From d1b7a924391f2cb602cdb7e65d81150a047cf30a Mon Sep 17 00:00:00 2001
From: slashexx
Date: Wed, 7 Jan 2026 10:47:07 +0530
Subject: [PATCH 01/81] docs: add CEL validation rules to agent daemonset
proposal
Add comprehensive CEL (Common Expression Language) validation rules
to the agent daemonset proposal documentation, including:
- x-kubernetes-validations for field validation
- Runtime fallback logic for validation handling
- Service monitor section refactoring
- Endpointslice section documentation
- Related field blocks and validation requirements
---
.../accepted/202405-agent-daemonset.md | 152 ++++++++++++++++++
1 file changed, 152 insertions(+)
diff --git a/Documentation/proposals/accepted/202405-agent-daemonset.md b/Documentation/proposals/accepted/202405-agent-daemonset.md
index 61ba7d319b3..dbd2364b568 100644
--- a/Documentation/proposals/accepted/202405-agent-daemonset.md
+++ b/Documentation/proposals/accepted/202405-agent-daemonset.md
@@ -12,6 +12,7 @@ draft: false
* Owners:
* [haanhvu](https://github.com/haanhvu)
+ * [slashexx](https://github.com/slashexx)
* Status:
* `Accepted`
* Related Tickets:
@@ -84,6 +85,97 @@ The current [PrometheusAgent CRD](https://prometheus-operator.dev/docs/platform/
We will add a new `mode` field that accepts either `StatefulSet` or `DaemonSet`, with `StatefulSet` being the default. If the DaemonSet mode is activated (`mode: DaemonSet`), all the unrelated fields listed above will not be accepted. In the MVP, we will simply fail the reconciliation if any of those fields are set. We will prevent users to directly switch from a live StatefulSet setup to DaemonSet, because that might break their workload if they forget to unset the unsupported fields. Following up, we will leverage validation rules with [Kubernetes' Common Expression Language (CEL)](https://kubernetes.io/docs/reference/using-api/cel/). Only then, we will allow switching from a live StatefulSet setup to DaemonSet. We already have an issue for CEL [here](https://github.com/prometheus-operator/prometheus-operator/issues/5079).
+#### 6.1.1 CEL Validation rules
+
+When `mode:DaemonSet`, the following CEL rules will be applied to prevent access to these fields:
+
+- `replicas`
+- `storage`
+- `shards`
+- `persistentVolumeClaimRetentionPolicy`
+- `scrapeConfigSelector`
+- `scrapeConfigNamespaceSelector`
+- `probeSelector`
+- `probeNamespaceSelector`
+- `serviceMonitorSelector`
+- `serviceMonitorNamespaceSelector`
+- `additionalScrapeConfigs`
+
+This is implemented by adding `x-kubernetes-validations` like:
+
+```yaml
+x-kubernetes-validations:
+ - rule: "self.mode == 'DaemonSet' ? !has(self.replicas) : true"
+ message: "replicas field is not allowed when mode is 'DaemonSet'"
+ - rule: "self.mode == 'DaemonSet' ? !has(self.storage) : true"
+ message: "storage field is not allowed when mode is 'DaemonSet'"
+ - rule: "self.mode == 'DaemonSet' ? !has(self.shards) : true"
+ message: "shards field is not allowed when mode is 'DaemonSet'"
+ - rule: "self.mode == 'DaemonSet' ? !has(self.persistentVolumeClaimRetentionPolicy) : true"
+ message: "persistentVolumeClaimRetentionPolicy field is not allowed when mode is 'DaemonSet'"
+ - rule: "!(has(self.mode) && self.mode == 'DaemonSet' && has(self.scrapeConfigSelector))"
+ message: "scrapeConfigSelector cannot be set when mode is DaemonSet"
+ - rule: "!(has(self.mode) && self.mode == 'DaemonSet' && has(self.probeSelector))"
+ message: "probeSelector cannot be set when mode is DaemonSet"
+ - rule: "!(has(self.mode) && self.mode == 'DaemonSet' && has(self.probeNamespaceSelector))"
+ message: "probeNamespaceSelector cannot be set when mode is DaemonSet"
+ - rule: "!(has(self.mode) && self.mode == 'DaemonSet' && has(self.scrapeConfigNamespaceSelector))"
+ message: "scrapeConfigNamespaceSelector cannot be set when mode is DaemonSet"
+ - rule: "!(has(self.mode) && self.mode == 'DaemonSet' && has(self.serviceMonitorSelector))"
+ message: "serviceMonitorSelector cannot be set when mode is DaemonSet"
+ - rule: "!(has(self.mode) && self.mode == 'DaemonSet' && has(self.serviceMonitorNamespaceSelector))"
+ message: "serviceMonitorNamespaceSelector cannot be set when mode is DaemonSet"
+ - rule: "!(has(self.mode) && self.mode == 'DaemonSet' && has(self.additionalScrapeConfigs))"
+ message: "additionalScrapeConfigs cannot be set when mode is DaemonSet"
+```
+
+#### 6.1.2 Runtime Validation Logic as Fallback
+
+CEL validation will provide immediate feedback during `kubectl apply` but we will need runtime validation logic in the controller as a fallback mechanism. This fallback will be integrated directly in the `PrometheusAgent` reconciler loop.
+
+This is mainly because :
+1. CEL validation will require Kubernetes version 1.25+ and hence not all users might have CEL supported clusters.
+2. This will provide an in-depth defense mechamnism against misconfigurations.
+3. More detailed error response in case the first layer of defense fails.
+
+```go
+if spec.Mode == "DaemonSet" {
+ if spec.Replicas != nil {
+ return fmt.Errorf("cannot configure replicas when using DaemonSet mode")
+ }
+ if spec.Storage != nil {
+ return fmt.Errorf("cannot configure storage when using DaemonSet mode")
+ }
+ if spec.Shards > 1 {
+ return fmt.Errorf("shards cannot be greater than 1 when mode is DaemonSet")
+ }
+ if spec.PersistentVolumeClaimRetentionPolicy != nil {
+ return fmt.Errorf("cannot configure persistentVolumeClaimRetentionPolicy when using DaemonSet mode")
+ }
+ if spec.ScrapeConfigSelector != nil {
+ return fmt.Errorf("cannot configure scrapeConfigSelector when using DaemonSet mode")
+ }
+ if spec.ProbeSelector != nil {
+ return fmt.Errorf("cannot configure probeSelector when using DaemonSet mode")
+ }
+ if spec.ProbeNamespaceSelector != nil {
+ return fmt.Errorf("cannot configure probeNamespaceSelector when using DaemonSet mode")
+ }
+ if spec.ScrapeConfigNamespaceSelector != nil {
+ return fmt.Errorf("cannot configure scrapeConfigNamespaceSelector when using DaemonSet mode")
+ }
+ if spec.ServiceMonitorSelector != nil {
+ return fmt.Errorf("cannot configure serviceMonitorSelector when using DaemonSet mode")
+ }
+ if spec.ServiceMonitorNamespaceSelector != nil {
+ return fmt.Errorf("cannot configure serviceMonitorNamespaceSelector when using DaemonSet mode")
+ }
+ if spec.AdditionalScrapeConfigs != nil {
+ return fmt.Errorf("cannot configure additionalScrapeConfigs when using DaemonSet mode")
+ }
+}
+```
+
### 6.2. Node detecting:
As pointed out in [Danny from GMP’s talk](https://www.youtube.com/watch?v=yk2aaAyxgKw), to make Prometheus Agent DaemonSet know which node it’s on, we can use [Kubernetes’ downward API](https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/). In `config-reloader` container, we can mount the node name as an environment variable like this:
@@ -115,6 +207,66 @@ We'll go with this option, because it filters targets right at discovery time, a
We've also considered using relabel config that filters pods by `__meta_kubernetes_pod_node_name` label. However, we didn't choose to go with this option because it filters pods only after discovering all the pods from PodMonitor, which increases load on Kubernetes API server.
+## Secondary/Extended goal (new feature gate)
+
+> **Note:** We are exploring the integration of ServiceMonitor support for DaemonSet mode using EndpointSlice as an experimental feature. This exploration will determine feasibility and performance, and if viable, it may be introduced behind a separate feature gate. This approach allows the main DaemonSet mode to reach GA independently of this feature.
+
+### ServiceMonitor Support with EndpointSlice
+
+To enable ServiceMonitor support for DaemonSet mode while addressing the performance concerns mentioned in section 5, we implement EndpointSlice-based service discovery:
+
+#### EndpointSlice Discovery Implementation
+
+The PrometheusAgent CRD already supports a `serviceDiscoveryRole` field that can be set to `EndpointSlice`:
+
+```yaml
+apiVersion: monitoring.coreos.com/v1alpha1
+kind: PrometheusAgent
+spec:
+ mode: DaemonSet
+ serviceDiscoveryRole: EndpointSlice # Use EndpointSlice instead of Endpoints
+ serviceMonitorSelector:
+ matchLabels:
+ team: platform
+```
+
+When `serviceDiscoveryRole: EndpointSlice` is specified, the generated Prometheus configuration will use:
+
+```yaml
+scrape_configs:
+- job_name: serviceMonitor/default/my-service/0
+ kubernetes_sd_configs:
+ - role: endpointslice # Instead of "endpoints"
+ namespaces:
+ names: [default]
+```
+
+#### Performance Benefits
+
+EndpointSlice provides significant performance improvements over classic Endpoints:
+* **Scalability**: EndpointSlice objects are limited to 1000 endpoints each, preventing massive objects
+* **Efficiency**: Multiple smaller objects reduce memory usage and network traffic
+* **Parallel Processing**: Multiple EndpointSlice objects can be processed in parallel
+* **Reduced API Server Load**: Less stress on Kubernetes API server with distributed endpoint information
+
+#### Implementation Details
+
+The implementation properly handles EndpointSlice support by checking both the user's `serviceDiscoveryRole` setting and cluster compatibility. The logic involves:
+
+```go
+// Check if THIS PrometheusAgent wants EndpointSlice discovery
+cpf := p.GetCommonPrometheusFields()
+if ptr.Deref(cpf.ServiceDiscoveryRole, monitoringv1.EndpointsRole) == monitoringv1.EndpointSliceRole {
+ if c.endpointSliceSupported {
+ opts = append(opts, prompkg.WithEndpointSliceSupport())
+ } else {
+ // Warn user that they want EndpointSlice but cluster doesn't support it
+ c.logger.Warn("EndpointSlice requested but not supported by Kubernetes cluster")
+ // Fall back to classic endpoints
+ }
+}
+```
+
## 7. Action Plan
For the implementation, we’ll do what we detailed in the How section. The common logics between StatefulSet and DaemonSet modes will be extracted into one place. We will have a separate `daemonset.go` for the separate logic of the DaemonSet mode.
From 2dda04c42b8e8f8424f0d3e2a63fc5b676e6a023 Mon Sep 17 00:00:00 2001
From: Nattapong Ekudomsuk
Date: Thu, 19 Feb 2026 22:42:39 +0700
Subject: [PATCH 02/81] amcfg: separate slack sanitize config
for easier understanding
---
pkg/alertmanager/amcfg_test.go | 236 +++++++++++++++++++--------------
1 file changed, 136 insertions(+), 100 deletions(-)
diff --git a/pkg/alertmanager/amcfg_test.go b/pkg/alertmanager/amcfg_test.go
index 77bc20d3fba..97749792c1e 100644
--- a/pkg/alertmanager/amcfg_test.go
+++ b/pkg/alertmanager/amcfg_test.go
@@ -4021,9 +4021,6 @@ func TestSanitizeConfig(t *testing.T) {
versionSlackAppConfigAllowed := semver.Version{Major: 0, Minor: 30}
versionSlackAppConfigNotAllowed := semver.Version{Major: 0, Minor: 29}
- versionSlackMessageTextAllowed := semver.Version{Major: 0, Minor: 31}
- versionSlackMessageTextNotAllowed := semver.Version{Major: 0, Minor: 30}
-
versionJiraAllowed := semver.Version{Major: 0, Minor: 28}
versionJiraNotAllowed := semver.Version{Major: 0, Minor: 27}
jiraURL := config.URL{}
@@ -4111,39 +4108,6 @@ func TestSanitizeConfig(t *testing.T) {
},
golden: "test_wechat_api_secret_takes_precedence_over_wechat_api_secret_file_in_global_config.golden",
},
- {
- name: "Test api_url takes precedence in slack config",
- againstVersion: versionFileURLAllowed,
- in: &alertmanagerConfig{
- Receivers: []*receiver{
- {
- SlackConfigs: []*slackConfig{
- {
- APIURL: "www.test.com",
- APIURLFile: "/test",
- },
- },
- },
- },
- },
- golden: "test_api_url_takes_precedence_in_slack_config.golden",
- },
- {
- name: "Test api_url_file is dropped in slack config for unsupported versions",
- againstVersion: versionFileURLNotAllowed,
- in: &alertmanagerConfig{
- Receivers: []*receiver{
- {
- SlackConfigs: []*slackConfig{
- {
- APIURLFile: "/test",
- },
- },
- },
- },
- },
- golden: "test_api_url_file_is_dropped_in_slack_config_for_unsupported_versions.golden",
- },
{
name: "Test slack config happy path",
againstVersion: versionFileURLAllowed,
@@ -4163,70 +4127,6 @@ func TestSanitizeConfig(t *testing.T) {
},
golden: "test_slack_config_happy_path.golden",
},
- {
- name: "Test timeout is dropped in slack config for unsupported versions",
- againstVersion: versionTimeoutConfigNotAllowed,
- in: &alertmanagerConfig{
- Receivers: []*receiver{
- {
- SlackConfigs: []*slackConfig{
- {
- Timeout: ptr.To(model.Duration(time.Minute)),
- },
- },
- },
- },
- },
- golden: "test_slack_timeout_is_dropped_in_slack_config_for_unsupported_versions.golden",
- },
- {
- name: "Test timeout is added in slack config for supported versions",
- againstVersion: versionTimeoutConfigAllowed,
- in: &alertmanagerConfig{
- Receivers: []*receiver{
- {
- SlackConfigs: []*slackConfig{
- {
- Timeout: ptr.To(model.Duration(time.Minute)),
- },
- },
- },
- },
- },
- golden: "test_slack_timeout_is_added_in_slack_config_for_supported_versions.golden",
- },
- {
- name: "Test message_text is dropped in slack config for unsupported versions",
- againstVersion: versionSlackMessageTextNotAllowed,
- in: &alertmanagerConfig{
- Receivers: []*receiver{
- {
- SlackConfigs: []*slackConfig{
- {
- MessageText: "test message text",
- },
- },
- },
- },
- },
- golden: "test_slack_message_text_is_dropped_in_slack_config_for_unsupported_versions.golden",
- },
- {
- name: "Test message_text is added in slack config for supported versions",
- againstVersion: versionSlackMessageTextAllowed,
- in: &alertmanagerConfig{
- Receivers: []*receiver{
- {
- SlackConfigs: []*slackConfig{
- {
- MessageText: "test message text",
- },
- },
- },
- },
- },
- golden: "test_slack_message_text_is_added_in_slack_config_for_supported_versions.golden",
- },
{
name: "Test inhibit rules error with unsupported syntax",
againstVersion: matcherV2SyntaxNotAllowed,
@@ -7984,6 +7884,142 @@ func TestSanitizeMSTeamsV2Config(t *testing.T) {
}
}
+func TestSanitizeSlackConfig(t *testing.T) {
+ logger := newNopLogger(t)
+
+ versionFileURLAllowed := semver.Version{Major: 0, Minor: 22}
+ versionFileURLNotAllowed := semver.Version{Major: 0, Minor: 21}
+
+ versionSlackMessageTextAllowed := semver.Version{Major: 0, Minor: 31}
+ versionSlackMessageTextNotAllowed := semver.Version{Major: 0, Minor: 30}
+
+ versionTimeoutConfigAllowed := semver.Version{Major: 0, Minor: 30}
+ versionTimeoutConfigNotAllowed := semver.Version{Major: 0, Minor: 29}
+
+ for _, tc := range []struct {
+ name string
+ againstVersion semver.Version
+ in *alertmanagerConfig
+ golden string
+ expectErr bool
+ }{
+
+ {
+ name: "Test api_url takes precedence in slack config",
+ againstVersion: versionFileURLAllowed,
+ in: &alertmanagerConfig{
+ Receivers: []*receiver{
+ {
+ SlackConfigs: []*slackConfig{
+ {
+ APIURL: "www.test.com",
+ APIURLFile: "/test",
+ },
+ },
+ },
+ },
+ },
+ golden: "test_api_url_takes_precedence_in_slack_config.golden",
+ },
+ {
+ name: "Test api_url_file is dropped in slack config for unsupported versions",
+ againstVersion: versionFileURLNotAllowed,
+ in: &alertmanagerConfig{
+ Receivers: []*receiver{
+ {
+ SlackConfigs: []*slackConfig{
+ {
+ APIURLFile: "/test",
+ },
+ },
+ },
+ },
+ },
+ golden: "test_api_url_file_is_dropped_in_slack_config_for_unsupported_versions.golden",
+ },
+ {
+ name: "Test timeout is dropped in slack config for unsupported versions",
+ againstVersion: versionTimeoutConfigNotAllowed,
+ in: &alertmanagerConfig{
+ Receivers: []*receiver{
+ {
+ SlackConfigs: []*slackConfig{
+ {
+ Timeout: ptr.To(model.Duration(time.Minute)),
+ },
+ },
+ },
+ },
+ },
+ golden: "test_slack_timeout_is_dropped_in_slack_config_for_unsupported_versions.golden",
+ },
+ {
+ name: "Test timeout is added in slack config for supported versions",
+ againstVersion: versionTimeoutConfigAllowed,
+ in: &alertmanagerConfig{
+ Receivers: []*receiver{
+ {
+ SlackConfigs: []*slackConfig{
+ {
+ Timeout: ptr.To(model.Duration(time.Minute)),
+ },
+ },
+ },
+ },
+ },
+ golden: "test_slack_timeout_is_added_in_slack_config_for_supported_versions.golden",
+ },
+ {
+ name: "Test message_text is dropped in slack config for unsupported versions",
+ againstVersion: versionSlackMessageTextNotAllowed,
+ in: &alertmanagerConfig{
+ Receivers: []*receiver{
+ {
+ SlackConfigs: []*slackConfig{
+ {
+ MessageText: "test message text",
+ },
+ },
+ },
+ },
+ },
+ golden: "test_slack_message_text_is_dropped_in_slack_config_for_unsupported_versions.golden",
+ },
+ {
+ name: "Test message_text is added in slack config for supported versions",
+ againstVersion: versionSlackMessageTextAllowed,
+ in: &alertmanagerConfig{
+ Receivers: []*receiver{
+ {
+ SlackConfigs: []*slackConfig{
+ {
+ MessageText: "test message text",
+ },
+ },
+ },
+ },
+ },
+ golden: "test_slack_message_text_is_added_in_slack_config_for_supported_versions.golden",
+ },
+ } {
+ t.Run(tc.name, func(t *testing.T) {
+ err := tc.in.sanitize(tc.againstVersion, logger)
+ if tc.expectErr {
+ require.Error(t, err)
+ return
+ }
+ require.NoError(t, err)
+
+ if tc.golden != "" {
+ amConfigs, err := yaml.Marshal(tc.in)
+ require.NoError(t, err)
+
+ golden.Assert(t, string(amConfigs), tc.golden)
+ }
+ })
+ }
+}
+
func newNopLogger(t *testing.T) *slog.Logger {
t.Helper()
return slog.New(slog.DiscardHandler)
From 37fdae6ddd6eb22c672519b114a179772ae7cf6a Mon Sep 17 00:00:00 2001
From: Nattapong Ekudomsuk
Date: Sat, 25 Apr 2026 10:52:28 +0800
Subject: [PATCH 03/81] alertmanager: fix wrong lib name
to fix compile issue
---
pkg/alertmanager/amcfg.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pkg/alertmanager/amcfg.go b/pkg/alertmanager/amcfg.go
index 24f8369c363..6492bc9cd50 100644
--- a/pkg/alertmanager/amcfg.go
+++ b/pkg/alertmanager/amcfg.go
@@ -2121,7 +2121,7 @@ func (cb *ConfigBuilder) convertGlobalMattermostConfig(ctx context.Context, out
if err != nil {
return fmt.Errorf("failed to parse Webhook URL: %w", err)
}
- out.MattermostWebhookURL = &config.URL{URL: u}
+ out.MattermostWebhookURL = &commoncfg.URL{URL: u}
}
return nil
From 985ccac9e9cb4a22e5e9c469560cd108b96e98f6 Mon Sep 17 00:00:00 2001
From: Nattapong Ekudomsuk
Date: Sat, 25 Apr 2026 11:56:21 +0800
Subject: [PATCH 04/81] trigger ci
From 0531816a5fb6a5e73d9be692595f9cade0bb4ede Mon Sep 17 00:00:00 2001
From: Simon Pasquier
Date: Mon, 27 Apr 2026 17:37:22 +0200
Subject: [PATCH 05/81] chore: bump k8s dependencies
Signed-off-by: Simon Pasquier
---
.github/env | 2 +-
Dockerfile | 2 +-
.../getting-started/compatibility.md | 5 ++-
bundle.yaml | 28 ++++---------
cmd/admission-webhook/Dockerfile | 2 +-
cmd/prometheus-config-reloader/Dockerfile | 2 +-
.../monitoring.coreos.com_alertmanagers.yaml | 7 +---
...onitoring.coreos.com_prometheusagents.yaml | 7 +---
.../monitoring.coreos.com_prometheuses.yaml | 7 +---
.../monitoring.coreos.com_thanosrulers.yaml | 7 +---
.../monitoring.coreos.com_alertmanagers.yaml | 7 +---
...onitoring.coreos.com_prometheusagents.yaml | 7 +---
.../monitoring.coreos.com_prometheuses.yaml | 7 +---
.../monitoring.coreos.com_thanosrulers.yaml | 7 +---
go.mod | 22 +++++-----
go.sum | 40 +++++++++----------
.../alertmanagers-crd.json | 8 ++--
.../prometheusagents-crd.json | 8 ++--
.../prometheus-operator/prometheuses-crd.json | 8 ++--
.../prometheus-operator/thanosrulers-crd.json | 8 ++--
pkg/apis/monitoring/go.mod | 10 ++---
pkg/apis/monitoring/go.sum | 22 +++++-----
pkg/client/go.mod | 19 +++++----
pkg/client/go.sum | 31 +++++++-------
24 files changed, 120 insertions(+), 153 deletions(-)
diff --git a/.github/env b/.github/env
index 0590ee68a4f..91775b52c85 100644
--- a/.github/env
+++ b/.github/env
@@ -1,3 +1,3 @@
-golang-version=1.25
+golang-version=1.26
kind-version=v0.31.0
kind-image=kindest/node:v1.35.1
diff --git a/Dockerfile b/Dockerfile
index ee43ddfa42d..f2540f91a32 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,6 +1,6 @@
ARG ARCH=amd64
ARG OS=linux
-ARG GOLANG_BUILDER=1.25
+ARG GOLANG_BUILDER=1.26
FROM quay.io/prometheus/golang-builder:${GOLANG_BUILDER}-base AS builder
WORKDIR /workspace
diff --git a/Documentation/getting-started/compatibility.md b/Documentation/getting-started/compatibility.md
index 733b327c329..ebe2d3b8d25 100644
--- a/Documentation/getting-started/compatibility.md
+++ b/Documentation/getting-started/compatibility.md
@@ -24,7 +24,7 @@ The Prometheus Operator uses the official [Go client](https://github.com/kuberne
The current version of the Prometheus operator uses the following Go client version:
```$ mdox-exec="go list -m -f '{{ .Version }}' k8s.io/client-go"
-v0.35.2
+v0.36.0
```
## Prometheus
@@ -78,12 +78,13 @@ Prometheus Operator supports all Prometheus versions >= v2.0.0. The operator's e
* v3.10.0
* v3.11.0
* v3.11.1
+* v3.11.2
```
The end-to-end tests are mostly tested against
```$ mdox-exec="go run ./cmd/po-docgen/. compatibility defaultPrometheusVersion"
-* v3.11.1
+* v3.11.2
```
## Alertmanager
diff --git a/bundle.yaml b/bundle.yaml
index bea8ae9937c..1de3860d2bf 100644
--- a/bundle.yaml
+++ b/bundle.yaml
@@ -16400,7 +16400,6 @@ spec:
procMount denotes the type of proc mount to use for the containers.
The default value is Default which uses the container runtime defaults for
readonly paths and masked paths.
- This requires the ProcMountType feature flag to be enabled.
Note that this field cannot be set when spec.os.name is windows.
type: string
readOnlyRootFilesystem:
@@ -18100,7 +18099,6 @@ spec:
procMount denotes the type of proc mount to use for the containers.
The default value is Default which uses the container runtime defaults for
readonly paths and masked paths.
- This requires the ProcMountType feature flag to be enabled.
Note that this field cannot be set when spec.os.name is windows.
type: string
readOnlyRootFilesystem:
@@ -21004,7 +21002,7 @@ spec:
A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message.
The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.
The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.
- The volume will be mounted read-only (ro) and non-executable files (noexec).
+ The volume will be mounted read-only (ro).
Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.
The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.
properties:
@@ -21176,8 +21174,7 @@ spec:
description: |-
portworxVolume represents a portworx volume attached and mounted on kubelets host machine.
Deprecated: PortworxVolume is deprecated. All operations for the in-tree portworxVolume type
- are redirected to the pxd.portworx.com CSI driver when the CSIMigrationPortworx feature-gate
- is on.
+ are redirected to the pxd.portworx.com CSI driver.
properties:
fsType:
description: |-
@@ -27766,7 +27763,6 @@ spec:
procMount denotes the type of proc mount to use for the containers.
The default value is Default which uses the container runtime defaults for
readonly paths and masked paths.
- This requires the ProcMountType feature flag to be enabled.
Note that this field cannot be set when spec.os.name is windows.
type: string
readOnlyRootFilesystem:
@@ -29687,7 +29683,6 @@ spec:
procMount denotes the type of proc mount to use for the containers.
The default value is Default which uses the container runtime defaults for
readonly paths and masked paths.
- This requires the ProcMountType feature flag to be enabled.
Note that this field cannot be set when spec.os.name is windows.
type: string
readOnlyRootFilesystem:
@@ -35251,7 +35246,7 @@ spec:
A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message.
The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.
The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.
- The volume will be mounted read-only (ro) and non-executable files (noexec).
+ The volume will be mounted read-only (ro).
Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.
The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.
properties:
@@ -35423,8 +35418,7 @@ spec:
description: |-
portworxVolume represents a portworx volume attached and mounted on kubelets host machine.
Deprecated: PortworxVolume is deprecated. All operations for the in-tree portworxVolume type
- are redirected to the pxd.portworx.com CSI driver when the CSIMigrationPortworx feature-gate
- is on.
+ are redirected to the pxd.portworx.com CSI driver.
properties:
fsType:
description: |-
@@ -40042,7 +40036,6 @@ spec:
procMount denotes the type of proc mount to use for the containers.
The default value is Default which uses the container runtime defaults for
readonly paths and masked paths.
- This requires the ProcMountType feature flag to be enabled.
Note that this field cannot be set when spec.os.name is windows.
type: string
readOnlyRootFilesystem:
@@ -42005,7 +41998,6 @@ spec:
procMount denotes the type of proc mount to use for the containers.
The default value is Default which uses the container runtime defaults for
readonly paths and masked paths.
- This requires the ProcMountType feature flag to be enabled.
Note that this field cannot be set when spec.os.name is windows.
type: string
readOnlyRootFilesystem:
@@ -49110,7 +49102,7 @@ spec:
A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message.
The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.
The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.
- The volume will be mounted read-only (ro) and non-executable files (noexec).
+ The volume will be mounted read-only (ro).
Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.
The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.
properties:
@@ -49282,8 +49274,7 @@ spec:
description: |-
portworxVolume represents a portworx volume attached and mounted on kubelets host machine.
Deprecated: PortworxVolume is deprecated. All operations for the in-tree portworxVolume type
- are redirected to the pxd.portworx.com CSI driver when the CSIMigrationPortworx feature-gate
- is on.
+ are redirected to the pxd.portworx.com CSI driver.
properties:
fsType:
description: |-
@@ -67376,7 +67367,6 @@ spec:
procMount denotes the type of proc mount to use for the containers.
The default value is Default which uses the container runtime defaults for
readonly paths and masked paths.
- This requires the ProcMountType feature flag to be enabled.
Note that this field cannot be set when spec.os.name is windows.
type: string
readOnlyRootFilesystem:
@@ -69319,7 +69309,6 @@ spec:
procMount denotes the type of proc mount to use for the containers.
The default value is Default which uses the container runtime defaults for
readonly paths and masked paths.
- This requires the ProcMountType feature flag to be enabled.
Note that this field cannot be set when spec.os.name is windows.
type: string
readOnlyRootFilesystem:
@@ -73591,7 +73580,7 @@ spec:
A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message.
The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.
The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.
- The volume will be mounted read-only (ro) and non-executable files (noexec).
+ The volume will be mounted read-only (ro).
Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.
The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.
properties:
@@ -73763,8 +73752,7 @@ spec:
description: |-
portworxVolume represents a portworx volume attached and mounted on kubelets host machine.
Deprecated: PortworxVolume is deprecated. All operations for the in-tree portworxVolume type
- are redirected to the pxd.portworx.com CSI driver when the CSIMigrationPortworx feature-gate
- is on.
+ are redirected to the pxd.portworx.com CSI driver.
properties:
fsType:
description: |-
diff --git a/cmd/admission-webhook/Dockerfile b/cmd/admission-webhook/Dockerfile
index 71cd4ab158c..8553ce2c464 100644
--- a/cmd/admission-webhook/Dockerfile
+++ b/cmd/admission-webhook/Dockerfile
@@ -1,6 +1,6 @@
ARG ARCH=amd64
ARG OS=linux
-ARG GOLANG_BUILDER=1.25
+ARG GOLANG_BUILDER=1.26
FROM quay.io/prometheus/golang-builder:${GOLANG_BUILDER}-base AS builder
WORKDIR /workspace
diff --git a/cmd/prometheus-config-reloader/Dockerfile b/cmd/prometheus-config-reloader/Dockerfile
index 74ed0f0bd0c..597befb5d04 100644
--- a/cmd/prometheus-config-reloader/Dockerfile
+++ b/cmd/prometheus-config-reloader/Dockerfile
@@ -1,6 +1,6 @@
ARG ARCH=amd64
ARG OS=linux
-ARG GOLANG_BUILDER=1.25
+ARG GOLANG_BUILDER=1.26
FROM quay.io/prometheus/golang-builder:${GOLANG_BUILDER}-base AS builder
WORKDIR /workspace
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml
index 48d5ae3d4d7..ac618de6b1a 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml
@@ -4040,7 +4040,6 @@ spec:
procMount denotes the type of proc mount to use for the containers.
The default value is Default which uses the container runtime defaults for
readonly paths and masked paths.
- This requires the ProcMountType feature flag to be enabled.
Note that this field cannot be set when spec.os.name is windows.
type: string
readOnlyRootFilesystem:
@@ -5740,7 +5739,6 @@ spec:
procMount denotes the type of proc mount to use for the containers.
The default value is Default which uses the container runtime defaults for
readonly paths and masked paths.
- This requires the ProcMountType feature flag to be enabled.
Note that this field cannot be set when spec.os.name is windows.
type: string
readOnlyRootFilesystem:
@@ -8644,7 +8642,7 @@ spec:
A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message.
The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.
The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.
- The volume will be mounted read-only (ro) and non-executable files (noexec).
+ The volume will be mounted read-only (ro).
Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.
The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.
properties:
@@ -8816,8 +8814,7 @@ spec:
description: |-
portworxVolume represents a portworx volume attached and mounted on kubelets host machine.
Deprecated: PortworxVolume is deprecated. All operations for the in-tree portworxVolume type
- are redirected to the pxd.portworx.com CSI driver when the CSIMigrationPortworx feature-gate
- is on.
+ are redirected to the pxd.portworx.com CSI driver.
properties:
fsType:
description: |-
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml
index 50c40a50e7e..2828c471d7f 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml
@@ -2577,7 +2577,6 @@ spec:
procMount denotes the type of proc mount to use for the containers.
The default value is Default which uses the container runtime defaults for
readonly paths and masked paths.
- This requires the ProcMountType feature flag to be enabled.
Note that this field cannot be set when spec.os.name is windows.
type: string
readOnlyRootFilesystem:
@@ -4498,7 +4497,6 @@ spec:
procMount denotes the type of proc mount to use for the containers.
The default value is Default which uses the container runtime defaults for
readonly paths and masked paths.
- This requires the ProcMountType feature flag to be enabled.
Note that this field cannot be set when spec.os.name is windows.
type: string
readOnlyRootFilesystem:
@@ -10062,7 +10060,7 @@ spec:
A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message.
The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.
The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.
- The volume will be mounted read-only (ro) and non-executable files (noexec).
+ The volume will be mounted read-only (ro).
Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.
The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.
properties:
@@ -10234,8 +10232,7 @@ spec:
description: |-
portworxVolume represents a portworx volume attached and mounted on kubelets host machine.
Deprecated: PortworxVolume is deprecated. All operations for the in-tree portworxVolume type
- are redirected to the pxd.portworx.com CSI driver when the CSIMigrationPortworx feature-gate
- is on.
+ are redirected to the pxd.portworx.com CSI driver.
properties:
fsType:
description: |-
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
index 58a1e423511..5dc7986673b 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
@@ -3337,7 +3337,6 @@ spec:
procMount denotes the type of proc mount to use for the containers.
The default value is Default which uses the container runtime defaults for
readonly paths and masked paths.
- This requires the ProcMountType feature flag to be enabled.
Note that this field cannot be set when spec.os.name is windows.
type: string
readOnlyRootFilesystem:
@@ -5300,7 +5299,6 @@ spec:
procMount denotes the type of proc mount to use for the containers.
The default value is Default which uses the container runtime defaults for
readonly paths and masked paths.
- This requires the ProcMountType feature flag to be enabled.
Note that this field cannot be set when spec.os.name is windows.
type: string
readOnlyRootFilesystem:
@@ -12405,7 +12403,7 @@ spec:
A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message.
The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.
The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.
- The volume will be mounted read-only (ro) and non-executable files (noexec).
+ The volume will be mounted read-only (ro).
Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.
The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.
properties:
@@ -12577,8 +12575,7 @@ spec:
description: |-
portworxVolume represents a portworx volume attached and mounted on kubelets host machine.
Deprecated: PortworxVolume is deprecated. All operations for the in-tree portworxVolume type
- are redirected to the pxd.portworx.com CSI driver when the CSIMigrationPortworx feature-gate
- is on.
+ are redirected to the pxd.portworx.com CSI driver.
properties:
fsType:
description: |-
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml
index 383c526ba50..a749366291c 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml
@@ -2230,7 +2230,6 @@ spec:
procMount denotes the type of proc mount to use for the containers.
The default value is Default which uses the container runtime defaults for
readonly paths and masked paths.
- This requires the ProcMountType feature flag to be enabled.
Note that this field cannot be set when spec.os.name is windows.
type: string
readOnlyRootFilesystem:
@@ -4173,7 +4172,6 @@ spec:
procMount denotes the type of proc mount to use for the containers.
The default value is Default which uses the container runtime defaults for
readonly paths and masked paths.
- This requires the ProcMountType feature flag to be enabled.
Note that this field cannot be set when spec.os.name is windows.
type: string
readOnlyRootFilesystem:
@@ -8445,7 +8443,7 @@ spec:
A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message.
The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.
The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.
- The volume will be mounted read-only (ro) and non-executable files (noexec).
+ The volume will be mounted read-only (ro).
Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.
The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.
properties:
@@ -8617,8 +8615,7 @@ spec:
description: |-
portworxVolume represents a portworx volume attached and mounted on kubelets host machine.
Deprecated: PortworxVolume is deprecated. All operations for the in-tree portworxVolume type
- are redirected to the pxd.portworx.com CSI driver when the CSIMigrationPortworx feature-gate
- is on.
+ are redirected to the pxd.portworx.com CSI driver.
properties:
fsType:
description: |-
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml
index 48d5ae3d4d7..ac618de6b1a 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml
@@ -4040,7 +4040,6 @@ spec:
procMount denotes the type of proc mount to use for the containers.
The default value is Default which uses the container runtime defaults for
readonly paths and masked paths.
- This requires the ProcMountType feature flag to be enabled.
Note that this field cannot be set when spec.os.name is windows.
type: string
readOnlyRootFilesystem:
@@ -5740,7 +5739,6 @@ spec:
procMount denotes the type of proc mount to use for the containers.
The default value is Default which uses the container runtime defaults for
readonly paths and masked paths.
- This requires the ProcMountType feature flag to be enabled.
Note that this field cannot be set when spec.os.name is windows.
type: string
readOnlyRootFilesystem:
@@ -8644,7 +8642,7 @@ spec:
A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message.
The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.
The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.
- The volume will be mounted read-only (ro) and non-executable files (noexec).
+ The volume will be mounted read-only (ro).
Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.
The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.
properties:
@@ -8816,8 +8814,7 @@ spec:
description: |-
portworxVolume represents a portworx volume attached and mounted on kubelets host machine.
Deprecated: PortworxVolume is deprecated. All operations for the in-tree portworxVolume type
- are redirected to the pxd.portworx.com CSI driver when the CSIMigrationPortworx feature-gate
- is on.
+ are redirected to the pxd.portworx.com CSI driver.
properties:
fsType:
description: |-
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml
index 50c40a50e7e..2828c471d7f 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml
@@ -2577,7 +2577,6 @@ spec:
procMount denotes the type of proc mount to use for the containers.
The default value is Default which uses the container runtime defaults for
readonly paths and masked paths.
- This requires the ProcMountType feature flag to be enabled.
Note that this field cannot be set when spec.os.name is windows.
type: string
readOnlyRootFilesystem:
@@ -4498,7 +4497,6 @@ spec:
procMount denotes the type of proc mount to use for the containers.
The default value is Default which uses the container runtime defaults for
readonly paths and masked paths.
- This requires the ProcMountType feature flag to be enabled.
Note that this field cannot be set when spec.os.name is windows.
type: string
readOnlyRootFilesystem:
@@ -10062,7 +10060,7 @@ spec:
A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message.
The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.
The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.
- The volume will be mounted read-only (ro) and non-executable files (noexec).
+ The volume will be mounted read-only (ro).
Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.
The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.
properties:
@@ -10234,8 +10232,7 @@ spec:
description: |-
portworxVolume represents a portworx volume attached and mounted on kubelets host machine.
Deprecated: PortworxVolume is deprecated. All operations for the in-tree portworxVolume type
- are redirected to the pxd.portworx.com CSI driver when the CSIMigrationPortworx feature-gate
- is on.
+ are redirected to the pxd.portworx.com CSI driver.
properties:
fsType:
description: |-
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
index 58a1e423511..5dc7986673b 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
@@ -3337,7 +3337,6 @@ spec:
procMount denotes the type of proc mount to use for the containers.
The default value is Default which uses the container runtime defaults for
readonly paths and masked paths.
- This requires the ProcMountType feature flag to be enabled.
Note that this field cannot be set when spec.os.name is windows.
type: string
readOnlyRootFilesystem:
@@ -5300,7 +5299,6 @@ spec:
procMount denotes the type of proc mount to use for the containers.
The default value is Default which uses the container runtime defaults for
readonly paths and masked paths.
- This requires the ProcMountType feature flag to be enabled.
Note that this field cannot be set when spec.os.name is windows.
type: string
readOnlyRootFilesystem:
@@ -12405,7 +12403,7 @@ spec:
A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message.
The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.
The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.
- The volume will be mounted read-only (ro) and non-executable files (noexec).
+ The volume will be mounted read-only (ro).
Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.
The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.
properties:
@@ -12577,8 +12575,7 @@ spec:
description: |-
portworxVolume represents a portworx volume attached and mounted on kubelets host machine.
Deprecated: PortworxVolume is deprecated. All operations for the in-tree portworxVolume type
- are redirected to the pxd.portworx.com CSI driver when the CSIMigrationPortworx feature-gate
- is on.
+ are redirected to the pxd.portworx.com CSI driver.
properties:
fsType:
description: |-
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml
index 383c526ba50..a749366291c 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml
@@ -2230,7 +2230,6 @@ spec:
procMount denotes the type of proc mount to use for the containers.
The default value is Default which uses the container runtime defaults for
readonly paths and masked paths.
- This requires the ProcMountType feature flag to be enabled.
Note that this field cannot be set when spec.os.name is windows.
type: string
readOnlyRootFilesystem:
@@ -4173,7 +4172,6 @@ spec:
procMount denotes the type of proc mount to use for the containers.
The default value is Default which uses the container runtime defaults for
readonly paths and masked paths.
- This requires the ProcMountType feature flag to be enabled.
Note that this field cannot be set when spec.os.name is windows.
type: string
readOnlyRootFilesystem:
@@ -8445,7 +8443,7 @@ spec:
A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message.
The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.
The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.
- The volume will be mounted read-only (ro) and non-executable files (noexec).
+ The volume will be mounted read-only (ro).
Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.
The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.
properties:
@@ -8617,8 +8615,7 @@ spec:
description: |-
portworxVolume represents a portworx volume attached and mounted on kubelets host machine.
Deprecated: PortworxVolume is deprecated. All operations for the in-tree portworxVolume type
- are redirected to the pxd.portworx.com CSI driver when the CSIMigrationPortworx feature-gate
- is on.
+ are redirected to the pxd.portworx.com CSI driver.
properties:
fsType:
description: |-
diff --git a/go.mod b/go.mod
index 848253436b6..8ace0a7b07c 100644
--- a/go.mod
+++ b/go.mod
@@ -1,6 +1,6 @@
module github.com/prometheus-operator/prometheus-operator
-go 1.25.0
+go 1.26.0
require (
github.com/KimMachineGun/automemlimit v0.7.5
@@ -30,16 +30,16 @@ require (
github.com/thanos-io/thanos v0.41.0
golang.org/x/net v0.53.0
golang.org/x/sync v0.20.0
- google.golang.org/protobuf v1.36.11
+ google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af
gopkg.in/yaml.v2 v2.4.0
- k8s.io/api v0.35.4
- k8s.io/apiextensions-apiserver v0.35.4
- k8s.io/apimachinery v0.35.4
- k8s.io/apiserver v0.35.4
- k8s.io/client-go v0.35.4
- k8s.io/component-base v0.35.4
+ k8s.io/api v0.36.0
+ k8s.io/apiextensions-apiserver v0.36.0
+ k8s.io/apimachinery v0.36.0
+ k8s.io/apiserver v0.36.0
+ k8s.io/client-go v0.36.0
+ k8s.io/component-base v0.36.0
k8s.io/klog/v2 v2.140.0
- k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2
+ k8s.io/utils v0.0.0-20260319190234-28399d86e0b5
sigs.k8s.io/controller-runtime v0.23.3
sigs.k8s.io/yaml v1.6.0
)
@@ -84,7 +84,6 @@ require (
github.com/mdlayher/socket v0.5.1 // indirect
github.com/mdlayher/vsock v1.2.1 // indirect
github.com/mitchellh/go-ps v1.0.0 // indirect
- github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect
github.com/oklog/ulid/v2 v2.1.1 // indirect
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
github.com/pkg/errors v0.9.1 // indirect
@@ -105,8 +104,9 @@ require (
google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 // indirect
google.golang.org/grpc v1.80.0 // indirect
gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect
+ k8s.io/streaming v0.36.0 // indirect
sigs.k8s.io/randfill v1.0.0 // indirect
- sigs.k8s.io/structured-merge-diff/v6 v6.3.2 // indirect
+ sigs.k8s.io/structured-merge-diff/v6 v6.4.0 // indirect
)
require (
diff --git a/go.sum b/go.sum
index 89c900b1335..a8950e75346 100644
--- a/go.sum
+++ b/go.sum
@@ -258,8 +258,6 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8m
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU=
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/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/oklog/run v1.2.0 h1:O8x3yXwah4A73hJdlrwo/2X6J62gE5qTMusH0dvz60E=
github.com/oklog/run v1.2.0/go.mod h1:mgDbKRSwPhJfesJ4PntqFUbKQRZ50NgmZTSPlFA0YFk=
github.com/oklog/ulid/v2 v2.1.1 h1:suPZ4ARWLOJLegGFiZZ1dFAkqzhMjL3J1TzI+5wHz8s=
@@ -452,8 +450,8 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 h1:
google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM=
google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4=
-google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
-google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
+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-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -474,31 +472,33 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q=
gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA=
-k8s.io/api v0.35.4 h1:P7nFYKl5vo9AGUp1Z+Pmd3p2tA7bX2wbFWCvDeRv988=
-k8s.io/api v0.35.4/go.mod h1:yl4lqySWOgYJJf9RERXKUwE9g2y+CkuwG+xmcOK8wXU=
-k8s.io/apiextensions-apiserver v0.35.4 h1:HeP+Upp7ItdvnyGmub0yoix+2z5+ev4M5cE5TCgtOUU=
-k8s.io/apiextensions-apiserver v0.35.4/go.mod h1:ogQlk+stIE8mnoRthSYCwlOS12fVqgWFiErMwPaXA7c=
-k8s.io/apimachinery v0.35.4 h1:xtdom9RG7e+yDp71uoXoJDWEE2eOiHgeO4GdBzwWpds=
-k8s.io/apimachinery v0.35.4/go.mod h1:NNi1taPOpep0jOj+oRha3mBJPqvi0hGdaV8TCqGQ+cc=
-k8s.io/apiserver v0.35.4 h1:vtuFqNFmF9bPRdHDL2lpK6qCTPWDreZJL4LRPwVM6ho=
-k8s.io/apiserver v0.35.4/go.mod h1:JnBcb+J8kFXKpZkgcbcUnPBBHi4qgBii1I7dLxFY/oo=
-k8s.io/client-go v0.35.4 h1:DN6fyaGuzK64UvnKO5fOA6ymSjvfGAnCAHAR0C66kD8=
-k8s.io/client-go v0.35.4/go.mod h1:2Pg9WpsS4NeOpoYTfHHfMxBG8zFMSAUi4O/qoiJC3nY=
-k8s.io/component-base v0.35.4 h1:6n1tNJ87johN0Hif0Fs8K2GMthsaUwMqCebUDLYyv7U=
-k8s.io/component-base v0.35.4/go.mod h1:qaDJgz5c1KYKla9occFmlJEfPpkuA55s90G509R+PeY=
+k8s.io/api v0.36.0 h1:SgqDhZzHdOtMk40xVSvCXkP9ME0H05hPM3p9AB1kL80=
+k8s.io/api v0.36.0/go.mod h1:m1LVrGPNYax5NBHdO+QuAedXyuzTt4RryI/qnmNvs34=
+k8s.io/apiextensions-apiserver v0.36.0 h1:Wt7E8J+VBCbj4FjiBfDTK/neXDDjyJVJc7xfuOHImZ0=
+k8s.io/apiextensions-apiserver v0.36.0/go.mod h1:kGDjH0msuiIB3tgsYRV0kS9GqpMYMUsQ3GHv7TApyug=
+k8s.io/apimachinery v0.36.0 h1:jZyPzhd5Z+3h9vJLt0z9XdzW9VzNzWAUw+P1xZ9PXtQ=
+k8s.io/apimachinery v0.36.0/go.mod h1:FklypaRJt6n5wUIwWXIP6GJlIpUizTgfo1T/As+Tyxc=
+k8s.io/apiserver v0.36.0 h1:Jg5OFAENUACByUCg15CmhZAYrr5ZyJ+jodyA1mHl3YE=
+k8s.io/apiserver v0.36.0/go.mod h1:mHvwdHf+qKEm+1/hYm756SV+oREOKSPnsjagOpx6Vho=
+k8s.io/client-go v0.36.0 h1:pOYi7C4RHChYjMiHpZSpSbIM6ZxVbRXBy7CuiIwqA3c=
+k8s.io/client-go v0.36.0/go.mod h1:ZKKcpwF0aLYfkHFCjillCKaTK/yBkEDHTDXCFY6AS9Y=
+k8s.io/component-base v0.36.0 h1:hFjEktssxiJhrK1zfybkH4kJOi8iZuF+mIDCqS5+jRo=
+k8s.io/component-base v0.36.0/go.mod h1:JZvIfcNHk+uck+8LhJzhSBtydWXaZNQwX2OdL+Mnwsk=
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-20260317180543-43fb72c5454a h1:xCeOEAOoGYl2jnJoHkC3hkbPJgdATINPMAxaynU2Ovg=
k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0=
-k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 h1:AZYQSJemyQB5eRxqcPky+/7EdBj0xi3g0ZcxxJ7vbWU=
-k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk=
+k8s.io/streaming v0.36.0 h1:agnTxU+NFulUrtYzXUGKO3ndEa8jKwht1Kwn9nu9x+4=
+k8s.io/streaming v0.36.0/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=
sigs.k8s.io/controller-runtime v0.23.3 h1:VjB/vhoPoA9l1kEKZHBMnQF33tdCLQKJtydy4iqwZ80=
sigs.k8s.io/controller-runtime v0.23.3/go.mod h1:B6COOxKptp+YaUT5q4l6LqUJTRpizbgf9KSRNdQGns0=
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg=
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
-sigs.k8s.io/structured-merge-diff/v6 v6.3.2 h1:kwVWMx5yS1CrnFWA/2QHyRVJ8jM6dBA80uLmm0wJkk8=
-sigs.k8s.io/structured-merge-diff/v6 v6.3.2/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE=
+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/jsonnet/prometheus-operator/alertmanagers-crd.json b/jsonnet/prometheus-operator/alertmanagers-crd.json
index 1dc015a4cce..6bc9f9c74a8 100644
--- a/jsonnet/prometheus-operator/alertmanagers-crd.json
+++ b/jsonnet/prometheus-operator/alertmanagers-crd.json
@@ -3601,7 +3601,7 @@
"type": "boolean"
},
"procMount": {
- "description": "procMount denotes the type of proc mount to use for the containers.\nThe default value is Default which uses the container runtime defaults for\nreadonly paths and masked paths.\nThis requires the ProcMountType feature flag to be enabled.\nNote that this field cannot be set when spec.os.name is windows.",
+ "description": "procMount denotes the type of proc mount to use for the containers.\nThe default value is Default which uses the container runtime defaults for\nreadonly paths and masked paths.\nNote that this field cannot be set when spec.os.name is windows.",
"type": "string"
},
"readOnlyRootFilesystem": {
@@ -5085,7 +5085,7 @@
"type": "boolean"
},
"procMount": {
- "description": "procMount denotes the type of proc mount to use for the containers.\nThe default value is Default which uses the container runtime defaults for\nreadonly paths and masked paths.\nThis requires the ProcMountType feature flag to be enabled.\nNote that this field cannot be set when spec.os.name is windows.",
+ "description": "procMount denotes the type of proc mount to use for the containers.\nThe default value is Default which uses the container runtime defaults for\nreadonly paths and masked paths.\nNote that this field cannot be set when spec.os.name is windows.",
"type": "string"
},
"readOnlyRootFilesystem": {
@@ -7266,7 +7266,7 @@
"type": "object"
},
"image": {
- "description": "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine.\nThe volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails.\n- Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present.\n- IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation.\nA failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message.\nThe types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.\nThe OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.\nThe volume will be mounted read-only (ro) and non-executable files (noexec).\nSub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.\nThe field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.",
+ "description": "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine.\nThe volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails.\n- Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present.\n- IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation.\nA failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message.\nThe types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.\nThe OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.\nThe volume will be mounted read-only (ro).\nSub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.\nThe field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.",
"properties": {
"pullPolicy": {
"description": "Policy for pulling OCI objects. Possible values are:\nAlways: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails.\nNever: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present.\nIfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\nDefaults to Always if :latest tag is specified, or IfNotPresent otherwise.",
@@ -7409,7 +7409,7 @@
"type": "object"
},
"portworxVolume": {
- "description": "portworxVolume represents a portworx volume attached and mounted on kubelets host machine.\nDeprecated: PortworxVolume is deprecated. All operations for the in-tree portworxVolume type\nare redirected to the pxd.portworx.com CSI driver when the CSIMigrationPortworx feature-gate\nis on.",
+ "description": "portworxVolume represents a portworx volume attached and mounted on kubelets host machine.\nDeprecated: PortworxVolume is deprecated. All operations for the in-tree portworxVolume type\nare redirected to the pxd.portworx.com CSI driver.",
"properties": {
"fsType": {
"description": "fSType represents the filesystem type to mount\nMust be a filesystem type supported by the host operating system.\nEx. \"ext4\", \"xfs\". Implicitly inferred to be \"ext4\" if unspecified.",
diff --git a/jsonnet/prometheus-operator/prometheusagents-crd.json b/jsonnet/prometheus-operator/prometheusagents-crd.json
index c1f0a249ae4..198a9ab2b15 100644
--- a/jsonnet/prometheus-operator/prometheusagents-crd.json
+++ b/jsonnet/prometheus-operator/prometheusagents-crd.json
@@ -2238,7 +2238,7 @@
"type": "boolean"
},
"procMount": {
- "description": "procMount denotes the type of proc mount to use for the containers.\nThe default value is Default which uses the container runtime defaults for\nreadonly paths and masked paths.\nThis requires the ProcMountType feature flag to be enabled.\nNote that this field cannot be set when spec.os.name is windows.",
+ "description": "procMount denotes the type of proc mount to use for the containers.\nThe default value is Default which uses the container runtime defaults for\nreadonly paths and masked paths.\nNote that this field cannot be set when spec.os.name is windows.",
"type": "string"
},
"readOnlyRootFilesystem": {
@@ -3824,7 +3824,7 @@
"type": "boolean"
},
"procMount": {
- "description": "procMount denotes the type of proc mount to use for the containers.\nThe default value is Default which uses the container runtime defaults for\nreadonly paths and masked paths.\nThis requires the ProcMountType feature flag to be enabled.\nNote that this field cannot be set when spec.os.name is windows.",
+ "description": "procMount denotes the type of proc mount to use for the containers.\nThe default value is Default which uses the container runtime defaults for\nreadonly paths and masked paths.\nNote that this field cannot be set when spec.os.name is windows.",
"type": "string"
},
"readOnlyRootFilesystem": {
@@ -8251,7 +8251,7 @@
"type": "object"
},
"image": {
- "description": "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine.\nThe volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails.\n- Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present.\n- IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation.\nA failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message.\nThe types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.\nThe OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.\nThe volume will be mounted read-only (ro) and non-executable files (noexec).\nSub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.\nThe field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.",
+ "description": "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine.\nThe volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails.\n- Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present.\n- IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation.\nA failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message.\nThe types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.\nThe OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.\nThe volume will be mounted read-only (ro).\nSub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.\nThe field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.",
"properties": {
"pullPolicy": {
"description": "Policy for pulling OCI objects. Possible values are:\nAlways: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails.\nNever: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present.\nIfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\nDefaults to Always if :latest tag is specified, or IfNotPresent otherwise.",
@@ -8394,7 +8394,7 @@
"type": "object"
},
"portworxVolume": {
- "description": "portworxVolume represents a portworx volume attached and mounted on kubelets host machine.\nDeprecated: PortworxVolume is deprecated. All operations for the in-tree portworxVolume type\nare redirected to the pxd.portworx.com CSI driver when the CSIMigrationPortworx feature-gate\nis on.",
+ "description": "portworxVolume represents a portworx volume attached and mounted on kubelets host machine.\nDeprecated: PortworxVolume is deprecated. All operations for the in-tree portworxVolume type\nare redirected to the pxd.portworx.com CSI driver.",
"properties": {
"fsType": {
"description": "fSType represents the filesystem type to mount\nMust be a filesystem type supported by the host operating system.\nEx. \"ext4\", \"xfs\". Implicitly inferred to be \"ext4\" if unspecified.",
diff --git a/jsonnet/prometheus-operator/prometheuses-crd.json b/jsonnet/prometheus-operator/prometheuses-crd.json
index b43f28d9c74..43e9383d649 100644
--- a/jsonnet/prometheus-operator/prometheuses-crd.json
+++ b/jsonnet/prometheus-operator/prometheuses-crd.json
@@ -2892,7 +2892,7 @@
"type": "boolean"
},
"procMount": {
- "description": "procMount denotes the type of proc mount to use for the containers.\nThe default value is Default which uses the container runtime defaults for\nreadonly paths and masked paths.\nThis requires the ProcMountType feature flag to be enabled.\nNote that this field cannot be set when spec.os.name is windows.",
+ "description": "procMount denotes the type of proc mount to use for the containers.\nThe default value is Default which uses the container runtime defaults for\nreadonly paths and masked paths.\nNote that this field cannot be set when spec.os.name is windows.",
"type": "string"
},
"readOnlyRootFilesystem": {
@@ -4503,7 +4503,7 @@
"type": "boolean"
},
"procMount": {
- "description": "procMount denotes the type of proc mount to use for the containers.\nThe default value is Default which uses the container runtime defaults for\nreadonly paths and masked paths.\nThis requires the ProcMountType feature flag to be enabled.\nNote that this field cannot be set when spec.os.name is windows.",
+ "description": "procMount denotes the type of proc mount to use for the containers.\nThe default value is Default which uses the container runtime defaults for\nreadonly paths and masked paths.\nNote that this field cannot be set when spec.os.name is windows.",
"type": "string"
},
"readOnlyRootFilesystem": {
@@ -10270,7 +10270,7 @@
"type": "object"
},
"image": {
- "description": "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine.\nThe volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails.\n- Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present.\n- IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation.\nA failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message.\nThe types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.\nThe OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.\nThe volume will be mounted read-only (ro) and non-executable files (noexec).\nSub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.\nThe field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.",
+ "description": "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine.\nThe volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails.\n- Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present.\n- IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation.\nA failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message.\nThe types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.\nThe OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.\nThe volume will be mounted read-only (ro).\nSub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.\nThe field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.",
"properties": {
"pullPolicy": {
"description": "Policy for pulling OCI objects. Possible values are:\nAlways: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails.\nNever: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present.\nIfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\nDefaults to Always if :latest tag is specified, or IfNotPresent otherwise.",
@@ -10413,7 +10413,7 @@
"type": "object"
},
"portworxVolume": {
- "description": "portworxVolume represents a portworx volume attached and mounted on kubelets host machine.\nDeprecated: PortworxVolume is deprecated. All operations for the in-tree portworxVolume type\nare redirected to the pxd.portworx.com CSI driver when the CSIMigrationPortworx feature-gate\nis on.",
+ "description": "portworxVolume represents a portworx volume attached and mounted on kubelets host machine.\nDeprecated: PortworxVolume is deprecated. All operations for the in-tree portworxVolume type\nare redirected to the pxd.portworx.com CSI driver.",
"properties": {
"fsType": {
"description": "fSType represents the filesystem type to mount\nMust be a filesystem type supported by the host operating system.\nEx. \"ext4\", \"xfs\". Implicitly inferred to be \"ext4\" if unspecified.",
diff --git a/jsonnet/prometheus-operator/thanosrulers-crd.json b/jsonnet/prometheus-operator/thanosrulers-crd.json
index 75703f03eb8..934673d950e 100644
--- a/jsonnet/prometheus-operator/thanosrulers-crd.json
+++ b/jsonnet/prometheus-operator/thanosrulers-crd.json
@@ -1930,7 +1930,7 @@
"type": "boolean"
},
"procMount": {
- "description": "procMount denotes the type of proc mount to use for the containers.\nThe default value is Default which uses the container runtime defaults for\nreadonly paths and masked paths.\nThis requires the ProcMountType feature flag to be enabled.\nNote that this field cannot be set when spec.os.name is windows.",
+ "description": "procMount denotes the type of proc mount to use for the containers.\nThe default value is Default which uses the container runtime defaults for\nreadonly paths and masked paths.\nNote that this field cannot be set when spec.os.name is windows.",
"type": "string"
},
"readOnlyRootFilesystem": {
@@ -3651,7 +3651,7 @@
"type": "boolean"
},
"procMount": {
- "description": "procMount denotes the type of proc mount to use for the containers.\nThe default value is Default which uses the container runtime defaults for\nreadonly paths and masked paths.\nThis requires the ProcMountType feature flag to be enabled.\nNote that this field cannot be set when spec.os.name is windows.",
+ "description": "procMount denotes the type of proc mount to use for the containers.\nThe default value is Default which uses the container runtime defaults for\nreadonly paths and masked paths.\nNote that this field cannot be set when spec.os.name is windows.",
"type": "string"
},
"readOnlyRootFilesystem": {
@@ -7026,7 +7026,7 @@
"type": "object"
},
"image": {
- "description": "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine.\nThe volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails.\n- Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present.\n- IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation.\nA failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message.\nThe types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.\nThe OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.\nThe volume will be mounted read-only (ro) and non-executable files (noexec).\nSub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.\nThe field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.",
+ "description": "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine.\nThe volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails.\n- Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present.\n- IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation.\nA failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message.\nThe types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.\nThe OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.\nThe volume will be mounted read-only (ro).\nSub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.\nThe field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.",
"properties": {
"pullPolicy": {
"description": "Policy for pulling OCI objects. Possible values are:\nAlways: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails.\nNever: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present.\nIfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\nDefaults to Always if :latest tag is specified, or IfNotPresent otherwise.",
@@ -7169,7 +7169,7 @@
"type": "object"
},
"portworxVolume": {
- "description": "portworxVolume represents a portworx volume attached and mounted on kubelets host machine.\nDeprecated: PortworxVolume is deprecated. All operations for the in-tree portworxVolume type\nare redirected to the pxd.portworx.com CSI driver when the CSIMigrationPortworx feature-gate\nis on.",
+ "description": "portworxVolume represents a portworx volume attached and mounted on kubelets host machine.\nDeprecated: PortworxVolume is deprecated. All operations for the in-tree portworxVolume type\nare redirected to the pxd.portworx.com CSI driver.",
"properties": {
"fsType": {
"description": "fSType represents the filesystem type to mount\nMust be a filesystem type supported by the host operating system.\nEx. \"ext4\", \"xfs\". Implicitly inferred to be \"ext4\" if unspecified.",
diff --git a/pkg/apis/monitoring/go.mod b/pkg/apis/monitoring/go.mod
index 09ad1364e4b..df6d533f9b2 100644
--- a/pkg/apis/monitoring/go.mod
+++ b/pkg/apis/monitoring/go.mod
@@ -1,12 +1,12 @@
module github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring
-go 1.25.0
+go 1.26.0
require (
- k8s.io/api v0.35.2
- k8s.io/apiextensions-apiserver v0.35.2
- k8s.io/apimachinery v0.35.2
- k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2
+ k8s.io/api v0.36.0
+ k8s.io/apiextensions-apiserver v0.36.0
+ k8s.io/apimachinery v0.36.0
+ k8s.io/utils v0.0.0-20260319190234-28399d86e0b5
sigs.k8s.io/controller-runtime v0.23.3
)
diff --git a/pkg/apis/monitoring/go.sum b/pkg/apis/monitoring/go.sum
index 72b2d37e4c8..754924ab6be 100644
--- a/pkg/apis/monitoring/go.sum
+++ b/pkg/apis/monitoring/go.sum
@@ -1,6 +1,7 @@
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM=
github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
@@ -16,8 +17,9 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ
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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY=
github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@@ -36,18 +38,18 @@ gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-k8s.io/api v0.35.2 h1:tW7mWc2RpxW7HS4CoRXhtYHSzme1PN1UjGHJ1bdrtdw=
-k8s.io/api v0.35.2/go.mod h1:7AJfqGoAZcwSFhOjcGM7WV05QxMMgUaChNfLTXDRE60=
-k8s.io/apiextensions-apiserver v0.35.2 h1:iyStXHoJZsUXPh/nFAsjC29rjJWdSgUmG1XpApE29c0=
-k8s.io/apiextensions-apiserver v0.35.2/go.mod h1:OdyGvcO1FtMDWQ+rRh/Ei3b6X3g2+ZDHd0MSRGeS8rU=
-k8s.io/apimachinery v0.35.2 h1:NqsM/mmZA7sHW02JZ9RTtk3wInRgbVxL8MPfzSANAK8=
-k8s.io/apimachinery v0.35.2/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns=
+k8s.io/api v0.36.0 h1:SgqDhZzHdOtMk40xVSvCXkP9ME0H05hPM3p9AB1kL80=
+k8s.io/api v0.36.0/go.mod h1:m1LVrGPNYax5NBHdO+QuAedXyuzTt4RryI/qnmNvs34=
+k8s.io/apiextensions-apiserver v0.36.0 h1:Wt7E8J+VBCbj4FjiBfDTK/neXDDjyJVJc7xfuOHImZ0=
+k8s.io/apiextensions-apiserver v0.36.0/go.mod h1:kGDjH0msuiIB3tgsYRV0kS9GqpMYMUsQ3GHv7TApyug=
+k8s.io/apimachinery v0.36.0 h1:jZyPzhd5Z+3h9vJLt0z9XdzW9VzNzWAUw+P1xZ9PXtQ=
+k8s.io/apimachinery v0.36.0/go.mod h1:FklypaRJt6n5wUIwWXIP6GJlIpUizTgfo1T/As+Tyxc=
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-20260317180543-43fb72c5454a h1:xCeOEAOoGYl2jnJoHkC3hkbPJgdATINPMAxaynU2Ovg=
k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0=
-k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 h1:AZYQSJemyQB5eRxqcPky+/7EdBj0xi3g0ZcxxJ7vbWU=
-k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk=
+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=
sigs.k8s.io/controller-runtime v0.23.3 h1:VjB/vhoPoA9l1kEKZHBMnQF33tdCLQKJtydy4iqwZ80=
sigs.k8s.io/controller-runtime v0.23.3/go.mod h1:B6COOxKptp+YaUT5q4l6LqUJTRpizbgf9KSRNdQGns0=
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg=
diff --git a/pkg/client/go.mod b/pkg/client/go.mod
index 328095de209..df7aa5cc2b1 100644
--- a/pkg/client/go.mod
+++ b/pkg/client/go.mod
@@ -1,14 +1,14 @@
module github.com/prometheus-operator/prometheus-operator/pkg/client
-go 1.25.0
+go 1.26.0
require (
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.91.0
- k8s.io/api v0.35.2
- k8s.io/apiextensions-apiserver v0.35.2
- k8s.io/apimachinery v0.35.2
- k8s.io/client-go v0.35.2
- sigs.k8s.io/structured-merge-diff/v6 v6.3.2
+ k8s.io/api v0.36.0
+ k8s.io/apiextensions-apiserver v0.36.0
+ k8s.io/apimachinery v0.36.0
+ k8s.io/client-go v0.36.0
+ sigs.k8s.io/structured-merge-diff/v6 v6.4.0
)
require (
@@ -31,14 +31,13 @@ require (
github.com/go-openapi/swag/typeutils v0.25.5 // indirect
github.com/go-openapi/swag/yamlutils v0.25.5 // indirect
github.com/google/gnostic-models v0.7.1 // indirect
- github.com/google/go-cmp v0.7.0 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
- github.com/pmezard/go-difflib v1.0.0 // indirect
+ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/x448/float16 v0.8.4 // indirect
go.yaml.in/yaml/v2 v2.4.4 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
@@ -48,12 +47,12 @@ require (
golang.org/x/term v0.41.0 // indirect
golang.org/x/text v0.35.0 // indirect
golang.org/x/time v0.15.0 // indirect
- google.golang.org/protobuf v1.36.11 // indirect
+ google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af // indirect
gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
k8s.io/klog/v2 v2.140.0 // indirect
k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a // indirect
- k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 // indirect
+ k8s.io/utils v0.0.0-20260319190234-28399d86e0b5 // indirect
sigs.k8s.io/controller-runtime v0.23.3 // indirect
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect
sigs.k8s.io/randfill v1.0.0 // indirect
diff --git a/pkg/client/go.sum b/pkg/client/go.sum
index 516d190ca00..e3bfbcccf71 100644
--- a/pkg/client/go.sum
+++ b/pkg/client/go.sum
@@ -64,8 +64,9 @@ github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFd
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY=
@@ -96,8 +97,8 @@ golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8=
golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA=
golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U=
golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno=
-google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
-google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
+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/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
@@ -107,27 +108,27 @@ gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-k8s.io/api v0.35.2 h1:tW7mWc2RpxW7HS4CoRXhtYHSzme1PN1UjGHJ1bdrtdw=
-k8s.io/api v0.35.2/go.mod h1:7AJfqGoAZcwSFhOjcGM7WV05QxMMgUaChNfLTXDRE60=
-k8s.io/apiextensions-apiserver v0.35.2 h1:iyStXHoJZsUXPh/nFAsjC29rjJWdSgUmG1XpApE29c0=
-k8s.io/apiextensions-apiserver v0.35.2/go.mod h1:OdyGvcO1FtMDWQ+rRh/Ei3b6X3g2+ZDHd0MSRGeS8rU=
-k8s.io/apimachinery v0.35.2 h1:NqsM/mmZA7sHW02JZ9RTtk3wInRgbVxL8MPfzSANAK8=
-k8s.io/apimachinery v0.35.2/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns=
-k8s.io/client-go v0.35.2 h1:YUfPefdGJA4aljDdayAXkc98DnPkIetMl4PrKX97W9o=
-k8s.io/client-go v0.35.2/go.mod h1:4QqEwh4oQpeK8AaefZ0jwTFJw/9kIjdQi0jpKeYvz7g=
+k8s.io/api v0.36.0 h1:SgqDhZzHdOtMk40xVSvCXkP9ME0H05hPM3p9AB1kL80=
+k8s.io/api v0.36.0/go.mod h1:m1LVrGPNYax5NBHdO+QuAedXyuzTt4RryI/qnmNvs34=
+k8s.io/apiextensions-apiserver v0.36.0 h1:Wt7E8J+VBCbj4FjiBfDTK/neXDDjyJVJc7xfuOHImZ0=
+k8s.io/apiextensions-apiserver v0.36.0/go.mod h1:kGDjH0msuiIB3tgsYRV0kS9GqpMYMUsQ3GHv7TApyug=
+k8s.io/apimachinery v0.36.0 h1:jZyPzhd5Z+3h9vJLt0z9XdzW9VzNzWAUw+P1xZ9PXtQ=
+k8s.io/apimachinery v0.36.0/go.mod h1:FklypaRJt6n5wUIwWXIP6GJlIpUizTgfo1T/As+Tyxc=
+k8s.io/client-go v0.36.0 h1:pOYi7C4RHChYjMiHpZSpSbIM6ZxVbRXBy7CuiIwqA3c=
+k8s.io/client-go v0.36.0/go.mod h1:ZKKcpwF0aLYfkHFCjillCKaTK/yBkEDHTDXCFY6AS9Y=
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-20260317180543-43fb72c5454a h1:xCeOEAOoGYl2jnJoHkC3hkbPJgdATINPMAxaynU2Ovg=
k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0=
-k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 h1:AZYQSJemyQB5eRxqcPky+/7EdBj0xi3g0ZcxxJ7vbWU=
-k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk=
+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=
sigs.k8s.io/controller-runtime v0.23.3 h1:VjB/vhoPoA9l1kEKZHBMnQF33tdCLQKJtydy4iqwZ80=
sigs.k8s.io/controller-runtime v0.23.3/go.mod h1:B6COOxKptp+YaUT5q4l6LqUJTRpizbgf9KSRNdQGns0=
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg=
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
-sigs.k8s.io/structured-merge-diff/v6 v6.3.2 h1:kwVWMx5yS1CrnFWA/2QHyRVJ8jM6dBA80uLmm0wJkk8=
-sigs.k8s.io/structured-merge-diff/v6 v6.3.2/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE=
+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=
From f46778091b696ee736ee81f308b098d261f1a6c3 Mon Sep 17 00:00:00 2001
From: dongjiang
Date: Tue, 5 May 2026 20:11:50 +0800
Subject: [PATCH 06/81] update golangci-linter version
Signed-off-by: dongjiang
---
.custom-gcl.yaml | 4 +-
Makefile | 6 +-
scripts/go.mod | 73 +++++++++---------
scripts/go.sum | 151 +++++++++++++++++++++-----------------
test/framework/context.go | 5 +-
5 files changed, 129 insertions(+), 110 deletions(-)
diff --git a/.custom-gcl.yaml b/.custom-gcl.yaml
index c7ce532b334..832efd43d1d 100644
--- a/.custom-gcl.yaml
+++ b/.custom-gcl.yaml
@@ -1,6 +1,6 @@
-version: v2.11.4
+version: v2.12.1
name: golangci-kube-api-linter
destination: ./tmp/bin/
plugins:
- module: 'sigs.k8s.io/kube-api-linter'
- version: v0.0.0-20260408163332-73b2175ca510
+ version: v0.0.0-20260423112246-3fa174937a6b
diff --git a/Makefile b/Makefile
index 64d0d5213ab..eccefe85219 100644
--- a/Makefile
+++ b/Makefile
@@ -335,8 +335,7 @@ check-metrics: $(PROMLINTER_BINARY) ## Lint Prometheus metrics.
$(PROMLINTER_BINARY) lint .
.PHONY: check
-check: ## Run all checks.
- check-golang check-api
+check: check-golang check-api ## Run all checks.
.PHONY: check-golang
check-golang: $(GOLANGCILINTER_BINARY) ## Run golangci-lint checks.
@@ -347,8 +346,7 @@ check-api: $(GOLANGCIKUBEAPILINTER_BINARY) ## Run golangci-kube-api-linter check
cd pkg/apis/monitoring && $(GOLANGCIKUBEAPILINTER_BINARY) run -v --config $(ROOT_DIR)/.golangci-kal.yml
.PHONY: fix
-fix: ## Fix all auto-fixable issues.
- fix-golang fix-api
+fix: fix-golang fix-api ## Fix all auto-fixable issues.
.PHONY: fix-golang
fix-golang: $(GOLANGCILINTER_BINARY) ## Run golangci-lint to fix issues.
diff --git a/scripts/go.mod b/scripts/go.mod
index be66b1205af..5d1e5ac1d15 100644
--- a/scripts/go.mod
+++ b/scripts/go.mod
@@ -6,7 +6,7 @@ require (
github.com/ahmetb/gen-crd-api-reference-docs v0.3.1-0.20241111191808-71fefeed8910
github.com/brancz/gojsontoyaml v0.1.0
github.com/bwplotka/mdox v0.9.1-0.20260318034157-e88e0a8655a0
- github.com/golangci/golangci-lint/v2 v2.11.4
+ github.com/golangci/golangci-lint/v2 v2.12.1
github.com/google/go-jsonnet v0.22.0
github.com/jsonnet-bundler/jsonnet-bundler v0.6.0
github.com/prometheus/prometheus v0.311.2
@@ -18,6 +18,7 @@ require (
require (
4d63.com/gocheckcompilerdirectives v1.3.0 // indirect
4d63.com/gochecknoglobals v0.2.2 // indirect
+ charm.land/lipgloss/v2 v2.0.3 // indirect
cloud.google.com/go/auth v0.18.2 // indirect
cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect
cloud.google.com/go/compute/metadata v0.9.0 // indirect
@@ -40,16 +41,17 @@ require (
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 // indirect
github.com/BurntSushi/toml v1.6.0 // indirect
+ github.com/ClickHouse/clickhouse-go-linter v1.2.0 // indirect
github.com/Code-Hex/go-generics-cache v1.5.1 // indirect
github.com/Djarvur/go-err113 v0.1.1 // indirect
github.com/Kunde21/markdownfmt/v3 v3.1.0 // indirect
- github.com/Masterminds/semver/v3 v3.4.0 // indirect
+ github.com/Masterminds/semver/v3 v3.5.0 // indirect
github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/MirrexOne/unqueryvet v1.5.4 // indirect
github.com/OpenPeeDeeP/depguard/v2 v2.2.1 // indirect
github.com/PuerkitoBio/goquery v1.5.1 // indirect
github.com/alecthomas/chroma v0.10.0 // indirect
- github.com/alecthomas/chroma/v2 v2.23.1 // indirect
+ github.com/alecthomas/chroma/v2 v2.24.1 // indirect
github.com/alecthomas/go-check-sumtype v0.3.1 // indirect
github.com/alecthomas/kingpin/v2 v2.4.0 // indirect
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect
@@ -64,8 +66,8 @@ require (
github.com/antchfx/xmlquery v1.3.4 // indirect
github.com/antchfx/xpath v1.1.10 // indirect
github.com/armon/go-metrics v0.4.1 // indirect
- github.com/ashanbrown/forbidigo/v2 v2.3.0 // indirect
- github.com/ashanbrown/makezero/v2 v2.1.0 // indirect
+ github.com/ashanbrown/forbidigo/v2 v2.3.1 // indirect
+ github.com/ashanbrown/makezero/v2 v2.2.1 // indirect
github.com/aws/aws-sdk-go-v2 v1.41.5 // indirect
github.com/aws/aws-sdk-go-v2/config v1.32.13 // indirect
github.com/aws/aws-sdk-go-v2/credentials v1.19.13 // indirect
@@ -96,24 +98,27 @@ require (
github.com/bkielbasa/cyclop v1.2.3 // indirect
github.com/blizzy78/varnamelen v0.8.0 // indirect
github.com/bombsimon/wsl/v4 v4.7.0 // indirect
- github.com/bombsimon/wsl/v5 v5.6.0 // indirect
+ github.com/bombsimon/wsl/v5 v5.8.0 // indirect
github.com/breml/bidichk v0.3.3 // indirect
github.com/breml/errchkjson v0.4.1 // indirect
- github.com/butuzov/ireturn v0.4.0 // indirect
+ github.com/butuzov/ireturn v0.4.1 // indirect
github.com/butuzov/mirror v1.3.0 // indirect
github.com/catenacyber/perfsprint v0.10.1 // indirect
github.com/ccojocar/zxcvbn-go v1.0.4 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/charithe/durationcheck v0.0.11 // indirect
- github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect
+ github.com/charmbracelet/colorprofile v0.4.3 // indirect
github.com/charmbracelet/glamour v0.6.0 // indirect
- github.com/charmbracelet/lipgloss v1.1.0 // indirect
- github.com/charmbracelet/x/ansi v0.10.1 // indirect
- github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect
- github.com/charmbracelet/x/term v0.2.1 // indirect
+ github.com/charmbracelet/ultraviolet v0.0.0-20251205161215-1948445e3318 // indirect
+ github.com/charmbracelet/x/ansi v0.11.7 // indirect
+ github.com/charmbracelet/x/term v0.2.2 // indirect
+ github.com/charmbracelet/x/termios v0.1.1 // indirect
+ github.com/charmbracelet/x/windows v0.2.2 // indirect
github.com/ckaznocha/intrange v0.3.1 // indirect
github.com/clbanning/mxj/v2 v2.7.0 // indirect
github.com/cli/safeexec v1.0.1 // indirect
+ github.com/clipperhouse/displaywidth v0.11.0 // indirect
+ github.com/clipperhouse/uax29/v2 v2.7.0 // indirect
github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 // indirect
github.com/containerd/errdefs v1.0.0 // indirect
github.com/containerd/errdefs/pkg v0.3.0 // indirect
@@ -126,7 +131,7 @@ require (
github.com/dennwc/varint v1.0.0 // indirect
github.com/digitalocean/godo v1.178.0 // indirect
github.com/distribution/reference v0.6.0 // indirect
- github.com/dlclark/regexp2 v1.11.5 // indirect
+ github.com/dlclark/regexp2 v1.12.0 // indirect
github.com/docker/docker v28.5.2+incompatible // indirect
github.com/docker/go-connections v0.6.0 // indirect
github.com/docker/go-units v0.5.0 // indirect
@@ -197,13 +202,14 @@ require (
github.com/golang/protobuf v1.5.4 // indirect
github.com/golang/snappy v1.0.0 // indirect
github.com/golangci/asciicheck v0.5.0 // indirect
- github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 // indirect
+ github.com/golangci/dupl v0.0.0-20260401084720-c99c5cf5c202 // indirect
github.com/golangci/go-printf-func-name v0.1.1 // indirect
github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d // indirect
github.com/golangci/golines v0.15.0 // indirect
github.com/golangci/misspell v0.8.0 // indirect
github.com/golangci/plugin-module-register v0.1.2 // indirect
github.com/golangci/revgrep v0.8.0 // indirect
+ github.com/golangci/rowserrcheck v0.0.0-20260419091836-c5f79b8a11ba // indirect
github.com/golangci/swaggoswag v0.0.0-20250504205917-77f2aca3143e // indirect
github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e // indirect
github.com/google/gnostic-models v0.7.1 // indirect
@@ -233,7 +239,7 @@ require (
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/hashicorp/go-retryablehttp v0.7.8 // indirect
github.com/hashicorp/go-rootcerts v1.0.2 // indirect
- github.com/hashicorp/go-version v1.8.0 // indirect
+ github.com/hashicorp/go-version v1.9.0 // indirect
github.com/hashicorp/golang-lru v0.6.0 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
@@ -243,8 +249,7 @@ require (
github.com/hexops/gotextdiff v1.0.3 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/ionos-cloud/sdk-go/v6 v6.3.6 // indirect
- github.com/jgautheron/goconst v1.8.2 // indirect
- github.com/jingyugao/rowserrcheck v1.1.1 // indirect
+ github.com/jgautheron/goconst v1.10.0 // indirect
github.com/jjti/go-spancheck v0.6.5 // indirect
github.com/jpillora/backoff v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
@@ -267,17 +272,17 @@ require (
github.com/ldez/usetesting v0.5.0 // indirect
github.com/leonklingele/grouper v1.1.2 // indirect
github.com/linode/linodego v1.66.0 // indirect
- github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
+ github.com/lucasb-eyer/go-colorful v1.4.0 // indirect
github.com/macabu/inamedparam v0.2.0 // indirect
github.com/magiconair/properties v1.8.6 // indirect
github.com/manuelarte/embeddedstructfieldcheck v0.4.0 // indirect
- github.com/manuelarte/funcorder v0.5.0 // indirect
+ github.com/manuelarte/funcorder v0.6.0 // indirect
github.com/maratori/testableexamples v1.0.1 // indirect
github.com/maratori/testpackage v1.1.2 // indirect
github.com/matoous/godox v1.1.0 // indirect
github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
- github.com/mattn/go-runewidth v0.0.16 // indirect
+ github.com/mattn/go-runewidth v0.0.23 // indirect
github.com/mattn/go-shellwords v1.0.12 // indirect
github.com/mattn/go-sqlite3 v1.14.17 // indirect
github.com/mdlayher/socket v0.5.1 // indirect
@@ -292,6 +297,7 @@ require (
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
github.com/moricho/tparallel v0.3.2 // indirect
+ github.com/muesli/cancelreader v0.2.2 // indirect
github.com/muesli/reflow v0.3.0 // indirect
github.com/muesli/termenv v0.16.0 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
@@ -309,7 +315,7 @@ require (
github.com/opencontainers/image-spec v1.1.1 // indirect
github.com/ovh/go-ovh v1.9.0 // indirect
github.com/pelletier/go-toml v1.9.5 // indirect
- github.com/pelletier/go-toml/v2 v2.2.4 // indirect
+ github.com/pelletier/go-toml/v2 v2.3.0 // indirect
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect
@@ -333,6 +339,7 @@ require (
github.com/rogpeppe/go-internal v1.14.1 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/ryancurrah/gomodguard v1.4.1 // indirect
+ github.com/ryancurrah/gomodguard/v2 v2.1.0 // indirect
github.com/ryanrolds/sqlclosecheck v0.6.0 // indirect
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca // indirect
github.com/sanposhiho/wastedassign/v2 v2.1.0 // indirect
@@ -340,12 +347,12 @@ require (
github.com/sashamelentyev/interfacebloat v1.1.0 // indirect
github.com/sashamelentyev/usestdlibvars v1.29.0 // indirect
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.36 // indirect
- github.com/securego/gosec/v2 v2.24.8-0.20260309165252-619ce2117e08 // indirect
+ github.com/securego/gosec/v2 v2.26.1 // indirect
github.com/sergi/go-diff v1.3.1 // indirect
github.com/sirupsen/logrus v1.9.4 // indirect
github.com/sivchari/containedctx v1.0.3 // indirect
github.com/sonatard/noctx v0.5.1 // indirect
- github.com/sourcegraph/go-diff v0.7.0 // indirect
+ github.com/sourcegraph/go-diff v0.8.0 // indirect
github.com/spf13/afero v1.15.0 // indirect
github.com/spf13/cast v1.5.1 // indirect
github.com/spf13/cobra v1.10.2 // indirect
@@ -360,9 +367,9 @@ require (
github.com/subosito/gotenv v1.4.1 // indirect
github.com/tdewolff/parse/v2 v2.7.3 // indirect
github.com/temoto/robotstxt v1.1.1 // indirect
- github.com/tetafro/godot v1.5.4 // indirect
+ github.com/tetafro/godot v1.5.6 // indirect
github.com/theckman/yacspin v0.13.12 // indirect
- github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67 // indirect
+ github.com/timakin/bodyclose v0.0.0-20260129054331-73d1f95b84b4 // indirect
github.com/timonwong/loggercheck v0.11.0 // indirect
github.com/tomarrell/wrapcheck/v2 v2.12.0 // indirect
github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect
@@ -381,7 +388,7 @@ require (
github.com/yuin/goldmark-emoji v1.0.2 // indirect
gitlab.com/bosi/decorder v0.4.2 // indirect
go-simpler.org/musttag v0.14.0 // indirect
- go-simpler.org/sloglint v0.11.1 // indirect
+ go-simpler.org/sloglint v0.12.0 // indirect
go.augendre.info/arangolint v0.4.0 // indirect
go.augendre.info/fatcontext v0.9.0 // indirect
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
@@ -396,18 +403,18 @@ require (
go.uber.org/zap v1.27.1 // indirect
go.yaml.in/yaml/v2 v2.4.4 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
- golang.org/x/crypto v0.49.0 // indirect
+ golang.org/x/crypto v0.50.0 // indirect
golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 // indirect
golang.org/x/exp/typeparams v0.0.0-20260209203927-2842357ff358 // indirect
- golang.org/x/mod v0.34.0 // indirect
- golang.org/x/net v0.52.0 // indirect
+ golang.org/x/mod v0.35.0 // indirect
+ golang.org/x/net v0.53.0 // indirect
golang.org/x/oauth2 v0.36.0 // indirect
golang.org/x/sync v0.20.0 // indirect
- golang.org/x/sys v0.42.0 // indirect
- golang.org/x/term v0.41.0 // indirect
- golang.org/x/text v0.35.0 // indirect
+ golang.org/x/sys v0.43.0 // indirect
+ golang.org/x/term v0.42.0 // indirect
+ golang.org/x/text v0.36.0 // indirect
golang.org/x/time v0.15.0 // indirect
- golang.org/x/tools v0.43.0 // indirect
+ golang.org/x/tools v0.44.0 // indirect
google.golang.org/api v0.272.0 // indirect
google.golang.org/appengine v1.6.8 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20260319201613-d00831a3d3e7 // indirect
diff --git a/scripts/go.sum b/scripts/go.sum
index 1132939e25d..2291d22d4e4 100644
--- a/scripts/go.sum
+++ b/scripts/go.sum
@@ -12,6 +12,8 @@ cel.dev/expr v0.19.2/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=
cel.dev/expr v0.20.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=
cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4=
cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4=
+charm.land/lipgloss/v2 v2.0.3 h1:yM2zJ4Cf5Y51b7RHIwioil4ApI/aypFXXVHSwlM6RzU=
+charm.land/lipgloss/v2 v2.0.3/go.mod h1:7myLU9iG/3xluAWzpY/fSxYYHCgoKTie7laxk6ATwXA=
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
@@ -399,6 +401,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk=
github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/ClickHouse/clickhouse-go-linter v1.2.0 h1:zbm174up3hTKjp0wKZVnTzRiG7tSF5XZF0FJG/MuCBI=
+github.com/ClickHouse/clickhouse-go-linter v1.2.0/go.mod h1:pLorS7ffPTfuUV9M0SJgfHA/h/WQPQUk2FWG9x74cQ4=
github.com/Code-Hex/go-generics-cache v1.5.1 h1:6vhZGc5M7Y/YD8cIUcY8kcuQLB4cHR7U+0KMqAA0KcU=
github.com/Code-Hex/go-generics-cache v1.5.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4=
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
@@ -426,8 +430,8 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapp
github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk=
github.com/Kunde21/markdownfmt/v3 v3.1.0 h1:KiZu9LKs+wFFBQKhrZJrFZwtLnCCWJahL+S+E/3VnM0=
github.com/Kunde21/markdownfmt/v3 v3.1.0/go.mod h1:tPXN1RTyOzJwhfHoon9wUr4HGYmWgVxSQN6VBJDkrVc=
-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/semver/v3 v3.5.0 h1:kQceYJfbupGfZOKZQg0kou0DgAKhzDg2NZPAwZ/2OOE=
+github.com/Masterminds/semver/v3 v3.5.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
github.com/MirrexOne/unqueryvet v1.5.4 h1:38QOxShO7JmMWT+eCdDMbcUgGCOeJphVkzzRgyLJgsQ=
@@ -449,8 +453,8 @@ github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8v
github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
github.com/alecthomas/chroma v0.10.0 h1:7XDcGkCQopCNKjZHfYrNLraA+M7e0fMiJ/Mfikbfjek=
github.com/alecthomas/chroma v0.10.0/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s=
-github.com/alecthomas/chroma/v2 v2.23.1 h1:nv2AVZdTyClGbVQkIzlDm/rnhk1E9bU9nXwmZ/Vk/iY=
-github.com/alecthomas/chroma/v2 v2.23.1/go.mod h1:NqVhfBR0lte5Ouh3DcthuUCTUpDC9cxBOfyMbMQPs3o=
+github.com/alecthomas/chroma/v2 v2.24.1 h1:m5ffpfZbIb++k8AqFEKy9uVgY12xIQtBsQlc6DfZJQM=
+github.com/alecthomas/chroma/v2 v2.24.1/go.mod h1:l+ohZ9xRXIbGe7cIW+YZgOGbvuVLjMps/FYN/CwuabI=
github.com/alecthomas/go-check-sumtype v0.3.1 h1:u9aUvbGINJxLVXiFvHUlPEaD7VDULsrxJb4Aq31NLkU=
github.com/alecthomas/go-check-sumtype v0.3.1/go.mod h1:A8TSiN3UPRw3laIgWEUOHHLPa6/r9MtoigdlP5h3K/E=
github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY=
@@ -501,10 +505,10 @@ github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJ
github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
-github.com/ashanbrown/forbidigo/v2 v2.3.0 h1:OZZDOchCgsX5gvToVtEBoV2UWbFfI6RKQTir2UZzSxo=
-github.com/ashanbrown/forbidigo/v2 v2.3.0/go.mod h1:5p6VmsG5/1xx3E785W9fouMxIOkvY2rRV9nMdWadd6c=
-github.com/ashanbrown/makezero/v2 v2.1.0 h1:snuKYMbqosNokUKm+R6/+vOPs8yVAi46La7Ck6QYSaE=
-github.com/ashanbrown/makezero/v2 v2.1.0/go.mod h1:aEGT/9q3S8DHeE57C88z2a6xydvgx8J5hgXIGWgo0MY=
+github.com/ashanbrown/forbidigo/v2 v2.3.1 h1:KAZijvQ7zeIBKbhikT4jCm0TLYXC4u78bTiLh/8JROI=
+github.com/ashanbrown/forbidigo/v2 v2.3.1/go.mod h1:2QDkLTzU6TV937eFROamXrW92M3paehdae4HCDCOZCM=
+github.com/ashanbrown/makezero/v2 v2.2.1 h1:A7uU8dgB1PA9aelTxHMfHIQ8Qev8AB3JLxJUBUsejqM=
+github.com/ashanbrown/makezero/v2 v2.2.1/go.mod h1:aEGT/9q3S8DHeE57C88z2a6xydvgx8J5hgXIGWgo0MY=
github.com/aws/aws-sdk-go-v2 v1.41.5 h1:dj5kopbwUsVUVFgO4Fi5BIT3t4WyqIDjGKCangnV/yY=
github.com/aws/aws-sdk-go-v2 v1.41.5/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o=
github.com/aws/aws-sdk-go-v2/config v1.32.13 h1:5KgbxMaS2coSWRrx9TX/QtWbqzgQkOdEa3sZPhBhCSg=
@@ -572,8 +576,8 @@ github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ
github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k=
github.com/bombsimon/wsl/v4 v4.7.0 h1:1Ilm9JBPRczjyUs6hvOPKvd7VL1Q++PL8M0SXBDf+jQ=
github.com/bombsimon/wsl/v4 v4.7.0/go.mod h1:uV/+6BkffuzSAVYD+yGyld1AChO7/EuLrCF/8xTiapg=
-github.com/bombsimon/wsl/v5 v5.6.0 h1:4z+/sBqC5vUmSp1O0mS+czxwH9+LKXtCWtHH9rZGQL8=
-github.com/bombsimon/wsl/v5 v5.6.0/go.mod h1:Uqt2EfrMj2NV8UGoN1f1Y3m0NpUVCsUdrNCdet+8LvU=
+github.com/bombsimon/wsl/v5 v5.8.0 h1:JTkyfs4yl8SPejrCF2GdABXE+mO1WvM7iUYzRWlsxDs=
+github.com/bombsimon/wsl/v5 v5.8.0/go.mod h1:AbOLsulgkqP4ZnitHf9gwPtCOGlrzkk0jb0uNxRSY0o=
github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
github.com/brancz/gojsontoyaml v0.1.0 h1:SdzR3+BCVOqaI42nFGTeaB7/2DgDM4fhuvRLqxatA8M=
@@ -582,8 +586,8 @@ github.com/breml/bidichk v0.3.3 h1:WSM67ztRusf1sMoqH6/c4OBCUlRVTKq+CbSeo0R17sE=
github.com/breml/bidichk v0.3.3/go.mod h1:ISbsut8OnjB367j5NseXEGGgO/th206dVa427kR8YTE=
github.com/breml/errchkjson v0.4.1 h1:keFSS8D7A2T0haP9kzZTi7o26r7kE3vymjZNeNDRDwg=
github.com/breml/errchkjson v0.4.1/go.mod h1:a23OvR6Qvcl7DG/Z4o0el6BRAjKnaReoPQFciAl9U3s=
-github.com/butuzov/ireturn v0.4.0 h1:+s76bF/PfeKEdbG8b54aCocxXmi0wvYdOVsWxVO7n8E=
-github.com/butuzov/ireturn v0.4.0/go.mod h1:ghI0FrCmap8pDWZwfPisFD1vEc56VKH4NpQUxDHta70=
+github.com/butuzov/ireturn v0.4.1 h1:vWb3NO4t77iku/sjCQ/2pHTQeOmxEhjIriJqRLg1Y+I=
+github.com/butuzov/ireturn v0.4.1/go.mod h1:q+DXKzTDV5guNuXLnIab9fKXizTn2miZHLhxH7V/GB4=
github.com/butuzov/mirror v1.3.0 h1:HdWCXzmwlQHdVhwvsfBb2Au0r3HyINry3bDWLYXiKoc=
github.com/butuzov/mirror v1.3.0/go.mod h1:AEij0Z8YMALaq4yQj9CPPVYOyJQyiexpQEQgihajRfI=
github.com/bwplotka/mdox v0.9.1-0.20260318034157-e88e0a8655a0 h1:ddpDQUwOAenI545bWVOZMAxB27q6HLuM+i6KqAOTNw4=
@@ -604,18 +608,20 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/charithe/durationcheck v0.0.11 h1:g1/EX1eIiKS57NTWsYtHDZ/APfeXKhye1DidBcABctk=
github.com/charithe/durationcheck v0.0.11/go.mod h1:x5iZaixRNl8ctbM+3B2RrPG5t856TxRyVQEnbIEM2X4=
-github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs=
-github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk=
+github.com/charmbracelet/colorprofile v0.4.3 h1:QPa1IWkYI+AOB+fE+mg/5/4HRMZcaXex9t5KX76i20Q=
+github.com/charmbracelet/colorprofile v0.4.3/go.mod h1:/zT4BhpD5aGFpqQQqw7a+VtHCzu+zrQtt1zhMt9mR4Q=
github.com/charmbracelet/glamour v0.6.0 h1:wi8fse3Y7nfcabbbDuwolqTqMQPMnVPeZhDM273bISc=
github.com/charmbracelet/glamour v0.6.0/go.mod h1:taqWV4swIMMbWALc0m7AfE9JkPSU8om2538k9ITBxOc=
-github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY=
-github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30=
-github.com/charmbracelet/x/ansi v0.10.1 h1:rL3Koar5XvX0pHGfovN03f5cxLbCF2YvLeyz7D2jVDQ=
-github.com/charmbracelet/x/ansi v0.10.1/go.mod h1:3RQDQ6lDnROptfpWuUVIUG64bD2g2BgntdxH0Ya5TeE=
-github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd h1:vy0GVL4jeHEwG5YOXDmi86oYw2yuYUGqz6a8sLwg0X8=
-github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs=
-github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ=
-github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg=
+github.com/charmbracelet/ultraviolet v0.0.0-20251205161215-1948445e3318 h1:OqDqxQZliC7C8adA7KjelW3OjtAxREfeHkNcd66wpeI=
+github.com/charmbracelet/ultraviolet v0.0.0-20251205161215-1948445e3318/go.mod h1:Y6kE2GzHfkyQQVCSL9r2hwokSrIlHGzZG+71+wDYSZI=
+github.com/charmbracelet/x/ansi v0.11.7 h1:kzv1kJvjg2S3r9KHo8hDdHFQLEqn4RBCb39dAYC84jI=
+github.com/charmbracelet/x/ansi v0.11.7/go.mod h1:9qGpnAVYz+8ACONkZBUWPtL7lulP9No6p1epAihUZwQ=
+github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSgfgZRk=
+github.com/charmbracelet/x/term v0.2.2/go.mod h1:kF8CY5RddLWrsgVwpw4kAa6TESp6EB5y3uxGLeCqzAI=
+github.com/charmbracelet/x/termios v0.1.1 h1:o3Q2bT8eqzGnGPOYheoYS8eEleT5ZVNYNy8JawjaNZY=
+github.com/charmbracelet/x/termios v0.1.1/go.mod h1:rB7fnv1TgOPOyyKRJ9o+AsTU/vK5WHJ2ivHeut/Pcwo=
+github.com/charmbracelet/x/windows v0.2.2 h1:IofanmuvaxnKHuV04sC0eBy/smG6kIKrWG2/jYn2GuM=
+github.com/charmbracelet/x/windows v0.2.2/go.mod h1:/8XtdKZzedat74NQFn0NGlGL4soHB0YQZrETF96h75k=
github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs=
github.com/chromedp/chromedp v0.9.2/go.mod h1:LkSXJKONWTCHAfQasKFUZI+mxqS4tZqhmtGzzhLsnLs=
github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww=
@@ -638,6 +644,10 @@ github.com/cli/safeexec v1.0.0/go.mod h1:Z/D4tTN8Vs5gXYHDCbaM1S/anmEDnJb1iW0+EJ5
github.com/cli/safeexec v1.0.1 h1:e/C79PbXF4yYTN/wauC4tviMxEV13BwljGj0N9j+N00=
github.com/cli/safeexec v1.0.1/go.mod h1:Z/D4tTN8Vs5gXYHDCbaM1S/anmEDnJb1iW0+EJ5zx3Q=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/clipperhouse/displaywidth v0.11.0 h1:lBc6kY44VFw+TDx4I8opi/EtL9m20WSEFgwIwO+UVM8=
+github.com/clipperhouse/displaywidth v0.11.0/go.mod h1:bkrFNkf81G8HyVqmKGxsPufD3JhNl3dSqnGhOoSD/o0=
+github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk=
+github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
@@ -695,8 +705,8 @@ github.com/digitalocean/godo v1.178.0/go.mod h1:xQsWpVCCbkDrWisHA72hPzPlnC+4W5w/
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/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
-github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ=
-github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
+github.com/dlclark/regexp2 v1.12.0 h1:0j4c5qQmnC6XOWNjP3PIXURXN2gWx76rd3KvgdPkCz8=
+github.com/dlclark/regexp2 v1.12.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaftjlSWt4AFexzM=
github.com/docker/docker v28.5.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/go-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94=
@@ -976,14 +986,14 @@ github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs=
github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golangci/asciicheck v0.5.0 h1:jczN/BorERZwK8oiFBOGvlGPknhvq0bjnysTj4nUfo0=
github.com/golangci/asciicheck v0.5.0/go.mod h1:5RMNAInbNFw2krqN6ibBxN/zfRFa9S6tA1nPdM0l8qQ=
-github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 h1:WUvBfQL6EW/40l6OmeSBYQJNSif4O11+bmWEz+C7FYw=
-github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32/go.mod h1:NUw9Zr2Sy7+HxzdjIULge71wI6yEg1lWQr7Evcu8K0E=
+github.com/golangci/dupl v0.0.0-20260401084720-c99c5cf5c202 h1:CbTB8KpqnViI6lIXxp03Oclc4VFHi3K4BWC1TacsZ+A=
+github.com/golangci/dupl v0.0.0-20260401084720-c99c5cf5c202/go.mod h1:NUw9Zr2Sy7+HxzdjIULge71wI6yEg1lWQr7Evcu8K0E=
github.com/golangci/go-printf-func-name v0.1.1 h1:hIYTFJqAGp1iwoIfsNTpoq1xZAarogrvjO9AfiW3B4U=
github.com/golangci/go-printf-func-name v0.1.1/go.mod h1:Es64MpWEZbh0UBtTAICOZiB+miW53w/K9Or/4QogJss=
github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d h1:viFft9sS/dxoYY0aiOTsLKO2aZQAPT4nlQCsimGcSGE=
github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d/go.mod h1:ivJ9QDg0XucIkmwhzCDsqcnxxlDStoTl89jDMIoNxKY=
-github.com/golangci/golangci-lint/v2 v2.11.4 h1:GK+UlZBN5y7rh2PBnHA93XLSX6RaF7uhzJQ3JwU1wuA=
-github.com/golangci/golangci-lint/v2 v2.11.4/go.mod h1:ODQDCASMA3VqfZYIbbQLpTRTzV7O/vjmIRF6u8NyFwI=
+github.com/golangci/golangci-lint/v2 v2.12.1 h1:Rr07Ps/u+kvQqSO4L026WOSVvOlMU+RZTa/lossFaJA=
+github.com/golangci/golangci-lint/v2 v2.12.1/go.mod h1:e/wBh0xvA13ag/OWByUmvjc9oYPtcKGpXycldJbc7t0=
github.com/golangci/golines v0.15.0 h1:Qnph25g8Y1c5fdo1X7GaRDGgnMHgnxh4Gk4VfPTtRx0=
github.com/golangci/golines v0.15.0/go.mod h1:AZjXd23tbHMpowhtnGlj9KCNsysj72aeZVVHnVcZx10=
github.com/golangci/misspell v0.8.0 h1:qvxQhiE2/5z+BVRo1kwYA8yGz+lOlu5Jfvtx2b04Jbg=
@@ -992,6 +1002,8 @@ github.com/golangci/plugin-module-register v0.1.2 h1:e5WM6PO6NIAEcij3B053CohVp3H
github.com/golangci/plugin-module-register v0.1.2/go.mod h1:1+QGTsKBvAIvPvoY/os+G5eoqxWn70HYDm2uvUyGuVw=
github.com/golangci/revgrep v0.8.0 h1:EZBctwbVd0aMeRnNUsFogoyayvKHyxlV3CdUA46FX2s=
github.com/golangci/revgrep v0.8.0/go.mod h1:U4R/s9dlXZsg8uJmaR1GrloUr14D7qDl8gi2iPXJH8k=
+github.com/golangci/rowserrcheck v0.0.0-20260419091836-c5f79b8a11ba h1:lqtcnSMDuuJdu/LrKWi5RJzpSNLOJXYe/nzQutTI5kg=
+github.com/golangci/rowserrcheck v0.0.0-20260419091836-c5f79b8a11ba/go.mod h1:sCBNcpRmhJCtbFGz49+IM3ETTFf7QdJ30AeYCd43NKk=
github.com/golangci/swaggoswag v0.0.0-20250504205917-77f2aca3143e h1:ai0EfmVYE2bRA5htgAG9r7s3tHsfjIhN98WshBTJ9jM=
github.com/golangci/swaggoswag v0.0.0-20250504205917-77f2aca3143e/go.mod h1:Vrn4B5oR9qRwM+f54koyeH3yzphlecwERs0el27Fr/s=
github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e h1:gD6P7NEo7Eqtt0ssnqSJNNndxe69DOQ24A5h7+i3KpM=
@@ -1191,8 +1203,8 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b
github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=
github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
-github.com/hashicorp/go-version v1.8.0 h1:KAkNb1HAiZd1ukkxDFGmokVZe1Xy9HG6NUp+bPle2i4=
-github.com/hashicorp/go-version v1.8.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
+github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA=
+github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4=
@@ -1227,10 +1239,8 @@ github.com/ionos-cloud/sdk-go/v6 v6.3.6/go.mod h1:nUGHP4kZHAZngCVr4v6C8nuargFrtv
github.com/jarcoal/httpmock v1.4.1 h1:0Ju+VCFuARfFlhVXFc2HxlcQkfB+Xq12/EotHko+x2A=
github.com/jarcoal/httpmock v1.4.1/go.mod h1:ftW1xULwo+j0R0JJkJIIi7UKigZUXCLLanykgjwBXL0=
github.com/jawher/mow.cli v1.1.0/go.mod h1:aNaQlc7ozF3vw6IJ2dHjp2ZFiA4ozMIYY6PyuRJwlUg=
-github.com/jgautheron/goconst v1.8.2 h1:y0XF7X8CikZ93fSNT6WBTb/NElBu9IjaY7CCYQrCMX4=
-github.com/jgautheron/goconst v1.8.2/go.mod h1:A0oxgBCHy55NQn6sYpO7UdnA9p+h7cPtoOZUmvNIako=
-github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs=
-github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c=
+github.com/jgautheron/goconst v1.10.0 h1:Ptt+OoE4NaEWKhLrWrrN3IpZdGLiqaf7WLnEX/iv4Jw=
+github.com/jgautheron/goconst v1.10.0/go.mod h1:0p+wv1lFOiUr0IlNNT1nrm6+8DB8u2sU6KHGzFRXHDc=
github.com/jjti/go-spancheck v0.6.5 h1:lmi7pKxa37oKYIMScialXUK6hP3iY5F1gu+mLBPgYB8=
github.com/jjti/go-spancheck v0.6.5/go.mod h1:aEogkeatBrbYsyW6y5TgDfihCulDYciL1B7rG2vSsrU=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
@@ -1315,8 +1325,9 @@ github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84Yrj
github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA=
github.com/linode/linodego v1.66.0 h1:rK8QJFaV53LWOEJvb/evhTg/dP5ElvtuZmx4iv4RJds=
github.com/linode/linodego v1.66.0/go.mod h1:12ykGs9qsvxE+OU3SXuW2w+DTruWF35FPlXC7gGk2tU=
-github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
+github.com/lucasb-eyer/go-colorful v1.4.0 h1:UtrWVfLdarDgc44HcS7pYloGHJUjHV/4FwW4TvVgFr4=
+github.com/lucasb-eyer/go-colorful v1.4.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA=
github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA=
github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o=
@@ -1329,8 +1340,8 @@ github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPK
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/manuelarte/embeddedstructfieldcheck v0.4.0 h1:3mAIyaGRtjK6EO9E73JlXLtiy7ha80b2ZVGyacxgfww=
github.com/manuelarte/embeddedstructfieldcheck v0.4.0/go.mod h1:z8dFSyXqp+fC6NLDSljRJeNQJJDWnY7RoWFzV3PC6UM=
-github.com/manuelarte/funcorder v0.5.0 h1:llMuHXXbg7tD0i/LNw8vGnkDTHFpTnWqKPI85Rknc+8=
-github.com/manuelarte/funcorder v0.5.0/go.mod h1:Yt3CiUQthSBMBxjShjdXMexmzpP8YGvGLjrxJNkO2hA=
+github.com/manuelarte/funcorder v0.6.0 h1:0hBngc4fa1IgNiI65A7sFGkMvoMCc878RjqB5V7rWP0=
+github.com/manuelarte/funcorder v0.6.0/go.mod h1:id3NDhXdQBmeqXH7eVC6Z89xS6JxvZ8kF9xUxpArU/g=
github.com/maratori/testableexamples v1.0.1 h1:HfOQXs+XgfeRBJ+Wz0XfH+FHnoY9TVqL6Fcevpzy4q8=
github.com/maratori/testableexamples v1.0.1/go.mod h1:XE2F/nQs7B9N08JgyRmdGjYVGqxWwClLPCGSQhXQSrQ=
github.com/maratori/testpackage v1.1.2 h1:ffDSh+AgqluCLMXhM19f/cpvQAKygKAJXFl9aUjmbqs=
@@ -1361,8 +1372,8 @@ github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
-github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
-github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
+github.com/mattn/go-runewidth v0.0.23 h1:7ykA0T0jkPpzSvMS5i9uoNn2Xy3R383f9HDx3RybWcw=
+github.com/mattn/go-runewidth v0.0.23/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs=
github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk=
github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
@@ -1415,6 +1426,8 @@ github.com/moricho/tparallel v0.3.2 h1:odr8aZVFA3NZrNybggMkYO3rgPRcqjeQUlBBFVxKH
github.com/moricho/tparallel v0.3.2/go.mod h1:OQ+K3b4Ln3l2TZveGCywybl68glfLEwFGqvnjok8b+U=
github.com/morikuni/aec v1.1.0 h1:vBBl0pUnvi/Je71dsRrhMBtreIqNMYErSAbEeb8jrXQ=
github.com/morikuni/aec v1.1.0/go.mod h1:xDRgiq/iw5l+zkao76YTKzKttOp2cwPEne25HDkJnBw=
+github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA=
+github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo=
github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s=
github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8=
github.com/muesli/termenv v0.13.0/go.mod h1:sP1+uffeLaEYpyOTb8pLCUctGcGLnoFjSn4YJK5e2bc=
@@ -1447,8 +1460,8 @@ github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
-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/ginkgo/v2 v2.28.2 h1:DTrMfpqxiNUyQ3Y0zhn1n3cOO2euFgQPYIpkWwxVFps=
+github.com/onsi/ginkgo/v2 v2.28.2/go.mod h1:CLtbVInNckU3/+gC8LzkGUb9oF+e8W8TdUsxPwvdOgE=
github.com/onsi/gomega v1.39.1 h1:1IJLAad4zjPn2PsnhH70V4DKRFlrCzGBNrNaru+Vf28=
github.com/onsi/gomega v1.39.1/go.mod h1:hL6yVALoTOxeWudERyfppUcZXjMwIMLnuSfruD2lcfg=
github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.148.0 h1:CiTjQE/Hh5xK2t56ogrDK4nl0+tJPNmASCs4zEYZ/xU=
@@ -1477,8 +1490,8 @@ github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144T
github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o=
github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
-github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
-github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
+github.com/pelletier/go-toml/v2 v2.3.0 h1:k59bC/lIZREW0/iVaQR8nDHxVq8OVlIzYCOJf421CaM=
+github.com/pelletier/go-toml/v2 v2.3.0/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=
github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=
github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=
@@ -1571,6 +1584,8 @@ github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfF
github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=
github.com/ryancurrah/gomodguard v1.4.1 h1:eWC8eUMNZ/wM/PWuZBv7JxxqT5fiIKSIyTvjb7Elr+g=
github.com/ryancurrah/gomodguard v1.4.1/go.mod h1:qnMJwV1hX9m+YJseXEBhd2s90+1Xn6x9dLz11ualI1I=
+github.com/ryancurrah/gomodguard/v2 v2.1.0 h1:iIIARHe7Fsp10LY5utfMmYA++hkVuKsMFGDzxnVcijU=
+github.com/ryancurrah/gomodguard/v2 v2.1.0/go.mod h1:ryDqr6as4otkNbUp/U0m7zAsxGpwcJ9NtL6mvy9Zzdw=
github.com/ryanrolds/sqlclosecheck v0.6.0 h1:pEyL9okISdg1F1SEpJNlrEotkTGerv5BMk7U4AG0eVg=
github.com/ryanrolds/sqlclosecheck v0.6.0/go.mod h1:xyX16hsDaCMXHrMJ3JMzGf5OpDfHTOTTQrT7HOFUmeU=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
@@ -1588,14 +1603,12 @@ github.com/scaleway/scaleway-sdk-go v1.0.0-beta.36 h1:ObX9hZmK+VmijreZO/8x9pQ8/P
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.36/go.mod h1:LEsDu4BubxK7/cWhtlQWfuxwL4rf/2UEpxXz1o1EMtM=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
-github.com/securego/gosec/v2 v2.24.8-0.20260309165252-619ce2117e08 h1:AoLtJX4WUtZkhhUUMFy3GgecAALp/Mb4S1iyQOA2s0U=
-github.com/securego/gosec/v2 v2.24.8-0.20260309165252-619ce2117e08/go.mod h1:+XLCJiRE95ga77XInNELh2M6zQP+PdqiT9Zpm0D9Wpk=
+github.com/securego/gosec/v2 v2.26.1 h1:gdkttGhQFVehqRJ8grKH4DrpqM/QlPKNHBnl8QgcEC4=
+github.com/securego/gosec/v2 v2.26.1/go.mod h1:57UW4p0uoP3kxoTkhoo3axLdVAi+OWrLg/Ax/kdqtPE=
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/shoenig/test v1.12.2 h1:ZVT8NeIUwGWpZcKaepPmFMoNQ3sVpxvqUh/MAqwFiJI=
github.com/shoenig/test v1.12.2/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI=
-github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
-github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
@@ -1605,8 +1618,8 @@ github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+W
github.com/sivchari/containedctx v1.0.3/go.mod h1:c1RDvCbnJLtH4lLcYD/GqwiBSSf4F5Qk0xld2rBqzJ4=
github.com/sonatard/noctx v0.5.1 h1:wklWg9c9ZYugOAk7qG4yP4PBrlQsmSLPTvW1K4PRQMs=
github.com/sonatard/noctx v0.5.1/go.mod h1:64XdbzFb18XL4LporKXp8poqZtPKbCrqQ402CV+kJas=
-github.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCpA8G0=
-github.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs=
+github.com/sourcegraph/go-diff v0.8.0 h1:ipIyu4cTsLbIrln4l0qtHA3r0a7gyK4ntKjtQytHhvY=
+github.com/sourcegraph/go-diff v0.8.0/go.mod h1:hWlcO7Al+UZStZAP8rBumHpCK5ZHQ5BXsMls8p4+F5E=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
@@ -1672,16 +1685,16 @@ github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA
github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0=
github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag=
github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY=
-github.com/tetafro/godot v1.5.4 h1:u1ww+gqpRLiIA16yF2PV1CV1n/X3zhyezbNXC3E14Sg=
-github.com/tetafro/godot v1.5.4/go.mod h1:eOkMrVQurDui411nBY2FA05EYH01r14LuWY/NrVDVcU=
+github.com/tetafro/godot v1.5.6 h1:IEkrFCwXaYHlOn4mGzGS3F3dkP6m9t0jpwqBFPIkKiA=
+github.com/tetafro/godot v1.5.6/go.mod h1:eOkMrVQurDui411nBY2FA05EYH01r14LuWY/NrVDVcU=
github.com/theckman/yacspin v0.13.12 h1:CdZ57+n0U6JMuh2xqjnjRq5Haj6v1ner2djtLQRzJr4=
github.com/theckman/yacspin v0.13.12/go.mod h1:Rd2+oG2LmQi5f3zC3yeZAOl245z8QOvrH4OPOJNZxLg=
github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28=
-github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67 h1:9LPGD+jzxMlnk5r6+hJnar67cgpDIz/iyD+rfl5r2Vk=
-github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67/go.mod h1:mkjARE7Yr8qU23YcGMSALbIxTQ9r9QBVahQOBRfU460=
+github.com/timakin/bodyclose v0.0.0-20260129054331-73d1f95b84b4 h1:SiHe5XLTn9sFWJ5pBwJ5FN/4j34q9ZlOAD//kMoMYp0=
+github.com/timakin/bodyclose v0.0.0-20260129054331-73d1f95b84b4/go.mod h1:sDHLK7rb/59v/ZxZ7KtymgcoxuUMxjXq8gtu9VMOK8M=
github.com/timonwong/loggercheck v0.11.0 h1:jdaMpYBl+Uq9mWPXv1r8jc5fC3gyXx4/WGwTnnNKn4M=
github.com/timonwong/loggercheck v0.11.0/go.mod h1:HEAWU8djynujaAVX7QI65Myb8qgfcZ1uKbdpg3ZzKl8=
github.com/tomarrell/wrapcheck/v2 v2.12.0 h1:H/qQ1aNWz/eeIhxKAFvkfIA+N7YDvq6TWVFL27Of9is=
@@ -1736,8 +1749,8 @@ go-simpler.org/assert v0.9.0 h1:PfpmcSvL7yAnWyChSjOz6Sp6m9j5lyK8Ok9pEL31YkQ=
go-simpler.org/assert v0.9.0/go.mod h1:74Eqh5eI6vCK6Y5l3PI8ZYFXG4Sa+tkr70OIPJAUr28=
go-simpler.org/musttag v0.14.0 h1:XGySZATqQYSEV3/YTy+iX+aofbZZllJaqwFWs+RTtSo=
go-simpler.org/musttag v0.14.0/go.mod h1:uP8EymctQjJ4Z1kUnjX0u2l60WfUdQxCwSNKzE1JEOE=
-go-simpler.org/sloglint v0.11.1 h1:xRbPepLT/MHPTCA6TS/wNfZrDzkGvCCqUv4Bdwc3H7s=
-go-simpler.org/sloglint v0.11.1/go.mod h1:2PowwiCOK8mjiF+0KGifVOT8ZsCNiFzvfyJeJOIt8MQ=
+go-simpler.org/sloglint v0.12.0 h1:UzWDlLWNE5FLqsvyq3tWYHuQMbqrervOhT8qPl4Mmw4=
+go-simpler.org/sloglint v0.12.0/go.mod h1:jBjjC2bm8rYrs88oTRlFX497kWjJsyZWYoNaXkGRI6I=
go.augendre.info/arangolint v0.4.0 h1:xSCZjRoS93nXazBSg5d0OGCi9APPLNMmmLrC995tR50=
go.augendre.info/arangolint v0.4.0/go.mod h1:l+f/b4plABuFISuKnTGD4RioXiCCgghv2xqst/xOvAA=
go.augendre.info/fatcontext v0.9.0 h1:Gt5jGD4Zcj8CDMVzjOJITlSb9cEch54hjRRlN3qDojE=
@@ -1940,8 +1953,8 @@ golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0Y
golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
-golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4=
-golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA=
+golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI=
+golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q=
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -2018,8 +2031,8 @@ golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
-golang.org/x/mod v0.34.0 h1:xIHgNUUnW6sYkcM5Jleh05DvLOtwc6RitGHbDk4akRI=
-golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY=
+golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM=
+golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU=
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
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=
@@ -2115,8 +2128,8 @@ golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
-golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0=
-golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw=
+golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA=
+golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -2317,8 +2330,8 @@ golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
-golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo=
-golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
+golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI=
+golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
@@ -2355,8 +2368,8 @@ golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s=
golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g=
golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw=
golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ=
-golang.org/x/term v0.41.0 h1:QCgPso/Q3RTJx2Th4bDLqML4W6iJiaXFq2/ftQF13YU=
-golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A=
+golang.org/x/term v0.42.0 h1:UiKe+zDFmJobeJ5ggPwOshJIVt6/Ft0rcfrXZDLWAWY=
+golang.org/x/term v0.42.0/go.mod h1:Dq/D+snpsbazcBG5+F9Q1n2rXV8Ma+71xEjTRufARgY=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -2389,8 +2402,8 @@ golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
-golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8=
-golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA=
+golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg=
+golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -2483,8 +2496,8 @@ golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxb
golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c=
golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI=
golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY=
-golang.org/x/tools v0.43.0 h1:12BdW9CeB3Z+J/I/wj34VMl8X+fEXBxVR90JeMX5E7s=
-golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0=
+golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c=
+golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI=
golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM=
golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY=
golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM=
diff --git a/test/framework/context.go b/test/framework/context.go
index c1a1b64bfea..09c99b9764a 100644
--- a/test/framework/context.go
+++ b/test/framework/context.go
@@ -21,6 +21,7 @@ import (
"io"
"os"
"path/filepath"
+ "slices"
"strconv"
"strings"
"testing"
@@ -570,8 +571,8 @@ func (ctx *TestCtx) Cleanup(t *testing.T) {
t.Helper()
var eg errgroup.Group
- for i := len(ctx.cleanUpFns) - 1; i >= 0; i-- {
- eg.Go(ctx.cleanUpFns[i])
+ for _, v := range slices.Backward(ctx.cleanUpFns) {
+ eg.Go(v)
}
if err := eg.Wait(); err != nil {
From c4829891ee1fb1b8a1c854001e1b9e41aa22136f Mon Sep 17 00:00:00 2001
From: Simon Pasquier
Date: Tue, 5 May 2026 14:24:57 +0200
Subject: [PATCH 07/81] *: modernize Go code
---
cmd/operator/main.go | 3 +-
pkg/alertmanager/amcfg.go | 2 +-
pkg/alertmanager/amcfg_test.go | 290 ++---
.../clustertlsconfig/config_test.go | 25 +-
pkg/alertmanager/operator_test.go | 64 +-
pkg/alertmanager/statefulset.go | 6 +-
pkg/alertmanager/statefulset_test.go | 55 +-
.../validation/v1beta1/validation_test.go | 34 +-
.../v1alpha1/alertmanager_config_types.go | 4 +-
.../v1alpha1/prometheusagent_types.go | 3 +-
.../monitoring/v1alpha1/scrapeconfig_types.go | 3 +-
.../monitoring/v1alpha1/validation_test.go | 3 +-
.../v1beta1/alertmanager_config_types.go | 4 +-
.../monitoring/v1beta1/validation_test.go | 3 +-
pkg/k8s/network_test.go | 3 +-
pkg/k8s/pod_test.go | 5 +-
pkg/k8s/secrets_test.go | 5 +-
pkg/kubelet/controller.go | 23 +-
pkg/namespacelabeler/labeler.go | 3 +-
pkg/namespacelabeler/labeler_test.go | 5 +-
pkg/operator/config_reloader.go | 7 +-
pkg/operator/factory.go | 5 +-
pkg/operator/factory_test.go | 5 +-
pkg/prometheus/agent/daemonset.go | 8 +-
pkg/prometheus/agent/daemonset_test.go | 9 +-
pkg/prometheus/agent/statefulset.go | 10 +-
pkg/prometheus/agent/statefulset_test.go | 26 +-
pkg/prometheus/agent/test_utils.go | 6 +-
pkg/prometheus/common.go | 2 +-
pkg/prometheus/common_test.go | 46 +-
pkg/prometheus/operator_test.go | 67 +-
pkg/prometheus/promcfg.go | 2 +-
pkg/prometheus/promcfg_test.go | 1100 ++++++++---------
pkg/prometheus/resource_selector_test.go | 328 ++---
pkg/prometheus/server/operator_test.go | 25 +-
pkg/prometheus/server/statefulset.go | 16 +-
pkg/prometheus/server/statefulset_test.go | 70 +-
pkg/prometheus/validation/validator_test.go | 19 +-
pkg/thanos/operator_test.go | 10 +-
pkg/thanos/statefulset.go | 8 +-
pkg/thanos/statefulset_test.go | 26 +-
pkg/webconfig/config_test.go | 17 +-
test/e2e/alertmanager_test.go | 56 +-
.../prometheus_shard_retention_policy_test.go | 13 +-
test/e2e/prometheus_test.go | 88 +-
test/e2e/prometheusagent_test.go | 9 +-
test/e2e/repair_policy_test.go | 6 +-
test/e2e/scrapeconfig_test.go | 352 +++---
test/e2e/thanosruler_test.go | 7 +-
test/e2e/topology_sharding_test.go | 2 +-
test/framework/alertmanager.go | 7 +-
test/framework/app.go | 3 +-
test/framework/framework.go | 3 +-
test/framework/prometheus.go | 16 +-
test/framework/prometheusagent.go | 2 +-
test/framework/thanosruler.go | 4 +-
56 files changed, 1453 insertions(+), 1470 deletions(-)
diff --git a/cmd/operator/main.go b/cmd/operator/main.go
index fa1232aa4b1..036eac71a09 100644
--- a/cmd/operator/main.go
+++ b/cmd/operator/main.go
@@ -43,7 +43,6 @@ import (
"k8s.io/client-go/rest"
k8sflag "k8s.io/component-base/cli/flag"
"k8s.io/klog/v2"
- "k8s.io/utils/ptr"
crd "github.com/prometheus-operator/prometheus-operator/example"
"github.com/prometheus-operator/prometheus-operator/internal/goruntime"
@@ -131,7 +130,7 @@ var (
kubeletSyncPeriod time.Duration
kubeletHTTPMetrics bool
- featureGates = k8sflag.NewMapStringBool(ptr.To(map[string]bool{}))
+ featureGates = k8sflag.NewMapStringBool(new(map[string]bool{}))
)
func parseFlags(fs *flag.FlagSet) {
diff --git a/pkg/alertmanager/amcfg.go b/pkg/alertmanager/amcfg.go
index bce9358e84f..c6b61bfb6d4 100644
--- a/pkg/alertmanager/amcfg.go
+++ b/pkg/alertmanager/amcfg.go
@@ -1332,7 +1332,7 @@ func (cb *ConfigBuilder) convertEmailConfig(ctx context.Context, in monitoringv1
if t := in.Threading; t != nil {
out.Threading = &emailThreadingConfig{
- Enabled: ptr.To(true),
+ Enabled: new(true),
}
switch t.ThreadByDate {
case "Daily":
diff --git a/pkg/alertmanager/amcfg_test.go b/pkg/alertmanager/amcfg_test.go
index a9a1e1a6fe0..9348ad48f45 100644
--- a/pkg/alertmanager/amcfg_test.go
+++ b/pkg/alertmanager/amcfg_test.go
@@ -125,29 +125,29 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
amVersion: &version28,
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
SMTPConfig: &monitoringv1.GlobalSMTPConfig{
- From: ptr.To("from"),
+ From: new("from"),
SmartHost: &monitoringv1.HostPort{
Host: "smtp.example.org",
Port: "587",
},
- Hello: ptr.To("smtp.example.org"),
- AuthUsername: ptr.To("dev@smtp.example.org"),
+ Hello: new("smtp.example.org"),
+ AuthUsername: new("dev@smtp.example.org"),
AuthPassword: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "smtp-auth",
},
Key: "password",
},
- AuthIdentity: ptr.To("dev@smtp.example.org"),
+ AuthIdentity: new("dev@smtp.example.org"),
AuthSecret: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "smtp-auth",
},
Key: "secret",
},
- RequireTLS: ptr.To(true),
+ RequireTLS: new(true),
TLSConfig: &monitoringv1.SafeTLSConfig{
- InsecureSkipVerify: ptr.To(true),
+ InsecureSkipVerify: new(true),
MinVersion: ptr.To(monitoringv1.TLSVersion12),
MaxVersion: ptr.To(monitoringv1.TLSVersion13),
},
@@ -177,7 +177,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
"some": "value",
},
},
- FollowRedirects: ptr.To(true),
+ FollowRedirects: new(true),
},
},
},
@@ -218,7 +218,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
HTTPConfigWithProxy: &monitoringv1.HTTPConfigWithProxy{
HTTPConfig: monitoringv1.HTTPConfig{
HTTPConfigWithoutTLS: monitoringv1.HTTPConfigWithoutTLS{
- FollowRedirects: ptr.To(true),
+ FollowRedirects: new(true),
},
TLSConfig: &monitoringv1.SafeTLSConfig{
CA: monitoringv1.SecretOrConfigMap{
@@ -562,7 +562,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
{
name: "valid global config with Pagerduty URL",
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
- PagerdutyURL: ptr.To(monitoringv1.URL(pagerdutyURL)),
+ PagerdutyURL: new(monitoringv1.URL(pagerdutyURL)),
},
amConfig: &monitoringv1alpha1.AlertmanagerConfig{
ObjectMeta: metav1.ObjectMeta{
@@ -596,7 +596,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
{
name: "global config with invalid Pagerduty URL",
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
- PagerdutyURL: ptr.To(monitoringv1.URL(invalidPagerdutyURL)),
+ PagerdutyURL: new(monitoringv1.URL(invalidPagerdutyURL)),
},
amConfig: &monitoringv1alpha1.AlertmanagerConfig{
ObjectMeta: metav1.ObjectMeta{
@@ -640,7 +640,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
HTTPConfigWithProxy: &monitoringv1.HTTPConfigWithProxy{
HTTPConfig: monitoringv1.HTTPConfig{
HTTPConfigWithoutTLS: monitoringv1.HTTPConfigWithoutTLS{
- FollowRedirects: ptr.To(true),
+ FollowRedirects: new(true),
},
},
},
@@ -672,12 +672,12 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
HTTPConfigWithProxy: &monitoringv1.HTTPConfigWithProxy{
HTTPConfig: monitoringv1.HTTPConfig{
HTTPConfigWithoutTLS: monitoringv1.HTTPConfigWithoutTLS{
- FollowRedirects: ptr.To(true),
+ FollowRedirects: new(true),
},
},
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://example.com"),
- NoProxy: ptr.To("svc.cluster.local"),
+ ProxyURL: new("http://example.com"),
+ NoProxy: new("svc.cluster.local"),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -718,8 +718,8 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
HTTPConfigWithProxy: &monitoringv1.HTTPConfigWithProxy{
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://example.com"),
- NoProxy: ptr.To("svc.cluster.local"),
+ ProxyURL: new("http://example.com"),
+ NoProxy: new("svc.cluster.local"),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -733,7 +733,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
},
HTTPConfig: monitoringv1.HTTPConfig{
HTTPConfigWithoutTLS: monitoringv1.HTTPConfigWithoutTLS{
- FollowRedirects: ptr.To(true),
+ FollowRedirects: new(true),
},
},
},
@@ -765,8 +765,8 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
HTTPConfigWithProxy: &monitoringv1.HTTPConfigWithProxy{
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://example.com"),
- NoProxy: ptr.To("svc.cluster.local"),
+ ProxyURL: new("http://example.com"),
+ NoProxy: new("svc.cluster.local"),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -780,7 +780,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
},
HTTPConfig: monitoringv1.HTTPConfig{
HTTPConfigWithoutTLS: monitoringv1.HTTPConfigWithoutTLS{
- FollowRedirects: ptr.To(true),
+ FollowRedirects: new(true),
},
},
},
@@ -839,29 +839,29 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
amVersion: &version28,
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
SMTPConfig: &monitoringv1.GlobalSMTPConfig{
- From: ptr.To("from"),
+ From: new("from"),
SmartHost: &monitoringv1.HostPort{
Host: "smtp.example.org",
Port: "587",
},
- Hello: ptr.To("smtp.example.org"),
- AuthUsername: ptr.To("dev@smtp.example.org"),
+ Hello: new("smtp.example.org"),
+ AuthUsername: new("dev@smtp.example.org"),
AuthPassword: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "smtp-auth",
},
Key: "password",
},
- AuthIdentity: ptr.To("dev@smtp.example.org"),
+ AuthIdentity: new("dev@smtp.example.org"),
AuthSecret: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "smtp-auth",
},
Key: "secret",
},
- RequireTLS: ptr.To(true),
+ RequireTLS: new(true),
TLSConfig: &monitoringv1.SafeTLSConfig{
- InsecureSkipVerify: ptr.To(true),
+ InsecureSkipVerify: new(true),
MinVersion: ptr.To(monitoringv1.TLSVersion12),
MaxVersion: ptr.To(monitoringv1.TLSVersion13),
},
@@ -881,11 +881,11 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
Name: "myreceiver",
EmailConfigs: []monitoringv1alpha1.EmailConfig{
{
- SendResolved: ptr.To(true),
- Smarthost: ptr.To("abc:1234"),
- From: ptr.To("a"),
- To: ptr.To("b"),
- AuthUsername: ptr.To("foo"),
+ SendResolved: new(true),
+ Smarthost: new("abc:1234"),
+ From: new("a"),
+ To: new("b"),
+ AuthUsername: new("foo"),
},
},
},
@@ -910,29 +910,29 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
amVersion: &version21,
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
SMTPConfig: &monitoringv1.GlobalSMTPConfig{
- From: ptr.To("from"),
+ From: new("from"),
SmartHost: &monitoringv1.HostPort{
Host: "smtp.example.org",
Port: "587",
},
- Hello: ptr.To("smtp.example.org"),
- AuthUsername: ptr.To("dev@smtp.example.org"),
+ Hello: new("smtp.example.org"),
+ AuthUsername: new("dev@smtp.example.org"),
AuthPassword: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "smtp-auth",
},
Key: "password",
},
- AuthIdentity: ptr.To("dev@smtp.example.org"),
+ AuthIdentity: new("dev@smtp.example.org"),
AuthSecret: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "smtp-auth",
},
Key: "secret",
},
- RequireTLS: ptr.To(true),
+ RequireTLS: new(true),
TLSConfig: &monitoringv1.SafeTLSConfig{
- InsecureSkipVerify: ptr.To(true),
+ InsecureSkipVerify: new(true),
MinVersion: ptr.To(monitoringv1.TLSVersion12),
MaxVersion: ptr.To(monitoringv1.TLSVersion13),
},
@@ -962,7 +962,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
"some": "value",
},
},
- FollowRedirects: ptr.To(true),
+ FollowRedirects: new(true),
},
},
},
@@ -1001,7 +1001,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
amVersion: &version31,
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
SMTPConfig: &monitoringv1.GlobalSMTPConfig{
- ForceImplicitTLS: ptr.To(true),
+ ForceImplicitTLS: new(true),
},
},
amConfig: &monitoringv1alpha1.AlertmanagerConfig{
@@ -1038,7 +1038,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
amVersion: &version28,
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
SMTPConfig: &monitoringv1.GlobalSMTPConfig{
- ForceImplicitTLS: ptr.To(true),
+ ForceImplicitTLS: new(true),
},
},
amConfig: &monitoringv1alpha1.AlertmanagerConfig{
@@ -1075,7 +1075,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
amVersion: &version28,
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
TelegramConfig: &monitoringv1.GlobalTelegramConfig{
- APIURL: ptr.To(monitoringv1.URL(telegramAPIURL)),
+ APIURL: new(monitoringv1.URL(telegramAPIURL)),
},
},
amConfig: &monitoringv1alpha1.AlertmanagerConfig{
@@ -1112,7 +1112,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
amVersion: &version28,
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
TelegramConfig: &monitoringv1.GlobalTelegramConfig{
- APIURL: ptr.To(monitoringv1.URL(invalidTelegramAPIURL)),
+ APIURL: new(monitoringv1.URL(invalidTelegramAPIURL)),
},
},
amConfig: &monitoringv1alpha1.AlertmanagerConfig{
@@ -1149,7 +1149,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
amVersion: &version21,
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
TelegramConfig: &monitoringv1.GlobalTelegramConfig{
- APIURL: ptr.To(monitoringv1.URL(telegramAPIURL)),
+ APIURL: new(monitoringv1.URL(telegramAPIURL)),
},
},
amConfig: &monitoringv1alpha1.AlertmanagerConfig{
@@ -1186,7 +1186,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
amVersion: &version28,
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
JiraConfig: &monitoringv1.GlobalJiraConfig{
- APIURL: ptr.To(monitoringv1.URL(jiraAPIURL)),
+ APIURL: new(monitoringv1.URL(jiraAPIURL)),
},
},
amConfig: &monitoringv1alpha1.AlertmanagerConfig{
@@ -1223,7 +1223,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
amVersion: &version28,
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
JiraConfig: &monitoringv1.GlobalJiraConfig{
- APIURL: ptr.To(monitoringv1.URL(invalidJiraAPIURL)),
+ APIURL: new(monitoringv1.URL(invalidJiraAPIURL)),
},
},
amConfig: &monitoringv1alpha1.AlertmanagerConfig{
@@ -1260,7 +1260,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
amVersion: &version26,
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
JiraConfig: &monitoringv1.GlobalJiraConfig{
- APIURL: ptr.To(monitoringv1.URL(jiraAPIURL)),
+ APIURL: new(monitoringv1.URL(jiraAPIURL)),
},
},
amConfig: &monitoringv1alpha1.AlertmanagerConfig{
@@ -1297,7 +1297,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
amVersion: &version28,
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
RocketChatConfig: &monitoringv1.GlobalRocketChatConfig{
- APIURL: ptr.To(monitoringv1.URL(rocketChatAPIURL)),
+ APIURL: new(monitoringv1.URL(rocketChatAPIURL)),
Token: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "rocketchat",
@@ -1346,7 +1346,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
amVersion: &version28,
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
RocketChatConfig: &monitoringv1.GlobalRocketChatConfig{
- APIURL: ptr.To(monitoringv1.URL(invalidRocketChatAPIURL)),
+ APIURL: new(monitoringv1.URL(invalidRocketChatAPIURL)),
Token: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "rocketchat",
@@ -1395,7 +1395,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
amVersion: &version28,
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
RocketChatConfig: &monitoringv1.GlobalRocketChatConfig{
- APIURL: ptr.To(monitoringv1.URL(rocketChatAPIURL)),
+ APIURL: new(monitoringv1.URL(rocketChatAPIURL)),
Token: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "rocketchat-missing",
@@ -1444,7 +1444,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
amVersion: &version28,
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
RocketChatConfig: &monitoringv1.GlobalRocketChatConfig{
- APIURL: ptr.To(monitoringv1.URL(rocketChatAPIURL)),
+ APIURL: new(monitoringv1.URL(rocketChatAPIURL)),
Token: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "rocketchat",
@@ -1493,7 +1493,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
amVersion: &version26,
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
RocketChatConfig: &monitoringv1.GlobalRocketChatConfig{
- APIURL: ptr.To(monitoringv1.URL(rocketChatAPIURL)),
+ APIURL: new(monitoringv1.URL(rocketChatAPIURL)),
Token: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "rocketchat",
@@ -1542,7 +1542,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
amVersion: &version28,
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
WebexConfig: &monitoringv1.GlobalWebexConfig{
- APIURL: ptr.To(monitoringv1.URL(webexAPIURL)),
+ APIURL: new(monitoringv1.URL(webexAPIURL)),
},
},
amConfig: &monitoringv1alpha1.AlertmanagerConfig{
@@ -1579,7 +1579,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
amVersion: &version28,
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
WebexConfig: &monitoringv1.GlobalWebexConfig{
- APIURL: ptr.To(monitoringv1.URL(invalidWebexAPIURL)),
+ APIURL: new(monitoringv1.URL(invalidWebexAPIURL)),
},
},
amConfig: &monitoringv1alpha1.AlertmanagerConfig{
@@ -1616,7 +1616,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
amVersion: &version24,
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
WebexConfig: &monitoringv1.GlobalWebexConfig{
- APIURL: ptr.To(monitoringv1.URL(webexAPIURL)),
+ APIURL: new(monitoringv1.URL(webexAPIURL)),
},
},
amConfig: &monitoringv1alpha1.AlertmanagerConfig{
@@ -1653,7 +1653,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
amVersion: &version28,
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
WeChatConfig: &monitoringv1.GlobalWeChatConfig{
- APIURL: ptr.To(monitoringv1.URL(weChatAPIURL)),
+ APIURL: new(monitoringv1.URL(weChatAPIURL)),
APISecret: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "wechat",
@@ -1697,7 +1697,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
amVersion: &version28,
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
WeChatConfig: &monitoringv1.GlobalWeChatConfig{
- APIURL: ptr.To(monitoringv1.URL(invalidWeChatAPIURL)),
+ APIURL: new(monitoringv1.URL(invalidWeChatAPIURL)),
APISecret: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "wechat",
@@ -1741,7 +1741,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
amVersion: &version28,
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
WeChatConfig: &monitoringv1.GlobalWeChatConfig{
- APIURL: ptr.To(monitoringv1.URL(weChatAPIURL)),
+ APIURL: new(monitoringv1.URL(weChatAPIURL)),
APISecret: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "wechat-missing",
@@ -1785,7 +1785,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
amVersion: &version28,
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
VictorOpsConfig: &monitoringv1.GlobalVictorOpsConfig{
- APIURL: ptr.To(monitoringv1.URL(victorOpsAPIURL)),
+ APIURL: new(monitoringv1.URL(victorOpsAPIURL)),
APIKey: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "victorops",
@@ -1828,7 +1828,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
amVersion: &version28,
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
VictorOpsConfig: &monitoringv1.GlobalVictorOpsConfig{
- APIURL: ptr.To(monitoringv1.URL(invalidVictorOpsAPIURL)),
+ APIURL: new(monitoringv1.URL(invalidVictorOpsAPIURL)),
APIKey: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "victorops",
@@ -1871,7 +1871,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
amVersion: &version28,
globalConfig: &monitoringv1.AlertmanagerGlobalConfig{
VictorOpsConfig: &monitoringv1.GlobalVictorOpsConfig{
- APIURL: ptr.To(monitoringv1.URL(victorOpsAPIURL)),
+ APIURL: new(monitoringv1.URL(victorOpsAPIURL)),
APIKey: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "victorops-missing",
@@ -2078,7 +2078,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) {
Key: "test",
},
},
- FollowRedirects: ptr.To(true),
+ FollowRedirects: new(true),
},
},
},
@@ -2328,7 +2328,7 @@ func TestGenerateConfig(t *testing.T) {
kclient: fake.NewClientset(),
baseConfig: alertmanagerConfig{
Global: &globalConfig{
- SMTPRequireTLS: ptr.To(false),
+ SMTPRequireTLS: new(false),
},
Route: &route{Receiver: "null"},
Receivers: []*receiver{{Name: "null"}},
@@ -2340,7 +2340,7 @@ func TestGenerateConfig(t *testing.T) {
kclient: fake.NewClientset(),
baseConfig: alertmanagerConfig{
Global: &globalConfig{
- SMTPRequireTLS: ptr.To(true),
+ SMTPRequireTLS: new(true),
},
Route: &route{Receiver: "null"},
Receivers: []*receiver{{Name: "null"}},
@@ -2885,15 +2885,15 @@ func TestGenerateConfig(t *testing.T) {
},
PagerDutyImageConfigs: []monitoringv1alpha1.PagerDutyImageConfig{
{
- Src: ptr.To("https://some-image.com"),
- Href: ptr.To("https://some-image.com"),
- Alt: ptr.To("some-image"),
+ Src: new("https://some-image.com"),
+ Href: new("https://some-image.com"),
+ Alt: new("some-image"),
},
},
PagerDutyLinkConfigs: []monitoringv1alpha1.PagerDutyLinkConfig{
{
- Href: ptr.To("https://some-link.com"),
- Text: ptr.To("some-link"),
+ Href: new("https://some-link.com"),
+ Text: new("some-link"),
},
},
}},
@@ -2944,7 +2944,7 @@ func TestGenerateConfig(t *testing.T) {
Receivers: []monitoringv1alpha1.Receiver{{
Name: "test",
WebhookConfigs: []monitoringv1alpha1.WebhookConfig{{
- URL: ptr.To("http://test.url"),
+ URL: new("http://test.url"),
HTTPConfig: &monitoringv1alpha1.HTTPConfig{
OAuth2: &monitoringv1.OAuth2{
ClientID: monitoringv1.SecretOrConfigMap{
@@ -2967,7 +2967,7 @@ func TestGenerateConfig(t *testing.T) {
"some": "value",
},
},
- FollowRedirects: ptr.To(true),
+ FollowRedirects: new(true),
},
}},
}},
@@ -3060,7 +3060,7 @@ func TestGenerateConfig(t *testing.T) {
Key: "apiKey",
},
Responders: []monitoringv1alpha1.OpsGenieConfigResponder{{
- Name: ptr.To("myname"),
+ Name: new("myname"),
Type: "team",
}},
}},
@@ -3154,7 +3154,7 @@ func TestGenerateConfig(t *testing.T) {
},
Key: "apiSecret",
},
- CorpID: ptr.To("wechatcorpid"),
+ CorpID: new("wechatcorpid"),
}},
}},
},
@@ -3215,9 +3215,9 @@ func TestGenerateConfig(t *testing.T) {
},
Key: "token",
},
- Retry: ptr.To("5m"),
- Expire: ptr.To("30s"),
- HTML: ptr.To(true),
+ Retry: new("5m"),
+ Expire: new("30s"),
+ HTML: new(true),
}},
}},
},
@@ -3303,7 +3303,7 @@ func TestGenerateConfig(t *testing.T) {
{
Type: "type",
Text: "text",
- Name: ptr.To("my-action"),
+ Name: new("my-action"),
ConfirmField: &monitoringv1alpha1.SlackConfirmationField{
Text: "text",
},
@@ -3347,7 +3347,7 @@ func TestGenerateConfig(t *testing.T) {
Receivers: []monitoringv1alpha1.Receiver{{
Name: "test",
SlackConfigs: []monitoringv1alpha1.SlackConfig{{
- Channel: ptr.To("#alerts"),
+ Channel: new("#alerts"),
TitleLink: "https://example.com/title",
IconURL: "https://example.com/icon.png",
ImageURL: "https://example.com/image.png",
@@ -3388,7 +3388,7 @@ func TestGenerateConfig(t *testing.T) {
{
Type: "type",
Text: "text",
- Name: ptr.To("my-action"),
+ Name: new("my-action"),
ConfirmField: &monitoringv1alpha1.SlackConfirmationField{
Text: "text",
},
@@ -3433,7 +3433,7 @@ func TestGenerateConfig(t *testing.T) {
Receivers: []monitoringv1alpha1.Receiver{{
Name: "test",
SlackConfigs: []monitoringv1alpha1.SlackConfig{{
- MessageText: ptr.To("test message text"),
+ MessageText: new("test message text"),
}},
}},
},
@@ -3474,7 +3474,7 @@ func TestGenerateConfig(t *testing.T) {
Name: "test",
SNSConfigs: []monitoringv1alpha1.SNSConfig{
{
- ApiURL: ptr.To("https://sns.us-east-2.amazonaws.com"),
+ ApiURL: new("https://sns.us-east-2.amazonaws.com"),
Sigv4: &monitoringv1.Sigv4{
Region: "us-east-2",
AccessKey: &corev1.SecretKeySelector{
@@ -3490,7 +3490,7 @@ func TestGenerateConfig(t *testing.T) {
Key: "secret",
},
},
- TopicARN: ptr.To("test-topicARN"),
+ TopicARN: new("test-topicARN"),
},
},
}},
@@ -3532,12 +3532,12 @@ func TestGenerateConfig(t *testing.T) {
Name: "test",
SNSConfigs: []monitoringv1alpha1.SNSConfig{
{
- ApiURL: ptr.To("https://sns.us-east-2.amazonaws.com"),
+ ApiURL: new("https://sns.us-east-2.amazonaws.com"),
Sigv4: &monitoringv1.Sigv4{
Region: "us-east-2",
RoleArn: "test-roleARN",
},
- TopicARN: ptr.To("test-topicARN"),
+ TopicARN: new("test-topicARN"),
},
},
}},
@@ -3580,13 +3580,13 @@ func TestGenerateConfig(t *testing.T) {
Name: "test",
SNSConfigs: []monitoringv1alpha1.SNSConfig{
{
- ApiURL: ptr.To("https://sns.us-east-2.amazonaws.com"),
+ ApiURL: new("https://sns.us-east-2.amazonaws.com"),
Sigv4: &monitoringv1.Sigv4{
Region: "us-east-2",
RoleArn: "test-roleARN",
ExternalID: "test-externalId",
},
- TopicARN: ptr.To("test-topicARN"),
+ TopicARN: new("test-topicARN"),
},
},
}},
@@ -3629,13 +3629,13 @@ func TestGenerateConfig(t *testing.T) {
Name: "test",
SNSConfigs: []monitoringv1alpha1.SNSConfig{
{
- ApiURL: ptr.To("https://sns.us-east-2.amazonaws.com"),
+ ApiURL: new("https://sns.us-east-2.amazonaws.com"),
Sigv4: &monitoringv1.Sigv4{
Region: "us-east-2",
RoleArn: "test-roleARN",
ExternalID: "test-externalId",
},
- TopicARN: ptr.To("test-topicARN"),
+ TopicARN: new("test-topicARN"),
},
},
}},
@@ -3705,7 +3705,7 @@ func TestGenerateConfig(t *testing.T) {
{
Type: "type",
Text: "text",
- Name: ptr.To("my-action"),
+ Name: new("my-action"),
ConfirmField: &monitoringv1alpha1.SlackConfirmationField{
Text: "text",
},
@@ -3786,7 +3786,7 @@ func TestGenerateConfig(t *testing.T) {
{
Type: "type",
Text: "text",
- Name: ptr.To("my-action"),
+ Name: new("my-action"),
ConfirmField: &monitoringv1alpha1.SlackConfirmationField{
Text: "text",
},
@@ -3846,8 +3846,8 @@ func TestGenerateConfig(t *testing.T) {
Name: "ms-teams-secret",
},
},
- Title: ptr.To("test title"),
- Text: ptr.To("test text"),
+ Title: new("test title"),
+ Text: new("test text"),
},
},
},
@@ -3898,9 +3898,9 @@ func TestGenerateConfig(t *testing.T) {
Name: "ms-teams-secret",
},
},
- Title: ptr.To("test title"),
- Summary: ptr.To("test summary"),
- Text: ptr.To("test text"),
+ Title: new("test title"),
+ Summary: new("test summary"),
+ Text: new("test text"),
},
},
},
@@ -4001,8 +4001,8 @@ func TestGenerateConfig(t *testing.T) {
Name: "ms-teams-secret",
},
},
- Title: ptr.To("test title"),
- Text: ptr.To("test text"),
+ Title: new("test title"),
+ Text: new("test text"),
},
},
},
@@ -4087,9 +4087,9 @@ func TestGenerateConfig(t *testing.T) {
Name: "test",
EmailConfigs: []monitoringv1alpha1.EmailConfig{
{
- Smarthost: ptr.To("example.com:25"),
- From: ptr.To("admin@example.com"),
- To: ptr.To("customers@example.com"),
+ Smarthost: new("example.com:25"),
+ From: new("admin@example.com"),
+ To: new("customers@example.com"),
},
},
},
@@ -4124,8 +4124,8 @@ func TestGenerateConfig(t *testing.T) {
Name: "test",
EmailConfigs: []monitoringv1alpha1.EmailConfig{
{
- From: ptr.To("admin@example.com"),
- To: ptr.To("customers@example.com"),
+ From: new("admin@example.com"),
+ To: new("customers@example.com"),
},
},
},
@@ -4160,8 +4160,8 @@ func TestGenerateConfig(t *testing.T) {
Name: "test",
EmailConfigs: []monitoringv1alpha1.EmailConfig{
{
- From: ptr.To("admin@example.com"),
- To: ptr.To("customers@example.com"),
+ From: new("admin@example.com"),
+ To: new("customers@example.com"),
},
},
},
@@ -4203,7 +4203,7 @@ func TestGenerateConfig(t *testing.T) {
Name: "test",
EmailConfigs: []monitoringv1alpha1.EmailConfig{
{
- To: ptr.To("customers@example.com"),
+ To: new("customers@example.com"),
},
},
},
@@ -4238,10 +4238,10 @@ func TestGenerateConfig(t *testing.T) {
Name: "test",
EmailConfigs: []monitoringv1alpha1.EmailConfig{
{
- Smarthost: ptr.To("example.com:25"),
- From: ptr.To("admin@example.com"),
- To: ptr.To("customers@example.com"),
- ForceImplicitTLS: ptr.To(true),
+ Smarthost: new("example.com:25"),
+ From: new("admin@example.com"),
+ To: new("customers@example.com"),
+ ForceImplicitTLS: new(true),
},
},
},
@@ -4276,9 +4276,9 @@ func TestGenerateConfig(t *testing.T) {
Name: "test",
EmailConfigs: []monitoringv1alpha1.EmailConfig{
{
- Smarthost: ptr.To("example.com:25"),
- From: ptr.To("admin@example.com"),
- To: ptr.To("customers@example.com"),
+ Smarthost: new("example.com:25"),
+ From: new("admin@example.com"),
+ To: new("customers@example.com"),
Threading: &monitoringv1alpha1.EmailThreadingConfig{
ThreadByDate: monitoringv1alpha1.ThreadByDateTypeDaily,
},
@@ -4316,7 +4316,7 @@ func TestGenerateConfig(t *testing.T) {
Name: "test",
WebhookConfigs: []monitoringv1alpha1.WebhookConfig{
{
- URL: ptr.To("https://example.com/"),
+ URL: new("https://example.com/"),
Timeout: ptr.To(monitoringv1.Duration("5s")),
},
},
@@ -4352,7 +4352,7 @@ func TestGenerateConfig(t *testing.T) {
Name: "test",
WebhookConfigs: []monitoringv1alpha1.WebhookConfig{
{
- URL: ptr.To("https://example.com/"),
+ URL: new("https://example.com/"),
Timeout: ptr.To(monitoringv1.Duration("5s")),
},
},
@@ -4549,7 +4549,7 @@ func TestSanitizeConfig(t *testing.T) {
againstVersion: versionGlobalSMTPForceImplicitTLSAllowed,
in: &alertmanagerConfig{
Global: &globalConfig{
- SMTPForceImplicitTLS: ptr.To(true),
+ SMTPForceImplicitTLS: new(true),
},
},
golden: "test_smtp_force_implicit_tls_added_for_supported_version.golden",
@@ -4559,7 +4559,7 @@ func TestSanitizeConfig(t *testing.T) {
againstVersion: versionGlobalSMTPForceImplicitTLSNotAllowed,
in: &alertmanagerConfig{
Global: &globalConfig{
- SMTPForceImplicitTLS: ptr.To(true),
+ SMTPForceImplicitTLS: new(true),
},
},
golden: "test_smtp_force_implicit_tls_dropped_for_unsupported_version.golden",
@@ -4793,7 +4793,7 @@ func TestSanitizeConfig(t *testing.T) {
{
SlackConfigs: []*slackConfig{
{
- UpdateMessage: ptr.To(true),
+ UpdateMessage: new(true),
},
},
},
@@ -4809,7 +4809,7 @@ func TestSanitizeConfig(t *testing.T) {
{
SlackConfigs: []*slackConfig{
{
- UpdateMessage: ptr.To(true),
+ UpdateMessage: new(true),
},
},
},
@@ -5883,7 +5883,7 @@ func TestHTTPClientConfig(t *testing.T) {
ProxyURL: "http://example.com/",
},
},
- EnableHTTP2: ptr.To(false),
+ EnableHTTP2: new(false),
TLSConfig: &tlsConfig{
MinVersion: "TLS12",
MaxVersion: "TLS12",
@@ -5949,7 +5949,7 @@ func TestHTTPClientConfig(t *testing.T) {
ProxyURL: "http://example.com/",
},
},
- EnableHTTP2: ptr.To(false),
+ EnableHTTP2: new(false),
TLSConfig: &tlsConfig{
MinVersion: "TLS13",
MaxVersion: "TLS12",
@@ -5970,7 +5970,7 @@ func TestHTTPClientConfig(t *testing.T) {
ProxyURL: "http://example.com/",
},
},
- EnableHTTP2: ptr.To(false),
+ EnableHTTP2: new(false),
TLSConfig: &tlsConfig{
MinVersion: "TLS14",
},
@@ -5990,7 +5990,7 @@ func TestHTTPClientConfig(t *testing.T) {
ProxyURL: "http://example.com/",
},
},
- EnableHTTP2: ptr.To(false),
+ EnableHTTP2: new(false),
TLSConfig: &tlsConfig{
MaxVersion: "TLS14",
},
@@ -6010,7 +6010,7 @@ func TestHTTPClientConfig(t *testing.T) {
ProxyURL: "http://example.com/",
},
},
- EnableHTTP2: ptr.To(false),
+ EnableHTTP2: new(false),
TLSConfig: &tlsConfig{
MinVersion: "TLS12",
MaxVersion: "TLS12",
@@ -6033,7 +6033,7 @@ func TestHTTPClientConfig(t *testing.T) {
ProxyFromEnvironment: true,
},
},
- EnableHTTP2: ptr.To(false),
+ EnableHTTP2: new(false),
},
againstVersion: httpConfigV25NotAllowed,
golden: "test_HTTP_client_config_oauth2_proxyConfig_fields_dropped_before_v0_25_0.golden",
@@ -6409,8 +6409,8 @@ func TestSanitizePushoverReceiverConfig(t *testing.T) {
{
UserKey: "foo",
Token: "bar",
- HTML: ptr.To(true),
- Monospace: ptr.To(true),
+ HTML: new(true),
+ Monospace: new(true),
},
},
},
@@ -6428,7 +6428,7 @@ func TestSanitizePushoverReceiverConfig(t *testing.T) {
{
UserKey: "foo",
Token: "bar",
- HTML: ptr.To(true),
+ HTML: new(true),
},
},
},
@@ -6446,7 +6446,7 @@ func TestSanitizePushoverReceiverConfig(t *testing.T) {
{
UserKey: "foo",
Token: "bar",
- Monospace: ptr.To(true),
+ Monospace: new(true),
},
},
},
@@ -6464,7 +6464,7 @@ func TestSanitizePushoverReceiverConfig(t *testing.T) {
{
UserKey: "foo",
Token: "bar",
- Monospace: ptr.To(true),
+ Monospace: new(true),
},
},
},
@@ -6576,7 +6576,7 @@ func TestSanitizeEmailConfig(t *testing.T) {
{
EmailConfigs: []*emailConfig{
{
- ForceImplicitTLS: ptr.To(true),
+ ForceImplicitTLS: new(true),
},
},
},
@@ -6592,7 +6592,7 @@ func TestSanitizeEmailConfig(t *testing.T) {
{
EmailConfigs: []*emailConfig{
{
- ForceImplicitTLS: ptr.To(true),
+ ForceImplicitTLS: new(true),
},
},
},
@@ -6658,7 +6658,7 @@ func TestSanitizeEmailConfig(t *testing.T) {
EmailConfigs: []*emailConfig{
{
Threading: &emailThreadingConfig{
- Enabled: ptr.To(true),
+ Enabled: new(true),
ThreadByDate: "daily",
},
},
@@ -6677,7 +6677,7 @@ func TestSanitizeEmailConfig(t *testing.T) {
EmailConfigs: []*emailConfig{
{
Threading: &emailThreadingConfig{
- Enabled: ptr.To(true),
+ Enabled: new(true),
ThreadByDate: "daily",
},
},
@@ -6696,7 +6696,7 @@ func TestSanitizeEmailConfig(t *testing.T) {
EmailConfigs: []*emailConfig{
{
Threading: &emailThreadingConfig{
- Enabled: ptr.To(true),
+ Enabled: new(true),
ThreadByDate: "",
},
},
@@ -7494,7 +7494,7 @@ func TestSanitizeJiraConfig(t *testing.T) {
APIURL: "http://issues.example.com",
Project: "Monitoring",
IssueType: "Bug",
- SendResolved: ptr.To(true),
+ SendResolved: new(true),
},
},
},
@@ -7750,7 +7750,7 @@ func TestSanitizeRocketChatConfig(t *testing.T) {
RocketChatConfigs: []*rocketChatConfig{
{
APIURL: "http://example.com",
- SendResolved: ptr.To(true),
+ SendResolved: new(true),
},
},
},
@@ -7784,7 +7784,7 @@ func TestSanitizeRocketChatConfig(t *testing.T) {
RocketChatConfigs: []*rocketChatConfig{
{
APIURL: "http://example.com",
- Token: ptr.To("aaaa-bbbb-cccc-dddd"),
+ Token: new("aaaa-bbbb-cccc-dddd"),
TokenFile: "/var/kubernetes/secrets/token",
},
},
@@ -7802,7 +7802,7 @@ func TestSanitizeRocketChatConfig(t *testing.T) {
RocketChatConfigs: []*rocketChatConfig{
{
APIURL: "http://example.com",
- TokenID: ptr.To("t123456"),
+ TokenID: new("t123456"),
TokenIDFile: "/var/kubernetes/secrets/token-id",
},
},
@@ -8263,7 +8263,7 @@ func TestConvertHTTPConfig(t *testing.T) {
{
name: "proxyURL only",
cfg: monitoringv1alpha1.HTTPConfig{
- ProxyURLOriginal: ptr.To("http://example.com"),
+ ProxyURLOriginal: new("http://example.com"),
},
golden: "proxy_url_only.golden",
},
@@ -8271,7 +8271,7 @@ func TestConvertHTTPConfig(t *testing.T) {
name: "proxyUrl only",
cfg: monitoringv1alpha1.HTTPConfig{
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://example.com"),
+ ProxyURL: new("http://example.com"),
},
},
golden: "proxy_config_only.golden",
@@ -8279,9 +8279,9 @@ func TestConvertHTTPConfig(t *testing.T) {
{
name: "proxyUrl and proxyURL",
cfg: monitoringv1alpha1.HTTPConfig{
- ProxyURLOriginal: ptr.To("http://example.com"),
+ ProxyURLOriginal: new("http://example.com"),
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://bad.example.com"),
+ ProxyURL: new("http://bad.example.com"),
},
},
golden: "proxy_url_and_proxy_config.golden",
@@ -8289,9 +8289,9 @@ func TestConvertHTTPConfig(t *testing.T) {
{
name: "proxyUrl and empty proxyURL",
cfg: monitoringv1alpha1.HTTPConfig{
- ProxyURLOriginal: ptr.To(""),
+ ProxyURLOriginal: new(""),
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://example.com"),
+ ProxyURL: new("http://example.com"),
},
},
golden: "proxy_url_empty_proxy_config.golden",
@@ -8299,14 +8299,14 @@ func TestConvertHTTPConfig(t *testing.T) {
{
name: "enableHTTP2",
cfg: monitoringv1alpha1.HTTPConfig{
- EnableHTTP2: ptr.To(false),
+ EnableHTTP2: new(false),
},
golden: "http_config_enable_http2_supported.golden",
},
{
name: "enableHTTP2 not supported",
cfg: monitoringv1alpha1.HTTPConfig{
- EnableHTTP2: ptr.To(false),
+ EnableHTTP2: new(false),
},
version: "v0.24.0",
golden: "http_config_enable_http2_not_supported.golden",
diff --git a/pkg/alertmanager/clustertlsconfig/config_test.go b/pkg/alertmanager/clustertlsconfig/config_test.go
index 0b9340a6c67..bfbf43a18b1 100644
--- a/pkg/alertmanager/clustertlsconfig/config_test.go
+++ b/pkg/alertmanager/clustertlsconfig/config_test.go
@@ -21,7 +21,6 @@ import (
"gotest.tools/v3/golden"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
- "k8s.io/utils/ptr"
"github.com/prometheus-operator/prometheus-operator/pkg/alertmanager/clustertlsconfig"
monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
@@ -59,7 +58,7 @@ func TestCreateOrUpdateClusterTLSConfigSecret(t *testing.T) {
},
},
ClientTLS: monitoringv1.SafeTLSConfig{
- InsecureSkipVerify: ptr.To(true),
+ InsecureSkipVerify: new(true),
CA: monitoringv1.SecretOrConfigMap{
Secret: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
@@ -106,7 +105,7 @@ func TestCreateOrUpdateClusterTLSConfigSecret(t *testing.T) {
},
},
ClientTLS: monitoringv1.SafeTLSConfig{
- InsecureSkipVerify: ptr.To(true),
+ InsecureSkipVerify: new(true),
CA: monitoringv1.SecretOrConfigMap{
Secret: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
@@ -161,7 +160,7 @@ func TestCreateOrUpdateClusterTLSConfigSecret(t *testing.T) {
},
},
ClientTLS: monitoringv1.SafeTLSConfig{
- InsecureSkipVerify: ptr.To(true),
+ InsecureSkipVerify: new(true),
CA: monitoringv1.SecretOrConfigMap{
Secret: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
@@ -214,15 +213,15 @@ func TestCreateOrUpdateClusterTLSConfigSecret(t *testing.T) {
},
Key: "tls.keySecret",
},
- ClientAuthType: ptr.To("RequireAnyClientCert"),
- MinVersion: ptr.To("TLS11"),
- MaxVersion: ptr.To("TLS13"),
+ ClientAuthType: new("RequireAnyClientCert"),
+ MinVersion: new("TLS11"),
+ MaxVersion: new("TLS13"),
CipherSuites: []string{"cipher-1", "cipher-2"},
- PreferServerCipherSuites: ptr.To(false),
+ PreferServerCipherSuites: new(false),
CurvePreferences: []string{"curve-1", "curve-2"},
},
ClientTLS: monitoringv1.SafeTLSConfig{
- InsecureSkipVerify: ptr.To(true),
+ InsecureSkipVerify: new(true),
CA: monitoringv1.SecretOrConfigMap{
Secret: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
@@ -253,12 +252,12 @@ func TestCreateOrUpdateClusterTLSConfigSecret(t *testing.T) {
name: "cluster tls config with server client CA, cert and key files",
clusterTLSConfig: &monitoringv1.ClusterTLSConfig{
ServerTLS: monitoringv1.WebTLSConfig{
- ClientCAFile: ptr.To("/etc/ssl/certs/tls.client_ca"),
- CertFile: ptr.To("/etc/ssl/certs/tls.crt"),
- KeyFile: ptr.To("/etc/ssl/secrets/tls.key"),
+ ClientCAFile: new("/etc/ssl/certs/tls.client_ca"),
+ CertFile: new("/etc/ssl/certs/tls.crt"),
+ KeyFile: new("/etc/ssl/secrets/tls.key"),
},
ClientTLS: monitoringv1.SafeTLSConfig{
- InsecureSkipVerify: ptr.To(true),
+ InsecureSkipVerify: new(true),
CA: monitoringv1.SecretOrConfigMap{
Secret: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
diff --git a/pkg/alertmanager/operator_test.go b/pkg/alertmanager/operator_test.go
index 62c0316e35e..68467513183 100644
--- a/pkg/alertmanager/operator_test.go
+++ b/pkg/alertmanager/operator_test.go
@@ -181,7 +181,7 @@ func TestCreateStatefulSetInputHash(t *testing.T) {
require.Equal(t, a1Hash, a2Hash, "expected two Alertmanager CRDs to produce the same hash but got different hash")
- a2Hash, err = createSSetInputHash(tc.a, Config{}, &operator.ShardedSecret{}, appsv1.StatefulSetSpec{Replicas: ptr.To(int32(2))})
+ a2Hash, err = createSSetInputHash(tc.a, Config{}, &operator.ShardedSecret{}, appsv1.StatefulSetSpec{Replicas: new(int32(2))})
require.NoError(t, err)
require.NotEqual(t, a1Hash, a2Hash, "expected same Alertmanager CRDs with different statefulset specs to produce different hashes but got equal hash")
@@ -489,7 +489,7 @@ func TestCheckAlertmanagerConfig(t *testing.T) {
Name: "recv1",
WebhookConfigs: []monitoringv1alpha1.WebhookConfig{
{
- URL: ptr.To("http://test.example.com"),
+ URL: new("http://test.example.com"),
},
},
}},
@@ -511,7 +511,7 @@ func TestCheckAlertmanagerConfig(t *testing.T) {
Name: "recv1",
WebhookConfigs: []monitoringv1alpha1.WebhookConfig{
{
- URL: ptr.To("http:test.example.com"),
+ URL: new("http:test.example.com"),
},
},
}},
@@ -533,7 +533,7 @@ func TestCheckAlertmanagerConfig(t *testing.T) {
Name: "recv1",
WebhookConfigs: []monitoringv1alpha1.WebhookConfig{
{
- URL: ptr.To("{{ .labels.url }}"),
+ URL: new("{{ .labels.url }}"),
},
},
}},
@@ -555,7 +555,7 @@ func TestCheckAlertmanagerConfig(t *testing.T) {
Name: "recv1",
WebhookConfigs: []monitoringv1alpha1.WebhookConfig{
{
- URL: ptr.To("{{ .labels.value "),
+ URL: new("{{ .labels.value "),
},
},
}},
@@ -677,7 +677,7 @@ func TestCheckAlertmanagerConfig(t *testing.T) {
Name: "recv1",
WeChatConfigs: []monitoringv1alpha1.WeChatConfig{
{
- CorpID: ptr.To("testingCorpID"),
+ CorpID: new("testingCorpID"),
},
},
}},
@@ -699,7 +699,7 @@ func TestCheckAlertmanagerConfig(t *testing.T) {
Name: "recv1",
WeChatConfigs: []monitoringv1alpha1.WeChatConfig{
{
- CorpID: ptr.To("testingCorpID"),
+ CorpID: new("testingCorpID"),
APIURL: ptr.To(monitoringv1alpha1.URL("http://::invalid-url")),
},
},
@@ -722,7 +722,7 @@ func TestCheckAlertmanagerConfig(t *testing.T) {
Name: "recv1",
WeChatConfigs: []monitoringv1alpha1.WeChatConfig{
{
- CorpID: ptr.To("testingCorpID"),
+ CorpID: new("testingCorpID"),
APISecret: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{Name: "secret"},
Key: "not-existing",
@@ -748,7 +748,7 @@ func TestCheckAlertmanagerConfig(t *testing.T) {
Name: "recv1",
WeChatConfigs: []monitoringv1alpha1.WeChatConfig{
{
- CorpID: ptr.To("testingCorpID"),
+ CorpID: new("testingCorpID"),
APISecret: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{Name: "secret"},
Key: "key1",
@@ -906,7 +906,7 @@ func TestCheckAlertmanagerConfig(t *testing.T) {
{
Type: "type",
Text: "text",
- Name: ptr.To("my-action"),
+ Name: new("my-action"),
},
},
},
@@ -934,7 +934,7 @@ func TestCheckAlertmanagerConfig(t *testing.T) {
{
Type: "type",
Text: "text",
- Name: ptr.To("my-action"),
+ Name: new("my-action"),
ConfirmField: &monitoringv1alpha1.SlackConfirmationField{
Text: "",
},
@@ -965,7 +965,7 @@ func TestCheckAlertmanagerConfig(t *testing.T) {
{
Type: "type",
Text: "text",
- Name: ptr.To("my-action"),
+ Name: new("my-action"),
ConfirmField: &monitoringv1alpha1.SlackConfirmationField{
Text: "text",
},
@@ -1075,7 +1075,7 @@ func TestCheckAlertmanagerConfig(t *testing.T) {
{
Type: "type",
Text: "text",
- Name: ptr.To("my-action"),
+ Name: new("my-action"),
ConfirmField: &monitoringv1alpha1.SlackConfirmationField{
Text: "text",
},
@@ -1108,7 +1108,7 @@ func TestCheckAlertmanagerConfig(t *testing.T) {
Name: "recv1",
SlackConfigs: []monitoringv1alpha1.SlackConfig{
{
- MessageText: ptr.To("test message text"),
+ MessageText: new("test message text"),
},
},
}},
@@ -1285,12 +1285,12 @@ func TestCheckAlertmanagerConfig(t *testing.T) {
Name: "recv1",
SNSConfigs: []monitoringv1alpha1.SNSConfig{
{
- ApiURL: ptr.To("https:://sns.us-east-2.amazonaws.com"),
+ ApiURL: new("https:://sns.us-east-2.amazonaws.com"),
Sigv4: &monitoringv1.Sigv4{
Region: "us-east-2",
RoleArn: "test-roleARN",
},
- TopicARN: ptr.To("test-topicARN"),
+ TopicARN: new("test-topicARN"),
},
},
}},
@@ -1387,10 +1387,10 @@ func TestCheckAlertmanagerConfig(t *testing.T) {
Name: "recv1",
EmailConfigs: []monitoringv1alpha1.EmailConfig{
{
- Smarthost: ptr.To("example.com:587"),
- From: ptr.To("admin@example.com"),
- To: ptr.To("customers@example.com"),
- ForceImplicitTLS: ptr.To(true),
+ Smarthost: new("example.com:587"),
+ From: new("admin@example.com"),
+ To: new("customers@example.com"),
+ ForceImplicitTLS: new(true),
},
},
}},
@@ -1413,10 +1413,10 @@ func TestCheckAlertmanagerConfig(t *testing.T) {
Name: "recv1",
EmailConfigs: []monitoringv1alpha1.EmailConfig{
{
- Smarthost: ptr.To("example.com:587"),
- From: ptr.To("admin@example.com"),
- To: ptr.To("customers@example.com"),
- ForceImplicitTLS: ptr.To(true),
+ Smarthost: new("example.com:587"),
+ From: new("admin@example.com"),
+ To: new("customers@example.com"),
+ ForceImplicitTLS: new(true),
},
},
}},
@@ -1445,7 +1445,7 @@ func TestCheckAlertmanagerConfig(t *testing.T) {
Name: "secret",
},
},
- BotTokenFile: ptr.To("/bot/token/file"),
+ BotTokenFile: new("/bot/token/file"),
},
},
}},
@@ -1468,7 +1468,7 @@ func TestCheckAlertmanagerConfig(t *testing.T) {
Name: "recv1",
TelegramConfigs: []monitoringv1alpha1.TelegramConfig{
{
- BotTokenFile: ptr.To("/bot/token/file"),
+ BotTokenFile: new("/bot/token/file"),
},
},
}},
@@ -1491,9 +1491,9 @@ func TestCheckAlertmanagerConfig(t *testing.T) {
Name: "recv1",
EmailConfigs: []monitoringv1alpha1.EmailConfig{
{
- Smarthost: ptr.To("example.com:587"),
- From: ptr.To("admin@example.com"),
- To: ptr.To("customers@example.com"),
+ Smarthost: new("example.com:587"),
+ From: new("admin@example.com"),
+ To: new("customers@example.com"),
Threading: &monitoringv1alpha1.EmailThreadingConfig{
ThreadByDate: monitoringv1alpha1.ThreadByDateTypeDaily,
},
@@ -1519,9 +1519,9 @@ func TestCheckAlertmanagerConfig(t *testing.T) {
Name: "recv1",
EmailConfigs: []monitoringv1alpha1.EmailConfig{
{
- Smarthost: ptr.To("example.com:587"),
- From: ptr.To("admin@example.com"),
- To: ptr.To("customers@example.com"),
+ Smarthost: new("example.com:587"),
+ From: new("admin@example.com"),
+ To: new("customers@example.com"),
Threading: &monitoringv1alpha1.EmailThreadingConfig{
ThreadByDate: monitoringv1alpha1.ThreadByDateTypeDaily,
},
diff --git a/pkg/alertmanager/statefulset.go b/pkg/alertmanager/statefulset.go
index cca77f84851..3aef2fb7b90 100644
--- a/pkg/alertmanager/statefulset.go
+++ b/pkg/alertmanager/statefulset.go
@@ -710,8 +710,8 @@ func makeStatefulSetSpec(logger *slog.Logger, a *monitoringv1.Alertmanager, conf
ReadinessProbe: readinessProbe,
Resources: a.Spec.Resources,
SecurityContext: &corev1.SecurityContext{
- AllowPrivilegeEscalation: ptr.To(false),
- ReadOnlyRootFilesystem: ptr.To(true),
+ AllowPrivilegeEscalation: new(false),
+ ReadOnlyRootFilesystem: new(true),
Capabilities: &corev1.Capabilities{
Drop: []corev1.Capability{"ALL"},
},
@@ -802,7 +802,7 @@ func makeStatefulSetSpec(logger *slog.Logger, a *monitoringv1.Alertmanager, conf
NodeSelector: a.Spec.NodeSelector,
SchedulerName: a.Spec.SchedulerName,
PriorityClassName: a.Spec.PriorityClassName,
- TerminationGracePeriodSeconds: ptr.To(ptr.Deref(a.Spec.TerminationGracePeriodSeconds, defaultTerminationGracePeriodSeconds)),
+ TerminationGracePeriodSeconds: new(ptr.Deref(a.Spec.TerminationGracePeriodSeconds, defaultTerminationGracePeriodSeconds)),
InitContainers: initContainers,
Containers: containers,
Volumes: volumes,
diff --git a/pkg/alertmanager/statefulset_test.go b/pkg/alertmanager/statefulset_test.go
index 3a1a2372e24..6b5d7bab9be 100644
--- a/pkg/alertmanager/statefulset_test.go
+++ b/pkg/alertmanager/statefulset_test.go
@@ -447,14 +447,14 @@ func TestMakeStatefulSetSpecWebTimeout(t *testing.T) {
scenario: "no timeout for old version",
version: "0.16.9",
web: &monitoringv1.AlertmanagerWebSpec{
- Timeout: toPtr(uint32(50)),
+ Timeout: new(uint32(50)),
},
expectTimeoutArg: false,
}, {
scenario: "timeout arg set if specified",
version: operator.DefaultAlertmanagerVersion,
web: &monitoringv1.AlertmanagerWebSpec{
- Timeout: toPtr(uint32(50)),
+ Timeout: new(uint32(50)),
},
expectTimeoutArg: true,
}}
@@ -462,7 +462,7 @@ func TestMakeStatefulSetSpecWebTimeout(t *testing.T) {
for _, ts := range tt {
t.Run(ts.scenario, func(t *testing.T) {
a := monitoringv1.Alertmanager{}
- a.Spec.Replicas = toPtr(int32(1))
+ a.Spec.Replicas = new(int32(1))
a.Spec.Version = ts.version
a.Spec.Web = ts.web
@@ -493,7 +493,7 @@ func TestMakeStatefulSetSpecWebConcurrency(t *testing.T) {
scenario: "no get-concurrency for old version",
version: "0.16.9",
web: &monitoringv1.AlertmanagerWebSpec{
- GetConcurrency: toPtr(uint32(50)),
+ GetConcurrency: new(uint32(50)),
},
expectGetConcurrencyArg: false,
}, {
@@ -501,7 +501,7 @@ func TestMakeStatefulSetSpecWebConcurrency(t *testing.T) {
version: operator.DefaultAlertmanagerVersion,
web: &monitoringv1.AlertmanagerWebSpec{
- GetConcurrency: toPtr(uint32(50)),
+ GetConcurrency: new(uint32(50)),
},
expectGetConcurrencyArg: true,
}}
@@ -509,7 +509,7 @@ func TestMakeStatefulSetSpecWebConcurrency(t *testing.T) {
for _, ts := range tt {
t.Run(ts.scenario, func(t *testing.T) {
a := monitoringv1.Alertmanager{}
- a.Spec.Replicas = toPtr(int32(1))
+ a.Spec.Replicas = new(int32(1))
a.Spec.Version = ts.version
a.Spec.Web = ts.web
@@ -540,14 +540,14 @@ func TestMakeStatefulSetSpecMaxSilences(t *testing.T) {
scenario: "no maxSilencesfor old version",
version: "0.27.9",
limits: &monitoringv1.AlertmanagerLimitsSpec{
- MaxSilences: toPtr(int32(50)),
+ MaxSilences: new(int32(50)),
},
expectMaxSilencesArg: false,
}, {
scenario: "maxSilencesfor arg set if specified",
version: operator.DefaultAlertmanagerVersion,
limits: &monitoringv1.AlertmanagerLimitsSpec{
- MaxSilences: toPtr(int32(50)),
+ MaxSilences: new(int32(50)),
},
expectMaxSilencesArg: true,
},
@@ -556,7 +556,7 @@ func TestMakeStatefulSetSpecMaxSilences(t *testing.T) {
for _, ts := range tt {
t.Run(ts.scenario, func(t *testing.T) {
a := monitoringv1.Alertmanager{}
- a.Spec.Replicas = toPtr(int32(1))
+ a.Spec.Replicas = new(int32(1))
a.Spec.Version = ts.version
a.Spec.Limits = ts.limits
@@ -603,7 +603,7 @@ func TestMakeStatefulSetSpecMaxPerSilenceBytes(t *testing.T) {
for _, ts := range tt {
t.Run(ts.scenario, func(t *testing.T) {
a := monitoringv1.Alertmanager{}
- a.Spec.Replicas = toPtr(int32(1))
+ a.Spec.Replicas = new(int32(1))
a.Spec.Version = ts.version
a.Spec.Limits = ts.limits
@@ -1073,7 +1073,7 @@ func TestClusterListenAddressForMultiReplica(t *testing.T) {
func TestExpectStatefulSetMinReadySeconds(t *testing.T) {
a := monitoringv1.Alertmanager{}
a.Spec.Version = operator.DefaultAlertmanagerVersion
- a.Spec.Replicas = ptr.To(int32(3))
+ a.Spec.Replicas = new(int32(3))
// assert defaults to zero if nil
statefulSet, err := makeStatefulSetSpec(nil, &a, defaultTestConfig, &operator.ShardedSecret{})
@@ -1081,7 +1081,7 @@ func TestExpectStatefulSetMinReadySeconds(t *testing.T) {
require.Equal(t, int32(0), statefulSet.MinReadySeconds)
// assert set correctly if not nil
- a.Spec.MinReadySeconds = ptr.To(int32(5))
+ a.Spec.MinReadySeconds = new(int32(5))
statefulSet, err = makeStatefulSetSpec(nil, &a, defaultTestConfig, &operator.ShardedSecret{})
require.NoError(t, err)
require.Equal(t, int32(5), statefulSet.MinReadySeconds)
@@ -1146,7 +1146,7 @@ func TestPodTemplateConfig(t *testing.T) {
ImagePullSecrets: imagePullSecrets,
ImagePullPolicy: imagePullPolicy,
SchedulerName: schedulerName,
- HostUsers: ptr.To(true),
+ HostUsers: new(true),
HostNetwork: hostNetwork,
},
}, defaultTestConfig, "", &operator.ShardedSecret{})
@@ -1262,7 +1262,7 @@ func TestClusterLabel(t *testing.T) {
Namespace: "monitoring",
},
Spec: monitoringv1.AlertmanagerSpec{
- Replicas: toPtr(int32(1)),
+ Replicas: new(int32(1)),
Version: ts.version,
},
}
@@ -1392,8 +1392,9 @@ func containsString(sub string) func(string) bool {
}
}
+//go:fix inline
func toPtr[T any](t T) *T {
- return &t
+ return new(t)
}
func TestEnableFeatures(t *testing.T) {
@@ -1428,7 +1429,7 @@ func TestEnableFeatures(t *testing.T) {
statefulSpec, err := makeStatefulSetSpec(nil, &monitoringv1.Alertmanager{
Spec: monitoringv1.AlertmanagerSpec{
Version: test.version,
- Replicas: toPtr(int32(1)),
+ Replicas: new(int32(1)),
EnableFeatures: test.features,
},
}, defaultTestConfig, &operator.ShardedSecret{})
@@ -1453,7 +1454,7 @@ func TestValidateAdditionalArgs(t *testing.T) {
statefulSpec, err := makeStatefulSetSpec(nil, &monitoringv1.Alertmanager{
Spec: monitoringv1.AlertmanagerSpec{
- Replicas: toPtr(int32(1)),
+ Replicas: new(int32(1)),
AdditionalArgs: additionalArgs,
},
}, defaultTestConfig, &operator.ShardedSecret{})
@@ -1477,7 +1478,7 @@ func TestStatefulSetDNSPolicyAndDNSConfig(t *testing.T) {
Options: []monitoringv1.PodDNSConfigOption{
{
Name: "ndots",
- Value: ptr.To("5"),
+ Value: new("5"),
},
},
},
@@ -1493,7 +1494,7 @@ func TestStatefulSetDNSPolicyAndDNSConfig(t *testing.T) {
Options: []corev1.PodDNSConfigOption{
{
Name: "ndots",
- Value: ptr.To("5"),
+ Value: new("5"),
},
},
}, sset.Spec.Template.Spec.DNSConfig, "expected dns configuration to match")
@@ -1525,8 +1526,8 @@ func TestStatefulSetEnableServiceLinks(t *testing.T) {
enableServiceLinks *bool
expectedEnableService *bool
}{
- {enableServiceLinks: ptr.To(false), expectedEnableService: ptr.To(false)},
- {enableServiceLinks: ptr.To(true), expectedEnableService: ptr.To(true)},
+ {enableServiceLinks: new(false), expectedEnableService: new(false)},
+ {enableServiceLinks: new(true), expectedEnableService: new(true)},
{enableServiceLinks: nil, expectedEnableService: nil},
}
@@ -1600,13 +1601,13 @@ func TestStatefulSetUpdateStrategy(t *testing.T) {
updateStrategy: &monitoringv1.StatefulSetUpdateStrategy{
Type: monitoringv1.RollingUpdateStatefulSetStrategyType,
RollingUpdate: &monitoringv1.RollingUpdateStatefulSetStrategy{
- MaxUnavailable: ptr.To(intstr.FromInt(1)),
+ MaxUnavailable: new(intstr.FromInt(1)),
},
},
exp: appsv1.StatefulSetUpdateStrategy{
Type: appsv1.RollingUpdateStatefulSetStrategyType,
RollingUpdate: &appsv1.RollingUpdateStatefulSetStrategy{
- MaxUnavailable: ptr.To(intstr.FromInt(1)),
+ MaxUnavailable: new(intstr.FromInt(1)),
},
},
},
@@ -1652,17 +1653,17 @@ func TestMakeStatefulSetSpecDispatchStartDelay(t *testing.T) {
},
{
version: "v0.29.0",
- minReadySeconds: ptr.To(int32(60)),
+ minReadySeconds: new(int32(60)),
expNotContains: "dispatch.start-delay",
},
{
version: "v0.30.0",
- minReadySeconds: ptr.To(int32(60)),
+ minReadySeconds: new(int32(60)),
expContains: "--dispatch.start-delay=60s",
},
{
version: "v0.30.0",
- minReadySeconds: ptr.To(int32(60)),
+ minReadySeconds: new(int32(60)),
additionalArgs: []monitoringv1.Argument{{Name: "dispatch.start-delay", Value: "10s"}},
expContains: "--dispatch.start-delay=10s",
},
@@ -1670,7 +1671,7 @@ func TestMakeStatefulSetSpecDispatchStartDelay(t *testing.T) {
t.Run("", func(t *testing.T) {
a := monitoringv1.Alertmanager{
Spec: monitoringv1.AlertmanagerSpec{
- Replicas: ptr.To(int32(1)),
+ Replicas: new(int32(1)),
Version: tc.version,
MinReadySeconds: tc.minReadySeconds,
AdditionalArgs: tc.additionalArgs,
diff --git a/pkg/alertmanager/validation/v1beta1/validation_test.go b/pkg/alertmanager/validation/v1beta1/validation_test.go
index 4339221fd6c..ace64293bea 100644
--- a/pkg/alertmanager/validation/v1beta1/validation_test.go
+++ b/pkg/alertmanager/validation/v1beta1/validation_test.go
@@ -84,7 +84,7 @@ func TestValidateAlertmanagerConfig(t *testing.T) {
Type: "a",
Text: "b",
URL: "www.test.com",
- Name: ptr.To("c"),
+ Name: new("c"),
ConfirmField: &monitoringv1beta1.SlackConfirmationField{
Text: "d",
},
@@ -172,8 +172,8 @@ func TestValidateAlertmanagerConfig(t *testing.T) {
Name: "different",
EmailConfigs: []monitoringv1beta1.EmailConfig{
{
- To: ptr.To("a"),
- Smarthost: ptr.To("invalid"),
+ To: new("a"),
+ Smarthost: new("invalid"),
},
},
},
@@ -287,7 +287,7 @@ func TestValidateAlertmanagerConfig(t *testing.T) {
Name: "creds",
Key: "user",
},
- TokenFile: ptr.To("/path/token_file"),
+ TokenFile: new("/path/token_file"),
},
},
},
@@ -312,7 +312,7 @@ func TestValidateAlertmanagerConfig(t *testing.T) {
Name: "creds",
Key: "user",
},
- UserKeyFile: ptr.To("/path/user_key_file"),
+ UserKeyFile: new("/path/user_key_file"),
},
},
},
@@ -365,8 +365,8 @@ func TestValidateAlertmanagerConfig(t *testing.T) {
Name: "creds",
Key: "token",
},
- HTML: ptr.To(true),
- Monospace: ptr.To(true),
+ HTML: new(true),
+ Monospace: new(true),
},
},
},
@@ -395,7 +395,7 @@ func TestValidateAlertmanagerConfig(t *testing.T) {
Name: "creds",
Key: "token",
},
- HTML: ptr.To(true),
+ HTML: new(true),
URL: "http://%>= 0 {
- p.Spec.SampleLimit = ptr.To(uint64(tc.globalLimit))
+ p.Spec.SampleLimit = new(uint64(tc.globalLimit))
}
if tc.golden == "SampleLimits_GlobalLimit1000_Enforce2000.golden" {
@@ -3921,7 +3921,7 @@ func TestRemoteReadConfig(t *testing.T) {
version: "v2.25.0",
remoteRead: monitoringv1.RemoteReadSpec{
URL: "http://example.com",
- FollowRedirects: ptr.To(true),
+ FollowRedirects: new(true),
},
golden: "RemoteReadConfig_v2.25.0.golden",
},
@@ -3929,7 +3929,7 @@ func TestRemoteReadConfig(t *testing.T) {
version: "v2.26.0",
remoteRead: monitoringv1.RemoteReadSpec{
URL: "http://example.com",
- FollowRedirects: ptr.To(false),
+ FollowRedirects: new(false),
},
golden: "RemoteReadConfig_v2.26.0_NotFollowRedirects.golden",
},
@@ -3937,7 +3937,7 @@ func TestRemoteReadConfig(t *testing.T) {
version: "v2.26.0",
remoteRead: monitoringv1.RemoteReadSpec{
URL: "http://example.com",
- FilterExternalLabels: ptr.To(true),
+ FilterExternalLabels: new(true),
},
golden: "RemoteReadConfig_v2.26.0_FilterExternalLabels.golden",
},
@@ -3952,7 +3952,7 @@ func TestRemoteReadConfig(t *testing.T) {
version: "v2.34.0",
remoteRead: monitoringv1.RemoteReadSpec{
URL: "http://example.com",
- FilterExternalLabels: ptr.To(false),
+ FilterExternalLabels: new(false),
},
golden: "RemoteReadConfig_v2.34.0_NotFilterExternalLabels.golden",
},
@@ -3960,7 +3960,7 @@ func TestRemoteReadConfig(t *testing.T) {
version: "v2.34.0",
remoteRead: monitoringv1.RemoteReadSpec{
URL: "http://example.com",
- FilterExternalLabels: ptr.To(true),
+ FilterExternalLabels: new(true),
},
golden: "RemoteReadConfig_v2.34.0_FilterExternalLabels.golden",
},
@@ -3986,9 +3986,9 @@ func TestRemoteReadConfig(t *testing.T) {
remoteRead: monitoringv1.RemoteReadSpec{
URL: "http://example.com",
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -4197,9 +4197,9 @@ func TestRemoteWriteConfig(t *testing.T) {
remoteWrite: monitoringv1.RemoteWriteSpec{
URL: "http://example.com",
AzureAD: &monitoringv1.AzureAD{
- Cloud: ptr.To("AzureGovernment"),
+ Cloud: new("AzureGovernment"),
ManagedIdentity: &monitoringv1.ManagedIdentity{
- ClientID: ptr.To("00000000-0000-0000-0000-000000000000"),
+ ClientID: new("00000000-0000-0000-0000-000000000000"),
},
},
},
@@ -4210,7 +4210,7 @@ func TestRemoteWriteConfig(t *testing.T) {
remoteWrite: monitoringv1.RemoteWriteSpec{
URL: "http://example.com",
AzureAD: &monitoringv1.AzureAD{
- Cloud: ptr.To("AzureGovernment"),
+ Cloud: new("AzureGovernment"),
OAuth: &monitoringv1.AzureOAuth{
TenantID: "00000000-a12b-3cd4-e56f-000000000000",
ClientID: "00000000-0000-0000-0000-000000000000",
@@ -4230,9 +4230,9 @@ func TestRemoteWriteConfig(t *testing.T) {
remoteWrite: monitoringv1.RemoteWriteSpec{
URL: "http://example.com",
AzureAD: &monitoringv1.AzureAD{
- Cloud: ptr.To("AzureGovernment"),
+ Cloud: new("AzureGovernment"),
SDK: &monitoringv1.AzureSDK{
- TenantID: ptr.To("00000000-a12b-3cd4-e56f-000000000000"),
+ TenantID: new("00000000-a12b-3cd4-e56f-000000000000"),
},
},
},
@@ -4243,9 +4243,9 @@ func TestRemoteWriteConfig(t *testing.T) {
remoteWrite: monitoringv1.RemoteWriteSpec{
URL: "http://example.com",
AzureAD: &monitoringv1.AzureAD{
- Cloud: ptr.To("AzureGovernment"),
+ Cloud: new("AzureGovernment"),
ManagedIdentity: &monitoringv1.ManagedIdentity{
- ClientID: ptr.To("00000000-0000-0000-0000-000000000000"),
+ ClientID: new("00000000-0000-0000-0000-000000000000"),
},
},
},
@@ -4256,7 +4256,7 @@ func TestRemoteWriteConfig(t *testing.T) {
remoteWrite: monitoringv1.RemoteWriteSpec{
URL: "http://example.com",
AzureAD: &monitoringv1.AzureAD{
- Cloud: ptr.To("AzureGovernment"),
+ Cloud: new("AzureGovernment"),
WorkloadIdentity: &monitoringv1.AzureWorkloadIdentity{
ClientID: "00000000-a12b-3cd4-e56f-000000000000",
TenantID: "11111111-a12b-3cd4-e56f-000000000000",
@@ -4521,9 +4521,9 @@ func TestRemoteWriteConfig(t *testing.T) {
URL: "http://example.com",
FollowRedirects: &followRedirects,
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -4544,9 +4544,9 @@ func TestRemoteWriteConfig(t *testing.T) {
URL: "http://example.com",
FollowRedirects: &followRedirects,
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -4588,7 +4588,7 @@ func TestRemoteWriteConfig(t *testing.T) {
remoteWrite: monitoringv1.RemoteWriteSpec{
URL: "http://example.com",
MessageVersion: ptr.To(monitoringv1.RemoteWriteMessageVersion2_0),
- RoundRobinDNS: ptr.To(true),
+ RoundRobinDNS: new(true),
},
golden: "RemoteWriteConfig_v3.1.0.golden",
},
@@ -4597,7 +4597,7 @@ func TestRemoteWriteConfig(t *testing.T) {
remoteWrite: monitoringv1.RemoteWriteSpec{
URL: "http://example.com",
MetadataConfig: &monitoringv1.MetadataConfig{
- MaxSamplesPerSend: ptr.To(int32(10)),
+ MaxSamplesPerSend: new(int32(10)),
},
},
golden: "RemoteWriteConfig_v2.28.0_MaxSamplesPerSendMetadataConfig.golden",
@@ -4607,7 +4607,7 @@ func TestRemoteWriteConfig(t *testing.T) {
remoteWrite: monitoringv1.RemoteWriteSpec{
URL: "http://example.com",
MetadataConfig: &monitoringv1.MetadataConfig{
- MaxSamplesPerSend: ptr.To(int32(10)),
+ MaxSamplesPerSend: new(int32(10)),
},
},
golden: "RemoteWriteConfig_v2.29.0_MaxSamplesPerSendMetadataConfig.golden",
@@ -4632,7 +4632,7 @@ func TestRemoteWriteConfig(t *testing.T) {
Key: "secret-key",
},
Region: "us-central-0",
- UseFIPSSTSEndpoint: ptr.To(true),
+ UseFIPSSTSEndpoint: new(true),
},
QueueConfig: &monitoringv1.QueueConfig{
Capacity: 1000,
@@ -4671,7 +4671,7 @@ func TestRemoteWriteConfig(t *testing.T) {
Key: "secret-key",
},
Region: "us-central-0",
- UseFIPSSTSEndpoint: ptr.To(true),
+ UseFIPSSTSEndpoint: new(true),
},
QueueConfig: &monitoringv1.QueueConfig{
Capacity: 1000,
@@ -4703,11 +4703,11 @@ func TestRemoteWriteConfig(t *testing.T) {
remoteWrite: monitoringv1.RemoteWriteSpec{
URL: "http://example.com",
AzureAD: &monitoringv1.AzureAD{
- Cloud: ptr.To("AzurePublic"),
+ Cloud: new("AzurePublic"),
ManagedIdentity: &monitoringv1.ManagedIdentity{
- ClientID: ptr.To("00000000-a12b-3cd4-e56f-000000000000"),
+ ClientID: new("00000000-a12b-3cd4-e56f-000000000000"),
},
- Scope: ptr.To("https://custom.monitor.azure.com/.default"),
+ Scope: new("https://custom.monitor.azure.com/.default"),
},
},
golden: "RemoteWriteConfig_AzureADScope_v3.8.0.golden",
@@ -4717,11 +4717,11 @@ func TestRemoteWriteConfig(t *testing.T) {
remoteWrite: monitoringv1.RemoteWriteSpec{
URL: "http://example.com",
AzureAD: &monitoringv1.AzureAD{
- Cloud: ptr.To("AzurePublic"),
+ Cloud: new("AzurePublic"),
ManagedIdentity: &monitoringv1.ManagedIdentity{
- ClientID: ptr.To("00000000-a12b-3cd4-e56f-000000000000"),
+ ClientID: new("00000000-a12b-3cd4-e56f-000000000000"),
},
- Scope: ptr.To("https://custom.monitor.azure.com/.default"),
+ Scope: new("https://custom.monitor.azure.com/.default"),
},
},
golden: "RemoteWriteConfig_AzureADScope_v3.9.0.golden",
@@ -4890,7 +4890,7 @@ func TestLabelLimits(t *testing.T) {
p.Spec.CommonPrometheusFields.Version = tc.version
if tc.enforcedLabelLimit >= 0 {
- p.Spec.EnforcedLabelLimit = ptr.To(uint64(tc.enforcedLabelLimit))
+ p.Spec.EnforcedLabelLimit = new(uint64(tc.enforcedLabelLimit))
}
serviceMonitor := monitoringv1.ServiceMonitor{
@@ -4997,7 +4997,7 @@ func TestLabelNameLengthLimits(t *testing.T) {
p.Spec.CommonPrometheusFields.Version = tc.version
if tc.enforcedLabelNameLengthLimit >= 0 {
- p.Spec.EnforcedLabelNameLengthLimit = ptr.To(uint64(tc.enforcedLabelNameLengthLimit))
+ p.Spec.EnforcedLabelNameLengthLimit = new(uint64(tc.enforcedLabelNameLengthLimit))
}
podMonitor := monitoringv1.PodMonitor{
@@ -5011,7 +5011,7 @@ func TestLabelNameLengthLimits(t *testing.T) {
Spec: monitoringv1.PodMonitorSpec{
PodMetricsEndpoints: []monitoringv1.PodMetricsEndpoint{
{
- Port: ptr.To("web"),
+ Port: new("web"),
Interval: "30s",
},
},
@@ -5104,7 +5104,7 @@ func TestLabelValueLengthLimits(t *testing.T) {
p.Spec.CommonPrometheusFields.Version = tc.version
if tc.enforcedLabelValueLengthLimit >= 0 {
- p.Spec.EnforcedLabelValueLengthLimit = ptr.To(uint64(tc.enforcedLabelValueLengthLimit))
+ p.Spec.EnforcedLabelValueLengthLimit = new(uint64(tc.enforcedLabelValueLengthLimit))
}
probe := monitoringv1.Probe{
@@ -5121,9 +5121,9 @@ func TestLabelValueLengthLimits(t *testing.T) {
URL: "blackbox.exporter.io",
Path: "/probe",
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -5197,20 +5197,20 @@ func TestKeepDroppedTargets(t *testing.T) {
}{
{
version: "v2.46.0",
- enforcedKeepDroppedTargets: ptr.To(uint64(1000)),
- keepDroppedTargets: ptr.To(uint64(50)),
+ enforcedKeepDroppedTargets: new(uint64(1000)),
+ keepDroppedTargets: new(uint64(50)),
golden: "KeepDroppedTargetsNotAddedInConfig.golden",
},
{
version: "v2.47.0",
- enforcedKeepDroppedTargets: ptr.To(uint64(1000)),
- keepDroppedTargets: ptr.To(uint64(2000)),
+ enforcedKeepDroppedTargets: new(uint64(1000)),
+ keepDroppedTargets: new(uint64(2000)),
golden: "KeepDroppedTargetsOverridedWithEnforcedValue.golden",
},
{
version: "v2.47.0",
- enforcedKeepDroppedTargets: ptr.To(uint64(1000)),
- keepDroppedTargets: ptr.To(uint64(500)),
+ enforcedKeepDroppedTargets: new(uint64(1000)),
+ keepDroppedTargets: new(uint64(500)),
golden: "KeepDroppedTargets.golden",
},
} {
@@ -5270,79 +5270,79 @@ func TestNativeHistogramConfig(t *testing.T) {
{
version: "v3.0.0",
nativeHistogramConfig: monitoringv1.NativeHistogramConfig{
- NativeHistogramBucketLimit: ptr.To(uint64(10)),
- ScrapeClassicHistograms: ptr.To(true),
- NativeHistogramMinBucketFactor: ptr.To(resource.MustParse("12.124")),
- ConvertClassicHistogramsToNHCB: ptr.To(true),
+ NativeHistogramBucketLimit: new(uint64(10)),
+ ScrapeClassicHistograms: new(true),
+ NativeHistogramMinBucketFactor: new(resource.MustParse("12.124")),
+ ConvertClassicHistogramsToNHCB: new(true),
},
golden: "NativeHistogramConfig.golden",
},
{
version: "v2.54.0",
nativeHistogramConfig: monitoringv1.NativeHistogramConfig{
- NativeHistogramBucketLimit: ptr.To(uint64(10)),
- ScrapeClassicHistograms: ptr.To(true),
- NativeHistogramMinBucketFactor: ptr.To(resource.MustParse("12.124")),
- ConvertClassicHistogramsToNHCB: ptr.To(true),
+ NativeHistogramBucketLimit: new(uint64(10)),
+ ScrapeClassicHistograms: new(true),
+ NativeHistogramMinBucketFactor: new(resource.MustParse("12.124")),
+ ConvertClassicHistogramsToNHCB: new(true),
},
golden: "native-histograms/NativeHistogramConfigMissConvertClassicHistogramsToNHCB.golden",
},
{
version: "v2.46.0",
nativeHistogramConfig: monitoringv1.NativeHistogramConfig{
- NativeHistogramBucketLimit: ptr.To(uint64(10)),
- ScrapeClassicHistograms: ptr.To(true),
- NativeHistogramMinBucketFactor: ptr.To(resource.MustParse("12.124")),
- ConvertClassicHistogramsToNHCB: ptr.To(true),
+ NativeHistogramBucketLimit: new(uint64(10)),
+ ScrapeClassicHistograms: new(true),
+ NativeHistogramMinBucketFactor: new(resource.MustParse("12.124")),
+ ConvertClassicHistogramsToNHCB: new(true),
},
golden: "native-histograms/NativeHistogramConfigWithMissNativeHistogramMinBucketFactor.golden",
},
{
version: "v2.44.0",
nativeHistogramConfig: monitoringv1.NativeHistogramConfig{
- NativeHistogramBucketLimit: ptr.To(uint64(10)),
- ScrapeClassicHistograms: ptr.To(true),
- NativeHistogramMinBucketFactor: ptr.To(resource.MustParse("12.124")),
- ConvertClassicHistogramsToNHCB: ptr.To(true),
+ NativeHistogramBucketLimit: new(uint64(10)),
+ ScrapeClassicHistograms: new(true),
+ NativeHistogramMinBucketFactor: new(resource.MustParse("12.124")),
+ ConvertClassicHistogramsToNHCB: new(true),
},
golden: "NativeHistogramConfigWithMissALL.golden",
},
{
version: "3.0.0-rc.0",
nativeHistogramConfig: monitoringv1.NativeHistogramConfig{
- NativeHistogramBucketLimit: ptr.To(uint64(10)),
- ScrapeClassicHistograms: ptr.To(true),
- NativeHistogramMinBucketFactor: ptr.To(resource.MustParse("12.124")),
- ConvertClassicHistogramsToNHCB: ptr.To(true),
+ NativeHistogramBucketLimit: new(uint64(10)),
+ ScrapeClassicHistograms: new(true),
+ NativeHistogramMinBucketFactor: new(resource.MustParse("12.124")),
+ ConvertClassicHistogramsToNHCB: new(true),
},
golden: "NativeHistogramConfigAlwaysScrapeClassicHistograms.golden",
},
{
version: "v3.8.0",
nativeHistogramConfig: monitoringv1.NativeHistogramConfig{
- ScrapeNativeHistograms: ptr.To(true),
- NativeHistogramBucketLimit: ptr.To(uint64(10)),
- ScrapeClassicHistograms: ptr.To(true),
- NativeHistogramMinBucketFactor: ptr.To(resource.MustParse("12.124")),
- ConvertClassicHistogramsToNHCB: ptr.To(true),
+ ScrapeNativeHistograms: new(true),
+ NativeHistogramBucketLimit: new(uint64(10)),
+ ScrapeClassicHistograms: new(true),
+ NativeHistogramMinBucketFactor: new(resource.MustParse("12.124")),
+ ConvertClassicHistogramsToNHCB: new(true),
},
golden: "NativeHistogramConfigWithScrapeNativeHistograms.golden",
},
{
version: "v3.7.0",
nativeHistogramConfig: monitoringv1.NativeHistogramConfig{
- ScrapeNativeHistograms: ptr.To(true),
- NativeHistogramBucketLimit: ptr.To(uint64(10)),
- ScrapeClassicHistograms: ptr.To(true),
- NativeHistogramMinBucketFactor: ptr.To(resource.MustParse("12.124")),
- ConvertClassicHistogramsToNHCB: ptr.To(true),
+ ScrapeNativeHistograms: new(true),
+ NativeHistogramBucketLimit: new(uint64(10)),
+ ScrapeClassicHistograms: new(true),
+ NativeHistogramMinBucketFactor: new(resource.MustParse("12.124")),
+ ConvertClassicHistogramsToNHCB: new(true),
},
golden: "NativeHistogramConfigMissScrapeNativeHistograms.golden",
},
{
version: "v3.8.0",
nativeHistogramConfig: monitoringv1.NativeHistogramConfig{
- ScrapeNativeHistograms: ptr.To(true),
+ ScrapeNativeHistograms: new(true),
},
golden: "NativeHistogramConfigOnlyScrapeNativeHistograms.golden",
},
@@ -5609,7 +5609,7 @@ func TestServiceMonitorEndpointFollowRedirects(t *testing.T) {
HTTPConfigWithProxyAndTLSFiles: monitoringv1.HTTPConfigWithProxyAndTLSFiles{
HTTPConfigWithTLSFiles: monitoringv1.HTTPConfigWithTLSFiles{
HTTPConfigWithoutTLS: monitoringv1.HTTPConfigWithoutTLS{
- FollowRedirects: ptr.To(tc.followRedirects),
+ FollowRedirects: new(tc.followRedirects),
},
},
},
@@ -5681,12 +5681,12 @@ func TestPodMonitorEndpointFollowRedirects(t *testing.T) {
Spec: monitoringv1.PodMonitorSpec{
PodMetricsEndpoints: []monitoringv1.PodMetricsEndpoint{
{
- Port: ptr.To("web"),
+ Port: new("web"),
Interval: "30s",
HTTPConfigWithProxy: monitoringv1.HTTPConfigWithProxy{
HTTPConfig: monitoringv1.HTTPConfig{
HTTPConfigWithoutTLS: monitoringv1.HTTPConfigWithoutTLS{
- FollowRedirects: ptr.To(tc.followRedirects),
+ FollowRedirects: new(tc.followRedirects),
},
},
},
@@ -5764,7 +5764,7 @@ func TestServiceMonitorEndpointEnableHttp2(t *testing.T) {
HTTPConfigWithProxyAndTLSFiles: monitoringv1.HTTPConfigWithProxyAndTLSFiles{
HTTPConfigWithTLSFiles: monitoringv1.HTTPConfigWithTLSFiles{
HTTPConfigWithoutTLS: monitoringv1.HTTPConfigWithoutTLS{
- EnableHTTP2: ptr.To(tc.enableHTTP2),
+ EnableHTTP2: new(tc.enableHTTP2),
},
},
},
@@ -5813,8 +5813,8 @@ func TestPodMonitorPhaseFilter(t *testing.T) {
Spec: monitoringv1.PodMonitorSpec{
PodMetricsEndpoints: []monitoringv1.PodMetricsEndpoint{
{
- FilterRunning: ptr.To(false),
- Port: ptr.To("test"),
+ FilterRunning: new(false),
+ Port: new("test"),
},
},
},
@@ -5874,12 +5874,12 @@ func TestPodMonitorEndpointEnableHttp2(t *testing.T) {
Spec: monitoringv1.PodMonitorSpec{
PodMetricsEndpoints: []monitoringv1.PodMetricsEndpoint{
{
- Port: ptr.To("web"),
+ Port: new("web"),
Interval: "30s",
HTTPConfigWithProxy: monitoringv1.HTTPConfigWithProxy{
HTTPConfig: monitoringv1.HTTPConfig{
HTTPConfigWithoutTLS: monitoringv1.HTTPConfigWithoutTLS{
- EnableHTTP2: ptr.To(tc.enableHTTP2),
+ EnableHTTP2: new(tc.enableHTTP2),
},
},
},
@@ -5920,7 +5920,7 @@ func TestRuntimeConfig(t *testing.T) {
Scenario: "Runtime GoGC is set to 25",
Version: "v2.53.0",
Runtime: &monitoringv1.RuntimeConfig{
- GoGC: ptr.To(int32(25)),
+ GoGC: new(int32(25)),
},
Golden: "RuntimeConfig_GoGC25.golden",
},
@@ -5928,7 +5928,7 @@ func TestRuntimeConfig(t *testing.T) {
Scenario: "Runtime GoGC is set to 25 but unsupported Prometheus Version",
Version: "v2.52.0",
Runtime: &monitoringv1.RuntimeConfig{
- GoGC: ptr.To(int32(25)),
+ GoGC: new(int32(25)),
},
Golden: "RuntimeConfig_GoGC_Not_Set.golden",
},
@@ -5972,7 +5972,7 @@ func TestStorageSettingMaxExemplars(t *testing.T) {
{
Scenario: "Exemplars maxSize is set to 5000000",
Exemplars: &monitoringv1.Exemplars{
- MaxSize: ptr.To(int64(5000000)),
+ MaxSize: new(int64(5000000)),
},
Golden: "StorageSettingMaxExemplars_MaxSize5000000.golden",
},
@@ -5980,7 +5980,7 @@ func TestStorageSettingMaxExemplars(t *testing.T) {
Scenario: "max_exemplars is not set if version is less than v2.29.0",
Version: "v2.28.0",
Exemplars: &monitoringv1.Exemplars{
- MaxSize: ptr.To(int64(5000000)),
+ MaxSize: new(int64(5000000)),
},
Golden: "StorageSettingMaxExemplars_MaxSizeNotSet_v2.29.0.golden",
},
@@ -6143,21 +6143,21 @@ func TestScrapeFailureLogFilePrometheusAgent(t *testing.T) {
{
name: "PrometheusAgent version < v2.55.0",
version: "v2.54.0",
- scrapeFailureLogFile: ptr.To("file.log"),
+ scrapeFailureLogFile: new("file.log"),
golden: "PrometheusAgent_scrapeFailureLogFile_less_than_v2.54.0.golden",
},
{
name: "PrometheusAgent version >= v2.55.0",
version: "v2.55.0",
- scrapeFailureLogFile: ptr.To("/tmp/file.log"),
+ scrapeFailureLogFile: new("/tmp/file.log"),
golden: "PrometheusAgent_scrapeFailureLogFile_greater_than_or_equal_to_v2.55.0.golden",
},
{
name: "PrometheusAgent version >= v2.55.0 and scrapeFailureLogFile with empty path",
version: "v2.55.0",
- scrapeFailureLogFile: ptr.To("file.log"),
+ scrapeFailureLogFile: new("file.log"),
golden: "PrometheusAgent_scrapeFailureLogFile_empty_path_v2.55.0.golden",
},
} {
@@ -6235,7 +6235,7 @@ func TestGenerateRelabelConfig(t *testing.T) {
{
// Test empty replacement
Action: "Replace",
- Replacement: ptr.To(""),
+ Replacement: new(""),
TargetLabel: "job",
},
},
@@ -6248,19 +6248,19 @@ func TestGenerateRelabelConfig(t *testing.T) {
{
Action: "Replace",
Regex: "(.+)(?::d+)",
- Replacement: ptr.To("$1:9537"),
+ Replacement: new("$1:9537"),
SourceLabels: []monitoringv1.LabelName{"__address__"},
TargetLabel: "__address__",
},
{
Action: "Replace",
- Replacement: ptr.To("crio"),
+ Replacement: new("crio"),
TargetLabel: "job",
},
{
// Test empty replacement
Action: "Replace",
- Replacement: ptr.To(""),
+ Replacement: new(""),
TargetLabel: "job",
},
},
@@ -6307,9 +6307,9 @@ func TestProbeSpecConfig(t *testing.T) {
URL: "example.com",
Path: "/probe",
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -6340,13 +6340,13 @@ func TestProbeSpecConfig(t *testing.T) {
RelabelConfigs: []monitoringv1.RelabelConfig{
{
TargetLabel: "foo",
- Replacement: ptr.To("bar"),
+ Replacement: new("bar"),
Action: "replace",
},
// Empty replacement case
{
TargetLabel: "foobar",
- Replacement: ptr.To(""),
+ Replacement: new(""),
Action: "replace",
},
},
@@ -6477,19 +6477,19 @@ func TestScrapeConfigSpecConfig(t *testing.T) {
{
name: "explicit_job_name",
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
- JobName: ptr.To("explicit-test-scrape-config3"),
+ JobName: new("explicit-test-scrape-config3"),
},
golden: "ScrapeConfigSpecConfig_WithJobName.golden",
},
{
name: "explicit_job_name_with_relabel_config",
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
- JobName: ptr.To("explicit-test-scrape-config5"),
+ JobName: new("explicit-test-scrape-config5"),
RelabelConfigs: []monitoringv1.RelabelConfig{
{
Action: "Replace",
Regex: "(.+)(?::d+)",
- Replacement: ptr.To("$1:9537"),
+ Replacement: new("$1:9537"),
SourceLabels: []monitoringv1.LabelName{"__address__"},
TargetLabel: "__address__",
},
@@ -6500,7 +6500,7 @@ func TestScrapeConfigSpecConfig(t *testing.T) {
{
name: "shard_config",
patchProm: func(p *monitoringv1.Prometheus) {
- p.Spec.Shards = ptr.To(int32(2))
+ p.Spec.Shards = new(int32(2))
},
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
StaticConfigs: []monitoringv1alpha1.StaticConfig{
@@ -6517,7 +6517,7 @@ func TestScrapeConfigSpecConfig(t *testing.T) {
{
name: "already_sharded_config",
patchProm: func(p *monitoringv1.Prometheus) {
- p.Spec.Shards = ptr.To(int32(2))
+ p.Spec.Shards = new(int32(2))
},
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
StaticConfigs: []monitoringv1alpha1.StaticConfig{
@@ -6578,9 +6578,9 @@ func TestScrapeConfigSpecConfig(t *testing.T) {
URL: "http://localhost:9100/sd.json",
RefreshInterval: &refreshInterval,
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -6600,7 +6600,7 @@ func TestScrapeConfigSpecConfig(t *testing.T) {
{
name: "metrics_path",
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
- MetricsPath: ptr.To("/metrics"),
+ MetricsPath: new("/metrics"),
},
golden: "ScrapeConfigSpecConfig_MetricPath.golden",
},
@@ -6618,7 +6618,7 @@ func TestScrapeConfigSpecConfig(t *testing.T) {
{
Action: "Replace",
Regex: "(.+)(?::d+)",
- Replacement: ptr.To("$1:9537"),
+ Replacement: new("$1:9537"),
SourceLabels: []monitoringv1.LabelName{"__address__"},
TargetLabel: "__address__",
},
@@ -6629,21 +6629,21 @@ func TestScrapeConfigSpecConfig(t *testing.T) {
{
name: "honor_timestamp",
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
- HonorTimestamps: ptr.To(true),
+ HonorTimestamps: new(true),
},
golden: "ScrapeConfigSpecConfig_HonorTimeStamp.golden",
},
{
name: "track_timestamps_staleness",
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
- TrackTimestampsStaleness: ptr.To(true),
+ TrackTimestampsStaleness: new(true),
},
golden: "ScrapeConfigSpecConfig_TrackTimestampsStaleness.golden",
},
{
name: "honor_labels",
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
- HonorLabels: ptr.To(true),
+ HonorLabels: new(true),
},
golden: "ScrapeConfigSpecConfig_HonorLabels.golden",
},
@@ -6744,7 +6744,7 @@ func TestScrapeConfigSpecConfig(t *testing.T) {
{
URL: "http://localhost:9100/sd.json",
TLSConfig: &monitoringv1.SafeTLSConfig{
- InsecureSkipVerify: ptr.To(false),
+ InsecureSkipVerify: new(false),
CA: monitoringv1.SecretOrConfigMap{
Secret: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
@@ -6791,7 +6791,7 @@ func TestScrapeConfigSpecConfig(t *testing.T) {
{
URL: "http://localhost:9100/sd.json",
TLSConfig: &monitoringv1.SafeTLSConfig{
- InsecureSkipVerify: ptr.To(true),
+ InsecureSkipVerify: new(true),
CA: monitoringv1.SecretOrConfigMap{
Secret: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
@@ -6816,18 +6816,18 @@ func TestScrapeConfigSpecConfig(t *testing.T) {
{
name: "limits",
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
- SampleLimit: ptr.To(uint64(10000)),
- TargetLimit: ptr.To(uint64(1000)),
- LabelLimit: ptr.To(uint64(50)),
- LabelNameLengthLimit: ptr.To(uint64(40)),
- LabelValueLengthLimit: ptr.To(uint64(30)),
+ SampleLimit: new(uint64(10000)),
+ TargetLimit: new(uint64(1000)),
+ LabelLimit: new(uint64(50)),
+ LabelNameLengthLimit: new(uint64(40)),
+ LabelValueLengthLimit: new(uint64(30)),
},
golden: "ScrapeConfigSpecConfig_Limits.golden",
},
{
name: "params",
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
- MetricsPath: ptr.To("/federate"),
+ MetricsPath: new("/federate"),
Params: map[string][]string{"match[]": {"{job=\"prometheus\"}", "{__name__=~\"job:.*\"}"}},
},
golden: "ScrapeConfigSpecConfig_Params.golden",
@@ -6890,9 +6890,9 @@ func TestScrapeConfigSpecConfig(t *testing.T) {
name: "proxy_settings",
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -6911,9 +6911,9 @@ func TestScrapeConfigSpecConfig(t *testing.T) {
name: "proxy_settings_with_muti_proxy_connect_header_values",
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -6961,9 +6961,9 @@ func TestScrapeConfigSpecConfig(t *testing.T) {
},
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -6996,7 +6996,7 @@ func TestScrapeConfigSpecConfig(t *testing.T) {
{
Names: []string{"node.demo.do.prometheus.io"},
Type: ptr.To(monitoringv1alpha1.DNSRecordTypeA),
- Port: ptr.To(int32(9100)),
+ Port: new(int32(9100)),
},
},
},
@@ -7010,7 +7010,7 @@ func TestScrapeConfigSpecConfig(t *testing.T) {
{
Names: []string{"node.demo.do.prometheus.io"},
Type: ptr.To(monitoringv1alpha1.DNSRecordTypeNS),
- Port: ptr.To(int32(9100)),
+ Port: new(int32(9100)),
},
},
},
@@ -7024,7 +7024,7 @@ func TestScrapeConfigSpecConfig(t *testing.T) {
{
Names: []string{"node.demo.do.prometheus.io"},
Type: ptr.To(monitoringv1alpha1.DNSRecordTypeNS),
- Port: ptr.To(int32(9100)),
+ Port: new(int32(9100)),
},
},
},
@@ -7038,7 +7038,7 @@ func TestScrapeConfigSpecConfig(t *testing.T) {
{
Names: []string{"node.demo.do.prometheus.io"},
Type: ptr.To(monitoringv1alpha1.DNSRecordTypeMX),
- Port: ptr.To(int32(9100)),
+ Port: new(int32(9100)),
},
},
},
@@ -7052,7 +7052,7 @@ func TestScrapeConfigSpecConfig(t *testing.T) {
{
Names: []string{"node.demo.do.prometheus.io"},
Type: ptr.To(monitoringv1alpha1.DNSRecordTypeNS),
- Port: ptr.To(int32(9100)),
+ Port: new(int32(9100)),
},
},
},
@@ -7061,14 +7061,14 @@ func TestScrapeConfigSpecConfig(t *testing.T) {
{
name: "enable_compression_is_set_to_true",
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
- EnableCompression: ptr.To(true),
+ EnableCompression: new(true),
},
golden: "ScrapeConfigSpecConfig_EnableCompression_True.golden",
},
{
name: "enable_compression_is_set_to_false",
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
- EnableCompression: ptr.To(false),
+ EnableCompression: new(false),
},
golden: "ScrapeConfigSpecConfig_EnableCompression_False.golden",
},
@@ -7076,7 +7076,7 @@ func TestScrapeConfigSpecConfig(t *testing.T) {
name: "enable_http2_is_set_to_true_unsupported",
version: "v2.34.0",
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
- EnableHTTP2: ptr.To(true),
+ EnableHTTP2: new(true),
},
golden: "ScrapeConfigSpecConfig_EnableHTTP2_Unsupported.golden",
},
@@ -7084,7 +7084,7 @@ func TestScrapeConfigSpecConfig(t *testing.T) {
name: "enable_http2_is_set_to_false_unsupported",
version: "v2.34.0",
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
- EnableHTTP2: ptr.To(false),
+ EnableHTTP2: new(false),
},
golden: "ScrapeConfigSpecConfig_EnableHTTP2_Unsupported.golden",
},
@@ -7092,7 +7092,7 @@ func TestScrapeConfigSpecConfig(t *testing.T) {
name: "enable_http2_is_set_to_true",
version: "v2.35.0",
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
- EnableHTTP2: ptr.To(true),
+ EnableHTTP2: new(true),
},
golden: "ScrapeConfigSpecConfig_EnableHTTP2_True.golden",
},
@@ -7100,7 +7100,7 @@ func TestScrapeConfigSpecConfig(t *testing.T) {
name: "enable_http2_is_set_to_false",
version: "v2.35.0",
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
- EnableHTTP2: ptr.To(false),
+ EnableHTTP2: new(false),
},
golden: "ScrapeConfigSpecConfig_EnableHTTP2_False.golden",
},
@@ -7346,12 +7346,12 @@ func TestScrapeConfigSpecConfigWithHTTPSD(t *testing.T) {
HTTPSDConfigs: []monitoringv1alpha1.HTTPSDConfig{
{
URL: "http://localhost:9100/sd.json",
- FollowRedirects: ptr.To(true),
- EnableHTTP2: ptr.To(true),
+ FollowRedirects: new(true),
+ EnableHTTP2: new(true),
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -7558,11 +7558,11 @@ func TestScrapeConfigSpecConfigWithKubernetesSD(t *testing.T) {
KubernetesSDConfigs: []monitoringv1alpha1.KubernetesSDConfig{
{
Role: monitoringv1alpha1.KubernetesRoleNode,
- APIServer: ptr.To("https://kubernetes.default.svc"),
+ APIServer: new("https://kubernetes.default.svc"),
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -7574,8 +7574,8 @@ func TestScrapeConfigSpecConfigWithKubernetesSD(t *testing.T) {
},
},
},
- FollowRedirects: ptr.To(true),
- EnableHTTP2: ptr.To(true),
+ FollowRedirects: new(true),
+ EnableHTTP2: new(true),
},
},
},
@@ -7588,7 +7588,7 @@ func TestScrapeConfigSpecConfigWithKubernetesSD(t *testing.T) {
{
Role: monitoringv1alpha1.KubernetesRolePod,
Namespaces: &monitoringv1alpha1.NamespaceDiscovery{
- IncludeOwnNamespace: ptr.To(true),
+ IncludeOwnNamespace: new(true),
Names: []string{"ns1", "ns2"},
},
},
@@ -7617,7 +7617,7 @@ func TestScrapeConfigSpecConfigWithKubernetesSD(t *testing.T) {
{
Role: monitoringv1alpha1.KubernetesRolePod,
AttachMetadata: &monitoringv1alpha1.AttachMetadata{
- Node: ptr.To(true),
+ Node: new(true),
},
},
},
@@ -7631,7 +7631,7 @@ func TestScrapeConfigSpecConfigWithKubernetesSD(t *testing.T) {
{
Role: monitoringv1alpha1.KubernetesRoleService,
AttachMetadata: &monitoringv1alpha1.AttachMetadata{
- Node: ptr.To(true),
+ Node: new(true),
},
},
},
@@ -7647,7 +7647,7 @@ func TestScrapeConfigSpecConfigWithKubernetesSD(t *testing.T) {
Selectors: []monitoringv1alpha1.K8SSelectorConfig{
{
Role: monitoringv1alpha1.KubernetesRoleNode,
- Label: ptr.To("component=executor"),
+ Label: new("component=executor"),
},
},
},
@@ -7665,8 +7665,8 @@ func TestScrapeConfigSpecConfigWithKubernetesSD(t *testing.T) {
Selectors: []monitoringv1alpha1.K8SSelectorConfig{
{
Role: monitoringv1alpha1.KubernetesRoleNode,
- Label: ptr.To("type=infra"),
- Field: ptr.To("spec.unschedulable=false"),
+ Label: new("type=infra"),
+ Field: new("spec.unschedulable=false"),
},
},
},
@@ -7681,7 +7681,7 @@ func TestScrapeConfigSpecConfigWithKubernetesSD(t *testing.T) {
KubernetesSDConfigs: []monitoringv1alpha1.KubernetesSDConfig{
{
Role: monitoringv1alpha1.KubernetesRoleNode,
- APIServer: ptr.To("https://kubernetes.default.svc"),
+ APIServer: new("https://kubernetes.default.svc"),
BasicAuth: &monitoringv1.BasicAuth{
Username: corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
@@ -7706,7 +7706,7 @@ func TestScrapeConfigSpecConfigWithKubernetesSD(t *testing.T) {
KubernetesSDConfigs: []monitoringv1alpha1.KubernetesSDConfig{
{
Role: monitoringv1alpha1.KubernetesRoleNode,
- APIServer: ptr.To("https://kubernetes.default.svc"),
+ APIServer: new("https://kubernetes.default.svc"),
Authorization: &monitoringv1.SafeAuthorization{
Credentials: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
@@ -7725,7 +7725,7 @@ func TestScrapeConfigSpecConfigWithKubernetesSD(t *testing.T) {
KubernetesSDConfigs: []monitoringv1alpha1.KubernetesSDConfig{
{
Role: monitoringv1alpha1.KubernetesRoleNode,
- APIServer: ptr.To("https://kubernetes.default.svc"),
+ APIServer: new("https://kubernetes.default.svc"),
OAuth2: &monitoringv1.OAuth2{
ClientID: monitoringv1.SecretOrConfigMap{
ConfigMap: &corev1.ConfigMapKeySelector{
@@ -7758,7 +7758,7 @@ func TestScrapeConfigSpecConfigWithKubernetesSD(t *testing.T) {
KubernetesSDConfigs: []monitoringv1alpha1.KubernetesSDConfig{
{
Role: monitoringv1alpha1.KubernetesRoleNode,
- APIServer: ptr.To("https://kubernetes.default.svc"),
+ APIServer: new("https://kubernetes.default.svc"),
TLSConfig: &monitoringv1.SafeTLSConfig{
CA: monitoringv1.SecretOrConfigMap{
Secret: &corev1.SecretKeySelector{
@@ -7869,23 +7869,23 @@ func TestScrapeConfigSpecConfigWithConsulSD(t *testing.T) {
ConsulSDConfigs: []monitoringv1alpha1.ConsulSDConfig{
{
Server: "localhost",
- Datacenter: ptr.To("we1"),
- Namespace: ptr.To("observability"),
- Partition: ptr.To("1"),
+ Datacenter: new("we1"),
+ Namespace: new("observability"),
+ Partition: new("1"),
Scheme: ptr.To(monitoringv1.SchemeHTTPS),
Services: []string{"prometheus", "alertmanager"},
Tags: []string{"tag1"},
- TagSeparator: ptr.To(";"),
+ TagSeparator: new(";"),
NodeMeta: map[string]string{
"service": "service_name",
"name": "node_name",
},
- AllowStale: ptr.To(false),
+ AllowStale: new(false),
RefreshInterval: ptr.To(monitoringv1.Duration("30s")),
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -7897,8 +7897,8 @@ func TestScrapeConfigSpecConfigWithConsulSD(t *testing.T) {
},
},
},
- FollowRedirects: ptr.To(true),
- EnableHttp2: ptr.To(true),
+ FollowRedirects: new(true),
+ EnableHttp2: new(true),
TokenRef: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "foo",
@@ -7916,7 +7916,7 @@ func TestScrapeConfigSpecConfigWithConsulSD(t *testing.T) {
ConsulSDConfigs: []monitoringv1alpha1.ConsulSDConfig{
{
Server: "localhost",
- Filter: ptr.To("Meta.env == \"qa\""),
+ Filter: new("Meta.env == \"qa\""),
},
},
},
@@ -7928,7 +7928,7 @@ func TestScrapeConfigSpecConfigWithConsulSD(t *testing.T) {
ConsulSDConfigs: []monitoringv1alpha1.ConsulSDConfig{
{
Server: "localhost",
- HealthFilter: ptr.To("Service.Meta.env == \"prod\""),
+ HealthFilter: new("Service.Meta.env == \"prod\""),
},
},
},
@@ -8048,7 +8048,7 @@ func TestScrapeConfigSpecConfigWithConsulSD(t *testing.T) {
ConsulSDConfigs: []monitoringv1alpha1.ConsulSDConfig{
{
Server: "server",
- PathPrefix: ptr.To("example-path-prefix"),
+ PathPrefix: new("example-path-prefix"),
},
},
},
@@ -8061,7 +8061,7 @@ func TestScrapeConfigSpecConfigWithConsulSD(t *testing.T) {
ConsulSDConfigs: []monitoringv1alpha1.ConsulSDConfig{
{
Server: "server",
- PathPrefix: ptr.To("example-path-prefix"),
+ PathPrefix: new("example-path-prefix"),
},
},
},
@@ -8074,7 +8074,7 @@ func TestScrapeConfigSpecConfigWithConsulSD(t *testing.T) {
ConsulSDConfigs: []monitoringv1alpha1.ConsulSDConfig{
{
Server: "server",
- Namespace: ptr.To("example-namespace"),
+ Namespace: new("example-namespace"),
},
},
},
@@ -8087,7 +8087,7 @@ func TestScrapeConfigSpecConfigWithConsulSD(t *testing.T) {
ConsulSDConfigs: []monitoringv1alpha1.ConsulSDConfig{
{
Server: "server",
- Namespace: ptr.To("example-namespace"),
+ Namespace: new("example-namespace"),
},
},
},
@@ -8198,7 +8198,7 @@ func TestScrapeConfigSpecConfigWithEC2SD(t *testing.T) {
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
EC2SDConfigs: []monitoringv1alpha1.EC2SDConfig{
{
- Region: ptr.To("us-east-1"),
+ Region: new("us-east-1"),
AccessKey: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "aws-access-api",
@@ -8212,7 +8212,7 @@ func TestScrapeConfigSpecConfigWithEC2SD(t *testing.T) {
Key: "secretKey",
},
RefreshInterval: ptr.To(monitoringv1.Duration("30s")),
- Port: ptr.To(int32(9100)),
+ Port: new(int32(9100)),
},
},
},
@@ -8223,10 +8223,10 @@ func TestScrapeConfigSpecConfigWithEC2SD(t *testing.T) {
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
EC2SDConfigs: []monitoringv1alpha1.EC2SDConfig{
{
- Region: ptr.To("us-east-1"),
- RoleARN: ptr.To("arn:aws:iam::123456789:role/prometheus-role"),
+ Region: new("us-east-1"),
+ RoleARN: new("arn:aws:iam::123456789:role/prometheus-role"),
RefreshInterval: ptr.To(monitoringv1.Duration("30s")),
- Port: ptr.To(int32(9100)),
+ Port: new(int32(9100)),
},
},
},
@@ -8237,10 +8237,10 @@ func TestScrapeConfigSpecConfigWithEC2SD(t *testing.T) {
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
EC2SDConfigs: []monitoringv1alpha1.EC2SDConfig{
{
- Region: ptr.To("us-east-1"),
- RoleARN: ptr.To("arn:aws:iam::123456789:role/prometheus-role"),
+ Region: new("us-east-1"),
+ RoleARN: new("arn:aws:iam::123456789:role/prometheus-role"),
RefreshInterval: ptr.To(monitoringv1.Duration("30s")),
- Port: ptr.To(int32(9100)),
+ Port: new(int32(9100)),
Filters: []monitoringv1alpha1.Filter{
{
Name: "tag:environment",
@@ -8262,10 +8262,10 @@ func TestScrapeConfigSpecConfigWithEC2SD(t *testing.T) {
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
EC2SDConfigs: []monitoringv1alpha1.EC2SDConfig{
{
- Region: ptr.To("us-east-1"),
- RoleARN: ptr.To("arn:aws:iam::123456789:role/prometheus-role"),
+ Region: new("us-east-1"),
+ RoleARN: new("arn:aws:iam::123456789:role/prometheus-role"),
RefreshInterval: ptr.To(monitoringv1.Duration("30s")),
- Port: ptr.To(int32(9100)),
+ Port: new(int32(9100)),
Filters: []monitoringv1alpha1.Filter{
{
Name: "tag:environment",
@@ -8287,7 +8287,7 @@ func TestScrapeConfigSpecConfigWithEC2SD(t *testing.T) {
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
EC2SDConfigs: []monitoringv1alpha1.EC2SDConfig{
{
- Region: ptr.To("us-east-1"),
+ Region: new("us-east-1"),
AccessKey: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "wrong-secret-name",
@@ -8317,11 +8317,11 @@ func TestScrapeConfigSpecConfigWithEC2SD(t *testing.T) {
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
EC2SDConfigs: []monitoringv1alpha1.EC2SDConfig{
{
- Region: ptr.To("us-east-1"),
+ Region: new("us-east-1"),
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -8333,9 +8333,9 @@ func TestScrapeConfigSpecConfigWithEC2SD(t *testing.T) {
},
},
},
- RefreshInterval: (*monitoringv1.Duration)(ptr.To("30s")),
- FollowRedirects: ptr.To(true),
- EnableHTTP2: ptr.To(true),
+ RefreshInterval: (*monitoringv1.Duration)(new("30s")),
+ FollowRedirects: new(true),
+ EnableHTTP2: new(true),
},
},
},
@@ -8346,7 +8346,7 @@ func TestScrapeConfigSpecConfigWithEC2SD(t *testing.T) {
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
EC2SDConfigs: []monitoringv1alpha1.EC2SDConfig{
{
- Region: ptr.To("us-east-1"),
+ Region: new("us-east-1"),
TLSConfig: &monitoringv1.SafeTLSConfig{
CA: monitoringv1.SecretOrConfigMap{
Secret: &corev1.SecretKeySelector{
@@ -8371,8 +8371,8 @@ func TestScrapeConfigSpecConfigWithEC2SD(t *testing.T) {
Key: "private-key",
},
},
- FollowRedirects: ptr.To(true),
- EnableHTTP2: ptr.To(true),
+ FollowRedirects: new(true),
+ EnableHTTP2: new(true),
},
},
},
@@ -8384,7 +8384,7 @@ func TestScrapeConfigSpecConfigWithEC2SD(t *testing.T) {
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
EC2SDConfigs: []monitoringv1alpha1.EC2SDConfig{
{
- Region: ptr.To("us-east-1"),
+ Region: new("us-east-1"),
TLSConfig: &monitoringv1.SafeTLSConfig{
CA: monitoringv1.SecretOrConfigMap{
Secret: &corev1.SecretKeySelector{
@@ -8409,8 +8409,8 @@ func TestScrapeConfigSpecConfigWithEC2SD(t *testing.T) {
Key: "private-key",
},
},
- FollowRedirects: ptr.To(true),
- EnableHTTP2: ptr.To(true),
+ FollowRedirects: new(true),
+ EnableHTTP2: new(true),
},
},
},
@@ -8466,20 +8466,20 @@ func TestScrapeConfigSpecConfigWithAzureSD(t *testing.T) {
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
AzureSDConfigs: []monitoringv1alpha1.AzureSDConfig{
{
- Environment: ptr.To("AzurePublicCloud"),
+ Environment: new("AzurePublicCloud"),
AuthenticationMethod: ptr.To(monitoringv1alpha1.AuthMethodTypeOAuth),
SubscriptionID: "11AAAA11-A11A-111A-A111-1111A1111A11",
- TenantID: ptr.To("BBBB222B-B2B2-2B22-B222-2BB2222BB2B2"),
- ClientID: ptr.To("333333CC-3C33-3333-CCC3-33C3CCCCC33C"),
+ TenantID: new("BBBB222B-B2B2-2B22-B222-2BB2222BB2B2"),
+ ClientID: new("333333CC-3C33-3333-CCC3-33C3CCCCC33C"),
ClientSecret: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "secret",
},
Key: "clientSecret",
},
- ResourceGroup: ptr.To("my-resource-group"),
+ ResourceGroup: new("my-resource-group"),
RefreshInterval: ptr.To(monitoringv1.Duration("30s")),
- Port: ptr.To(int32(9100)),
+ Port: new(int32(9100)),
},
},
},
@@ -8490,12 +8490,12 @@ func TestScrapeConfigSpecConfigWithAzureSD(t *testing.T) {
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
AzureSDConfigs: []monitoringv1alpha1.AzureSDConfig{
{
- Environment: ptr.To("AzurePublicCloud"),
+ Environment: new("AzurePublicCloud"),
AuthenticationMethod: ptr.To(monitoringv1alpha1.AuthMethodTypeSDK),
SubscriptionID: "11AAAA11-A11A-111A-A111-1111A1111A11",
- ResourceGroup: ptr.To("my-resource-group"),
+ ResourceGroup: new("my-resource-group"),
RefreshInterval: ptr.To(monitoringv1.Duration("30s")),
- Port: ptr.To(int32(9100)),
+ Port: new(int32(9100)),
},
},
},
@@ -8506,7 +8506,7 @@ func TestScrapeConfigSpecConfigWithAzureSD(t *testing.T) {
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
AzureSDConfigs: []monitoringv1alpha1.AzureSDConfig{
{
- Environment: ptr.To("AzurePublicCloud"),
+ Environment: new("AzurePublicCloud"),
AuthenticationMethod: ptr.To(monitoringv1alpha1.AuthMethodTypeManagedIdentity),
SubscriptionID: "11AAAA11-A11A-111A-A111-1111A1111A11",
},
@@ -8558,9 +8558,9 @@ func TestScrapeConfigSpecConfigWithAzureSD(t *testing.T) {
},
},
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -8572,8 +8572,8 @@ func TestScrapeConfigSpecConfigWithAzureSD(t *testing.T) {
},
},
},
- FollowRedirects: ptr.To(true),
- EnableHTTP2: ptr.To(true),
+ FollowRedirects: new(true),
+ EnableHTTP2: new(true),
},
},
},
@@ -8675,7 +8675,7 @@ func TestScrapeConfigSpecConfigWithAzureSD(t *testing.T) {
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
AzureSDConfigs: []monitoringv1alpha1.AzureSDConfig{
{
- Environment: ptr.To("AzurePublicCloud"),
+ Environment: new("AzurePublicCloud"),
AuthenticationMethod: ptr.To(monitoringv1alpha1.AuthMethodTypeWorkloadIdentity),
SubscriptionID: "11AAAA11-A11A-111A-A111-1111A1111A11",
},
@@ -8777,7 +8777,7 @@ func TestScrapeConfigSpecConfigWithGCESD(t *testing.T) {
Project: "devops-dev",
Zone: "us-west-1",
RefreshInterval: ptr.To(monitoringv1.Duration("30s")),
- Port: ptr.To(int32(9100)),
+ Port: new(int32(9100)),
},
},
},
@@ -8791,9 +8791,9 @@ func TestScrapeConfigSpecConfigWithGCESD(t *testing.T) {
Project: "devops-dev",
Zone: "us-west-1",
RefreshInterval: ptr.To(monitoringv1.Duration("30s")),
- Port: ptr.To(int32(9100)),
- Filter: ptr.To("filter-expression"),
- TagSeparator: ptr.To("tag-value"),
+ Port: new(int32(9100)),
+ Filter: new("filter-expression"),
+ TagSeparator: new("tag-value"),
},
},
},
@@ -8879,16 +8879,16 @@ func TestScrapeConfigSpecConfigWithOpenStackSD(t *testing.T) {
Role: monitoringv1alpha1.OpenStackRoleInstance,
Region: "region-1",
IdentityEndpoint: ptr.To(monitoringv1alpha1.URL("http://identity.example.com:5000/v2.0")),
- Username: ptr.To("nova-user-1"),
+ Username: new("nova-user-1"),
Password: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "openstack-access-secret",
},
Key: "password",
},
- DomainName: ptr.To("devops-project-1"),
+ DomainName: new("devops-project-1"),
RefreshInterval: ptr.To(monitoringv1.Duration("30s")),
- Port: ptr.To(int32(9100)),
+ Port: new(int32(9100)),
},
},
},
@@ -8976,9 +8976,9 @@ func TestScrapeConfigSpecConfigWithDigitalOceanSD(t *testing.T) {
},
},
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -8990,9 +8990,9 @@ func TestScrapeConfigSpecConfigWithDigitalOceanSD(t *testing.T) {
},
},
},
- FollowRedirects: ptr.To(true),
- EnableHTTP2: ptr.To(true),
- Port: ptr.To(int32(9100)),
+ FollowRedirects: new(true),
+ EnableHTTP2: new(true),
+ Port: new(int32(9100)),
RefreshInterval: ptr.To(monitoringv1.Duration("30s")),
},
},
@@ -9160,9 +9160,9 @@ func TestScrapeConfigSpecConfigWithDockerSDConfig(t *testing.T) {
},
},
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -9174,11 +9174,11 @@ func TestScrapeConfigSpecConfigWithDockerSDConfig(t *testing.T) {
},
},
},
- FollowRedirects: ptr.To(true),
- EnableHTTP2: ptr.To(true),
- Port: ptr.To(int32(9100)),
+ FollowRedirects: new(true),
+ EnableHTTP2: new(true),
+ Port: new(int32(9100)),
RefreshInterval: ptr.To(monitoringv1.Duration("30s")),
- HostNetworkingHost: ptr.To("localhost"),
+ HostNetworkingHost: new("localhost"),
Filters: []monitoringv1alpha1.Filter{
{Name: "dummy_label_1",
Values: []string{"dummy_value_1"}},
@@ -9385,7 +9385,7 @@ func TestScrapeConfigSpecConfigWithDockerSDConfig(t *testing.T) {
Key: "password",
},
},
- MatchFirstNetwork: ptr.To(true),
+ MatchFirstNetwork: new(true),
},
},
},
@@ -9442,7 +9442,7 @@ func TestScrapeConfigSpecConfigWithDockerSDConfig(t *testing.T) {
Key: "password",
},
},
- MatchFirstNetwork: ptr.To(true),
+ MatchFirstNetwork: new(true),
},
},
},
@@ -9535,9 +9535,9 @@ func TestScrapeConfigSpecConfigWithLinodeSDConfig(t *testing.T) {
},
},
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -9549,11 +9549,11 @@ func TestScrapeConfigSpecConfigWithLinodeSDConfig(t *testing.T) {
},
},
},
- FollowRedirects: ptr.To(true),
- Port: ptr.To(int32(9100)),
- TagSeparator: ptr.To(","),
+ FollowRedirects: new(true),
+ Port: new(int32(9100)),
+ TagSeparator: new(","),
RefreshInterval: ptr.To(monitoringv1.Duration("5m")),
- EnableHTTP2: ptr.To(true),
+ EnableHTTP2: new(true),
TLSConfig: &monitoringv1.SafeTLSConfig{
CA: monitoringv1.SecretOrConfigMap{
Secret: &corev1.SecretKeySelector{
@@ -9610,9 +9610,9 @@ func TestScrapeConfigSpecConfigWithLinodeSDConfig(t *testing.T) {
"param2": "value2",
},
},
- TagSeparator: ptr.To(","),
+ TagSeparator: new(","),
RefreshInterval: ptr.To(monitoringv1.Duration("5m")),
- EnableHTTP2: ptr.To(true),
+ EnableHTTP2: new(true),
TLSConfig: &monitoringv1.SafeTLSConfig{
CA: monitoringv1.SecretOrConfigMap{
Secret: &corev1.SecretKeySelector{
@@ -9719,9 +9719,9 @@ func TestScrapeConfigSpecConfigWithHetznerSD(t *testing.T) {
{
Role: "hcloud",
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -9733,9 +9733,9 @@ func TestScrapeConfigSpecConfigWithHetznerSD(t *testing.T) {
},
},
},
- FollowRedirects: ptr.To(true),
- EnableHTTP2: ptr.To(true),
- Port: ptr.To(int32(9100)),
+ FollowRedirects: new(true),
+ EnableHTTP2: new(true),
+ Port: new(int32(9100)),
RefreshInterval: ptr.To(monitoringv1.Duration("5m")),
},
},
@@ -9750,9 +9750,9 @@ func TestScrapeConfigSpecConfigWithHetznerSD(t *testing.T) {
{
Role: "hcloud",
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -9764,11 +9764,11 @@ func TestScrapeConfigSpecConfigWithHetznerSD(t *testing.T) {
},
},
},
- FollowRedirects: ptr.To(true),
- EnableHTTP2: ptr.To(true),
- Port: ptr.To(int32(9100)),
+ FollowRedirects: new(true),
+ EnableHTTP2: new(true),
+ Port: new(int32(9100)),
RefreshInterval: ptr.To(monitoringv1.Duration("5m")),
- LabelSelector: ptr.To("label_value"),
+ LabelSelector: new("label_value"),
},
},
},
@@ -9782,9 +9782,9 @@ func TestScrapeConfigSpecConfigWithHetznerSD(t *testing.T) {
{
Role: "hcloud",
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -9796,11 +9796,11 @@ func TestScrapeConfigSpecConfigWithHetznerSD(t *testing.T) {
},
},
},
- FollowRedirects: ptr.To(true),
- EnableHTTP2: ptr.To(true),
- Port: ptr.To(int32(9100)),
+ FollowRedirects: new(true),
+ EnableHTTP2: new(true),
+ Port: new(int32(9100)),
RefreshInterval: ptr.To(monitoringv1.Duration("5m")),
- LabelSelector: ptr.To("label_value"),
+ LabelSelector: new("label_value"),
},
},
},
@@ -10113,19 +10113,19 @@ func TestAppendConvertClassicHistogramsToNHCB(t *testing.T) {
{
name: "ConvertClassicHistogramsToNHCB true with Prometheus Version 3.4",
version: "v3.4.0",
- convertClassicHistogramsToNHCB: ptr.To(true),
+ convertClassicHistogramsToNHCB: new(true),
expectedCfg: "ConvertClassicHistogramsToNHCBTrueWithPrometheusV3.golden",
},
{
name: "ConvertClassicHistogramsToNHCB false with Prometheus Version 3.4",
version: "v3.4.0",
- convertClassicHistogramsToNHCB: ptr.To(false),
+ convertClassicHistogramsToNHCB: new(false),
expectedCfg: "ConvertClassicHistogramsToNHCBFalseWithPrometheusV3.golden",
},
{
name: "ConvertClassicHistogramsToNHCB true with Prometheus Version 2",
version: "v2.55.0",
- convertClassicHistogramsToNHCB: ptr.To(true),
+ convertClassicHistogramsToNHCB: new(true),
expectedCfg: "ConvertClassicHistogramsToNHCBTrueWithPrometheusLowerThanV3.golden",
},
}
@@ -10239,7 +10239,7 @@ func TestOTLPConfig(t *testing.T) {
name: "Config KeepIdentifyingResourceAttributes",
version: "v3.1.0",
otlpConfig: &monitoringv1.OTLPConfig{
- KeepIdentifyingResourceAttributes: ptr.To(true),
+ KeepIdentifyingResourceAttributes: new(true),
},
golden: "OTLPConfig_Config_keep_identifying_resource_attributes.golden",
},
@@ -10247,7 +10247,7 @@ func TestOTLPConfig(t *testing.T) {
name: "Config ConvertHistogramsToNHCB old version",
version: "v3.0.0",
otlpConfig: &monitoringv1.OTLPConfig{
- KeepIdentifyingResourceAttributes: ptr.To(false),
+ KeepIdentifyingResourceAttributes: new(false),
},
golden: "OTLPConfig_Config_keep_identifying_resource_attributes_with_old_version.golden",
},
@@ -10271,7 +10271,7 @@ func TestOTLPConfig(t *testing.T) {
name: "Config ConvertHistogramsToNHCB",
version: "v3.4.0",
otlpConfig: &monitoringv1.OTLPConfig{
- ConvertHistogramsToNHCB: ptr.To(true),
+ ConvertHistogramsToNHCB: new(true),
},
golden: "OTLPConfig_Config_convert_histograms_to_nhcb.golden",
},
@@ -10279,7 +10279,7 @@ func TestOTLPConfig(t *testing.T) {
name: "Config ConvertHistogramsToNHCB with old version",
version: "v3.3.1",
otlpConfig: &monitoringv1.OTLPConfig{
- ConvertHistogramsToNHCB: ptr.To(true),
+ ConvertHistogramsToNHCB: new(true),
},
golden: "OTLPConfig_Config_convert_histograms_to_nhcb_with_old_version.golden",
},
@@ -10288,7 +10288,7 @@ func TestOTLPConfig(t *testing.T) {
version: "v3.5.0",
otlpConfig: &monitoringv1.OTLPConfig{
IgnoreResourceAttributes: []string{"aa", "bb", "cc"},
- PromoteAllResourceAttributes: ptr.To(true),
+ PromoteAllResourceAttributes: new(true),
},
golden: "OTLPConfig_Config_ignore_resource_attributes_and_promote_all_resource_attributes.golden",
},
@@ -10312,7 +10312,7 @@ func TestOTLPConfig(t *testing.T) {
name: "Config PromoteAllResourceAttributes with correct prometheus version",
version: "v3.5.0",
otlpConfig: &monitoringv1.OTLPConfig{
- PromoteAllResourceAttributes: ptr.To(true),
+ PromoteAllResourceAttributes: new(true),
},
golden: "OTLPConfig_Config_promote_all_resource_attributes.golden",
},
@@ -10321,7 +10321,7 @@ func TestOTLPConfig(t *testing.T) {
version: "v3.5.0",
otlpConfig: &monitoringv1.OTLPConfig{
PromoteResourceAttributes: []string{"aa", "bb", "cc"},
- PromoteAllResourceAttributes: ptr.To(true),
+ PromoteAllResourceAttributes: new(true),
},
expectedErr: true,
},
@@ -10329,7 +10329,7 @@ func TestOTLPConfig(t *testing.T) {
name: "Config PromoteAllResourceAttributes with old prometheus version",
version: "v3.4.0",
otlpConfig: &monitoringv1.OTLPConfig{
- PromoteAllResourceAttributes: ptr.To(true),
+ PromoteAllResourceAttributes: new(true),
},
golden: "OTLPConfig_Config_promote_all_resource_attributes_wrong_prom.golden",
},
@@ -10337,7 +10337,7 @@ func TestOTLPConfig(t *testing.T) {
name: "Config PromoteScopeMetadata with compatible versiopn",
version: "v3.6.0",
otlpConfig: &monitoringv1.OTLPConfig{
- PromoteScopeMetadata: ptr.To(true),
+ PromoteScopeMetadata: new(true),
},
golden: "OTLPConfig_Config_promote_scope_metadata.golden",
},
@@ -10345,7 +10345,7 @@ func TestOTLPConfig(t *testing.T) {
name: "Config PromoteScopeMetadata with wrong version",
version: "v3.5.0",
otlpConfig: &monitoringv1.OTLPConfig{
- PromoteScopeMetadata: ptr.To(true),
+ PromoteScopeMetadata: new(true),
},
golden: "OTLPConfig_Config_promote_scope_metadata_wrong_version.golden",
},
@@ -10405,15 +10405,15 @@ func TestTracingConfig(t *testing.T) {
},
{
tracingConfig: &monitoringv1.TracingConfig{
- ClientType: ptr.To("grpc"),
+ ClientType: new("grpc"),
Endpoint: "https://otel-collector.default.svc.local:3333",
SamplingFraction: &samplingTwo,
Headers: map[string]string{
"custom": "header",
},
- Compression: ptr.To("gzip"),
+ Compression: new("gzip"),
Timeout: ptr.To(monitoringv1.Duration("10s")),
- Insecure: ptr.To(false),
+ Insecure: new(false),
},
name: "Expect valid config",
expectedErr: false,
@@ -10471,9 +10471,9 @@ func TestScrapeConfigSpecConfigWithKumaSD(t *testing.T) {
},
},
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -10485,12 +10485,12 @@ func TestScrapeConfigSpecConfigWithKumaSD(t *testing.T) {
},
},
},
- FollowRedirects: ptr.To(true),
- EnableHTTP2: ptr.To(true),
+ FollowRedirects: new(true),
+ EnableHTTP2: new(true),
Server: "http://127.0.0.1:5681",
- ClientID: ptr.To("client"),
- FetchTimeout: (*monitoringv1.Duration)(ptr.To("5s")),
- RefreshInterval: (*monitoringv1.Duration)(ptr.To("30s")),
+ ClientID: new("client"),
+ FetchTimeout: (*monitoringv1.Duration)(new("5s")),
+ RefreshInterval: (*monitoringv1.Duration)(new("30s")),
},
},
},
@@ -10758,7 +10758,7 @@ func defaultPodMonitor() *monitoringv1.PodMonitor {
},
PodMetricsEndpoints: []monitoringv1.PodMetricsEndpoint{
{
- Port: ptr.To("web"),
+ Port: new("web"),
Interval: "30s",
},
},
@@ -10781,9 +10781,9 @@ func defaultScrapeConfig() *monitoringv1alpha1.ScrapeConfig {
URL: "http://localhost:9100/sd.json",
RefreshInterval: ptr.To(monitoringv1.Duration("5m")),
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
},
},
},
@@ -10823,7 +10823,7 @@ func TestScrapeClass(t *testing.T) {
scrapeClass: []monitoringv1.ScrapeClass{
{
Name: "test-tls-scrape-class",
- Default: ptr.To(true),
+ Default: new(true),
TLSConfig: &monitoringv1.TLSConfig{
TLSFilesConfig: monitoringv1.TLSFilesConfig{
CAFile: "/etc/prometheus/secrets/default/ca.crt",
@@ -10847,10 +10847,10 @@ func TestScrapeClass(t *testing.T) {
for _, sc := range tc.scrapeClass {
p.Spec.ScrapeClasses = append(p.Spec.ScrapeClasses, sc)
if !ptr.Deref(sc.Default, false) {
- serviceMonitor.Spec.ScrapeClassName = ptr.To(sc.Name)
- podMonitor.Spec.ScrapeClassName = ptr.To(sc.Name)
- probe.Spec.ScrapeClassName = ptr.To(sc.Name)
- scrapeConfig.Spec.ScrapeClassName = ptr.To(sc.Name)
+ serviceMonitor.Spec.ScrapeClassName = new(sc.Name)
+ podMonitor.Spec.ScrapeClassName = new(sc.Name)
+ probe.Spec.ScrapeClassName = new(sc.Name)
+ scrapeConfig.Spec.ScrapeClassName = new(sc.Name)
}
}
@@ -10965,7 +10965,7 @@ func TestServiceMonitorScrapeClassWithDefaultTLS(t *testing.T) {
for _, sc := range tc.scrapeClass {
p.Spec.ScrapeClasses = append(p.Spec.ScrapeClasses, sc)
if sc.Default == nil {
- serviceMonitor.Spec.ScrapeClassName = ptr.To(sc.Name)
+ serviceMonitor.Spec.ScrapeClassName = new(sc.Name)
}
}
@@ -11077,7 +11077,7 @@ func TestPodMonitorScrapeClassWithDefaultTLS(t *testing.T) {
for _, sc := range tc.scrapeClass {
p.Spec.ScrapeClasses = append(p.Spec.ScrapeClasses, sc)
if sc.Default == nil {
- podMonitor.Spec.ScrapeClassName = ptr.To(sc.Name)
+ podMonitor.Spec.ScrapeClassName = new(sc.Name)
}
}
podMonitor.Spec.PodMetricsEndpoints[0].TLSConfig = tc.tlsConfig
@@ -11138,10 +11138,10 @@ func TestPodMonitorPortNumber(t *testing.T) {
p := defaultPrometheus()
podMonitor := defaultPodMonitor()
- podMonitor.Spec.PodMetricsEndpoints[0].Port = ptr.To(tc.port)
- podMonitor.Spec.PodMetricsEndpoints[0].PortNumber = ptr.To(tc.portNumber)
+ podMonitor.Spec.PodMetricsEndpoints[0].Port = new(tc.port)
+ podMonitor.Spec.PodMetricsEndpoints[0].PortNumber = new(tc.portNumber)
//nolint:staticcheck // Ignore SA1019 this field is marked as deprecated.
- podMonitor.Spec.PodMetricsEndpoints[0].TargetPort = ptr.To(tc.targetPort)
+ podMonitor.Spec.PodMetricsEndpoints[0].TargetPort = new(tc.targetPort)
cg := mustNewConfigGenerator(t, p)
@@ -11171,7 +11171,7 @@ func TestNewConfigGeneratorWithMultipleDefaultScrapeClass(t *testing.T) {
p.Spec.ScrapeClasses = []monitoringv1.ScrapeClass{
{
Name: "test-default-scrape-class",
- Default: ptr.To(true),
+ Default: new(true),
TLSConfig: &monitoringv1.TLSConfig{
TLSFilesConfig: monitoringv1.TLSFilesConfig{
CAFile: "/etc/prometheus/secrets/ca.crt",
@@ -11182,7 +11182,7 @@ func TestNewConfigGeneratorWithMultipleDefaultScrapeClass(t *testing.T) {
},
{
Name: "test-default-scrape-class-2",
- Default: ptr.To(true),
+ Default: new(true),
TLSConfig: &monitoringv1.TLSConfig{
TLSFilesConfig: monitoringv1.TLSFilesConfig{
CAFile: "/etc/prometheus/secrets/ca.crt",
@@ -11304,9 +11304,9 @@ func TestScrapeConfigSpecConfigWithEurekaSD(t *testing.T) {
},
},
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -11318,10 +11318,10 @@ func TestScrapeConfigSpecConfigWithEurekaSD(t *testing.T) {
},
},
},
- FollowRedirects: ptr.To(true),
- EnableHTTP2: ptr.To(true),
+ FollowRedirects: new(true),
+ EnableHTTP2: new(true),
Server: "http://localhost:8761/eureka",
- RefreshInterval: (*monitoringv1.Duration)(ptr.To("30s")),
+ RefreshInterval: (*monitoringv1.Duration)(new("30s")),
},
},
},
@@ -11485,9 +11485,9 @@ func TestScrapeConfigSpecConfigWithNomadSD(t *testing.T) {
},
},
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -11499,14 +11499,14 @@ func TestScrapeConfigSpecConfigWithNomadSD(t *testing.T) {
},
},
},
- FollowRedirects: ptr.To(true),
- EnableHTTP2: ptr.To(true),
- AllowStale: ptr.To(true),
- TagSeparator: ptr.To(","),
- Namespace: ptr.To("default"),
- Region: ptr.To("default"),
+ FollowRedirects: new(true),
+ EnableHTTP2: new(true),
+ AllowStale: new(true),
+ TagSeparator: new(","),
+ Namespace: new("default"),
+ Region: new("default"),
Server: "http://127.0.0.1:4646",
- RefreshInterval: (*monitoringv1.Duration)(ptr.To("30s")),
+ RefreshInterval: (*monitoringv1.Duration)(new("30s")),
},
},
},
@@ -11672,9 +11672,9 @@ func TestScrapeConfigSpecConfigWithDockerswarmSD(t *testing.T) {
},
},
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -11686,9 +11686,9 @@ func TestScrapeConfigSpecConfigWithDockerswarmSD(t *testing.T) {
},
},
},
- FollowRedirects: ptr.To(true),
- EnableHTTP2: ptr.To(true),
- RefreshInterval: (*monitoringv1.Duration)(ptr.To("30s")),
+ FollowRedirects: new(true),
+ EnableHTTP2: new(true),
+ RefreshInterval: (*monitoringv1.Duration)(new("30s")),
Filters: []monitoringv1alpha1.Filter{
{
Name: "foo",
@@ -11723,9 +11723,9 @@ func TestScrapeConfigSpecConfigWithDockerswarmSD(t *testing.T) {
},
},
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -11737,9 +11737,9 @@ func TestScrapeConfigSpecConfigWithDockerswarmSD(t *testing.T) {
},
},
},
- FollowRedirects: ptr.To(true),
- EnableHTTP2: ptr.To(true),
- RefreshInterval: (*monitoringv1.Duration)(ptr.To("30s")),
+ FollowRedirects: new(true),
+ EnableHTTP2: new(true),
+ RefreshInterval: (*monitoringv1.Duration)(new("30s")),
},
},
},
@@ -11907,9 +11907,9 @@ func TestScrapeConfigSpecConfigWithPuppetDBSD(t *testing.T) {
},
},
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -11921,9 +11921,9 @@ func TestScrapeConfigSpecConfigWithPuppetDBSD(t *testing.T) {
},
},
},
- FollowRedirects: ptr.To(true),
- EnableHTTP2: ptr.To(true),
- RefreshInterval: (*monitoringv1.Duration)(ptr.To("30s")),
+ FollowRedirects: new(true),
+ EnableHTTP2: new(true),
+ RefreshInterval: (*monitoringv1.Duration)(new("30s")),
},
},
},
@@ -11952,9 +11952,9 @@ func TestScrapeConfigSpecConfigWithPuppetDBSD(t *testing.T) {
},
},
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -11966,9 +11966,9 @@ func TestScrapeConfigSpecConfigWithPuppetDBSD(t *testing.T) {
},
},
},
- FollowRedirects: ptr.To(true),
- EnableHTTP2: ptr.To(true),
- RefreshInterval: (*monitoringv1.Duration)(ptr.To("30s")),
+ FollowRedirects: new(true),
+ EnableHTTP2: new(true),
+ RefreshInterval: (*monitoringv1.Duration)(new("30s")),
},
},
},
@@ -12125,8 +12125,8 @@ func TestScrapeConfigSpecConfigWithLightSailSD(t *testing.T) {
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
LightSailSDConfigs: []monitoringv1alpha1.LightSailSDConfig{
{
- Region: ptr.To("us-east-1"),
- Endpoint: ptr.To("https://lightsail.us-east-1.amazonaws.com/"),
+ Region: new("us-east-1"),
+ Endpoint: new("https://lightsail.us-east-1.amazonaws.com/"),
AccessKey: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "aws-access-api",
@@ -12140,7 +12140,7 @@ func TestScrapeConfigSpecConfigWithLightSailSD(t *testing.T) {
Key: "secretKey",
},
RefreshInterval: ptr.To(monitoringv1.Duration("30s")),
- Port: ptr.To(int32(9100)),
+ Port: new(int32(9100)),
},
},
},
@@ -12151,11 +12151,11 @@ func TestScrapeConfigSpecConfigWithLightSailSD(t *testing.T) {
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
LightSailSDConfigs: []monitoringv1alpha1.LightSailSDConfig{
{
- Region: ptr.To("us-east-1"),
- Endpoint: ptr.To("https://lightsail.us-east-1.amazonaws.com/"),
- RoleARN: ptr.To("arn:aws:iam::123456789:role/prometheus-role"),
+ Region: new("us-east-1"),
+ Endpoint: new("https://lightsail.us-east-1.amazonaws.com/"),
+ RoleARN: new("arn:aws:iam::123456789:role/prometheus-role"),
RefreshInterval: ptr.To(monitoringv1.Duration("30s")),
- Port: ptr.To(int32(9100)),
+ Port: new(int32(9100)),
},
},
},
@@ -12166,8 +12166,8 @@ func TestScrapeConfigSpecConfigWithLightSailSD(t *testing.T) {
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
LightSailSDConfigs: []monitoringv1alpha1.LightSailSDConfig{
{
- Region: ptr.To("us-east-1"),
- Endpoint: ptr.To("https://lightsail.us-east-1.amazonaws.com/"),
+ Region: new("us-east-1"),
+ Endpoint: new("https://lightsail.us-east-1.amazonaws.com/"),
Authorization: &monitoringv1.SafeAuthorization{
Credentials: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
@@ -12177,9 +12177,9 @@ func TestScrapeConfigSpecConfigWithLightSailSD(t *testing.T) {
},
},
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -12191,9 +12191,9 @@ func TestScrapeConfigSpecConfigWithLightSailSD(t *testing.T) {
},
},
},
- FollowRedirects: ptr.To(true),
- EnableHTTP2: ptr.To(true),
- RefreshInterval: (*monitoringv1.Duration)(ptr.To("30s")),
+ FollowRedirects: new(true),
+ EnableHTTP2: new(true),
+ RefreshInterval: (*monitoringv1.Duration)(new("30s")),
},
},
},
@@ -12204,8 +12204,8 @@ func TestScrapeConfigSpecConfigWithLightSailSD(t *testing.T) {
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
LightSailSDConfigs: []monitoringv1alpha1.LightSailSDConfig{
{
- Region: ptr.To("us-east-1"),
- Endpoint: ptr.To("https://lightsail.us-east-1.amazonaws.com/"),
+ Region: new("us-east-1"),
+ Endpoint: new("https://lightsail.us-east-1.amazonaws.com/"),
BasicAuth: &monitoringv1.BasicAuth{
Username: corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
@@ -12221,9 +12221,9 @@ func TestScrapeConfigSpecConfigWithLightSailSD(t *testing.T) {
},
},
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -12235,9 +12235,9 @@ func TestScrapeConfigSpecConfigWithLightSailSD(t *testing.T) {
},
},
},
- FollowRedirects: ptr.To(true),
- EnableHTTP2: ptr.To(true),
- RefreshInterval: (*monitoringv1.Duration)(ptr.To("30s")),
+ FollowRedirects: new(true),
+ EnableHTTP2: new(true),
+ RefreshInterval: (*monitoringv1.Duration)(new("30s")),
},
},
},
@@ -12248,8 +12248,8 @@ func TestScrapeConfigSpecConfigWithLightSailSD(t *testing.T) {
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
LightSailSDConfigs: []monitoringv1alpha1.LightSailSDConfig{
{
- Region: ptr.To("us-east-1"),
- Endpoint: ptr.To("https://lightsail.us-east-1.amazonaws.com/"),
+ Region: new("us-east-1"),
+ Endpoint: new("https://lightsail.us-east-1.amazonaws.com/"),
OAuth2: &monitoringv1.OAuth2{
ClientID: monitoringv1.SecretOrConfigMap{
@@ -12283,8 +12283,8 @@ func TestScrapeConfigSpecConfigWithLightSailSD(t *testing.T) {
scSpec: monitoringv1alpha1.ScrapeConfigSpec{
LightSailSDConfigs: []monitoringv1alpha1.LightSailSDConfig{
{
- Region: ptr.To("us-east-1"),
- Endpoint: ptr.To("https://lightsail.us-east-1.amazonaws.com/"),
+ Region: new("us-east-1"),
+ Endpoint: new("https://lightsail.us-east-1.amazonaws.com/"),
Authorization: &monitoringv1.SafeAuthorization{
Credentials: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
@@ -12422,8 +12422,8 @@ func TestScrapeConfigSpecConfigWithOVHCloudSD(t *testing.T) {
Key: "ck",
},
Service: monitoringv1alpha1.OVHServiceDedicatedServer,
- Endpoint: ptr.To("127.0.0.1"),
- RefreshInterval: (*monitoringv1.Duration)(ptr.To("30s")),
+ Endpoint: new("127.0.0.1"),
+ RefreshInterval: (*monitoringv1.Duration)(new("30s")),
},
},
},
@@ -12494,15 +12494,15 @@ func TestScrapeConfigSpecConfigWithScalewaySD(t *testing.T) {
},
ProjectID: "00000000-0000-0000-0000-000000000001",
Role: monitoringv1alpha1.ScalewayRoleInstance,
- Zone: ptr.To("fr-par-1"),
- Port: ptr.To(int32(23456)),
+ Zone: new("fr-par-1"),
+ Port: new(int32(23456)),
ApiURL: ptr.To(monitoringv1alpha1.URL("https://api.scaleway.com")),
- NameFilter: ptr.To("name"),
+ NameFilter: new("name"),
TagsFilter: []string{"aa", "bb"},
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -12514,9 +12514,9 @@ func TestScrapeConfigSpecConfigWithScalewaySD(t *testing.T) {
},
},
},
- FollowRedirects: ptr.To(true),
- EnableHTTP2: ptr.To(true),
- RefreshInterval: (*monitoringv1.Duration)(ptr.To("30s")),
+ FollowRedirects: new(true),
+ EnableHTTP2: new(true),
+ RefreshInterval: (*monitoringv1.Duration)(new("30s")),
},
},
},
@@ -12648,9 +12648,9 @@ func TestScrapeConfigSpecConfigWithIonosSD(t *testing.T) {
},
},
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -12662,10 +12662,10 @@ func TestScrapeConfigSpecConfigWithIonosSD(t *testing.T) {
},
},
},
- FollowRedirects: ptr.To(true),
- EnableHTTP2: ptr.To(true),
- Port: ptr.To(int32(9100)),
- RefreshInterval: (*monitoringv1.Duration)(ptr.To("30s")),
+ FollowRedirects: new(true),
+ EnableHTTP2: new(true),
+ Port: new(int32(9100)),
+ RefreshInterval: (*monitoringv1.Duration)(new("30s")),
},
},
},
@@ -12817,7 +12817,7 @@ func TestServiceMonitorWithDefaultScrapeClassRelabelings(t *testing.T) {
scrapeClasses := []monitoringv1.ScrapeClass{
{
Name: "default",
- Default: ptr.To(true),
+ Default: new(true),
Relabelings: []monitoringv1.RelabelConfig{
{
Action: "replace",
@@ -12872,7 +12872,7 @@ func TestServiceMonitorWithNonDefaultScrapeClassRelabelings(t *testing.T) {
}
p.Spec.ScrapeClasses = append(p.Spec.ScrapeClasses, sc)
- serviceMonitor.Spec.ScrapeClassName = ptr.To(sc.Name)
+ serviceMonitor.Spec.ScrapeClassName = new(sc.Name)
cg := mustNewConfigGenerator(t, p)
cfg, err := cg.GenerateServerConfiguration(
@@ -12897,7 +12897,7 @@ func TestPodMonitorWithDefaultScrapeClassRelabelings(t *testing.T) {
scrapeClasses := []monitoringv1.ScrapeClass{
{
Name: "default",
- Default: ptr.To(true),
+ Default: new(true),
Relabelings: []monitoringv1.RelabelConfig{
{
Action: "replace",
@@ -12952,7 +12952,7 @@ func TestPodMonitorWithNonDefaultScrapeClassRelabelings(t *testing.T) {
}
p.Spec.ScrapeClasses = append(p.Spec.ScrapeClasses, sc)
- podMonitor.Spec.ScrapeClassName = ptr.To(sc.Name)
+ podMonitor.Spec.ScrapeClassName = new(sc.Name)
cg := mustNewConfigGenerator(t, p)
cfg, err := cg.GenerateServerConfiguration(
@@ -12973,9 +12973,9 @@ func TestPodMonitorWithNonDefaultScrapeClassRelabelings(t *testing.T) {
func TestScrapeClassMetricRelabelings(t *testing.T) {
serviceMonitorWithNonDefaultScrapeClass := defaultServiceMonitor()
- serviceMonitorWithNonDefaultScrapeClass.Spec.ScrapeClassName = ptr.To("test-extra-relabelings-scrape-class")
+ serviceMonitorWithNonDefaultScrapeClass.Spec.ScrapeClassName = new("test-extra-relabelings-scrape-class")
podMonitorWithNonDefaultScrapeClass := defaultPodMonitor()
- podMonitorWithNonDefaultScrapeClass.Spec.ScrapeClassName = ptr.To("test-extra-relabelings-scrape-class")
+ podMonitorWithNonDefaultScrapeClass.Spec.ScrapeClassName = new("test-extra-relabelings-scrape-class")
for _, tc := range []struct {
name string
scrapeClasses []monitoringv1.ScrapeClass
@@ -12990,19 +12990,19 @@ func TestScrapeClassMetricRelabelings(t *testing.T) {
scrapeClasses: []monitoringv1.ScrapeClass{
{
Name: "default",
- Default: ptr.To(true),
+ Default: new(true),
MetricRelabelings: []monitoringv1.RelabelConfig{
{
SourceLabels: []monitoringv1.LabelName{"namespace"},
Regex: "tenant1-.*",
TargetLabel: "tenant",
- Replacement: ptr.To("tenant1"),
+ Replacement: new("tenant1"),
},
{
SourceLabels: []monitoringv1.LabelName{"namespace"},
Regex: "tenant2-.*",
TargetLabel: "tenant",
- Replacement: ptr.To("tenant2"),
+ Replacement: new("tenant2"),
},
},
},
@@ -13011,7 +13011,7 @@ func TestScrapeClassMetricRelabelings(t *testing.T) {
MetricRelabelings: []monitoringv1.RelabelConfig{
{
TargetLabel: "tenant",
- Replacement: ptr.To("not-default"),
+ Replacement: new("not-default"),
},
},
},
@@ -13027,7 +13027,7 @@ func TestScrapeClassMetricRelabelings(t *testing.T) {
MetricRelabelings: []monitoringv1.RelabelConfig{
{
TargetLabel: "extra",
- Replacement: ptr.To("value1"),
+ Replacement: new("value1"),
},
},
},
@@ -13040,19 +13040,19 @@ func TestScrapeClassMetricRelabelings(t *testing.T) {
scrapeClasses: []monitoringv1.ScrapeClass{
{
Name: "default",
- Default: ptr.To(true),
+ Default: new(true),
MetricRelabelings: []monitoringv1.RelabelConfig{
{
SourceLabels: []monitoringv1.LabelName{"namespace"},
Regex: "tenant1-.*",
TargetLabel: "tenant",
- Replacement: ptr.To("tenant1"),
+ Replacement: new("tenant1"),
},
{
SourceLabels: []monitoringv1.LabelName{"namespace"},
Regex: "tenant2-.*",
TargetLabel: "tenant",
- Replacement: ptr.To("tenant2"),
+ Replacement: new("tenant2"),
},
},
},
@@ -13061,7 +13061,7 @@ func TestScrapeClassMetricRelabelings(t *testing.T) {
MetricRelabelings: []monitoringv1.RelabelConfig{
{
TargetLabel: "tenant",
- Replacement: ptr.To("not-default"),
+ Replacement: new("not-default"),
},
},
},
@@ -13077,7 +13077,7 @@ func TestScrapeClassMetricRelabelings(t *testing.T) {
MetricRelabelings: []monitoringv1.RelabelConfig{
{
TargetLabel: "extra",
- Replacement: ptr.To("value1"),
+ Replacement: new("value1"),
},
},
},
@@ -13177,7 +13177,7 @@ func TestScrapeClassAuthorization(t *testing.T) {
scrapeClasses: []monitoringv1.ScrapeClass{
{
Name: "default",
- Default: ptr.To(true),
+ Default: new(true),
Authorization: &monitoringv1.Authorization{
CredentialsFile: "/etc/secret/credentials",
},
@@ -13218,7 +13218,7 @@ func TestScrapeClassAuthorization(t *testing.T) {
scrapeClasses: []monitoringv1.ScrapeClass{
{
Name: "default",
- Default: ptr.To(true),
+ Default: new(true),
Authorization: &monitoringv1.Authorization{
CredentialsFile: "/etc/secret/credentials/default",
},
@@ -13265,7 +13265,7 @@ func TestScrapeClassAuthorization(t *testing.T) {
scrapeClasses: []monitoringv1.ScrapeClass{
{
Name: "default",
- Default: ptr.To(true),
+ Default: new(true),
Authorization: &monitoringv1.Authorization{
CredentialsFile: "/etc/secret/credentials/default",
},
@@ -13312,7 +13312,7 @@ func TestScrapeClassAuthorization(t *testing.T) {
scrapeClasses: []monitoringv1.ScrapeClass{
{
Name: "default",
- Default: ptr.To(true),
+ Default: new(true),
Authorization: &monitoringv1.Authorization{
CredentialsFile: "/etc/secret/credentials/default",
},
@@ -13387,9 +13387,9 @@ func TestScrapeClassAuthorization(t *testing.T) {
func TestScrapeClassAttachMetadata(t *testing.T) {
serviceMonitorWithNonDefaultScrapeClass := defaultServiceMonitor()
- serviceMonitorWithNonDefaultScrapeClass.Spec.ScrapeClassName = ptr.To("test-attachmetadata-scrape-class")
+ serviceMonitorWithNonDefaultScrapeClass.Spec.ScrapeClassName = new("test-attachmetadata-scrape-class")
podMonitorWithNonDefaultScrapeClass := defaultPodMonitor()
- podMonitorWithNonDefaultScrapeClass.Spec.ScrapeClassName = ptr.To("test-attachmetadata-scrape-class")
+ podMonitorWithNonDefaultScrapeClass.Spec.ScrapeClassName = new("test-attachmetadata-scrape-class")
for _, tc := range []struct {
name string
scrapeClasses []monitoringv1.ScrapeClass
@@ -13404,8 +13404,8 @@ func TestScrapeClassAttachMetadata(t *testing.T) {
scrapeClasses: []monitoringv1.ScrapeClass{
{
Name: "default",
- Default: ptr.To(true),
- AttachMetadata: &monitoringv1.AttachMetadata{Node: ptr.To(true)},
+ Default: new(true),
+ AttachMetadata: &monitoringv1.AttachMetadata{Node: new(true)},
},
},
serviceMonitors: map[string]*monitoringv1.ServiceMonitor{"monitor": defaultServiceMonitor()},
@@ -13416,7 +13416,7 @@ func TestScrapeClassAttachMetadata(t *testing.T) {
scrapeClasses: []monitoringv1.ScrapeClass{
{
Name: "test-attachmetadata-scrape-class",
- AttachMetadata: &monitoringv1.AttachMetadata{Node: ptr.To(true)},
+ AttachMetadata: &monitoringv1.AttachMetadata{Node: new(true)},
},
},
serviceMonitors: map[string]*monitoringv1.ServiceMonitor{"monitor": serviceMonitorWithNonDefaultScrapeClass},
@@ -13427,12 +13427,12 @@ func TestScrapeClassAttachMetadata(t *testing.T) {
scrapeClasses: []monitoringv1.ScrapeClass{
{
Name: "default",
- Default: ptr.To(true),
- AttachMetadata: &monitoringv1.AttachMetadata{Node: ptr.To(true)},
+ Default: new(true),
+ AttachMetadata: &monitoringv1.AttachMetadata{Node: new(true)},
},
{
Name: "not-default",
- AttachMetadata: &monitoringv1.AttachMetadata{Node: ptr.To(true)},
+ AttachMetadata: &monitoringv1.AttachMetadata{Node: new(true)},
},
},
podMonitors: map[string]*monitoringv1.PodMonitor{"monitor": defaultPodMonitor()},
@@ -13443,7 +13443,7 @@ func TestScrapeClassAttachMetadata(t *testing.T) {
scrapeClasses: []monitoringv1.ScrapeClass{
{
Name: "test-attachmetadata-scrape-class",
- AttachMetadata: &monitoringv1.AttachMetadata{Node: ptr.To(true)},
+ AttachMetadata: &monitoringv1.AttachMetadata{Node: new(true)},
},
},
podMonitors: map[string]*monitoringv1.PodMonitor{"monitor": podMonitorWithNonDefaultScrapeClass},
@@ -13478,13 +13478,13 @@ func TestScrapeClassAttachMetadata(t *testing.T) {
func TestScrapeClassFallbackScrapeProtocol(t *testing.T) {
serviceMonitorWithNonDefaultScrapeClass := defaultServiceMonitor()
- serviceMonitorWithNonDefaultScrapeClass.Spec.ScrapeClassName = ptr.To("test-fallback-scrapeprotocol-scrape-class")
+ serviceMonitorWithNonDefaultScrapeClass.Spec.ScrapeClassName = new("test-fallback-scrapeprotocol-scrape-class")
podMonitorWithNonDefaultScrapeClass := defaultPodMonitor()
- podMonitorWithNonDefaultScrapeClass.Spec.ScrapeClassName = ptr.To("test-fallback-scrapeprotocol-scrape-class")
+ podMonitorWithNonDefaultScrapeClass.Spec.ScrapeClassName = new("test-fallback-scrapeprotocol-scrape-class")
probeWithNonDefaultScrapeClass := defaultProbe()
- probeWithNonDefaultScrapeClass.Spec.ScrapeClassName = ptr.To("test-fallback-scrapeprotocol-scrape-class")
+ probeWithNonDefaultScrapeClass.Spec.ScrapeClassName = new("test-fallback-scrapeprotocol-scrape-class")
scrapeConfigWithNonDefaultScrapeClass := defaultScrapeConfig()
- scrapeConfigWithNonDefaultScrapeClass.Spec.ScrapeClassName = ptr.To("test-fallback-scrapeprotocol-scrape-class")
+ scrapeConfigWithNonDefaultScrapeClass.Spec.ScrapeClassName = new("test-fallback-scrapeprotocol-scrape-class")
for _, tc := range []struct {
name string
scrapeClasses []monitoringv1.ScrapeClass
@@ -13499,7 +13499,7 @@ func TestScrapeClassFallbackScrapeProtocol(t *testing.T) {
scrapeClasses: []monitoringv1.ScrapeClass{
{
Name: "default",
- Default: ptr.To(true),
+ Default: new(true),
FallbackScrapeProtocol: ptr.To(monitoringv1.OpenMetricsText1_0_0),
},
},
@@ -13522,7 +13522,7 @@ func TestScrapeClassFallbackScrapeProtocol(t *testing.T) {
scrapeClasses: []monitoringv1.ScrapeClass{
{
Name: "default",
- Default: ptr.To(true),
+ Default: new(true),
FallbackScrapeProtocol: ptr.To(monitoringv1.OpenMetricsText1_0_0),
},
},
@@ -13545,7 +13545,7 @@ func TestScrapeClassFallbackScrapeProtocol(t *testing.T) {
scrapeClasses: []monitoringv1.ScrapeClass{
{
Name: "default",
- Default: ptr.To(true),
+ Default: new(true),
FallbackScrapeProtocol: ptr.To(monitoringv1.OpenMetricsText1_0_0),
},
},
@@ -13568,7 +13568,7 @@ func TestScrapeClassFallbackScrapeProtocol(t *testing.T) {
scrapeClasses: []monitoringv1.ScrapeClass{
{
Name: "default",
- Default: ptr.To(true),
+ Default: new(true),
FallbackScrapeProtocol: ptr.To(monitoringv1.OpenMetricsText1_0_0),
},
},
@@ -13628,7 +13628,7 @@ func TestGenerateAlertmanagerConfig(t *testing.T) {
Alertmanagers: []monitoringv1.AlertmanagerEndpoints{
{
Name: "foo",
- Namespace: ptr.To("other"),
+ Namespace: new("other"),
Port: intstr.FromString("web"),
},
},
@@ -13640,12 +13640,12 @@ func TestGenerateAlertmanagerConfig(t *testing.T) {
Alertmanagers: []monitoringv1.AlertmanagerEndpoints{
{
Name: "foo",
- Namespace: ptr.To("default"),
+ Namespace: new("default"),
Port: intstr.FromString("web"),
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -13667,7 +13667,7 @@ func TestGenerateAlertmanagerConfig(t *testing.T) {
Alertmanagers: []monitoringv1.AlertmanagerEndpoints{
{
Name: "foo",
- Namespace: ptr.To("default"),
+ Namespace: new("default"),
Port: intstr.FromString("web"),
TLSConfig: &monitoringv1.TLSConfig{
SafeTLSConfig: monitoringv1.SafeTLSConfig{
@@ -13705,7 +13705,7 @@ func TestGenerateAlertmanagerConfig(t *testing.T) {
Alertmanagers: []monitoringv1.AlertmanagerEndpoints{
{
Name: "foo",
- Namespace: ptr.To("other"),
+ Namespace: new("other"),
Port: intstr.FromString("web"),
TLSConfig: &monitoringv1.TLSConfig{
SafeTLSConfig: monitoringv1.SafeTLSConfig{
@@ -13743,7 +13743,7 @@ func TestGenerateAlertmanagerConfig(t *testing.T) {
Alertmanagers: []monitoringv1.AlertmanagerEndpoints{
{
Name: "foo",
- Namespace: ptr.To("default"),
+ Namespace: new("default"),
Port: intstr.FromString("web"),
},
},
@@ -13813,7 +13813,7 @@ func TestAlertmanagerTLSConfig(t *testing.T) {
Alertmanagers: []monitoringv1.AlertmanagerEndpoints{
{
Name: "foo",
- Namespace: ptr.To("other"),
+ Namespace: new("other"),
TLSConfig: &monitoringv1.TLSConfig{
SafeTLSConfig: monitoringv1.SafeTLSConfig{
CA: monitoringv1.SecretOrConfigMap{
@@ -13854,7 +13854,7 @@ func TestAlertmanagerTLSConfig(t *testing.T) {
Alertmanagers: []monitoringv1.AlertmanagerEndpoints{
{
Name: "foo",
- Namespace: ptr.To("other"),
+ Namespace: new("other"),
TLSConfig: &monitoringv1.TLSConfig{
SafeTLSConfig: monitoringv1.SafeTLSConfig{
CA: monitoringv1.SecretOrConfigMap{
@@ -13895,7 +13895,7 @@ func TestAlertmanagerTLSConfig(t *testing.T) {
Alertmanagers: []monitoringv1.AlertmanagerEndpoints{
{
Name: "foo",
- Namespace: ptr.To("other"),
+ Namespace: new("other"),
TLSConfig: &monitoringv1.TLSConfig{
SafeTLSConfig: monitoringv1.SafeTLSConfig{
CA: monitoringv1.SecretOrConfigMap{
@@ -13936,7 +13936,7 @@ func TestAlertmanagerTLSConfig(t *testing.T) {
Alertmanagers: []monitoringv1.AlertmanagerEndpoints{
{
Name: "foo",
- Namespace: ptr.To("other"),
+ Namespace: new("other"),
TLSConfig: &monitoringv1.TLSConfig{
SafeTLSConfig: monitoringv1.SafeTLSConfig{
CA: monitoringv1.SecretOrConfigMap{
@@ -14186,7 +14186,7 @@ func TestPodMonitorSelectors(t *testing.T) {
},
PodMetricsEndpoints: []monitoringv1.PodMetricsEndpoint{
{
- Port: ptr.To("web"),
+ Port: new("web"),
Interval: "30s",
},
},
@@ -14217,7 +14217,7 @@ func TestPodMonitorSelectors(t *testing.T) {
},
PodMetricsEndpoints: []monitoringv1.PodMetricsEndpoint{
{
- Port: ptr.To("web"),
+ Port: new("web"),
Interval: "30s",
},
},
@@ -14244,7 +14244,7 @@ func TestPodMonitorSelectors(t *testing.T) {
},
PodMetricsEndpoints: []monitoringv1.PodMetricsEndpoint{
{
- Port: ptr.To("web"),
+ Port: new("web"),
Interval: "30s",
},
},
@@ -14282,7 +14282,7 @@ func TestPodMonitorSelectors(t *testing.T) {
},
PodMetricsEndpoints: []monitoringv1.PodMetricsEndpoint{
{
- Port: ptr.To("web"),
+ Port: new("web"),
Interval: "30s",
},
},
@@ -14321,19 +14321,19 @@ func TestAppendConvertScrapeClassicHistograms(t *testing.T) {
{
name: "ScrapeClassicHistograms true with Prometheus Version 3.5",
version: "v3.5.0",
- ScrapeClassicHistograms: ptr.To(true),
+ ScrapeClassicHistograms: new(true),
expectedCfg: "ScrapeClassicHistogramsTrueProperPromVersion.golden",
},
{
name: "ScrapeClassicHistograms false with Prometheus Version 3.5",
version: "v3.5.0",
- ScrapeClassicHistograms: ptr.To(false),
+ ScrapeClassicHistograms: new(false),
expectedCfg: "ScrapeClassicHistogramsFalseProperPromVersion.golden",
},
{
name: "ScrapeClassicHistograms true with Prometheus Version 2",
version: "v2.45.0",
- ScrapeClassicHistograms: ptr.To(true),
+ ScrapeClassicHistograms: new(true),
expectedCfg: "ScrapeClassicHistogramsTrueWrongPromVersion.golden",
},
}
@@ -14378,19 +14378,19 @@ func TestAppendScrapeNativeHistograms(t *testing.T) {
{
name: "ScrapeNativeHistograms true with Prometheus Version 3.8",
version: "v3.8.0",
- ScrapeNativeHistograms: ptr.To(true),
+ ScrapeNativeHistograms: new(true),
expectedCfg: "ScrapeNativeHistogramsTrueProperPromVersion.golden",
},
{
name: "ScrapeNativeHistograms false with Prometheus Version 3.8",
version: "v3.8.0",
- ScrapeNativeHistograms: ptr.To(false),
+ ScrapeNativeHistograms: new(false),
expectedCfg: "ScrapeNativeHistogramsFalseProperPromVersion.golden",
},
{
name: "ScrapeNativeHistograms true with Lower Prometheus version",
version: "v3.7.0",
- ScrapeNativeHistograms: ptr.To(true),
+ ScrapeNativeHistograms: new(true),
expectedCfg: "ScrapeNativeHistogramsTrueWrongPromVersion.golden",
},
}
@@ -14459,7 +14459,7 @@ func TestTopologyShardingRelabeling(t *testing.T) {
MatchLabels: map[string]string{"foo": "bar"},
},
PodMetricsEndpoints: []monitoringv1.PodMetricsEndpoint{
- {Port: ptr.To("web"), Interval: "30s"},
+ {Port: new("web"), Interval: "30s"},
},
},
},
@@ -14516,7 +14516,7 @@ func TestTopologyShardingRelabeling(t *testing.T) {
zones: []string{"zone-a", "zone-b"},
serviceMonitor: func() map[string]*monitoringv1.ServiceMonitor {
sm := basicServiceMonitor()
- sm["test"].Spec.AttachMetadata = &monitoringv1.AttachMetadata{Node: ptr.To(false)}
+ sm["test"].Spec.AttachMetadata = &monitoringv1.AttachMetadata{Node: new(false)}
return sm
}(),
golden: "TopologySharding_ServiceMonitor_force_attach_metadata_false.golden",
@@ -14524,9 +14524,9 @@ func TestTopologyShardingRelabeling(t *testing.T) {
} {
t.Run(tc.name, func(t *testing.T) {
p := defaultPrometheus()
- p.Spec.Shards = ptr.To(tc.shards)
+ p.Spec.Shards = new(tc.shards)
p.Spec.ShardingStrategy = &monitoringv1.ShardingStrategy{
- Mode: ptr.To(topologyMode),
+ Mode: new(topologyMode),
Topology: &monitoringv1.TopologyShardingStrategy{Values: tc.zones},
}
@@ -14577,7 +14577,7 @@ func TestShardingRelabelConfigsWithRetention(t *testing.T) {
} {
t.Run(tc.name, func(t *testing.T) {
p := defaultPrometheus()
- p.Spec.Shards = ptr.To(tc.shards)
+ p.Spec.Shards = new(tc.shards)
opts := []ConfigGeneratorOption{}
if tc.retentionEnabled {
@@ -14642,7 +14642,7 @@ func TestTopologyZoneForShard(t *testing.T) {
{
name: "address mode returns empty",
shardingStrategy: &monitoringv1.ShardingStrategy{
- Mode: ptr.To(addressMode),
+ Mode: new(addressMode),
},
prometheusTopologySharding: true,
shardIndex: 0,
@@ -14651,7 +14651,7 @@ func TestTopologyZoneForShard(t *testing.T) {
{
name: "topology mode with no values returns empty",
shardingStrategy: &monitoringv1.ShardingStrategy{
- Mode: ptr.To(topologyMode),
+ Mode: new(topologyMode),
Topology: &monitoringv1.TopologyShardingStrategy{Values: []string{}},
},
prometheusTopologySharding: true,
@@ -14661,7 +14661,7 @@ func TestTopologyZoneForShard(t *testing.T) {
{
name: "shard 0 gets first zone",
shardingStrategy: &monitoringv1.ShardingStrategy{
- Mode: ptr.To(topologyMode),
+ Mode: new(topologyMode),
Topology: &monitoringv1.TopologyShardingStrategy{Values: []string{"zone-a", "zone-b"}},
},
prometheusTopologySharding: true,
@@ -14671,7 +14671,7 @@ func TestTopologyZoneForShard(t *testing.T) {
{
name: "shard 1 gets second zone",
shardingStrategy: &monitoringv1.ShardingStrategy{
- Mode: ptr.To(topologyMode),
+ Mode: new(topologyMode),
Topology: &monitoringv1.TopologyShardingStrategy{Values: []string{"zone-a", "zone-b"}},
},
prometheusTopologySharding: true,
@@ -14681,7 +14681,7 @@ func TestTopologyZoneForShard(t *testing.T) {
{
name: "shard 2 wraps around to first zone",
shardingStrategy: &monitoringv1.ShardingStrategy{
- Mode: ptr.To(topologyMode),
+ Mode: new(topologyMode),
Topology: &monitoringv1.TopologyShardingStrategy{Values: []string{"zone-a", "zone-b"}},
},
prometheusTopologySharding: true,
@@ -14727,7 +14727,7 @@ func TestInzoneShardForShard(t *testing.T) {
{
name: "2 shards 2 zones",
shardingStrategy: &monitoringv1.ShardingStrategy{
- Mode: ptr.To(topologyMode),
+ Mode: new(topologyMode),
Topology: &monitoringv1.TopologyShardingStrategy{Values: []string{"zone-a", "zone-b"}},
},
prometheusTopologySharding: true,
@@ -14736,7 +14736,7 @@ func TestInzoneShardForShard(t *testing.T) {
{
name: "2 shards 1 zone",
shardingStrategy: &monitoringv1.ShardingStrategy{
- Mode: ptr.To(topologyMode),
+ Mode: new(topologyMode),
Topology: &monitoringv1.TopologyShardingStrategy{Values: []string{"zone-a"}},
},
prometheusTopologySharding: true,
@@ -14745,7 +14745,7 @@ func TestInzoneShardForShard(t *testing.T) {
{
name: "3 shards 2 zones",
shardingStrategy: &monitoringv1.ShardingStrategy{
- Mode: ptr.To(topologyMode),
+ Mode: new(topologyMode),
Topology: &monitoringv1.TopologyShardingStrategy{Values: []string{"zone-a", "zone-b"}},
},
prometheusTopologySharding: true,
@@ -14754,7 +14754,7 @@ func TestInzoneShardForShard(t *testing.T) {
{
name: "4 shards 2 zones",
shardingStrategy: &monitoringv1.ShardingStrategy{
- Mode: ptr.To(topologyMode),
+ Mode: new(topologyMode),
Topology: &monitoringv1.TopologyShardingStrategy{Values: []string{"zone-a", "zone-b"}},
},
prometheusTopologySharding: true,
@@ -14763,7 +14763,7 @@ func TestInzoneShardForShard(t *testing.T) {
{
name: "6 shards 3 zones",
shardingStrategy: &monitoringv1.ShardingStrategy{
- Mode: ptr.To(topologyMode),
+ Mode: new(topologyMode),
Topology: &monitoringv1.TopologyShardingStrategy{Values: []string{"zone-a", "zone-b", "zone-c"}},
},
prometheusTopologySharding: true,
diff --git a/pkg/prometheus/resource_selector_test.go b/pkg/prometheus/resource_selector_test.go
index 0946bf99659..919645bd831 100644
--- a/pkg/prometheus/resource_selector_test.go
+++ b/pkg/prometheus/resource_selector_test.go
@@ -146,9 +146,9 @@ func TestSelectProbes(t *testing.T) {
scenario: "invalid proxyconfig due to invalid proxyurl",
updateSpec: func(ps *monitoringv1.ProbeSpec) {
ps.ProberSpec.ProxyConfig = monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://xxx-${dev}.svc.cluster.local:80"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://xxx-${dev}.svc.cluster.local:80"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -167,8 +167,8 @@ func TestSelectProbes(t *testing.T) {
scenario: "invalid proxyconfig due to proxy environment set to true and proxyurl defined",
updateSpec: func(ps *monitoringv1.ProbeSpec) {
ps.ProberSpec.ProxyConfig = monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- ProxyFromEnvironment: ptr.To(true),
+ ProxyURL: new("http://no-proxy.com"),
+ ProxyFromEnvironment: new(true),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -187,8 +187,8 @@ func TestSelectProbes(t *testing.T) {
scenario: "invalid proxyconfig due to proxy environment set to true and noproxy defined",
updateSpec: func(ps *monitoringv1.ProbeSpec) {
ps.ProberSpec.ProxyConfig = monitoringv1.ProxyConfig{
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(true),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(true),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -207,8 +207,8 @@ func TestSelectProbes(t *testing.T) {
scenario: "invalid proxyconfig due to invalid secret secret key",
updateSpec: func(ps *monitoringv1.ProbeSpec) {
ps.ProberSpec.ProxyConfig = monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- ProxyFromEnvironment: ptr.To(true),
+ ProxyURL: new("http://no-proxy.com"),
+ ProxyFromEnvironment: new(true),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -227,7 +227,7 @@ func TestSelectProbes(t *testing.T) {
scenario: "invalid proxyconfig due to proxy from environment set to false and proxyurl and noproxy not defined",
updateSpec: func(ps *monitoringv1.ProbeSpec) {
ps.ProberSpec.ProxyConfig = monitoringv1.ProxyConfig{
- ProxyFromEnvironment: ptr.To(false),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -246,9 +246,9 @@ func TestSelectProbes(t *testing.T) {
scenario: "valid proxyconfig",
updateSpec: func(ps *monitoringv1.ProbeSpec) {
ps.ProberSpec.ProxyConfig = monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -395,7 +395,7 @@ func TestSelectProbes(t *testing.T) {
},
{
scenario: "inexistent scrape class",
- scrapeClass: ptr.To("inexistent"),
+ scrapeClass: new("inexistent"),
updateSpec: func(ps *monitoringv1.ProbeSpec) {
ps.Targets.StaticConfig = nil
ps.Targets.Ingress = &monitoringv1.ProbeTargetIngress{
@@ -412,7 +412,7 @@ func TestSelectProbes(t *testing.T) {
},
{
scenario: "existent scrape class",
- scrapeClass: ptr.To("existent"),
+ scrapeClass: new("existent"),
updateSpec: func(ps *monitoringv1.ProbeSpec) {
ps.Targets.StaticConfig = nil
ps.Targets.Ingress = &monitoringv1.ProbeTargetIngress{
@@ -901,9 +901,9 @@ func TestSelectServiceMonitors(t *testing.T) {
sm.Endpoints = append(sm.Endpoints, monitoringv1.Endpoint{
HTTPConfigWithProxyAndTLSFiles: monitoringv1.HTTPConfigWithProxyAndTLSFiles{
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -926,9 +926,9 @@ func TestSelectServiceMonitors(t *testing.T) {
sm.Endpoints = append(sm.Endpoints, monitoringv1.Endpoint{
HTTPConfigWithProxyAndTLSFiles: monitoringv1.HTTPConfigWithProxyAndTLSFiles{
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -951,9 +951,9 @@ func TestSelectServiceMonitors(t *testing.T) {
sm.Endpoints = append(sm.Endpoints, monitoringv1.Endpoint{
HTTPConfigWithProxyAndTLSFiles: monitoringv1.HTTPConfigWithProxyAndTLSFiles{
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://xxx-${dev}.svc.cluster.local:80"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://xxx-${dev}.svc.cluster.local:80"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -976,8 +976,8 @@ func TestSelectServiceMonitors(t *testing.T) {
sm.Endpoints = append(sm.Endpoints, monitoringv1.Endpoint{
HTTPConfigWithProxyAndTLSFiles: monitoringv1.HTTPConfigWithProxyAndTLSFiles{
ProxyConfig: monitoringv1.ProxyConfig{
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(true),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(true),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -1000,8 +1000,8 @@ func TestSelectServiceMonitors(t *testing.T) {
sm.Endpoints = append(sm.Endpoints, monitoringv1.Endpoint{
HTTPConfigWithProxyAndTLSFiles: monitoringv1.HTTPConfigWithProxyAndTLSFiles{
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- ProxyFromEnvironment: ptr.To(true),
+ ProxyURL: new("http://no-proxy.com"),
+ ProxyFromEnvironment: new(true),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -1042,14 +1042,14 @@ func TestSelectServiceMonitors(t *testing.T) {
},
{
scenario: "inexistent Scrape Class",
- scrapeClass: ptr.To("inexistent"),
+ scrapeClass: new("inexistent"),
updateSpec: func(_ *monitoringv1.ServiceMonitorSpec) {
},
valid: false,
},
{
scenario: "existent Scrape Class",
- scrapeClass: ptr.To("existent"),
+ scrapeClass: new("existent"),
updateSpec: func(_ *monitoringv1.ServiceMonitorSpec) {
},
valid: true,
@@ -1294,9 +1294,9 @@ func TestSelectPodMonitors(t *testing.T) {
pm.PodMetricsEndpoints = append(pm.PodMetricsEndpoints, monitoringv1.PodMetricsEndpoint{
HTTPConfigWithProxy: monitoringv1.HTTPConfigWithProxy{
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -1319,9 +1319,9 @@ func TestSelectPodMonitors(t *testing.T) {
pm.PodMetricsEndpoints = append(pm.PodMetricsEndpoints, monitoringv1.PodMetricsEndpoint{
HTTPConfigWithProxy: monitoringv1.HTTPConfigWithProxy{
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -1344,9 +1344,9 @@ func TestSelectPodMonitors(t *testing.T) {
pm.PodMetricsEndpoints = append(pm.PodMetricsEndpoints, monitoringv1.PodMetricsEndpoint{
HTTPConfigWithProxy: monitoringv1.HTTPConfigWithProxy{
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://xxx-${dev}.svc.cluster.local:80"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://xxx-${dev}.svc.cluster.local:80"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -1369,8 +1369,8 @@ func TestSelectPodMonitors(t *testing.T) {
pm.PodMetricsEndpoints = append(pm.PodMetricsEndpoints, monitoringv1.PodMetricsEndpoint{
HTTPConfigWithProxy: monitoringv1.HTTPConfigWithProxy{
ProxyConfig: monitoringv1.ProxyConfig{
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(true),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(true),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -1393,8 +1393,8 @@ func TestSelectPodMonitors(t *testing.T) {
pm.PodMetricsEndpoints = append(pm.PodMetricsEndpoints, monitoringv1.PodMetricsEndpoint{
HTTPConfigWithProxy: monitoringv1.HTTPConfigWithProxy{
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- ProxyFromEnvironment: ptr.To(true),
+ ProxyURL: new("http://no-proxy.com"),
+ ProxyFromEnvironment: new(true),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -1435,14 +1435,14 @@ func TestSelectPodMonitors(t *testing.T) {
},
{
scenario: "Inexistent Scrape Class",
- scrapeClass: ptr.To("inexistent"),
+ scrapeClass: new("inexistent"),
updateSpec: func(_ *monitoringv1.PodMonitorSpec) {
},
valid: false,
},
{
scenario: "existent Scrape Class",
- scrapeClass: ptr.To("existent"),
+ scrapeClass: new("existent"),
updateSpec: func(_ *monitoringv1.PodMonitorSpec) {
},
valid: true,
@@ -1666,9 +1666,9 @@ func TestSelectScrapeConfigs(t *testing.T) {
scenario: "valid proxy config",
updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) {
sc.ProxyConfig = monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -1705,8 +1705,8 @@ func TestSelectScrapeConfigs(t *testing.T) {
scenario: "invalid proxy config with proxy from environment set to true but proxyUrl defined",
updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) {
sc.ProxyConfig = monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- ProxyFromEnvironment: ptr.To(true),
+ ProxyURL: new("http://no-proxy.com"),
+ ProxyFromEnvironment: new(true),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -1725,8 +1725,8 @@ func TestSelectScrapeConfigs(t *testing.T) {
scenario: "invalid proxy config with proxyFromEnvironment set to true but noProxy defined",
updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) {
sc.ProxyConfig = monitoringv1.ProxyConfig{
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(true),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(true),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -1745,9 +1745,9 @@ func TestSelectScrapeConfigs(t *testing.T) {
scenario: "invalid proxy config with invalid secret key",
updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) {
sc.ProxyConfig = monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -1772,7 +1772,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
scenario: "invalid proxy config with noProxy defined and but no proxyUrl defined",
updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) {
sc.ProxyConfig = monitoringv1.ProxyConfig{
- NoProxy: ptr.To("0.0.0.0"),
+ NoProxy: new("0.0.0.0"),
}
},
valid: false,
@@ -1781,9 +1781,9 @@ func TestSelectScrapeConfigs(t *testing.T) {
scenario: "valid proxy config with multi header values",
updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) {
sc.ProxyConfig = monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -1814,9 +1814,9 @@ func TestSelectScrapeConfigs(t *testing.T) {
scenario: "invalid proxy config with one invalid secret key",
updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) {
sc.ProxyConfig = monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -1872,9 +1872,9 @@ func TestSelectScrapeConfigs(t *testing.T) {
{
URL: "http://example.com",
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -1899,8 +1899,8 @@ func TestSelectScrapeConfigs(t *testing.T) {
{
URL: "http://example.com",
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- ProxyFromEnvironment: ptr.To(true),
+ ProxyURL: new("http://no-proxy.com"),
+ ProxyFromEnvironment: new(true),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -1964,9 +1964,9 @@ func TestSelectScrapeConfigs(t *testing.T) {
sc.HTTPSDConfigs = []monitoringv1alpha1.HTTPSDConfig{
{
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -2105,9 +2105,9 @@ func TestSelectScrapeConfigs(t *testing.T) {
{
Role: monitoringv1alpha1.KubernetesRoleNode,
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -2131,8 +2131,8 @@ func TestSelectScrapeConfigs(t *testing.T) {
{
Role: monitoringv1alpha1.KubernetesRoleNode,
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- ProxyFromEnvironment: ptr.To(true),
+ ProxyURL: new("http://no-proxy.com"),
+ ProxyFromEnvironment: new(true),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -2156,7 +2156,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
{
Selectors: []monitoringv1alpha1.K8SSelectorConfig{
{
- Label: ptr.To("app=example,env!=production,release in (v1, v2)"),
+ Label: new("app=example,env!=production,release in (v1, v2)"),
},
},
},
@@ -2171,7 +2171,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
{
Selectors: []monitoringv1alpha1.K8SSelectorConfig{
{
- Field: ptr.To("status.phase=Running,metadata.name!=worker"),
+ Field: new("status.phase=Running,metadata.name!=worker"),
},
},
},
@@ -2293,8 +2293,8 @@ func TestSelectScrapeConfigs(t *testing.T) {
Selectors: []monitoringv1alpha1.K8SSelectorConfig{
{
Role: monitoringv1alpha1.KubernetesRoleNode,
- Label: ptr.To("app=example,env!=production,release in (v1, v2)"),
- Field: ptr.To("status.phase=Running,metadata.name!=worker"),
+ Label: new("app=example,env!=production,release in (v1, v2)"),
+ Field: new("status.phase=Running,metadata.name!=worker"),
},
},
},
@@ -2307,7 +2307,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) {
sc.KubernetesSDConfigs = []monitoringv1alpha1.KubernetesSDConfig{
{
- APIServer: ptr.To("https://kube-api-server-address:6443"),
+ APIServer: new("https://kube-api-server-address:6443"),
},
}
},
@@ -2319,7 +2319,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
sc.KubernetesSDConfigs = []monitoringv1alpha1.KubernetesSDConfig{
{
Namespaces: &monitoringv1alpha1.NamespaceDiscovery{
- IncludeOwnNamespace: ptr.To(true),
+ IncludeOwnNamespace: new(true),
},
},
}
@@ -2331,9 +2331,9 @@ func TestSelectScrapeConfigs(t *testing.T) {
updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) {
sc.KubernetesSDConfigs = []monitoringv1alpha1.KubernetesSDConfig{
{
- APIServer: ptr.To("https://kube-api-server-address:6443"),
+ APIServer: new("https://kube-api-server-address:6443"),
Namespaces: &monitoringv1alpha1.NamespaceDiscovery{
- IncludeOwnNamespace: ptr.To(true),
+ IncludeOwnNamespace: new(true),
},
},
}
@@ -2391,7 +2391,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
sc.ConsulSDConfigs = []monitoringv1alpha1.ConsulSDConfig{
{
Server: "example.com",
- Filter: ptr.To("Meta.env == \"qa\""),
+ Filter: new("Meta.env == \"qa\""),
},
}
},
@@ -2404,7 +2404,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
sc.ConsulSDConfigs = []monitoringv1alpha1.ConsulSDConfig{
{
Server: "example.com",
- Filter: ptr.To("Meta.env == \"qa\""),
+ Filter: new("Meta.env == \"qa\""),
},
}
},
@@ -2417,7 +2417,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
sc.ConsulSDConfigs = []monitoringv1alpha1.ConsulSDConfig{
{
Server: "example.com",
- HealthFilter: ptr.To("Service.Meta.env == \"prod\""),
+ HealthFilter: new("Service.Meta.env == \"prod\""),
},
}
},
@@ -2430,7 +2430,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
sc.ConsulSDConfigs = []monitoringv1alpha1.ConsulSDConfig{
{
Server: "example.com",
- HealthFilter: ptr.To("Service.Meta.env == \"prod\""),
+ HealthFilter: new("Service.Meta.env == \"prod\""),
},
}
},
@@ -2452,9 +2452,9 @@ func TestSelectScrapeConfigs(t *testing.T) {
},
{
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -2603,7 +2603,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
{
Names: []string{"node.demo.do.prometheus.io"},
Type: ptr.To(monitoringv1alpha1.DNSRecordTypeMX),
- Port: ptr.To(int32(9900)),
+ Port: new(int32(9900)),
},
}
},
@@ -2617,7 +2617,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
{
Names: []string{"node.demo.do.prometheus.io"},
Type: ptr.To(monitoringv1alpha1.DNSRecordTypeA),
- Port: ptr.To(int32(9900)),
+ Port: new(int32(9900)),
},
}
},
@@ -2631,7 +2631,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
{
Names: []string{"node.demo.do.prometheus.io"},
Type: ptr.To(monitoringv1alpha1.DNSRecordTypeA),
- Port: ptr.To(int32(9900)),
+ Port: new(int32(9900)),
},
}
},
@@ -2644,7 +2644,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
{
Names: []string{"node.demo.do.prometheus.io"},
Type: ptr.To(monitoringv1alpha1.DNSRecordTypeNS),
- Port: ptr.To(int32(9900)),
+ Port: new(int32(9900)),
},
}
},
@@ -2658,7 +2658,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
{
Names: []string{"node.demo.do.prometheus.io"},
Type: ptr.To(monitoringv1alpha1.DNSRecordTypeMX),
- Port: ptr.To(int32(9900)),
+ Port: new(int32(9900)),
},
}
},
@@ -2672,7 +2672,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
{
Names: []string{"node.demo.do.prometheus.io"},
Type: ptr.To(monitoringv1alpha1.DNSRecordTypeA),
- Port: ptr.To(int32(9900)),
+ Port: new(int32(9900)),
},
}
},
@@ -2684,7 +2684,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) {
sc.EC2SDConfigs = []monitoringv1alpha1.EC2SDConfig{
{
- Region: ptr.To("us-east-1"),
+ Region: new("us-east-1"),
AccessKey: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "secret",
@@ -2707,7 +2707,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) {
sc.EC2SDConfigs = []monitoringv1alpha1.EC2SDConfig{
{
- Region: ptr.To("us-east-1"),
+ Region: new("us-east-1"),
},
}
},
@@ -2718,7 +2718,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) {
sc.EC2SDConfigs = []monitoringv1alpha1.EC2SDConfig{
{
- Region: ptr.To("us-east-1"),
+ Region: new("us-east-1"),
AccessKey: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "secret",
@@ -2741,7 +2741,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) {
sc.EC2SDConfigs = []monitoringv1alpha1.EC2SDConfig{
{
- Region: ptr.To("us-east-1"),
+ Region: new("us-east-1"),
TLSConfig: &monitoringv1.SafeTLSConfig{
CA: monitoringv1.SecretOrConfigMap{
Secret: &corev1.SecretKeySelector{
@@ -2776,7 +2776,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) {
sc.EC2SDConfigs = []monitoringv1alpha1.EC2SDConfig{
{
- Region: ptr.To("us-east-1"),
+ Region: new("us-east-1"),
TLSConfig: &monitoringv1.SafeTLSConfig{
CA: monitoringv1.SecretOrConfigMap{
Secret: &corev1.SecretKeySelector{
@@ -2802,7 +2802,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
},
},
RefreshInterval: ptr.To(monitoringv1.Duration("30s")),
- EnableHTTP2: ptr.To(true),
+ EnableHTTP2: new(true),
},
}
},
@@ -2814,7 +2814,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) {
sc.EC2SDConfigs = []monitoringv1alpha1.EC2SDConfig{
{
- Region: ptr.To("us-east-1"),
+ Region: new("us-east-1"),
TLSConfig: &monitoringv1.SafeTLSConfig{
CA: monitoringv1.SecretOrConfigMap{
Secret: &corev1.SecretKeySelector{
@@ -2835,11 +2835,11 @@ func TestSelectScrapeConfigs(t *testing.T) {
updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) {
sc.EC2SDConfigs = []monitoringv1alpha1.EC2SDConfig{
{
- Region: ptr.To("us-east-1"),
+ Region: new("us-east-1"),
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -2862,8 +2862,8 @@ func TestSelectScrapeConfigs(t *testing.T) {
updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) {
sc.AzureSDConfigs = []monitoringv1alpha1.AzureSDConfig{
{
- TenantID: ptr.To("BBBB222B-B2B2-2B22-B222-2BB2222BB2B2"),
- ClientID: ptr.To("333333CC-3C33-3333-CCC3-33C3CCCCC33C"),
+ TenantID: new("BBBB222B-B2B2-2B22-B222-2BB2222BB2B2"),
+ ClientID: new("333333CC-3C33-3333-CCC3-33C3CCCCC33C"),
ClientSecret: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "secret",
@@ -2881,8 +2881,8 @@ func TestSelectScrapeConfigs(t *testing.T) {
sc.AzureSDConfigs = []monitoringv1alpha1.AzureSDConfig{
{
AuthenticationMethod: ptr.To(monitoringv1alpha1.AuthMethodTypeOAuth),
- TenantID: ptr.To("BBBB222B-B2B2-2B22-B222-2BB2222BB2B2"),
- ClientID: ptr.To("333333CC-3C33-3333-CCC3-33C3CCCCC33C"),
+ TenantID: new("BBBB222B-B2B2-2B22-B222-2BB2222BB2B2"),
+ ClientID: new("333333CC-3C33-3333-CCC3-33C3CCCCC33C"),
},
}
},
@@ -2894,7 +2894,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
sc.AzureSDConfigs = []monitoringv1alpha1.AzureSDConfig{
{
AuthenticationMethod: ptr.To(monitoringv1alpha1.AuthMethodTypeOAuth),
- ClientID: ptr.To("333333CC-3C33-3333-CCC3-33C3CCCCC33C"),
+ ClientID: new("333333CC-3C33-3333-CCC3-33C3CCCCC33C"),
ClientSecret: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "secret",
@@ -2912,7 +2912,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
sc.AzureSDConfigs = []monitoringv1alpha1.AzureSDConfig{
{
AuthenticationMethod: ptr.To(monitoringv1alpha1.AuthMethodTypeOAuth),
- TenantID: ptr.To("BBBB222B-B2B2-2B22-B222-2BB2222BB2B2"),
+ TenantID: new("BBBB222B-B2B2-2B22-B222-2BB2222BB2B2"),
ClientSecret: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "secret",
@@ -2965,7 +2965,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
sc.AzureSDConfigs = []monitoringv1alpha1.AzureSDConfig{
{
AuthenticationMethod: ptr.To(monitoringv1alpha1.AuthMethodTypeManagedIdentity),
- ResourceGroup: ptr.To("my-resource-group"),
+ ResourceGroup: new("my-resource-group"),
},
}
},
@@ -2978,7 +2978,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
sc.AzureSDConfigs = []monitoringv1alpha1.AzureSDConfig{
{
AuthenticationMethod: ptr.To(monitoringv1alpha1.AuthMethodTypeManagedIdentity),
- ResourceGroup: ptr.To("my-resource-group"),
+ ResourceGroup: new("my-resource-group"),
},
}
},
@@ -2991,8 +2991,8 @@ func TestSelectScrapeConfigs(t *testing.T) {
sc.AzureSDConfigs = []monitoringv1alpha1.AzureSDConfig{
{
SubscriptionID: "11111111-1111-1111-1111-111111111111",
- TenantID: ptr.To("BBBB222B-B2B2-2B22-B222-2BB2222BB2B2"),
- ClientID: ptr.To("333333CC-3C33-3333-CCC3-33C3CCCCC33C"),
+ TenantID: new("BBBB222B-B2B2-2B22-B222-2BB2222BB2B2"),
+ ClientID: new("333333CC-3C33-3333-CCC3-33C3CCCCC33C"),
ClientSecret: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "secret",
@@ -3315,9 +3315,9 @@ func TestSelectScrapeConfigs(t *testing.T) {
{
Server: "http://example.com",
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -3413,9 +3413,9 @@ func TestSelectScrapeConfigs(t *testing.T) {
sc.EurekaSDConfigs = []monitoringv1alpha1.EurekaSDConfig{
{
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -3736,9 +3736,9 @@ func TestSelectScrapeConfigs(t *testing.T) {
{
Role: "hcloud",
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -3762,8 +3762,8 @@ func TestSelectScrapeConfigs(t *testing.T) {
{
Role: "hcloud",
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- ProxyFromEnvironment: ptr.To(true),
+ ProxyURL: new("http://no-proxy.com"),
+ ProxyFromEnvironment: new(true),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -3843,9 +3843,9 @@ func TestSelectScrapeConfigs(t *testing.T) {
{
Server: "http://localhost:4646",
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -3898,7 +3898,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
sc.DockerSDConfigs = []monitoringv1alpha1.DockerSDConfig{
{
Host: "unix:///var/run/docker.sock",
- MatchFirstNetwork: ptr.To(true),
+ MatchFirstNetwork: new(true),
},
}
},
@@ -3911,7 +3911,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
sc.DockerSDConfigs = []monitoringv1alpha1.DockerSDConfig{
{
Host: "unix:///var/run/docker.sock",
- MatchFirstNetwork: ptr.To(true),
+ MatchFirstNetwork: new(true),
},
}
},
@@ -3924,7 +3924,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
sc.HetznerSDConfigs = []monitoringv1alpha1.HetznerSDConfig{
{
Role: "hcloud",
- LabelSelector: ptr.To("env=production"),
+ LabelSelector: new("env=production"),
},
}
},
@@ -3937,7 +3937,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
sc.HetznerSDConfigs = []monitoringv1alpha1.HetznerSDConfig{
{
Role: "hcloud",
- LabelSelector: ptr.To("env=production"),
+ LabelSelector: new("env=production"),
},
}
},
@@ -4004,9 +4004,9 @@ func TestSelectScrapeConfigs(t *testing.T) {
sc.DockerSwarmSDConfigs = []monitoringv1alpha1.DockerSwarmSDConfig{
{
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -4104,9 +4104,9 @@ func TestSelectScrapeConfigs(t *testing.T) {
{
URL: "https://example.com",
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -4214,9 +4214,9 @@ func TestSelectScrapeConfigs(t *testing.T) {
sc.LightSailSDConfigs = []monitoringv1alpha1.LightSailSDConfig{
{
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -4239,8 +4239,8 @@ func TestSelectScrapeConfigs(t *testing.T) {
sc.LightSailSDConfigs = []monitoringv1alpha1.LightSailSDConfig{
{
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- ProxyFromEnvironment: ptr.To(true),
+ ProxyURL: new("http://no-proxy.com"),
+ ProxyFromEnvironment: new(true),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -4281,7 +4281,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) {
sc.LightSailSDConfigs = []monitoringv1alpha1.LightSailSDConfig{
{
- Region: ptr.To("us-east-1"),
+ Region: new("us-east-1"),
AccessKey: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "secret",
@@ -4304,7 +4304,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) {
sc.LightSailSDConfigs = []monitoringv1alpha1.LightSailSDConfig{
{
- Region: ptr.To("us-east-1"),
+ Region: new("us-east-1"),
},
}
},
@@ -4315,7 +4315,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) {
sc.LightSailSDConfigs = []monitoringv1alpha1.LightSailSDConfig{
{
- Region: ptr.To("us-east-1"),
+ Region: new("us-east-1"),
AccessKey: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "wrong",
@@ -4338,7 +4338,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) {
sc.LightSailSDConfigs = []monitoringv1alpha1.LightSailSDConfig{
{
- Region: ptr.To("us-east-1"),
+ Region: new("us-east-1"),
AccessKey: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "secret",
@@ -4375,7 +4375,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
Key: "key2",
},
Service: monitoringv1alpha1.OVHServiceVPS,
- Endpoint: ptr.To("127.0.0.1"),
+ Endpoint: new("127.0.0.1"),
},
}
},
@@ -4396,10 +4396,10 @@ func TestSelectScrapeConfigs(t *testing.T) {
ProjectID: "1",
Role: monitoringv1alpha1.ScalewayRoleInstance,
- Zone: ptr.To("beijing-1"),
- Port: ptr.To(int32(23456)),
+ Zone: new("beijing-1"),
+ Port: new(int32(23456)),
ApiURL: ptr.To(monitoringv1alpha1.URL("https://api.scaleway.com/")),
- NameFilter: ptr.To("name"),
+ NameFilter: new("name"),
TagsFilter: []string{"aa", "bb"},
},
}
@@ -4431,8 +4431,8 @@ func TestSelectScrapeConfigs(t *testing.T) {
sc.ScalewaySDConfigs = []monitoringv1alpha1.ScalewaySDConfig{
{
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- ProxyFromEnvironment: ptr.To(true),
+ ProxyURL: new("http://no-proxy.com"),
+ ProxyFromEnvironment: new(true),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -4529,9 +4529,9 @@ func TestSelectScrapeConfigs(t *testing.T) {
sc.IonosSDConfigs = []monitoringv1alpha1.IonosSDConfig{
{
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- NoProxy: ptr.To("0.0.0.0"),
- ProxyFromEnvironment: ptr.To(false),
+ ProxyURL: new("http://no-proxy.com"),
+ NoProxy: new("0.0.0.0"),
+ ProxyFromEnvironment: new(false),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -4554,8 +4554,8 @@ func TestSelectScrapeConfigs(t *testing.T) {
sc.IonosSDConfigs = []monitoringv1alpha1.IonosSDConfig{
{
ProxyConfig: monitoringv1.ProxyConfig{
- ProxyURL: ptr.To("http://no-proxy.com"),
- ProxyFromEnvironment: ptr.To(true),
+ ProxyURL: new("http://no-proxy.com"),
+ ProxyFromEnvironment: new(true),
ProxyConnectHeader: map[string][]corev1.SecretKeySelector{
"header": {
{
@@ -4601,7 +4601,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
}
},
valid: false,
- scrapeClass: ptr.To("inexistent"),
+ scrapeClass: new("inexistent"),
},
{
scenario: "inexistent Scrape Class",
@@ -4614,7 +4614,7 @@ func TestSelectScrapeConfigs(t *testing.T) {
}
},
valid: true,
- scrapeClass: ptr.To("existent"),
+ scrapeClass: new("existent"),
},
} {
t.Run(tc.scenario, func(t *testing.T) {
@@ -4804,7 +4804,7 @@ func TestSelectPodMonitorsWithInvalidAuthentication(t *testing.T) {
p := defaultPrometheus()
pme := monitoringv1.PodMetricsEndpoint{
- Port: ptr.To("web"),
+ Port: new("web"),
Interval: "30s",
}
tc.updateFunc(&pme)
diff --git a/pkg/prometheus/server/operator_test.go b/pkg/prometheus/server/operator_test.go
index 27158e94845..1d657edf79b 100644
--- a/pkg/prometheus/server/operator_test.go
+++ b/pkg/prometheus/server/operator_test.go
@@ -29,7 +29,6 @@ import (
k8sruntime "k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/kubernetes/fake"
clienttesting "k8s.io/client-go/testing"
- "k8s.io/utils/ptr"
monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
"github.com/prometheus-operator/prometheus-operator/pkg/operator"
@@ -220,7 +219,7 @@ func TestCreateStatefulSetInputHash(t *testing.T) {
require.Equal(t, p1Hash, p2Hash, "expected two Prometheus CRDs to produce the same hash but got different hash")
- p2Hash, err = createSSetInputHash(tc.a, c, []string{}, &operator.ShardedSecret{}, appsv1.StatefulSetSpec{Replicas: ptr.To(int32(2))})
+ p2Hash, err = createSSetInputHash(tc.a, c, []string{}, &operator.ShardedSecret{}, appsv1.StatefulSetSpec{Replicas: new(int32(2))})
require.NoError(t, err)
require.NotEqual(t, p1Hash, p2Hash, "expected same Prometheus CRDs with different statefulset specs to produce different hashes but got equal hash")
@@ -303,7 +302,7 @@ func TestProcessShardRetention(t *testing.T) {
retentionPoliciesEnabled: true,
spec: monitoringv1.PrometheusSpec{
ShardRetentionPolicy: &monitoringv1.ShardRetentionPolicy{
- WhenScaled: ptr.To(monitoringv1.DeleteWhenScaledRetentionType),
+ WhenScaled: new(monitoringv1.DeleteWhenScaledRetentionType),
},
},
expectedDelete: true,
@@ -313,7 +312,7 @@ func TestProcessShardRetention(t *testing.T) {
retentionPoliciesEnabled: true,
spec: monitoringv1.PrometheusSpec{
ShardRetentionPolicy: &monitoringv1.ShardRetentionPolicy{
- WhenScaled: ptr.To(monitoringv1.RetainWhenScaledRetentionType),
+ WhenScaled: new(monitoringv1.RetainWhenScaledRetentionType),
},
},
expectedDelete: false,
@@ -325,7 +324,7 @@ func TestProcessShardRetention(t *testing.T) {
retentionPoliciesEnabled: true,
spec: monitoringv1.PrometheusSpec{
ShardRetentionPolicy: &monitoringv1.ShardRetentionPolicy{
- WhenScaled: ptr.To(monitoringv1.RetainWhenScaledRetentionType),
+ WhenScaled: new(monitoringv1.RetainWhenScaledRetentionType),
},
},
annotations: map[string]string{deletionDeadlineAnnotation: time.Now().UTC().Add(24 * time.Hour).Format(annotationTimeFormat)},
@@ -338,7 +337,7 @@ func TestProcessShardRetention(t *testing.T) {
spec: monitoringv1.PrometheusSpec{
RetentionSize: "10Gi",
ShardRetentionPolicy: &monitoringv1.ShardRetentionPolicy{
- WhenScaled: ptr.To(monitoringv1.RetainWhenScaledRetentionType),
+ WhenScaled: new(monitoringv1.RetainWhenScaledRetentionType),
},
},
expectedDelete: false,
@@ -350,7 +349,7 @@ func TestProcessShardRetention(t *testing.T) {
retentionPoliciesEnabled: true,
spec: monitoringv1.PrometheusSpec{
ShardRetentionPolicy: &monitoringv1.ShardRetentionPolicy{
- WhenScaled: ptr.To(monitoringv1.RetainWhenScaledRetentionType),
+ WhenScaled: new(monitoringv1.RetainWhenScaledRetentionType),
},
},
injectPatchError: true,
@@ -438,7 +437,7 @@ func TestGracePeriodForPrometheusStorage(t *testing.T) {
name: "empty retention uses default (24h)",
spec: monitoringv1.PrometheusSpec{
ShardRetentionPolicy: &monitoringv1.ShardRetentionPolicy{
- WhenScaled: ptr.To(monitoringv1.RetainWhenScaledRetentionType),
+ WhenScaled: new(monitoringv1.RetainWhenScaledRetentionType),
},
},
expectedDuration: 24 * time.Hour,
@@ -447,7 +446,7 @@ func TestGracePeriodForPrometheusStorage(t *testing.T) {
name: "explicit retain retention duration",
spec: monitoringv1.PrometheusSpec{
ShardRetentionPolicy: &monitoringv1.ShardRetentionPolicy{
- WhenScaled: ptr.To(monitoringv1.RetainWhenScaledRetentionType),
+ WhenScaled: new(monitoringv1.RetainWhenScaledRetentionType),
Retain: &monitoringv1.RetainConfig{
RetentionPeriod: monitoringv1.Duration("15d"),
},
@@ -460,7 +459,7 @@ func TestGracePeriodForPrometheusStorage(t *testing.T) {
spec: monitoringv1.PrometheusSpec{
Retention: "15d",
ShardRetentionPolicy: &monitoringv1.ShardRetentionPolicy{
- WhenScaled: ptr.To(monitoringv1.RetainWhenScaledRetentionType),
+ WhenScaled: new(monitoringv1.RetainWhenScaledRetentionType),
},
},
expectedDuration: 15 * 24 * time.Hour,
@@ -470,7 +469,7 @@ func TestGracePeriodForPrometheusStorage(t *testing.T) {
spec: monitoringv1.PrometheusSpec{
RetentionSize: "10Gi",
ShardRetentionPolicy: &monitoringv1.ShardRetentionPolicy{
- WhenScaled: ptr.To(monitoringv1.RetainWhenScaledRetentionType),
+ WhenScaled: new(monitoringv1.RetainWhenScaledRetentionType),
},
},
expectedDuration: 0,
@@ -481,7 +480,7 @@ func TestGracePeriodForPrometheusStorage(t *testing.T) {
Retention: "7d",
RetentionSize: "10Gi",
ShardRetentionPolicy: &monitoringv1.ShardRetentionPolicy{
- WhenScaled: ptr.To(monitoringv1.RetainWhenScaledRetentionType),
+ WhenScaled: new(monitoringv1.RetainWhenScaledRetentionType),
},
},
expectedDuration: 7 * 24 * time.Hour,
@@ -491,7 +490,7 @@ func TestGracePeriodForPrometheusStorage(t *testing.T) {
spec: monitoringv1.PrometheusSpec{
Retention: "invalid",
ShardRetentionPolicy: &monitoringv1.ShardRetentionPolicy{
- WhenScaled: ptr.To(monitoringv1.RetainWhenScaledRetentionType),
+ WhenScaled: new(monitoringv1.RetainWhenScaledRetentionType),
},
},
expectedErr: true,
diff --git a/pkg/prometheus/server/statefulset.go b/pkg/prometheus/server/statefulset.go
index ccd44311707..a086dee84f7 100644
--- a/pkg/prometheus/server/statefulset.go
+++ b/pkg/prometheus/server/statefulset.go
@@ -267,7 +267,7 @@ func makeStatefulSetSpec(
operator.Zone(topologyZone),
}
if topologyZone != "" {
- reloaderOpts = append(reloaderOpts, operator.InzoneShard(ptr.To(cg.InzoneShardForShard(shard))))
+ reloaderOpts = append(reloaderOpts, operator.InzoneShard(new(cg.InzoneShardForShard(shard))))
}
operatorInitContainers = append(operatorInitContainers,
prompkg.BuildConfigReloader(
@@ -311,8 +311,8 @@ func makeStatefulSetSpec(
Resources: cpf.Resources,
TerminationMessagePolicy: corev1.TerminationMessageFallbackToLogsOnError,
SecurityContext: &corev1.SecurityContext{
- ReadOnlyRootFilesystem: ptr.To(true),
- AllowPrivilegeEscalation: ptr.To(false),
+ ReadOnlyRootFilesystem: new(true),
+ AllowPrivilegeEscalation: new(false),
Capabilities: &corev1.Capabilities{
Drop: []corev1.Capability{"ALL"},
},
@@ -359,11 +359,11 @@ func makeStatefulSetSpec(
InitContainers: initContainers,
SecurityContext: cpf.SecurityContext,
ServiceAccountName: cpf.ServiceAccountName,
- AutomountServiceAccountToken: ptr.To(ptr.Deref(cpf.AutomountServiceAccountToken, true)),
+ AutomountServiceAccountToken: new(ptr.Deref(cpf.AutomountServiceAccountToken, true)),
NodeSelector: cg.NodeSelectorWithTopologyZone(shard),
SchedulerName: cpf.SchedulerName,
PriorityClassName: cpf.PriorityClassName,
- TerminationGracePeriodSeconds: ptr.To(ptr.Deref(cpf.TerminationGracePeriodSeconds, prompkg.DefaultTerminationGracePeriodSeconds)),
+ TerminationGracePeriodSeconds: new(ptr.Deref(cpf.TerminationGracePeriodSeconds, prompkg.DefaultTerminationGracePeriodSeconds)),
Volumes: volumes,
Tolerations: cpf.Tolerations,
Affinity: cpf.Affinity,
@@ -480,7 +480,7 @@ func appendServerVolumes(p *monitoringv1.Prometheus, volumes []corev1.Volume, vo
LocalObjectReference: corev1.LocalObjectReference{
Name: name,
},
- Optional: ptr.To(true),
+ Optional: new(true),
},
},
})
@@ -577,8 +577,8 @@ func createThanosContainer(p *monitoringv1.Prometheus, c prompkg.Config) (*corev
ImagePullPolicy: cpf.ImagePullPolicy,
TerminationMessagePolicy: corev1.TerminationMessageFallbackToLogsOnError,
SecurityContext: &corev1.SecurityContext{
- AllowPrivilegeEscalation: ptr.To(false),
- ReadOnlyRootFilesystem: ptr.To(true),
+ AllowPrivilegeEscalation: new(false),
+ ReadOnlyRootFilesystem: new(true),
Capabilities: &corev1.Capabilities{
Drop: []corev1.Capability{"ALL"},
},
diff --git a/pkg/prometheus/server/statefulset_test.go b/pkg/prometheus/server/statefulset_test.go
index c50ebc59cd6..cef804d29ce 100644
--- a/pkg/prometheus/server/statefulset_test.go
+++ b/pkg/prometheus/server/statefulset_test.go
@@ -379,7 +379,7 @@ func TestStatefulSetVolumeInitial(t *testing.T) {
LocalObjectReference: corev1.LocalObjectReference{
Name: "rules-configmap-one",
},
- Optional: ptr.To(true),
+ Optional: new(true),
},
},
},
@@ -1551,7 +1551,7 @@ func TestTSDBAllowOverlappingCompaction(t *testing.T) {
name: "Verify AllowOverlappingCompaction",
version: "v2.55.0",
outOfOrderTimeWindow: "1s",
- objectStorageConfigFile: ptr.To("/etc/thanos.cfg"),
+ objectStorageConfigFile: new("/etc/thanos.cfg"),
shouldContain: true,
},
}
@@ -1563,7 +1563,7 @@ func TestTSDBAllowOverlappingCompaction(t *testing.T) {
CommonPrometheusFields: monitoringv1.CommonPrometheusFields{
Version: test.version,
TSDB: &monitoringv1.TSDBSpec{
- OutOfOrderTimeWindow: ptr.To(test.outOfOrderTimeWindow),
+ OutOfOrderTimeWindow: new(test.outOfOrderTimeWindow),
},
},
Thanos: &monitoringv1.ThanosSpec{
@@ -1773,7 +1773,7 @@ func TestExpectStatefulSetMinReadySeconds(t *testing.T) {
sset, err = makeStatefulSetFromPrometheus(monitoringv1.Prometheus{
Spec: monitoringv1.PrometheusSpec{
CommonPrometheusFields: monitoringv1.CommonPrometheusFields{
- MinReadySeconds: ptr.To(int32(5)),
+ MinReadySeconds: new(int32(5)),
},
},
})
@@ -2045,7 +2045,7 @@ func TestScrapeFailureLogFileVolumeMountPresent(t *testing.T) {
sset, err := makeStatefulSetFromPrometheus(monitoringv1.Prometheus{
Spec: monitoringv1.PrometheusSpec{
CommonPrometheusFields: monitoringv1.CommonPrometheusFields{
- ScrapeFailureLogFile: ptr.To("file.log"),
+ ScrapeFailureLogFile: new("file.log"),
},
},
})
@@ -2080,7 +2080,7 @@ func TestScrapeFailureLogFileVolumeMountNotPresent(t *testing.T) {
sset, err := makeStatefulSetFromPrometheus(monitoringv1.Prometheus{
Spec: monitoringv1.PrometheusSpec{
CommonPrometheusFields: monitoringv1.CommonPrometheusFields{
- ScrapeFailureLogFile: ptr.To("/tmp/file.log"),
+ ScrapeFailureLogFile: new("/tmp/file.log"),
},
},
})
@@ -2268,7 +2268,7 @@ func TestPodTemplateConfig(t *testing.T) {
ImagePullSecrets: imagePullSecrets,
SchedulerName: schedulerName,
HostNetwork: hostNetwork,
- HostUsers: ptr.To(true),
+ HostUsers: new(true),
},
},
})
@@ -2413,13 +2413,13 @@ func TestRuntimeGOGCEnvVar(t *testing.T) {
{
scenario: "Prometheus < 2.53.0",
version: "v2.51.2",
- gogc: ptr.To(int32(50)),
+ gogc: new(int32(50)),
expectedEnvVar: true,
},
{
scenario: "Prometheus > 2.53.0",
version: "v2.54.0",
- gogc: ptr.To(int32(50)),
+ gogc: new(int32(50)),
expectedEnvVar: false,
},
} {
@@ -2589,7 +2589,7 @@ func TestGRPCServerTLSCipherSuites(t *testing.T) {
sset, err := makeStatefulSetFromPrometheus(monitoringv1.Prometheus{
Spec: monitoringv1.PrometheusSpec{
Thanos: &monitoringv1.ThanosSpec{
- Version: ptr.To(tc.version),
+ Version: new(tc.version),
GRPCServerTLSConfig: &monitoringv1.GRPCServerTLSConfig{
CipherSuites: tc.cipherSuites,
},
@@ -2637,7 +2637,7 @@ func TestGRPCServerTLSCurves(t *testing.T) {
sset, err := makeStatefulSetFromPrometheus(monitoringv1.Prometheus{
Spec: monitoringv1.PrometheusSpec{
Thanos: &monitoringv1.ThanosSpec{
- Version: ptr.To(tc.version),
+ Version: new(tc.version),
GRPCServerTLSConfig: &monitoringv1.GRPCServerTLSConfig{
Curves: tc.curves,
},
@@ -2744,9 +2744,9 @@ func TestPrometheusQuerySpec(t *testing.T) {
},
{
name: "all values provided",
- lookbackDelta: ptr.To("2m"),
- maxConcurrency: ptr.To(int32(10)),
- maxSamples: ptr.To(int32(10000)),
+ lookbackDelta: new("2m"),
+ maxConcurrency: new(int32(10)),
+ maxSamples: new(int32(10000)),
timeout: ptr.To(monitoringv1.Duration("1m")),
expected: []string{
@@ -2758,9 +2758,9 @@ func TestPrometheusQuerySpec(t *testing.T) {
},
{
name: "zero values are skipped",
- lookbackDelta: ptr.To("2m"),
- maxConcurrency: ptr.To(int32(0)),
- maxSamples: ptr.To(int32(0)),
+ lookbackDelta: new("2m"),
+ maxConcurrency: new(int32(0)),
+ maxSamples: new(int32(0)),
timeout: ptr.To(monitoringv1.Duration("1m")),
expected: []string{
@@ -2770,7 +2770,7 @@ func TestPrometheusQuerySpec(t *testing.T) {
},
{
name: "maxConcurrency set to 1",
- maxConcurrency: ptr.To(int32(1)),
+ maxConcurrency: new(int32(1)),
expected: []string{
"--query.max-concurrency=1",
@@ -2778,9 +2778,9 @@ func TestPrometheusQuerySpec(t *testing.T) {
},
{
name: "max samples skipped if version < 2.5",
- lookbackDelta: ptr.To("2m"),
- maxConcurrency: ptr.To(int32(10)),
- maxSamples: ptr.To(int32(10000)),
+ lookbackDelta: new("2m"),
+ maxConcurrency: new(int32(10)),
+ maxSamples: new(int32(10000)),
timeout: ptr.To(monitoringv1.Duration("1m")),
version: "v2.4.0",
@@ -2792,9 +2792,9 @@ func TestPrometheusQuerySpec(t *testing.T) {
},
{
name: "max samples not skipped if version > 2.5",
- lookbackDelta: ptr.To("2m"),
- maxConcurrency: ptr.To(int32(10)),
- maxSamples: ptr.To(int32(10000)),
+ lookbackDelta: new("2m"),
+ maxConcurrency: new(int32(10)),
+ maxSamples: new(int32(10000)),
timeout: ptr.To(monitoringv1.Duration("1m")),
version: "v2.5.0",
@@ -2874,7 +2874,7 @@ func TestSecurityContextCapabilities(t *testing.T) {
name: "Thanos sidecar with object storage",
spec: monitoringv1.PrometheusSpec{
Thanos: &monitoringv1.ThanosSpec{
- ObjectStorageConfigFile: ptr.To("/etc/thanos.cfg"),
+ ObjectStorageConfigFile: new("/etc/thanos.cfg"),
},
},
},
@@ -3096,7 +3096,7 @@ func TestStartupProbeTimeoutSeconds(t *testing.T) {
expectedStartupFailureThreshold: 60,
},
{
- maximumStartupDurationSeconds: ptr.To(int32(600)),
+ maximumStartupDurationSeconds: new(int32(600)),
expectedStartupPeriodSeconds: 60,
expectedStartupFailureThreshold: 10,
},
@@ -3199,12 +3199,12 @@ func TestAutomountServiceAccountToken(t *testing.T) {
},
{
name: "automountServiceAccountToken set to true",
- automountServiceAccountToken: ptr.To(true),
+ automountServiceAccountToken: new(true),
expectedValue: true,
},
{
name: "automountServiceAccountToken set to false",
- automountServiceAccountToken: ptr.To(false),
+ automountServiceAccountToken: new(false),
expectedValue: false,
},
} {
@@ -3276,7 +3276,7 @@ func TestDNSPolicyAndDNSConfig(t *testing.T) {
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
- monitoringDNSPolicyPtr := ptr.To(monitoringv1.DNSPolicy(test.dnsPolicy))
+ monitoringDNSPolicyPtr := new(monitoringv1.DNSPolicy(test.dnsPolicy))
var monitoringDNSConfig *monitoringv1.PodDNSConfig
if test.dnsConfig != nil {
@@ -3314,8 +3314,8 @@ func TestStatefulSetenableServiceLinks(t *testing.T) {
enableServiceLinks *bool
expectedEnableServiceLinks *bool
}{
- {enableServiceLinks: ptr.To(false), expectedEnableServiceLinks: ptr.To(false)},
- {enableServiceLinks: ptr.To(true), expectedEnableServiceLinks: ptr.To(true)},
+ {enableServiceLinks: new(false), expectedEnableServiceLinks: new(false)},
+ {enableServiceLinks: new(true), expectedEnableServiceLinks: new(true)},
{enableServiceLinks: nil, expectedEnableServiceLinks: nil},
}
@@ -3394,13 +3394,13 @@ func TestStatefulSetUpdateStrategy(t *testing.T) {
updateStrategy: &monitoringv1.StatefulSetUpdateStrategy{
Type: monitoringv1.RollingUpdateStatefulSetStrategyType,
RollingUpdate: &monitoringv1.RollingUpdateStatefulSetStrategy{
- MaxUnavailable: ptr.To(intstr.FromInt(1)),
+ MaxUnavailable: new(intstr.FromInt(1)),
},
},
exp: appsv1.StatefulSetUpdateStrategy{
Type: appsv1.RollingUpdateStatefulSetStrategyType,
RollingUpdate: &appsv1.RollingUpdateStatefulSetStrategy{
- MaxUnavailable: ptr.To(intstr.FromInt(1)),
+ MaxUnavailable: new(intstr.FromInt(1)),
},
},
},
@@ -3440,7 +3440,7 @@ func TestConfigReloaderTopologyZoneEnvVar(t *testing.T) {
{
name: "shard 0 gets zone-a",
shardingStrategy: &monitoringv1.ShardingStrategy{
- Mode: ptr.To(topologyMode),
+ Mode: new(topologyMode),
Topology: &monitoringv1.TopologyShardingStrategy{
Values: []string{"zone-a", "zone-b"},
},
@@ -3451,7 +3451,7 @@ func TestConfigReloaderTopologyZoneEnvVar(t *testing.T) {
{
name: "shard 1 gets zone-b",
shardingStrategy: &monitoringv1.ShardingStrategy{
- Mode: ptr.To(topologyMode),
+ Mode: new(topologyMode),
Topology: &monitoringv1.TopologyShardingStrategy{
Values: []string{"zone-a", "zone-b"},
},
diff --git a/pkg/prometheus/validation/validator_test.go b/pkg/prometheus/validation/validator_test.go
index baae6581d11..725fd39e508 100644
--- a/pkg/prometheus/validation/validator_test.go
+++ b/pkg/prometheus/validation/validator_test.go
@@ -19,7 +19,6 @@ import (
"github.com/prometheus/prometheus/model/relabel"
"github.com/stretchr/testify/require"
- "k8s.io/utils/ptr"
monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
)
@@ -117,7 +116,7 @@ func TestValidateRelabelConfig(t *testing.T) {
scenario: "replacement set for uppercase action",
relabelConfig: monitoringv1.RelabelConfig{
Action: "uppercase",
- Replacement: ptr.To("some-replace-value"),
+ Replacement: new("some-replace-value"),
},
prometheus: defaultPrometheusSpec,
expectedErr: true,
@@ -140,7 +139,7 @@ func TestValidateRelabelConfig(t *testing.T) {
relabelConfig: monitoringv1.RelabelConfig{
Action: "labelmap",
Regex: "__meta_kubernetes_service_label_(.+)",
- Replacement: ptr.To("some-name-value"),
+ Replacement: new("some-name-value"),
},
prometheus: defaultPrometheusSpec,
expectedErr: true,
@@ -160,7 +159,7 @@ func TestValidateRelabelConfig(t *testing.T) {
relabelConfig: monitoringv1.RelabelConfig{
Action: "labelmap",
Regex: "__meta_kubernetes_service_label_(.+)",
- Replacement: ptr.To("abc"),
+ Replacement: new("abc"),
},
prometheus: defaultPrometheusSpec,
},
@@ -197,7 +196,7 @@ func TestValidateRelabelConfig(t *testing.T) {
scenario: "valid replace config with empty replacement",
relabelConfig: monitoringv1.RelabelConfig{
Action: "replace",
- Replacement: ptr.To(""),
+ Replacement: new(""),
TargetLabel: "abc",
},
prometheus: defaultPrometheusSpec,
@@ -351,9 +350,9 @@ func TestValidateRelabelConfig(t *testing.T) {
relabelConfig: monitoringv1.RelabelConfig{
SourceLabels: []monitoringv1.LabelName{"__tmp_port"},
TargetLabel: "__port1",
- Separator: ptr.To("^"),
+ Separator: new("^"),
Regex: "validregex",
- Replacement: ptr.To("replacevalue"),
+ Replacement: new("replacevalue"),
Action: "keepequal",
},
prometheus: monitoringv1.Prometheus{
@@ -371,7 +370,7 @@ func TestValidateRelabelConfig(t *testing.T) {
relabelConfig: monitoringv1.RelabelConfig{
SourceLabels: []monitoringv1.LabelName{"__tmp_port"},
TargetLabel: "__port1",
- Separator: ptr.To(relabel.DefaultRelabelConfig.Separator),
+ Separator: new(relabel.DefaultRelabelConfig.Separator),
Regex: relabel.DefaultRelabelConfig.Regex.String(),
Modulus: relabel.DefaultRelabelConfig.Modulus,
Replacement: &relabel.DefaultRelabelConfig.Replacement,
@@ -390,7 +389,7 @@ func TestValidateRelabelConfig(t *testing.T) {
relabelConfig: monitoringv1.RelabelConfig{
Action: "labelmap",
Regex: "^(cluster)$",
- Replacement: ptr.To("exported_${1}"),
+ Replacement: new("exported_${1}"),
},
prometheus: defaultPrometheusSpec,
},
@@ -399,7 +398,7 @@ func TestValidateRelabelConfig(t *testing.T) {
relabelConfig: monitoringv1.RelabelConfig{
Action: "labelmap",
Regex: "__meta_kubernetes_(.*)",
- Replacement: ptr.To("k8s_${1}"),
+ Replacement: new("k8s_${1}"),
},
prometheus: defaultPrometheusSpec,
},
diff --git a/pkg/thanos/operator_test.go b/pkg/thanos/operator_test.go
index 8010758c89f..44e277552a1 100644
--- a/pkg/thanos/operator_test.go
+++ b/pkg/thanos/operator_test.go
@@ -51,8 +51,8 @@ func TestCreateOrUpdateRulerConfigSecret(t *testing.T) {
{
URL: "http://example.com",
MessageVersion: ptr.To(monitoringv1.RemoteWriteMessageVersion2_0),
- SendNativeHistograms: ptr.To(true),
- RoundRobinDNS: ptr.To(true),
+ SendNativeHistograms: new(true),
+ RoundRobinDNS: new(true),
},
},
golden: "default_remote_write_config.golden",
@@ -74,8 +74,8 @@ func TestCreateOrUpdateRulerConfigSecret(t *testing.T) {
{
URL: "http://example.com",
MessageVersion: ptr.To(monitoringv1.RemoteWriteMessageVersion2_0),
- SendNativeHistograms: ptr.To(true),
- RoundRobinDNS: ptr.To(true),
+ SendNativeHistograms: new(true),
+ RoundRobinDNS: new(true),
Sigv4: &monitoringv1.Sigv4{
Profile: "profilename",
RoleArn: "arn:aws:iam::123456789012:instance-profile/prometheus",
@@ -108,7 +108,7 @@ func TestCreateOrUpdateRulerConfigSecret(t *testing.T) {
Namespace: "default",
},
Spec: monitoringv1.ThanosRulerSpec{
- Version: ptr.To(tc.version),
+ Version: new(tc.version),
RemoteWrite: tc.remoteWrite,
},
}
diff --git a/pkg/thanos/statefulset.go b/pkg/thanos/statefulset.go
index 59e053d5364..66a651245f5 100644
--- a/pkg/thanos/statefulset.go
+++ b/pkg/thanos/statefulset.go
@@ -453,7 +453,7 @@ func makeStatefulSetSpec(tr *monitoringv1.ThanosRuler, config Config, ruleConfig
LocalObjectReference: corev1.LocalObjectReference{
Name: name,
},
- Optional: ptr.To(true),
+ Optional: new(true),
},
},
})
@@ -478,8 +478,8 @@ func makeStatefulSetSpec(tr *monitoringv1.ThanosRuler, config Config, ruleConfig
Ports: ports,
TerminationMessagePolicy: corev1.TerminationMessageFallbackToLogsOnError,
SecurityContext: &corev1.SecurityContext{
- AllowPrivilegeEscalation: ptr.To(false),
- ReadOnlyRootFilesystem: ptr.To(true),
+ AllowPrivilegeEscalation: new(false),
+ ReadOnlyRootFilesystem: new(true),
Capabilities: &corev1.Capabilities{
Drop: []corev1.Capability{"ALL"},
},
@@ -517,7 +517,7 @@ func makeStatefulSetSpec(tr *monitoringv1.ThanosRuler, config Config, ruleConfig
SchedulerName: tr.Spec.SchedulerName,
PriorityClassName: tr.Spec.PriorityClassName,
ServiceAccountName: tr.Spec.ServiceAccountName,
- TerminationGracePeriodSeconds: ptr.To(ptr.Deref(tr.Spec.TerminationGracePeriodSeconds, defaultTerminationGracePeriodSeconds)),
+ TerminationGracePeriodSeconds: new(ptr.Deref(tr.Spec.TerminationGracePeriodSeconds, defaultTerminationGracePeriodSeconds)),
Containers: containers,
InitContainers: tr.Spec.InitContainers,
Volumes: trVolumes,
diff --git a/pkg/thanos/statefulset_test.go b/pkg/thanos/statefulset_test.go
index 3c5de001b9c..a849cf78067 100644
--- a/pkg/thanos/statefulset_test.go
+++ b/pkg/thanos/statefulset_test.go
@@ -231,7 +231,7 @@ func TestStatefulSetVolumes(t *testing.T) {
LocalObjectReference: corev1.LocalObjectReference{
Name: "rules-configmap-one",
},
- Optional: ptr.To(true),
+ Optional: new(true),
},
},
},
@@ -722,7 +722,7 @@ func TestRetention(t *testing.T) {
func TestThanosGrpcArguments(t *testing.T) {
sset, err := makeStatefulSet(&monitoringv1.ThanosRuler{
Spec: monitoringv1.ThanosRulerSpec{
- Version: ptr.To("0.37.0"),
+ Version: new("0.37.0"),
QueryEndpoints: emptyQueryEndpoints,
GRPCServerTLSConfig: &monitoringv1.GRPCServerTLSConfig{
TLSConfig: monitoringv1.TLSConfig{
@@ -779,7 +779,7 @@ func TestGRPCServerTLSCipherSuites(t *testing.T) {
t.Run(tc.scenario, func(t *testing.T) {
sset, err := makeStatefulSet(&monitoringv1.ThanosRuler{
Spec: monitoringv1.ThanosRulerSpec{
- Version: ptr.To(tc.version),
+ Version: new(tc.version),
QueryEndpoints: emptyQueryEndpoints,
GRPCServerTLSConfig: &monitoringv1.GRPCServerTLSConfig{
CipherSuites: tc.cipherSuites,
@@ -827,7 +827,7 @@ func TestGRPCServerTLSCurves(t *testing.T) {
t.Run(tc.scenario, func(t *testing.T) {
sset, err := makeStatefulSet(&monitoringv1.ThanosRuler{
Spec: monitoringv1.ThanosRulerSpec{
- Version: ptr.To(tc.version),
+ Version: new(tc.version),
QueryEndpoints: emptyQueryEndpoints,
GRPCServerTLSConfig: &monitoringv1.GRPCServerTLSConfig{
Curves: tc.curves,
@@ -909,7 +909,7 @@ func TestPodTemplateConfig(t *testing.T) {
ImagePullPolicy: imagePullPolicy,
AdditionalArgs: additionalArgs,
SchedulerName: schedulerName,
- HostUsers: ptr.To(true),
+ HostUsers: new(true),
},
}, defaultTestConfig, nil, "", &operator.ShardedSecret{})
require.NoError(t, err)
@@ -983,7 +983,7 @@ func TestStatefulSetMinReadySeconds(t *testing.T) {
require.Equal(t, int32(0), statefulSet.MinReadySeconds)
// assert set correctly if not nil
- tr.Spec.MinReadySeconds = ptr.To(int32(5))
+ tr.Spec.MinReadySeconds = new(int32(5))
statefulSet, err = makeStatefulSetSpec(&tr, defaultTestConfig, nil, &operator.ShardedSecret{})
require.NoError(t, err)
require.Equal(t, int32(5), statefulSet.MinReadySeconds)
@@ -1127,7 +1127,7 @@ func TestThanosVersion(t *testing.T) {
sset, err := makeStatefulSet(&monitoringv1.ThanosRuler{
Spec: monitoringv1.ThanosRulerSpec{
QueryEndpoints: emptyQueryEndpoints,
- Version: ptr.To(tc.version),
+ Version: new(tc.version),
},
}, defaultTestConfig, nil, "", &operator.ShardedSecret{})
@@ -1155,7 +1155,7 @@ func TestStatefulSetDNSPolicyAndDNSConfig(t *testing.T) {
Options: []monitoringv1.PodDNSConfigOption{
{
Name: "ndots",
- Value: ptr.To("5"),
+ Value: new("5"),
},
},
},
@@ -1170,7 +1170,7 @@ func TestStatefulSetDNSPolicyAndDNSConfig(t *testing.T) {
Options: []corev1.PodDNSConfigOption{
{
Name: "ndots",
- Value: ptr.To("5"),
+ Value: new("5"),
},
},
}, sset.Spec.Template.Spec.DNSConfig, "expected DNS configuration to match")
@@ -1181,8 +1181,8 @@ func TestStatefulSetenableServiceLinks(t *testing.T) {
enableServiceLinks *bool
expectedEnableServiceLinks *bool
}{
- {enableServiceLinks: ptr.To(false), expectedEnableServiceLinks: ptr.To(false)},
- {enableServiceLinks: ptr.To(true), expectedEnableServiceLinks: ptr.To(true)},
+ {enableServiceLinks: new(false), expectedEnableServiceLinks: new(false)},
+ {enableServiceLinks: new(true), expectedEnableServiceLinks: new(true)},
{enableServiceLinks: nil, expectedEnableServiceLinks: nil},
}
@@ -1585,13 +1585,13 @@ func TestStatefulSetUpdateStrategy(t *testing.T) {
updateStrategy: &monitoringv1.StatefulSetUpdateStrategy{
Type: monitoringv1.RollingUpdateStatefulSetStrategyType,
RollingUpdate: &monitoringv1.RollingUpdateStatefulSetStrategy{
- MaxUnavailable: ptr.To(intstr.FromInt(1)),
+ MaxUnavailable: new(intstr.FromInt(1)),
},
},
exp: appsv1.StatefulSetUpdateStrategy{
Type: appsv1.RollingUpdateStatefulSetStrategyType,
RollingUpdate: &appsv1.RollingUpdateStatefulSetStrategy{
- MaxUnavailable: ptr.To(intstr.FromInt(1)),
+ MaxUnavailable: new(intstr.FromInt(1)),
},
},
},
diff --git a/pkg/webconfig/config_test.go b/pkg/webconfig/config_test.go
index 89ba5e7dc61..45f824d2448 100644
--- a/pkg/webconfig/config_test.go
+++ b/pkg/webconfig/config_test.go
@@ -23,7 +23,6 @@ import (
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes/fake"
- "k8s.io/utils/ptr"
monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
"github.com/prometheus-operator/prometheus-operator/pkg/webconfig"
@@ -140,11 +139,11 @@ func TestCreateOrUpdateWebConfigSecret(t *testing.T) {
},
Key: "tls.keySecret",
},
- ClientAuthType: ptr.To("RequireAnyClientCert"),
- MinVersion: ptr.To("TLS11"),
- MaxVersion: ptr.To("TLS13"),
+ ClientAuthType: new("RequireAnyClientCert"),
+ MinVersion: new("TLS11"),
+ MaxVersion: new("TLS13"),
CipherSuites: []string{"cipher-1", "cipher-2"},
- PreferServerCipherSuites: ptr.To(false),
+ PreferServerCipherSuites: new(false),
CurvePreferences: []string{"curve-1", "curve-2"},
},
},
@@ -154,9 +153,9 @@ func TestCreateOrUpdateWebConfigSecret(t *testing.T) {
name: "TLS config with client CA, cert and key files",
webConfigFileFields: monitoringv1.WebConfigFileFields{
TLSConfig: &monitoringv1.WebTLSConfig{
- ClientCAFile: ptr.To("/etc/ssl/certs/tls.client_ca"),
- CertFile: ptr.To("/etc/ssl/certs/tls.crt"),
- KeyFile: ptr.To("/etc/ssl/secrets/tls.key"),
+ ClientCAFile: new("/etc/ssl/certs/tls.client_ca"),
+ CertFile: new("/etc/ssl/certs/tls.crt"),
+ KeyFile: new("/etc/ssl/secrets/tls.key"),
},
},
golden: "TLS_config_with_client_CA_cert_and_key_files.golden",
@@ -165,7 +164,7 @@ func TestCreateOrUpdateWebConfigSecret(t *testing.T) {
name: "HTTP config with all parameters",
webConfigFileFields: monitoringv1.WebConfigFileFields{
HTTPConfig: &monitoringv1.WebHTTPConfig{
- HTTP2: ptr.To(false),
+ HTTP2: new(false),
Headers: &monitoringv1.WebHTTPHeaders{
ContentSecurityPolicy: "test",
StrictTransportSecurity: "test",
diff --git a/test/e2e/alertmanager_test.go b/test/e2e/alertmanager_test.go
index 45fe0261bcf..7f1d81b4e69 100644
--- a/test/e2e/alertmanager_test.go
+++ b/test/e2e/alertmanager_test.go
@@ -247,7 +247,7 @@ func testAMStorageUpdate(t *testing.T) {
},
},
Spec: corev1.PersistentVolumeClaimSpec{
- StorageClassName: ptr.To("unknown-storage-class"),
+ StorageClassName: new("unknown-storage-class"),
Resources: corev1.VolumeResourceRequirements{
Requests: corev1.ResourceList{
corev1.ResourceStorage: resource.MustParse("200Mi"),
@@ -400,7 +400,7 @@ func testAMClusterGossipSilences(t *testing.T) {
},
Key: "key.pem",
},
- ClientAuthType: ptr.To("VerifyClientCertIfGiven"),
+ ClientAuthType: new("VerifyClientCertIfGiven"),
},
ClientTLS: monitoringv1.SafeTLSConfig{
CA: monitoringv1.SecretOrConfigMap{
@@ -426,7 +426,7 @@ func testAMClusterGossipSilences(t *testing.T) {
Key: "key.pem",
},
// Since we cannot verify hostname in the cert.
- InsecureSkipVerify: ptr.To(true),
+ InsecureSkipVerify: new(true),
},
},
},
@@ -1117,7 +1117,7 @@ func testAlertmanagerConfigCRD(t *testing.T) {
{
Type: "type",
Text: "text",
- Name: ptr.To("my-action"),
+ Name: new("my-action"),
ConfirmField: &monitoringv1alpha1.SlackConfirmationField{
Text: "text",
},
@@ -1131,7 +1131,7 @@ func testAlertmanagerConfigCRD(t *testing.T) {
},
}},
WebhookConfigs: []monitoringv1alpha1.WebhookConfig{{
- URL: ptr.To("http://test.url"),
+ URL: new("http://test.url"),
}},
WeChatConfigs: []monitoringv1alpha1.WeChatConfig{{
APISecret: &corev1.SecretKeySelector{
@@ -1140,15 +1140,15 @@ func testAlertmanagerConfigCRD(t *testing.T) {
},
Key: testingSecretKey,
},
- CorpID: ptr.To("testingCorpID"),
+ CorpID: new("testingCorpID"),
}},
EmailConfigs: []monitoringv1alpha1.EmailConfig{{
SendResolved: func(b bool) *bool {
return &b
}(true),
- Smarthost: ptr.To("example.com:25"),
- From: ptr.To("admin@example.com"),
- To: ptr.To("test@example.com"),
+ Smarthost: new("example.com:25"),
+ From: new("admin@example.com"),
+ To: new("test@example.com"),
AuthPassword: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: testingSecret,
@@ -1167,7 +1167,7 @@ func testAlertmanagerConfigCRD(t *testing.T) {
},
// HTML field with an empty string must appear as-is in the generated configuration.
// See https://github.com/prometheus-operator/prometheus-operator/issues/5421
- HTML: ptr.To(""),
+ HTML: new(""),
}},
VictorOpsConfigs: []monitoringv1alpha1.VictorOpsConfig{{
APIKey: &corev1.SecretKeySelector{
@@ -1204,7 +1204,7 @@ func testAlertmanagerConfigCRD(t *testing.T) {
}},
SNSConfigs: []monitoringv1alpha1.SNSConfig{
{
- ApiURL: ptr.To("https://sns.us-east-2.amazonaws.com"),
+ ApiURL: new("https://sns.us-east-2.amazonaws.com"),
Sigv4: &monitoringv1.Sigv4{
Region: "us-east-2",
AccessKey: &corev1.SecretKeySelector{
@@ -1220,7 +1220,7 @@ func testAlertmanagerConfigCRD(t *testing.T) {
Key: testingSecretKey,
},
},
- TopicARN: ptr.To("test-topicARN"),
+ TopicARN: new("test-topicARN"),
},
},
WebexConfigs: []monitoringv1alpha1.WebexConfig{{
@@ -1303,7 +1303,7 @@ func testAlertmanagerConfigCRD(t *testing.T) {
Receivers: []monitoringv1alpha1.Receiver{{
Name: "e2e",
WebhookConfigs: []monitoringv1alpha1.WebhookConfig{{
- URL: ptr.To("http://test.url"),
+ URL: new("http://test.url"),
}},
}},
MuteTimeIntervals: []monitoringv1alpha1.MuteTimeInterval{
@@ -1358,7 +1358,7 @@ func testAlertmanagerConfigCRD(t *testing.T) {
Receivers: []monitoringv1alpha1.Receiver{{
Name: "e2e",
WebhookConfigs: []monitoringv1alpha1.WebhookConfig{{
- URL: ptr.To("http://test.url"),
+ URL: new("http://test.url"),
}},
}},
MuteTimeIntervals: []monitoringv1alpha1.MuteTimeInterval{
@@ -1804,7 +1804,7 @@ func testAlertmanagerConfigCRDValidation(t *testing.T) {
Receivers: []monitoringv1alpha1.Receiver{{
Name: "e2e",
WebhookConfigs: []monitoringv1alpha1.WebhookConfig{{
- URL: ptr.To("http://example.com"),
+ URL: new("http://example.com"),
}},
}},
},
@@ -1917,27 +1917,27 @@ func testUserDefinedAlertmanagerConfigFromCustomResource(t *testing.T) {
Name: alertmanagerConfig.Name,
Global: &monitoringv1.AlertmanagerGlobalConfig{
SMTPConfig: &monitoringv1.GlobalSMTPConfig{
- From: ptr.To("from"),
+ From: new("from"),
SmartHost: &monitoringv1.HostPort{
Host: "smtp.example.org",
Port: "587",
},
- Hello: ptr.To("smtp.example.org"),
- AuthUsername: ptr.To("dev@smtp.example.org"),
+ Hello: new("smtp.example.org"),
+ AuthUsername: new("dev@smtp.example.org"),
AuthPassword: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "smtp-auth",
},
Key: "password",
},
- AuthIdentity: ptr.To("dev@smtp.example.org"),
+ AuthIdentity: new("dev@smtp.example.org"),
AuthSecret: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: "smtp-auth",
},
Key: "secret",
},
- RequireTLS: ptr.To(true),
+ RequireTLS: new(true),
},
ResolveTimeout: "30s",
HTTPConfigWithProxy: &monitoringv1.HTTPConfigWithProxy{
@@ -1964,7 +1964,7 @@ func testUserDefinedAlertmanagerConfigFromCustomResource(t *testing.T) {
"some": "value",
},
},
- FollowRedirects: ptr.To(true),
+ FollowRedirects: new(true),
},
},
},
@@ -2229,7 +2229,7 @@ func testAMRollbackManualChanges(t *testing.T) {
sset, err := ssetClient.Get(context.Background(), "alertmanager-"+name, metav1.GetOptions{})
require.NoError(t, err)
- sset.Spec.Replicas = ptr.To(int32(0))
+ sset.Spec.Replicas = new(int32(0))
sset, err = ssetClient.Update(context.Background(), sset, metav1.UpdateOptions{})
require.NoError(t, err)
@@ -2508,7 +2508,7 @@ func testAlertManagerMinReadySeconds(t *testing.T) {
framework.SetupPrometheusRBAC(context.Background(), t, testCtx, ns)
am := framework.MakeBasicAlertmanager(ns, "basic-am", 3)
- am.Spec.MinReadySeconds = ptr.To(int32(5))
+ am.Spec.MinReadySeconds = new(int32(5))
am, err := framework.CreateAlertmanagerAndWaitUntilReady(context.Background(), am)
require.NoError(t, err)
@@ -2517,7 +2517,7 @@ func testAlertManagerMinReadySeconds(t *testing.T) {
require.Equal(t, int32(5), amSS.Spec.MinReadySeconds)
- _, err = framework.PatchAlertmanagerAndWaitUntilReady(context.Background(), am.Name, am.Namespace, monitoringv1.AlertmanagerSpec{MinReadySeconds: ptr.To(int32(10))})
+ _, err = framework.PatchAlertmanagerAndWaitUntilReady(context.Background(), am.Name, am.Namespace, monitoringv1.AlertmanagerSpec{MinReadySeconds: new(int32(10))})
require.NoError(t, err)
amSS, err = framework.KubeClient.AppsV1().StatefulSets(ns).Get(context.Background(), "alertmanager-basic-am", metav1.GetOptions{})
@@ -2614,7 +2614,7 @@ func testAlertmanagerCRDValidation(t *testing.T) {
Options: []monitoringv1.PodDNSConfigOption{
{
Name: "ndots",
- Value: ptr.To("5"),
+ Value: new("5"),
},
},
},
@@ -2640,11 +2640,11 @@ func testAlertmanagerCRDValidation(t *testing.T) {
Options: []monitoringv1.PodDNSConfigOption{
{
Name: "ndots",
- Value: ptr.To("5"),
+ Value: new("5"),
},
{
Name: "timeout",
- Value: ptr.To("2"),
+ Value: new("2"),
},
},
},
@@ -2671,7 +2671,7 @@ func testAlertmanagerCRDValidation(t *testing.T) {
Options: []monitoringv1.PodDNSConfigOption{
{
Name: "", // Empty string violates MinLength constraint
- Value: ptr.To("some-value"),
+ Value: new("some-value"),
},
},
},
diff --git a/test/e2e/prometheus_shard_retention_policy_test.go b/test/e2e/prometheus_shard_retention_policy_test.go
index 5735068f474..a8fbb8dc606 100644
--- a/test/e2e/prometheus_shard_retention_policy_test.go
+++ b/test/e2e/prometheus_shard_retention_policy_test.go
@@ -26,7 +26,6 @@ import (
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/wait"
- "k8s.io/utils/ptr"
monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
"github.com/prometheus-operator/prometheus-operator/pkg/operator"
@@ -76,7 +75,7 @@ func testPrometheusTargetDistributionOnResharding(t *testing.T) {
{
TargetLabel: "__tmp_disable_sharding",
Action: "Replace",
- Replacement: ptr.To("true"),
+ Replacement: new("true"),
},
}
sm, err = framework.MonClientV1.ServiceMonitors(ns).Create(ctx, sm, metav1.CreateOptions{})
@@ -88,7 +87,7 @@ func testPrometheusTargetDistributionOnResharding(t *testing.T) {
// the Delete strategy because the second shard will not exist anymore in
// case of scale down.
prom := framework.MakeBasicPrometheus(ns, prometheusName, prometheusGroupLabel, 1)
- prom.Spec.Shards = ptr.To(int32(1))
+ prom.Spec.Shards = new(int32(1))
prom.Spec.ServiceMonitorSelector = &metav1.LabelSelector{
MatchExpressions: []metav1.LabelSelectorRequirement{
{
@@ -100,7 +99,7 @@ func testPrometheusTargetDistributionOnResharding(t *testing.T) {
}
prom.Spec.ShardRetentionPolicy = &monitoringv1.ShardRetentionPolicy{
- WhenScaled: ptr.To(monitoringv1.RetainWhenScaledRetentionType),
+ WhenScaled: new(monitoringv1.RetainWhenScaledRetentionType),
}
shardServices := make([]*corev1.Service, 2)
@@ -208,11 +207,11 @@ func testPrometheusRetentionPolicies(t *testing.T) {
}{
{
name: "delete policy",
- whenScaledDown: ptr.To(monitoringv1.DeleteWhenScaledRetentionType),
+ whenScaledDown: new(monitoringv1.DeleteWhenScaledRetentionType),
},
{
name: "retain policy",
- whenScaledDown: ptr.To(monitoringv1.RetainWhenScaledRetentionType),
+ whenScaledDown: new(monitoringv1.RetainWhenScaledRetentionType),
},
}
@@ -223,7 +222,7 @@ func testPrometheusRetentionPolicies(t *testing.T) {
p.Spec.ShardRetentionPolicy = &monitoringv1.ShardRetentionPolicy{
WhenScaled: tc.whenScaledDown,
}
- p.Spec.Shards = ptr.To(int32(2))
+ p.Spec.Shards = new(int32(2))
_, err := framework.CreatePrometheusAndWaitUntilReady(ctx, ns, p)
require.NoError(t, err)
diff --git a/test/e2e/prometheus_test.go b/test/e2e/prometheus_test.go
index 7139b267298..1e5da0f555a 100644
--- a/test/e2e/prometheus_test.go
+++ b/test/e2e/prometheus_test.go
@@ -144,7 +144,7 @@ func deployInstrumentedApplicationWithTLS(name, ns string) error {
TLSConfig: &monitoringv1.TLSConfig{
SafeTLSConfig: monitoringv1.SafeTLSConfig{
- ServerName: ptr.To("caandserver.com"),
+ ServerName: new("caandserver.com"),
CA: monitoringv1.SecretOrConfigMap{
Secret: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
@@ -1095,7 +1095,7 @@ func testPromStorageUpdate(t *testing.T) {
},
},
Spec: corev1.PersistentVolumeClaimSpec{
- StorageClassName: ptr.To("unknown-storage-class"),
+ StorageClassName: new("unknown-storage-class"),
Resources: corev1.VolumeResourceRequirements{
Requests: corev1.ResourceList{
corev1.ResourceStorage: resource.MustParse("200Mi"),
@@ -1161,7 +1161,7 @@ func testPromReloadConfig(t *testing.T) {
},
Key: "config.yaml",
}
- p.Spec.ReloadStrategy = ptr.To(tc.reloadStrategy)
+ p.Spec.ReloadStrategy = new(tc.reloadStrategy)
svc := framework.MakePrometheusService(p.Name, "not-relevant", corev1.ServiceTypeClusterIP)
@@ -2399,7 +2399,7 @@ func testPromAlertmanagerDiscovery(t *testing.T) {
p := framework.MakeBasicPrometheus(ns, prometheusName, group, 1)
framework.AddAlertingToPrometheus(p, ns, alertmanagerName)
- p.Spec.ServiceDiscoveryRole = ptr.To(tc.sdRole)
+ p.Spec.ServiceDiscoveryRole = new(tc.sdRole)
_, err := framework.CreatePrometheusAndWaitUntilReady(context.Background(), ns, p)
if err != nil {
t.Fatal(err)
@@ -3056,7 +3056,7 @@ func testPromArbitraryFSAcc(t *testing.T) {
HTTPConfigWithTLSFiles: monitoringv1.HTTPConfigWithTLSFiles{
TLSConfig: &monitoringv1.TLSConfig{
SafeTLSConfig: monitoringv1.SafeTLSConfig{
- InsecureSkipVerify: ptr.To(true),
+ InsecureSkipVerify: new(true),
CA: monitoringv1.SecretOrConfigMap{
Secret: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
@@ -3097,7 +3097,7 @@ func testPromArbitraryFSAcc(t *testing.T) {
HTTPConfigWithTLSFiles: monitoringv1.HTTPConfigWithTLSFiles{
TLSConfig: &monitoringv1.TLSConfig{
SafeTLSConfig: monitoringv1.SafeTLSConfig{
- InsecureSkipVerify: ptr.To(true),
+ InsecureSkipVerify: new(true),
CA: monitoringv1.SecretOrConfigMap{
ConfigMap: &corev1.ConfigMapKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
@@ -3357,7 +3357,7 @@ func testPromTLSConfigViaSecret(t *testing.T) {
HTTPConfigWithTLSFiles: monitoringv1.HTTPConfigWithTLSFiles{
TLSConfig: &monitoringv1.TLSConfig{
SafeTLSConfig: monitoringv1.SafeTLSConfig{
- InsecureSkipVerify: ptr.To(true),
+ InsecureSkipVerify: new(true),
Cert: monitoringv1.SecretOrConfigMap{
Secret: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
@@ -3517,7 +3517,7 @@ func testPromSecurePodMonitor(t *testing.T) {
{
name: "basic-auth-secret",
endpoint: monitoringv1.PodMetricsEndpoint{
- Port: ptr.To("web"),
+ Port: new("web"),
HTTPConfigWithProxy: monitoringv1.HTTPConfigWithProxy{
HTTPConfig: monitoringv1.HTTPConfig{
HTTPConfigWithoutTLS: monitoringv1.HTTPConfigWithoutTLS{
@@ -3546,7 +3546,7 @@ func testPromSecurePodMonitor(t *testing.T) {
{
name: "bearer-secret",
endpoint: monitoringv1.PodMetricsEndpoint{
- Port: ptr.To("web"),
+ Port: new("web"),
HTTPConfigWithProxy: monitoringv1.HTTPConfigWithProxy{
HTTPConfig: monitoringv1.HTTPConfig{
HTTPConfigWithoutTLS: monitoringv1.HTTPConfigWithoutTLS{
@@ -3568,12 +3568,12 @@ func testPromSecurePodMonitor(t *testing.T) {
{
name: "tls-secret",
endpoint: monitoringv1.PodMetricsEndpoint{
- Port: ptr.To("mtls"),
+ Port: new("mtls"),
Scheme: ptr.To(monitoringv1.SchemeHTTPS),
HTTPConfigWithProxy: monitoringv1.HTTPConfigWithProxy{
HTTPConfig: monitoringv1.HTTPConfig{
TLSConfig: &monitoringv1.SafeTLSConfig{
- InsecureSkipVerify: ptr.To(true),
+ InsecureSkipVerify: new(true),
CA: monitoringv1.SecretOrConfigMap{
Secret: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
@@ -3605,12 +3605,12 @@ func testPromSecurePodMonitor(t *testing.T) {
{
name: "tls-configmap",
endpoint: monitoringv1.PodMetricsEndpoint{
- Port: ptr.To("mtls"),
+ Port: new("mtls"),
Scheme: ptr.To(monitoringv1.SchemeHTTPS),
HTTPConfigWithProxy: monitoringv1.HTTPConfigWithProxy{
HTTPConfig: monitoringv1.HTTPConfig{
TLSConfig: &monitoringv1.SafeTLSConfig{
- InsecureSkipVerify: ptr.To(true),
+ InsecureSkipVerify: new(true),
CA: monitoringv1.SecretOrConfigMap{
ConfigMap: &corev1.ConfigMapKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
@@ -4026,7 +4026,7 @@ func testPromMinReadySeconds(t *testing.T) {
kubeClient := framework.KubeClient
prom := framework.MakeBasicPrometheus(ns, "basic-prometheus", "test-group", 1)
- prom.Spec.MinReadySeconds = ptr.To(int32(5))
+ prom.Spec.MinReadySeconds = new(int32(5))
prom, err := framework.CreatePrometheusAndWaitUntilReady(context.Background(), ns, prom)
require.NoError(t, err)
@@ -4041,7 +4041,7 @@ func testPromMinReadySeconds(t *testing.T) {
ns,
monitoringv1.PrometheusSpec{
CommonPrometheusFields: monitoringv1.CommonPrometheusFields{
- MinReadySeconds: ptr.To(int32(10)),
+ MinReadySeconds: new(int32(10)),
},
},
)
@@ -4081,13 +4081,13 @@ func testPromEnforcedNamespaceLabel(t *testing.T) {
relabelConfigs: []monitoringv1.RelabelConfig{
{
TargetLabel: "namespace",
- Replacement: ptr.To("ns1"),
+ Replacement: new("ns1"),
},
},
metricRelabelConfigs: []monitoringv1.RelabelConfig{
{
TargetLabel: "namespace",
- Replacement: ptr.To("ns1"),
+ Replacement: new("ns1"),
},
},
},
@@ -4096,13 +4096,13 @@ func testPromEnforcedNamespaceLabel(t *testing.T) {
relabelConfigs: []monitoringv1.RelabelConfig{
{
TargetLabel: "namespace",
- Replacement: ptr.To(""),
+ Replacement: new(""),
},
},
metricRelabelConfigs: []monitoringv1.RelabelConfig{
{
TargetLabel: "namespace",
- Replacement: ptr.To(""),
+ Replacement: new(""),
},
},
},
@@ -4111,14 +4111,14 @@ func testPromEnforcedNamespaceLabel(t *testing.T) {
relabelConfigs: []monitoringv1.RelabelConfig{
{
TargetLabel: "temp_namespace",
- Replacement: ptr.To("ns1"),
+ Replacement: new("ns1"),
},
},
metricRelabelConfigs: []monitoringv1.RelabelConfig{
{
Action: "labelmap",
Regex: "temp_namespace",
- Replacement: ptr.To("namespace"),
+ Replacement: new("namespace"),
},
{
Action: "labeldrop",
@@ -4239,13 +4239,13 @@ func testPromNamespaceEnforcementExclusion(t *testing.T) {
relabelConfigs: []monitoringv1.RelabelConfig{
{
TargetLabel: "namespace",
- Replacement: ptr.To("ns1"),
+ Replacement: new("ns1"),
},
},
metricRelabelConfigs: []monitoringv1.RelabelConfig{
{
TargetLabel: "namespace",
- Replacement: ptr.To("ns1"),
+ Replacement: new("ns1"),
},
},
expectedNamespace: "ns1",
@@ -4255,14 +4255,14 @@ func testPromNamespaceEnforcementExclusion(t *testing.T) {
relabelConfigs: []monitoringv1.RelabelConfig{
{
TargetLabel: "temp_namespace",
- Replacement: ptr.To("ns1"),
+ Replacement: new("ns1"),
},
},
metricRelabelConfigs: []monitoringv1.RelabelConfig{
{
Action: "labelmap",
Regex: "temp_namespace",
- Replacement: ptr.To("namespace"),
+ Replacement: new("namespace"),
},
{
Action: "labeldrop",
@@ -4606,7 +4606,7 @@ func testPrometheusCRDValidation(t *testing.T) {
},
},
Query: &monitoringv1.QuerySpec{
- MaxConcurrency: ptr.To(int32(100)),
+ MaxConcurrency: new(int32(100)),
},
},
},
@@ -4624,7 +4624,7 @@ func testPrometheusCRDValidation(t *testing.T) {
},
},
Query: &monitoringv1.QuerySpec{
- MaxConcurrency: ptr.To(int32(0)),
+ MaxConcurrency: new(int32(0)),
},
},
expectedError: true,
@@ -4647,7 +4647,7 @@ func testPrometheusCRDValidation(t *testing.T) {
Options: []monitoringv1.PodDNSConfigOption{
{
Name: "ndots",
- Value: ptr.To("5"),
+ Value: new("5"),
},
},
},
@@ -4693,7 +4693,7 @@ func testPrometheusCRDValidation(t *testing.T) {
Name: "test",
Port: intstr.FromInt(9797),
Scheme: ptr.To(monitoringv1.SchemeHTTPS),
- PathPrefix: ptr.To("/alerts"),
+ PathPrefix: new("/alerts"),
BearerTokenFile: "/file",
APIVersion: ptr.To(monitoringv1.AlertmanagerAPIVersion1),
},
@@ -4719,10 +4719,10 @@ func testPrometheusCRDValidation(t *testing.T) {
Alertmanagers: []monitoringv1.AlertmanagerEndpoints{
{
Name: "test",
- Namespace: ptr.To("default"),
+ Namespace: new("default"),
Port: intstr.FromInt(9797),
Scheme: ptr.To(monitoringv1.SchemeHTTPS),
- PathPrefix: ptr.To("/alerts"),
+ PathPrefix: new("/alerts"),
BearerTokenFile: "/file",
APIVersion: ptr.To(monitoringv1.AlertmanagerAPIVersion1),
},
@@ -4747,10 +4747,10 @@ func testPrometheusCRDValidation(t *testing.T) {
Alerting: &monitoringv1.AlertingSpec{
Alertmanagers: []monitoringv1.AlertmanagerEndpoints{
{
- Namespace: ptr.To("default"),
+ Namespace: new("default"),
Port: intstr.FromInt(9797),
Scheme: ptr.To(monitoringv1.SchemeHTTPS),
- PathPrefix: ptr.To("/alerts"),
+ PathPrefix: new("/alerts"),
BearerTokenFile: "/file",
APIVersion: ptr.To(monitoringv1.AlertmanagerAPIVersion1),
},
@@ -4876,7 +4876,7 @@ func testPrometheusCRDValidation(t *testing.T) {
Replicas: &replicas,
Version: operator.DefaultPrometheusVersion,
ServiceAccountName: "prometheus",
- TerminationGracePeriodSeconds: ptr.To(int64(-100)),
+ TerminationGracePeriodSeconds: new(int64(-100)),
},
},
expectedError: true,
@@ -4888,7 +4888,7 @@ func testPrometheusCRDValidation(t *testing.T) {
Replicas: &replicas,
Version: operator.DefaultPrometheusVersion,
ServiceAccountName: "prometheus",
- TerminationGracePeriodSeconds: ptr.To(int64(100)),
+ TerminationGracePeriodSeconds: new(int64(100)),
},
},
},
@@ -4970,7 +4970,7 @@ func testRelabelConfigCRDValidation(t *testing.T) {
SourceLabels: []monitoringv1.LabelName{"__address__"},
Action: "replace",
Regex: "([^:]+)(?::\\d+)?",
- Replacement: ptr.To("$1:80"),
+ Replacement: new("$1:80"),
TargetLabel: "__address__",
},
},
@@ -4980,9 +4980,9 @@ func testRelabelConfigCRDValidation(t *testing.T) {
relabelConfigs: []monitoringv1.RelabelConfig{
{
SourceLabels: []monitoringv1.LabelName{"__address__"},
- Separator: ptr.To(","),
+ Separator: new(","),
Regex: "([^:]+)(?::\\d+)?",
- Replacement: ptr.To("$1:80"),
+ Replacement: new("$1:80"),
TargetLabel: "__address__",
},
},
@@ -4991,7 +4991,7 @@ func testRelabelConfigCRDValidation(t *testing.T) {
scenario: "empty-separator",
relabelConfigs: []monitoringv1.RelabelConfig{
{
- Separator: ptr.To(""),
+ Separator: new(""),
},
},
},
@@ -5011,7 +5011,7 @@ func testRelabelConfigCRDValidation(t *testing.T) {
SourceLabels: []monitoringv1.LabelName{"app.info"},
Action: "replace",
TargetLabel: "app.info",
- Replacement: ptr.To("test.app"),
+ Replacement: new("test.app"),
},
},
},
@@ -5595,7 +5595,7 @@ func testPrometheusUTF8MetricsSupport(t *testing.T) {
},
},
Spec: appsv1.DeploymentSpec{
- Replicas: ptr.To(int32(1)),
+ Replicas: new(int32(1)),
Selector: &metav1.LabelSelector{
MatchLabels: map[string]string{"app": "instrumented-sample-app"},
},
@@ -5826,7 +5826,7 @@ func testPrometheusUTF8LabelSupport(t *testing.T) {
},
},
Spec: appsv1.DeploymentSpec{
- Replicas: ptr.To(int32(1)),
+ Replicas: new(int32(1)),
Selector: &metav1.LabelSelector{
MatchLabels: map[string]string{"app.name": "instrumented-sample-app"},
},
@@ -6127,7 +6127,7 @@ func testPrometheusShardingStrategyCELValidations(t *testing.T) {
{
name: "topology sharding with shards < values",
updateFn: func(p *monitoringv1.Prometheus) {
- p.Spec.Shards = ptr.To(int32(2))
+ p.Spec.Shards = new(int32(2))
p.Spec.ShardingStrategy = &monitoringv1.ShardingStrategy{
Mode: ptr.To(monitoringv1.TopologyShardingStrategyMode),
Topology: &monitoringv1.TopologyShardingStrategy{
@@ -6140,7 +6140,7 @@ func testPrometheusShardingStrategyCELValidations(t *testing.T) {
{
name: "topology sharding with shards >= values",
updateFn: func(p *monitoringv1.Prometheus) {
- p.Spec.Shards = ptr.To(int32(2))
+ p.Spec.Shards = new(int32(2))
p.Spec.ShardingStrategy = &monitoringv1.ShardingStrategy{
Mode: ptr.To(monitoringv1.TopologyShardingStrategyMode),
Topology: &monitoringv1.TopologyShardingStrategy{
diff --git a/test/e2e/prometheusagent_test.go b/test/e2e/prometheusagent_test.go
index a7127684491..d85c281c163 100644
--- a/test/e2e/prometheusagent_test.go
+++ b/test/e2e/prometheusagent_test.go
@@ -35,7 +35,6 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/fields"
"k8s.io/apimachinery/pkg/util/wait"
- "k8s.io/utils/ptr"
monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
monitoringv1alpha1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1alpha1"
@@ -140,7 +139,7 @@ func testAgentCheckStorageClass(t *testing.T) {
Storage: &monitoringv1.StorageSpec{
VolumeClaimTemplate: monitoringv1.EmbeddedPersistentVolumeClaim{
Spec: corev1.PersistentVolumeClaimSpec{
- StorageClassName: ptr.To("unknown-storage-class"),
+ StorageClassName: new("unknown-storage-class"),
Resources: corev1.VolumeResourceRequirements{
Requests: corev1.ResourceList{
corev1.ResourceStorage: resource.MustParse("200Mi"),
@@ -686,7 +685,7 @@ func testDaemonSetInvalidReplicas(t *testing.T) {
p := framework.MakeBasicPrometheusAgentDaemonSet(ns, name)
// no replicas should be set in Daemonsets
- p.Spec.Replicas = ptr.To(int32(3))
+ p.Spec.Replicas = new(int32(3))
_, err = framework.CreatePrometheusAgentAndWaitUntilReady(ctx, ns, p)
require.Error(t, err)
@@ -717,7 +716,7 @@ func testDaemonSetInvalidStorage(t *testing.T) {
p.Spec.CommonPrometheusFields.Storage = &monitoringv1.StorageSpec{
VolumeClaimTemplate: monitoringv1.EmbeddedPersistentVolumeClaim{
Spec: corev1.PersistentVolumeClaimSpec{
- StorageClassName: ptr.To("standard"),
+ StorageClassName: new("standard"),
Resources: corev1.VolumeResourceRequirements{
Requests: corev1.ResourceList{
corev1.ResourceStorage: resource.MustParse("200Mi"),
@@ -753,7 +752,7 @@ func testDaemonSetInvalidShards(t *testing.T) {
p := framework.MakeBasicPrometheusAgentDaemonSet(ns, name)
// shards cannot be greater than 1 in DaemonSets
- p.Spec.Shards = ptr.To(int32(2))
+ p.Spec.Shards = new(int32(2))
_, err = framework.CreatePrometheusAgentAndWaitUntilReady(ctx, ns, p)
require.Error(t, err)
diff --git a/test/e2e/repair_policy_test.go b/test/e2e/repair_policy_test.go
index 14c634fc20b..04a45337f86 100644
--- a/test/e2e/repair_policy_test.go
+++ b/test/e2e/repair_policy_test.go
@@ -124,7 +124,7 @@ func repairPrometheus(ns string) func(t *testing.T) {
prom.Namespace,
monitoringv1.PrometheusSpec{
CommonPrometheusFields: monitoringv1.CommonPrometheusFields{
- Image: ptr.To(badImage),
+ Image: new(badImage),
},
},
)
@@ -141,7 +141,7 @@ func repairPrometheus(ns string) func(t *testing.T) {
prom.Namespace,
monitoringv1.PrometheusSpec{
CommonPrometheusFields: monitoringv1.CommonPrometheusFields{
- Image: ptr.To(operator.DefaultPrometheusImage),
+ Image: new(operator.DefaultPrometheusImage),
},
},
)
@@ -166,7 +166,7 @@ func repairAlertmanager(ns string) func(t *testing.T) {
am.Name,
am.Namespace,
monitoringv1.AlertmanagerSpec{
- Image: ptr.To(badImage),
+ Image: new(badImage),
},
)
require.NoError(t, err)
diff --git a/test/e2e/scrapeconfig_test.go b/test/e2e/scrapeconfig_test.go
index cf0a4616302..0630bcea350 100644
--- a/test/e2e/scrapeconfig_test.go
+++ b/test/e2e/scrapeconfig_test.go
@@ -94,7 +94,7 @@ func testScrapeConfigCreation(t *testing.T) {
Selectors: []monitoringv1alpha1.K8SSelectorConfig{
{
Role: "Pod",
- Label: ptr.To("component=executor"),
+ Label: new("component=executor"),
},
},
},
@@ -111,7 +111,7 @@ func testScrapeConfigCreation(t *testing.T) {
},
RefreshInterval: &fiveMins,
Type: ptr.To(monitoringv1alpha1.DNSRecordType("A")),
- Port: ptr.To(int32(9100)),
+ Port: new(int32(9100)),
},
},
},
@@ -124,7 +124,7 @@ func testScrapeConfigCreation(t *testing.T) {
Names: []string{""},
RefreshInterval: &fiveMins,
Type: ptr.To(monitoringv1alpha1.DNSRecordType("A")),
- Port: ptr.To(int32(9100)),
+ Port: new(int32(9100)),
},
},
},
@@ -470,7 +470,7 @@ func testScrapeConfigKubernetesNodeRole(t *testing.T) {
}
sc.Spec.TLSConfig = &monitoringv1.SafeTLSConfig{
// since we cannot validate server name in cert
- InsecureSkipVerify: ptr.To(true),
+ InsecureSkipVerify: new(true),
CA: monitoringv1.SecretOrConfigMap{
Secret: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
@@ -545,7 +545,7 @@ func testScrapeConfigDNSSDConfig(t *testing.T) {
{
Names: []string{"node.demo.do.prometheus.io"},
Type: ptr.To(monitoringv1alpha1.DNSRecordType("A")),
- Port: ptr.To(int32(9100)),
+ Port: new(int32(9100)),
},
}
_, err = framework.CreateScrapeConfig(context.Background(), ns, sc)
@@ -751,7 +751,7 @@ var ConsulSDTestCases = []scrapeCRDTestCase{
ConsulSDConfigs: []monitoringv1alpha1.ConsulSDConfig{
{
Server: "valid-server",
- PathPrefix: ptr.To("valid-server"),
+ PathPrefix: new("valid-server"),
},
},
},
@@ -763,7 +763,7 @@ var ConsulSDTestCases = []scrapeCRDTestCase{
ConsulSDConfigs: []monitoringv1alpha1.ConsulSDConfig{
{
Server: "valid-server",
- PathPrefix: ptr.To(""),
+ PathPrefix: new(""),
},
},
},
@@ -786,7 +786,7 @@ var ConsulSDTestCases = []scrapeCRDTestCase{
ConsulSDConfigs: []monitoringv1alpha1.ConsulSDConfig{
{
Server: "valid-server",
- Datacenter: ptr.To("valid-server"),
+ Datacenter: new("valid-server"),
},
},
},
@@ -798,7 +798,7 @@ var ConsulSDTestCases = []scrapeCRDTestCase{
ConsulSDConfigs: []monitoringv1alpha1.ConsulSDConfig{
{
Server: "valid-server",
- Datacenter: ptr.To(""),
+ Datacenter: new(""),
},
},
},
@@ -821,7 +821,7 @@ var ConsulSDTestCases = []scrapeCRDTestCase{
ConsulSDConfigs: []monitoringv1alpha1.ConsulSDConfig{
{
Server: "valid-server",
- Namespace: ptr.To("valid-server"),
+ Namespace: new("valid-server"),
},
},
},
@@ -833,7 +833,7 @@ var ConsulSDTestCases = []scrapeCRDTestCase{
ConsulSDConfigs: []monitoringv1alpha1.ConsulSDConfig{
{
Server: "valid-server",
- Namespace: ptr.To(""),
+ Namespace: new(""),
},
},
},
@@ -856,7 +856,7 @@ var ConsulSDTestCases = []scrapeCRDTestCase{
ConsulSDConfigs: []monitoringv1alpha1.ConsulSDConfig{
{
Server: "valid-server",
- Partition: ptr.To("valid-server"),
+ Partition: new("valid-server"),
},
},
},
@@ -868,7 +868,7 @@ var ConsulSDTestCases = []scrapeCRDTestCase{
ConsulSDConfigs: []monitoringv1alpha1.ConsulSDConfig{
{
Server: "valid-server",
- Partition: ptr.To(""),
+ Partition: new(""),
},
},
},
@@ -1020,7 +1020,7 @@ var ConsulSDTestCases = []scrapeCRDTestCase{
ConsulSDConfigs: []monitoringv1alpha1.ConsulSDConfig{
{
Server: "valid-server",
- TagSeparator: ptr.To(","),
+ TagSeparator: new(","),
},
},
},
@@ -1032,7 +1032,7 @@ var ConsulSDTestCases = []scrapeCRDTestCase{
ConsulSDConfigs: []monitoringv1alpha1.ConsulSDConfig{
{
Server: "valid-server",
- TagSeparator: ptr.To(""),
+ TagSeparator: new(""),
},
},
},
@@ -1114,7 +1114,7 @@ var K8STestCases = []scrapeCRDTestCase{
KubernetesSDConfigs: []monitoringv1alpha1.KubernetesSDConfig{
{
Role: "EndpointSlice",
- APIServer: ptr.To(""),
+ APIServer: new(""),
},
},
},
@@ -1207,7 +1207,7 @@ var K8STestCases = []scrapeCRDTestCase{
Selectors: []monitoringv1alpha1.K8SSelectorConfig{
{
Role: "Pod",
- Label: ptr.To(""),
+ Label: new(""),
},
},
},
@@ -1224,7 +1224,7 @@ var K8STestCases = []scrapeCRDTestCase{
Selectors: []monitoringv1alpha1.K8SSelectorConfig{
{
Role: "Pod",
- Label: ptr.To("node.kubernetes.io/instance-type=master"),
+ Label: new("node.kubernetes.io/instance-type=master"),
},
},
},
@@ -1241,7 +1241,7 @@ var K8STestCases = []scrapeCRDTestCase{
Selectors: []monitoringv1alpha1.K8SSelectorConfig{
{
Role: "Pod",
- Field: ptr.To(""),
+ Field: new(""),
},
},
},
@@ -1258,7 +1258,7 @@ var K8STestCases = []scrapeCRDTestCase{
Selectors: []monitoringv1alpha1.K8SSelectorConfig{
{
Role: "Pod",
- Field: ptr.To("metadata.name=foobar"),
+ Field: new("metadata.name=foobar"),
},
},
},
@@ -1275,7 +1275,7 @@ var K8STestCases = []scrapeCRDTestCase{
Selectors: []monitoringv1alpha1.K8SSelectorConfig{
{
Role: "Pod",
- Field: ptr.To("metadata.name=foobar"),
+ Field: new("metadata.name=foobar"),
},
},
},
@@ -1292,13 +1292,13 @@ var K8STestCases = []scrapeCRDTestCase{
Selectors: []monitoringv1alpha1.K8SSelectorConfig{
{
Role: "Pod",
- Label: ptr.To("node.kubernetes.io/instance-type=master"),
- Field: ptr.To("metadata.name=foobar"),
+ Label: new("node.kubernetes.io/instance-type=master"),
+ Field: new("metadata.name=foobar"),
},
{
Role: "Pod",
- Label: ptr.To("node.kubernetes.io/instance-type=master"),
- Field: ptr.To("metadata.name=foobar"),
+ Label: new("node.kubernetes.io/instance-type=master"),
+ Field: new("metadata.name=foobar"),
},
},
},
@@ -1313,7 +1313,7 @@ var K8STestCases = []scrapeCRDTestCase{
{
Role: "Pod",
Namespaces: &monitoringv1alpha1.NamespaceDiscovery{
- IncludeOwnNamespace: ptr.To(true),
+ IncludeOwnNamespace: new(true),
},
},
},
@@ -1327,7 +1327,7 @@ var K8STestCases = []scrapeCRDTestCase{
{
Role: "Pod",
Namespaces: &monitoringv1alpha1.NamespaceDiscovery{
- IncludeOwnNamespace: ptr.To(false),
+ IncludeOwnNamespace: new(false),
Names: []string{},
},
},
@@ -1370,7 +1370,7 @@ var K8STestCases = []scrapeCRDTestCase{
{
Role: "Pod",
Namespaces: &monitoringv1alpha1.NamespaceDiscovery{
- IncludeOwnNamespace: ptr.To(true),
+ IncludeOwnNamespace: new(true),
Names: []string{"default", "kube-system"},
},
},
@@ -1385,7 +1385,7 @@ var K8STestCases = []scrapeCRDTestCase{
{
Role: "Pod",
Namespaces: &monitoringv1alpha1.NamespaceDiscovery{
- IncludeOwnNamespace: ptr.To(true),
+ IncludeOwnNamespace: new(true),
Names: []string{"default", "default"},
},
},
@@ -1399,7 +1399,7 @@ var K8STestCases = []scrapeCRDTestCase{
KubernetesSDConfigs: []monitoringv1alpha1.KubernetesSDConfig{
{
Role: "Pod",
- AttachMetadata: &monitoringv1alpha1.AttachMetadata{Node: ptr.To(true)},
+ AttachMetadata: &monitoringv1alpha1.AttachMetadata{Node: new(true)},
},
},
},
@@ -1544,7 +1544,7 @@ var DNSSDTestCases = []scrapeCRDTestCase{
DNSSDConfigs: []monitoringv1alpha1.DNSSDConfig{
{
Names: []string{"test1"},
- Port: ptr.To(int32(8080)),
+ Port: new(int32(8080)),
},
},
},
@@ -1556,7 +1556,7 @@ var DNSSDTestCases = []scrapeCRDTestCase{
DNSSDConfigs: []monitoringv1alpha1.DNSSDConfig{
{
Names: []string{"test1"},
- Port: ptr.To(int32(80809)),
+ Port: new(int32(80809)),
},
},
},
@@ -1594,7 +1594,7 @@ var EC2SDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
EC2SDConfigs: []monitoringv1alpha1.EC2SDConfig{
{
- Region: ptr.To("us-west"),
+ Region: new("us-west"),
},
},
},
@@ -1614,7 +1614,7 @@ var EC2SDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
EC2SDConfigs: []monitoringv1alpha1.EC2SDConfig{
{
- Region: ptr.To(""),
+ Region: new(""),
},
},
},
@@ -1625,7 +1625,7 @@ var EC2SDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
EC2SDConfigs: []monitoringv1alpha1.EC2SDConfig{
{
- RoleARN: ptr.To("valid-role"),
+ RoleARN: new("valid-role"),
},
},
},
@@ -1645,7 +1645,7 @@ var EC2SDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
EC2SDConfigs: []monitoringv1alpha1.EC2SDConfig{
{
- RoleARN: ptr.To(""),
+ RoleARN: new(""),
},
},
},
@@ -1656,7 +1656,7 @@ var EC2SDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
EC2SDConfigs: []monitoringv1alpha1.EC2SDConfig{
{
- Port: ptr.To(int32(8080)),
+ Port: new(int32(8080)),
},
},
},
@@ -1667,7 +1667,7 @@ var EC2SDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
EC2SDConfigs: []monitoringv1alpha1.EC2SDConfig{
{
- Port: ptr.To(int32(80809)),
+ Port: new(int32(80809)),
},
},
},
@@ -1678,7 +1678,7 @@ var EC2SDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
EC2SDConfigs: []monitoringv1alpha1.EC2SDConfig{
{
- Region: ptr.To("us-west"),
+ Region: new("us-west"),
Filters: []monitoringv1alpha1.Filter{
{
Name: "foo",
@@ -1695,7 +1695,7 @@ var EC2SDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
EC2SDConfigs: []monitoringv1alpha1.EC2SDConfig{
{
- Region: ptr.To("us-west"),
+ Region: new("us-west"),
Filters: []monitoringv1alpha1.Filter{
{
Name: "foo",
@@ -1712,7 +1712,7 @@ var EC2SDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
EC2SDConfigs: []monitoringv1alpha1.EC2SDConfig{
{
- Region: ptr.To("us-west"),
+ Region: new("us-west"),
Filters: []monitoringv1alpha1.Filter{
{
Name: "foo",
@@ -1729,7 +1729,7 @@ var EC2SDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
EC2SDConfigs: []monitoringv1alpha1.EC2SDConfig{
{
- Region: ptr.To("us-west"),
+ Region: new("us-west"),
Filters: []monitoringv1alpha1.Filter{
{
Name: "foo",
@@ -1752,14 +1752,14 @@ var ScrapeConfigCRDTestCases = []scrapeCRDTestCase{
{
name: "JobName: Empty String",
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
- JobName: ptr.To(""),
+ JobName: new(""),
},
expectedError: true,
},
{
name: "JobName: Valid Value",
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
- JobName: ptr.To("validJob"),
+ JobName: new("validJob"),
},
expectedError: false,
},
@@ -1797,14 +1797,14 @@ var ScrapeConfigCRDTestCases = []scrapeCRDTestCase{
{
name: "ScrapeClassName: Empty String",
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
- ScrapeClassName: ptr.To(""),
+ ScrapeClassName: new(""),
},
expectedError: true,
},
{
name: "ScrapeClassName: Valid Value",
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
- ScrapeClassName: ptr.To("default"),
+ ScrapeClassName: new("default"),
},
expectedError: false,
},
@@ -2071,7 +2071,7 @@ var DigitalOceanSDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
DigitalOceanSDConfigs: []monitoringv1alpha1.DigitalOceanSDConfig{
{
- Port: ptr.To(int32(8080)),
+ Port: new(int32(8080)),
},
},
},
@@ -2082,7 +2082,7 @@ var DigitalOceanSDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
DigitalOceanSDConfigs: []monitoringv1alpha1.DigitalOceanSDConfig{
{
- Port: ptr.To(int32(65536)), // maximum Port number = 65535
+ Port: new(int32(65536)), // maximum Port number = 65535
},
},
},
@@ -2093,7 +2093,7 @@ var DigitalOceanSDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
DigitalOceanSDConfigs: []monitoringv1alpha1.DigitalOceanSDConfig{
{
- Port: ptr.To(int32(-1)), // minimum Port number = 0;
+ Port: new(int32(-1)), // minimum Port number = 0;
},
},
},
@@ -2161,7 +2161,7 @@ var IonosSDTestCases = []scrapeCRDTestCase{
IonosSDConfigs: []monitoringv1alpha1.IonosSDConfig{
{
DataCenterID: "11111111-1111-1111-1111-111111111111",
- Port: ptr.To(int32(8080)),
+ Port: new(int32(8080)),
},
},
},
@@ -2173,7 +2173,7 @@ var IonosSDTestCases = []scrapeCRDTestCase{
IonosSDConfigs: []monitoringv1alpha1.IonosSDConfig{
{
DataCenterID: "11111111-1111-1111-1111-111111111111",
- Port: ptr.To(int32(65536)), // maximum Port number = 65535
+ Port: new(int32(65536)), // maximum Port number = 65535
},
},
},
@@ -2185,7 +2185,7 @@ var IonosSDTestCases = []scrapeCRDTestCase{
IonosSDConfigs: []monitoringv1alpha1.IonosSDConfig{
{
DataCenterID: "11111111-1111-1111-1111-111111111111",
- Port: ptr.To(int32(-1)), // minimum Port number = 0
+ Port: new(int32(-1)), // minimum Port number = 0
},
},
},
@@ -2199,7 +2199,7 @@ var LightSailSDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
LightSailSDConfigs: []monitoringv1alpha1.LightSailSDConfig{
{
- Region: ptr.To("us-east-1"),
+ Region: new("us-east-1"),
},
},
},
@@ -2210,7 +2210,7 @@ var LightSailSDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
LightSailSDConfigs: []monitoringv1alpha1.LightSailSDConfig{
{
- Region: ptr.To(""),
+ Region: new(""),
},
},
},
@@ -2221,7 +2221,7 @@ var LightSailSDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
LightSailSDConfigs: []monitoringv1alpha1.LightSailSDConfig{
{
- Endpoint: ptr.To("https://custom-endpoint.example.com"),
+ Endpoint: new("https://custom-endpoint.example.com"),
},
},
},
@@ -2233,7 +2233,7 @@ var LightSailSDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
LightSailSDConfigs: []monitoringv1alpha1.LightSailSDConfig{
{
- Endpoint: ptr.To(""),
+ Endpoint: new(""),
},
},
},
@@ -2244,7 +2244,7 @@ var LightSailSDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
LightSailSDConfigs: []monitoringv1alpha1.LightSailSDConfig{
{
- Port: ptr.To(int32(80)),
+ Port: new(int32(80)),
},
},
},
@@ -2255,7 +2255,7 @@ var LightSailSDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
LightSailSDConfigs: []monitoringv1alpha1.LightSailSDConfig{
{
- Port: ptr.To(int32(-1)),
+ Port: new(int32(-1)),
},
},
},
@@ -2266,7 +2266,7 @@ var LightSailSDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
LightSailSDConfigs: []monitoringv1alpha1.LightSailSDConfig{
{
- Port: ptr.To(int32(65536)),
+ Port: new(int32(65536)),
},
},
},
@@ -2277,7 +2277,7 @@ var LightSailSDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
LightSailSDConfigs: []monitoringv1alpha1.LightSailSDConfig{
{
- RoleARN: ptr.To("arn:aws:iam::123456789012:role/MyRole"),
+ RoleARN: new("arn:aws:iam::123456789012:role/MyRole"),
},
},
},
@@ -2288,7 +2288,7 @@ var LightSailSDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
LightSailSDConfigs: []monitoringv1alpha1.LightSailSDConfig{
{
- RoleARN: ptr.To(""),
+ RoleARN: new(""),
},
},
},
@@ -2371,7 +2371,7 @@ var GCESDTestCases = []scrapeCRDTestCase{
{
Project: "devops-dev",
Zone: "us-west-1",
- Port: ptr.To(int32(65534)),
+ Port: new(int32(65534)),
},
},
},
@@ -2382,7 +2382,7 @@ var GCESDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
GCESDConfigs: []monitoringv1alpha1.GCESDConfig{
{
- Port: ptr.To(int32(-1)),
+ Port: new(int32(-1)),
},
},
},
@@ -2395,7 +2395,7 @@ var GCESDTestCases = []scrapeCRDTestCase{
{
Project: "devops-dev",
Zone: "us-west-1",
- Filter: ptr.To("filter-expression"),
+ Filter: new("filter-expression"),
},
},
},
@@ -2406,7 +2406,7 @@ var GCESDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
GCESDConfigs: []monitoringv1alpha1.GCESDConfig{
{
- Filter: ptr.To(""),
+ Filter: new(""),
},
},
},
@@ -2419,7 +2419,7 @@ var GCESDTestCases = []scrapeCRDTestCase{
{
Project: "devops-dev",
Zone: "us-west-1",
- TagSeparator: ptr.To("tag-value"),
+ TagSeparator: new("tag-value"),
},
},
},
@@ -2430,7 +2430,7 @@ var GCESDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
GCESDConfigs: []monitoringv1alpha1.GCESDConfig{
{
- TagSeparator: ptr.To(""),
+ TagSeparator: new(""),
},
},
},
@@ -2455,7 +2455,7 @@ var AzureSDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
AzureSDConfigs: []monitoringv1alpha1.AzureSDConfig{
{
- Environment: ptr.To("AzurePublicCloud"),
+ Environment: new("AzurePublicCloud"),
AuthenticationMethod: ptr.To(monitoringv1alpha1.AuthMethodTypeSDK),
},
},
@@ -2487,7 +2487,7 @@ var AzureSDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
AzureSDConfigs: []monitoringv1alpha1.AzureSDConfig{
{
- Environment: ptr.To("AzurePublicCloud"),
+ Environment: new("AzurePublicCloud"),
SubscriptionID: "11111111-1111-1111-1111-111111111111",
},
},
@@ -2499,7 +2499,7 @@ var AzureSDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
AzureSDConfigs: []monitoringv1alpha1.AzureSDConfig{
{
- Environment: ptr.To(""),
+ Environment: new(""),
SubscriptionID: "11111111-1111-1111-1111-111111111111",
},
},
@@ -2511,7 +2511,7 @@ var AzureSDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
AzureSDConfigs: []monitoringv1alpha1.AzureSDConfig{
{
- ResourceGroup: ptr.To("my-resource-group"),
+ ResourceGroup: new("my-resource-group"),
SubscriptionID: "11111111-1111-1111-1111-111111111111",
},
},
@@ -2523,7 +2523,7 @@ var AzureSDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
AzureSDConfigs: []monitoringv1alpha1.AzureSDConfig{
{
- ResourceGroup: ptr.To(""),
+ ResourceGroup: new(""),
SubscriptionID: "11111111-1111-1111-1111-111111111111",
},
},
@@ -2560,8 +2560,8 @@ var AzureSDTestCases = []scrapeCRDTestCase{
AzureSDConfigs: []monitoringv1alpha1.AzureSDConfig{
{
AuthenticationMethod: ptr.To(monitoringv1alpha1.AuthMethodTypeOAuth),
- TenantID: ptr.To("22222222-2222-2222-2222-222222222222"),
- ClientID: ptr.To("33333333-3333-3333-3333-333333333333"),
+ TenantID: new("22222222-2222-2222-2222-222222222222"),
+ ClientID: new("33333333-3333-3333-3333-333333333333"),
SubscriptionID: "11111111-1111-1111-1111-111111111111",
ClientSecret: &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
@@ -2580,7 +2580,7 @@ var AzureSDTestCases = []scrapeCRDTestCase{
AzureSDConfigs: []monitoringv1alpha1.AzureSDConfig{
{
AuthenticationMethod: ptr.To(monitoringv1alpha1.AuthMethodTypeOAuth),
- TenantID: ptr.To(""),
+ TenantID: new(""),
SubscriptionID: "11111111-1111-1111-1111-111111111111",
},
},
@@ -2593,7 +2593,7 @@ var AzureSDTestCases = []scrapeCRDTestCase{
AzureSDConfigs: []monitoringv1alpha1.AzureSDConfig{
{
AuthenticationMethod: ptr.To(monitoringv1alpha1.AuthMethodTypeOAuth),
- ClientID: ptr.To(""),
+ ClientID: new(""),
SubscriptionID: "11111111-1111-1111-1111-111111111111",
},
},
@@ -2630,7 +2630,7 @@ var AzureSDTestCases = []scrapeCRDTestCase{
AzureSDConfigs: []monitoringv1alpha1.AzureSDConfig{
{
SubscriptionID: "11111111-1111-1111-1111-111111111111",
- Port: ptr.To(int32(65534)),
+ Port: new(int32(65534)),
},
},
},
@@ -2642,7 +2642,7 @@ var AzureSDTestCases = []scrapeCRDTestCase{
AzureSDConfigs: []monitoringv1alpha1.AzureSDConfig{
{
SubscriptionID: "11111111-1111-1111-1111-111111111111",
- Port: ptr.To(int32(-1)),
+ Port: new(int32(-1)),
},
},
},
@@ -2660,7 +2660,7 @@ var OVHCloudSDTestCases = []scrapeCRDTestCase{
ApplicationSecret: corev1.SecretKeySelector{Key: "valid-secret-key"},
ConsumerKey: corev1.SecretKeySelector{Key: "valid-consumer-key"},
Service: monitoringv1alpha1.OVHServiceDedicatedServer,
- Endpoint: ptr.To("https://api.ovh.com/endpoint"),
+ Endpoint: new("https://api.ovh.com/endpoint"),
RefreshInterval: ptr.To(monitoringv1.Duration("30s")),
},
},
@@ -2800,7 +2800,7 @@ var OVHCloudSDTestCases = []scrapeCRDTestCase{
ApplicationSecret: corev1.SecretKeySelector{Key: "valid-secret-key"},
ConsumerKey: corev1.SecretKeySelector{Key: "valid-consumer-key"},
Service: monitoringv1alpha1.OVHServiceVPS,
- Endpoint: ptr.To(""),
+ Endpoint: new(""),
},
},
},
@@ -3001,7 +3001,7 @@ var OpenStackSDTestCases = []scrapeCRDTestCase{
{
Role: monitoringv1alpha1.OpenStackRoleHypervisor,
Region: "default",
- Username: ptr.To("admin"),
+ Username: new("admin"),
},
},
},
@@ -3014,7 +3014,7 @@ var OpenStackSDTestCases = []scrapeCRDTestCase{
{
Role: monitoringv1alpha1.OpenStackRoleHypervisor,
Region: "default",
- Username: ptr.To(""),
+ Username: new(""),
},
},
},
@@ -3027,7 +3027,7 @@ var OpenStackSDTestCases = []scrapeCRDTestCase{
{
Role: monitoringv1alpha1.OpenStackRoleHypervisor,
Region: "default",
- UserID: ptr.To("ac3377633149401296f6c0d92d79dc16"),
+ UserID: new("ac3377633149401296f6c0d92d79dc16"),
},
},
},
@@ -3040,7 +3040,7 @@ var OpenStackSDTestCases = []scrapeCRDTestCase{
{
Role: monitoringv1alpha1.OpenStackRoleHypervisor,
Region: "default",
- UserID: ptr.To(""),
+ UserID: new(""),
},
},
},
@@ -3053,7 +3053,7 @@ var OpenStackSDTestCases = []scrapeCRDTestCase{
{
Role: monitoringv1alpha1.OpenStackRoleHypervisor,
Region: "default",
- DomainID: ptr.To("e0353a670a9e496da891347c589539e9"),
+ DomainID: new("e0353a670a9e496da891347c589539e9"),
},
},
},
@@ -3066,7 +3066,7 @@ var OpenStackSDTestCases = []scrapeCRDTestCase{
{
Role: monitoringv1alpha1.OpenStackRoleHypervisor,
Region: "default",
- DomainID: ptr.To(""),
+ DomainID: new(""),
},
},
},
@@ -3079,7 +3079,7 @@ var OpenStackSDTestCases = []scrapeCRDTestCase{
{
Role: monitoringv1alpha1.OpenStackRoleHypervisor,
Region: "default",
- DomainName: ptr.To("default"),
+ DomainName: new("default"),
},
},
},
@@ -3092,7 +3092,7 @@ var OpenStackSDTestCases = []scrapeCRDTestCase{
{
Role: monitoringv1alpha1.OpenStackRoleHypervisor,
Region: "default",
- DomainName: ptr.To(""),
+ DomainName: new(""),
},
},
},
@@ -3105,7 +3105,7 @@ var OpenStackSDTestCases = []scrapeCRDTestCase{
{
Role: monitoringv1alpha1.OpenStackRoleHypervisor,
Region: "default",
- ProjectName: ptr.To("default"),
+ ProjectName: new("default"),
},
},
},
@@ -3118,7 +3118,7 @@ var OpenStackSDTestCases = []scrapeCRDTestCase{
{
Role: monitoringv1alpha1.OpenStackRoleHypervisor,
Region: "default",
- ProjectName: ptr.To(""),
+ ProjectName: new(""),
},
},
},
@@ -3131,7 +3131,7 @@ var OpenStackSDTestCases = []scrapeCRDTestCase{
{
Role: monitoringv1alpha1.OpenStackRoleHypervisor,
Region: "default",
- ProjectID: ptr.To("343d245e850143a096806dfaefa9afdc"),
+ ProjectID: new("343d245e850143a096806dfaefa9afdc"),
},
},
},
@@ -3144,7 +3144,7 @@ var OpenStackSDTestCases = []scrapeCRDTestCase{
{
Role: monitoringv1alpha1.OpenStackRoleHypervisor,
Region: "default",
- ProjectID: ptr.To(""),
+ ProjectID: new(""),
},
},
},
@@ -3157,7 +3157,7 @@ var OpenStackSDTestCases = []scrapeCRDTestCase{
{
Role: monitoringv1alpha1.OpenStackRoleHypervisor,
Region: "default",
- ApplicationCredentialName: ptr.To("monitoring"),
+ ApplicationCredentialName: new("monitoring"),
},
},
},
@@ -3170,7 +3170,7 @@ var OpenStackSDTestCases = []scrapeCRDTestCase{
{
Role: monitoringv1alpha1.OpenStackRoleHypervisor,
Region: "default",
- ApplicationCredentialName: ptr.To(""),
+ ApplicationCredentialName: new(""),
},
},
},
@@ -3183,7 +3183,7 @@ var OpenStackSDTestCases = []scrapeCRDTestCase{
{
Role: monitoringv1alpha1.OpenStackRoleHypervisor,
Region: "default",
- ApplicationCredentialID: ptr.To("aa809205ed614a0e854bac92c0768bb9"),
+ ApplicationCredentialID: new("aa809205ed614a0e854bac92c0768bb9"),
},
},
},
@@ -3196,7 +3196,7 @@ var OpenStackSDTestCases = []scrapeCRDTestCase{
{
Role: monitoringv1alpha1.OpenStackRoleHypervisor,
Region: "default",
- ApplicationCredentialID: ptr.To(""),
+ ApplicationCredentialID: new(""),
},
},
},
@@ -3209,7 +3209,7 @@ var OpenStackSDTestCases = []scrapeCRDTestCase{
{
Role: monitoringv1alpha1.OpenStackRoleHypervisor,
Region: "default",
- AllTenants: ptr.To(true),
+ AllTenants: new(true),
},
},
},
@@ -3222,7 +3222,7 @@ var OpenStackSDTestCases = []scrapeCRDTestCase{
{
Role: monitoringv1alpha1.OpenStackRoleHypervisor,
Region: "default",
- AllTenants: ptr.To(false),
+ AllTenants: new(false),
},
},
},
@@ -3261,7 +3261,7 @@ var OpenStackSDTestCases = []scrapeCRDTestCase{
{
Role: monitoringv1alpha1.OpenStackRoleHypervisor,
Region: "default",
- Port: ptr.To(int32(8080)),
+ Port: new(int32(8080)),
},
},
},
@@ -3274,7 +3274,7 @@ var OpenStackSDTestCases = []scrapeCRDTestCase{
{
Role: monitoringv1alpha1.OpenStackRoleHypervisor,
Region: "default",
- Port: ptr.To(int32(-1)),
+ Port: new(int32(-1)),
},
},
},
@@ -3287,7 +3287,7 @@ var OpenStackSDTestCases = []scrapeCRDTestCase{
{
Role: monitoringv1alpha1.OpenStackRoleHypervisor,
Region: "default",
- Port: ptr.To(int32(65537)),
+ Port: new(int32(65537)),
},
},
},
@@ -3300,7 +3300,7 @@ var OpenStackSDTestCases = []scrapeCRDTestCase{
{
Role: monitoringv1alpha1.OpenStackRoleHypervisor,
Region: "default",
- Availability: ptr.To("public"),
+ Availability: new("public"),
},
},
},
@@ -3313,7 +3313,7 @@ var OpenStackSDTestCases = []scrapeCRDTestCase{
{
Role: monitoringv1alpha1.OpenStackRoleHypervisor,
Region: "default",
- Availability: ptr.To("admin"),
+ Availability: new("admin"),
},
},
},
@@ -3326,7 +3326,7 @@ var OpenStackSDTestCases = []scrapeCRDTestCase{
{
Role: monitoringv1alpha1.OpenStackRoleHypervisor,
Region: "default",
- Availability: ptr.To("internal"),
+ Availability: new("internal"),
},
},
},
@@ -3339,7 +3339,7 @@ var OpenStackSDTestCases = []scrapeCRDTestCase{
{
Role: monitoringv1alpha1.OpenStackRoleHypervisor,
Region: "default",
- Availability: ptr.To("private"),
+ Availability: new("private"),
},
},
},
@@ -3352,7 +3352,7 @@ var OpenStackSDTestCases = []scrapeCRDTestCase{
{
Role: monitoringv1alpha1.OpenStackRoleHypervisor,
Region: "default",
- Availability: ptr.To(""),
+ Availability: new(""),
},
},
},
@@ -3409,7 +3409,7 @@ var KumaSDTestCases = []scrapeCRDTestCase{
KumaSDConfigs: []monitoringv1alpha1.KumaSDConfig{
{
Server: "http://example.com",
- ClientID: ptr.To("valid-client-id"),
+ ClientID: new("valid-client-id"),
},
},
},
@@ -3421,7 +3421,7 @@ var KumaSDTestCases = []scrapeCRDTestCase{
KumaSDConfigs: []monitoringv1alpha1.KumaSDConfig{
{
Server: "http://example.com",
- ClientID: ptr.To(""),
+ ClientID: new(""),
},
},
},
@@ -3481,7 +3481,7 @@ var KumaSDTestCases = []scrapeCRDTestCase{
KumaSDConfigs: []monitoringv1alpha1.KumaSDConfig{
{
Server: "http://example.com",
- FollowRedirects: ptr.To(true),
+ FollowRedirects: new(true),
},
},
},
@@ -3493,7 +3493,7 @@ var KumaSDTestCases = []scrapeCRDTestCase{
KumaSDConfigs: []monitoringv1alpha1.KumaSDConfig{
{
Server: "http://example.com",
- FollowRedirects: ptr.To(false),
+ FollowRedirects: new(false),
},
},
},
@@ -3505,7 +3505,7 @@ var KumaSDTestCases = []scrapeCRDTestCase{
KumaSDConfigs: []monitoringv1alpha1.KumaSDConfig{
{
Server: "http://example.com",
- EnableHTTP2: ptr.To(true),
+ EnableHTTP2: new(true),
},
},
},
@@ -3517,7 +3517,7 @@ var KumaSDTestCases = []scrapeCRDTestCase{
KumaSDConfigs: []monitoringv1alpha1.KumaSDConfig{
{
Server: "http://example.com",
- EnableHTTP2: ptr.To(false),
+ EnableHTTP2: new(false),
},
},
},
@@ -3766,7 +3766,7 @@ var ScalewaySDTestCases = []scrapeCRDTestCase{
},
Key: "key.pem",
},
- NameFilter: ptr.To("my-server"),
+ NameFilter: new("my-server"),
},
},
},
@@ -3786,7 +3786,7 @@ var ScalewaySDTestCases = []scrapeCRDTestCase{
},
Key: "key.pem",
},
- NameFilter: ptr.To(""),
+ NameFilter: new(""),
},
},
},
@@ -3866,7 +3866,7 @@ var ScalewaySDTestCases = []scrapeCRDTestCase{
},
Key: "key.pem",
},
- Zone: ptr.To("fr-par-1"),
+ Zone: new("fr-par-1"),
},
},
},
@@ -3886,7 +3886,7 @@ var ScalewaySDTestCases = []scrapeCRDTestCase{
},
Key: "key.pem",
},
- Zone: ptr.To(""),
+ Zone: new(""),
},
},
},
@@ -3906,7 +3906,7 @@ var ScalewaySDTestCases = []scrapeCRDTestCase{
},
Key: "key.pem",
},
- Port: ptr.To(int32(8080)),
+ Port: new(int32(8080)),
},
},
},
@@ -3926,7 +3926,7 @@ var ScalewaySDTestCases = []scrapeCRDTestCase{
},
Key: "key.pem",
},
- Port: ptr.To(int32(65536)), // maximum Port number = 65535
+ Port: new(int32(65536)), // maximum Port number = 65535
},
},
},
@@ -3946,7 +3946,7 @@ var ScalewaySDTestCases = []scrapeCRDTestCase{
},
Key: "key.pem",
},
- Port: ptr.To(int32(-1)), // minimum Port number = 0;
+ Port: new(int32(-1)), // minimum Port number = 0;
},
},
},
@@ -4034,7 +4034,7 @@ var DockerSDTestCases = []scrapeCRDTestCase{
DockerSDConfigs: []monitoringv1alpha1.DockerSDConfig{
{
Host: "unix:///var/run/docker.sock",
- Port: ptr.To(int32(80)),
+ Port: new(int32(80)),
},
},
},
@@ -4046,7 +4046,7 @@ var DockerSDTestCases = []scrapeCRDTestCase{
DockerSDConfigs: []monitoringv1alpha1.DockerSDConfig{
{
Host: "unix:///var/run/docker.sock",
- Port: ptr.To(int32(-1)),
+ Port: new(int32(-1)),
},
},
},
@@ -4058,7 +4058,7 @@ var DockerSDTestCases = []scrapeCRDTestCase{
DockerSDConfigs: []monitoringv1alpha1.DockerSDConfig{
{
Host: "unix:///var/run/docker.sock",
- HostNetworkingHost: ptr.To("localhost"),
+ HostNetworkingHost: new("localhost"),
},
},
},
@@ -4070,7 +4070,7 @@ var DockerSDTestCases = []scrapeCRDTestCase{
DockerSDConfigs: []monitoringv1alpha1.DockerSDConfig{
{
Host: "unix:///var/run/docker.sock",
- HostNetworkingHost: ptr.To(""),
+ HostNetworkingHost: new(""),
},
},
},
@@ -4082,7 +4082,7 @@ var DockerSDTestCases = []scrapeCRDTestCase{
DockerSDConfigs: []monitoringv1alpha1.DockerSDConfig{
{
Host: "unix:///var/run/docker.sock",
- MatchFirstNetwork: ptr.To(true),
+ MatchFirstNetwork: new(true),
},
},
},
@@ -4094,7 +4094,7 @@ var DockerSDTestCases = []scrapeCRDTestCase{
DockerSDConfigs: []monitoringv1alpha1.DockerSDConfig{
{
Host: "unix:///var/run/docker.sock",
- MatchFirstNetwork: ptr.To(false),
+ MatchFirstNetwork: new(false),
},
},
},
@@ -4198,7 +4198,7 @@ var DockerSDTestCases = []scrapeCRDTestCase{
DockerSDConfigs: []monitoringv1alpha1.DockerSDConfig{
{
Host: "unix:///var/run/docker.sock",
- FollowRedirects: ptr.To(true),
+ FollowRedirects: new(true),
},
},
},
@@ -4210,7 +4210,7 @@ var DockerSDTestCases = []scrapeCRDTestCase{
DockerSDConfigs: []monitoringv1alpha1.DockerSDConfig{
{
Host: "unix:///var/run/docker.sock",
- FollowRedirects: ptr.To(false),
+ FollowRedirects: new(false),
},
},
},
@@ -4222,7 +4222,7 @@ var DockerSDTestCases = []scrapeCRDTestCase{
DockerSDConfigs: []monitoringv1alpha1.DockerSDConfig{
{
Host: "unix:///var/run/docker.sock",
- EnableHTTP2: ptr.To(true),
+ EnableHTTP2: new(true),
},
},
},
@@ -4234,7 +4234,7 @@ var DockerSDTestCases = []scrapeCRDTestCase{
DockerSDConfigs: []monitoringv1alpha1.DockerSDConfig{
{
Host: "unix:///var/run/docker.sock",
- EnableHTTP2: ptr.To(false),
+ EnableHTTP2: new(false),
},
},
},
@@ -4262,7 +4262,7 @@ var DockerSwarmSDTestCases = []scrapeCRDTestCase{
{
Host: "tcp://localhost",
Role: "Services",
- Port: ptr.To(int32(80)),
+ Port: new(int32(80)),
},
},
},
@@ -4275,7 +4275,7 @@ var DockerSwarmSDTestCases = []scrapeCRDTestCase{
{
Host: "tcp://localhost",
Role: "Services",
- Port: ptr.To(int32(-1)),
+ Port: new(int32(-1)),
},
},
},
@@ -4385,7 +4385,7 @@ var DockerSwarmSDTestCases = []scrapeCRDTestCase{
{
Host: "tcp://localhost",
Role: "Services",
- FollowRedirects: ptr.To(true),
+ FollowRedirects: new(true),
},
},
},
@@ -4398,7 +4398,7 @@ var DockerSwarmSDTestCases = []scrapeCRDTestCase{
{
Host: "tcp://localhost",
Role: "Services",
- FollowRedirects: ptr.To(false),
+ FollowRedirects: new(false),
},
},
},
@@ -4411,7 +4411,7 @@ var DockerSwarmSDTestCases = []scrapeCRDTestCase{
{
Host: "tcp://localhost",
Role: "Services",
- EnableHTTP2: ptr.To(true),
+ EnableHTTP2: new(true),
},
},
},
@@ -4424,7 +4424,7 @@ var DockerSwarmSDTestCases = []scrapeCRDTestCase{
{
Host: "tcp://localhost",
Role: "Services",
- EnableHTTP2: ptr.To(false),
+ EnableHTTP2: new(false),
},
},
},
@@ -4461,7 +4461,7 @@ var HetznerSDTestCases = []scrapeCRDTestCase{
HetznerSDConfigs: []monitoringv1alpha1.HetznerSDConfig{
{
Role: "Hcloud",
- FollowRedirects: ptr.To(true),
+ FollowRedirects: new(true),
},
},
},
@@ -4473,7 +4473,7 @@ var HetznerSDTestCases = []scrapeCRDTestCase{
HetznerSDConfigs: []monitoringv1alpha1.HetznerSDConfig{
{
Role: "Hcloud",
- FollowRedirects: ptr.To(false),
+ FollowRedirects: new(false),
},
},
},
@@ -4485,7 +4485,7 @@ var HetznerSDTestCases = []scrapeCRDTestCase{
HetznerSDConfigs: []monitoringv1alpha1.HetznerSDConfig{
{
Role: "Hcloud",
- EnableHTTP2: ptr.To(true),
+ EnableHTTP2: new(true),
},
},
},
@@ -4497,7 +4497,7 @@ var HetznerSDTestCases = []scrapeCRDTestCase{
HetznerSDConfigs: []monitoringv1alpha1.HetznerSDConfig{
{
Role: "Hcloud",
- EnableHTTP2: ptr.To(false),
+ EnableHTTP2: new(false),
},
},
},
@@ -4509,7 +4509,7 @@ var HetznerSDTestCases = []scrapeCRDTestCase{
HetznerSDConfigs: []monitoringv1alpha1.HetznerSDConfig{
{
Role: "Hcloud",
- Port: ptr.To(int32(80)),
+ Port: new(int32(80)),
},
},
},
@@ -4521,7 +4521,7 @@ var HetznerSDTestCases = []scrapeCRDTestCase{
HetznerSDConfigs: []monitoringv1alpha1.HetznerSDConfig{
{
Role: "Hcloud",
- Port: ptr.To(int32(-1)),
+ Port: new(int32(-1)),
},
},
},
@@ -4557,7 +4557,7 @@ var HetznerSDTestCases = []scrapeCRDTestCase{
HetznerSDConfigs: []monitoringv1alpha1.HetznerSDConfig{
{
Role: "Hcloud",
- LabelSelector: ptr.To("foo"),
+ LabelSelector: new("foo"),
},
},
},
@@ -4569,7 +4569,7 @@ var HetznerSDTestCases = []scrapeCRDTestCase{
HetznerSDConfigs: []monitoringv1alpha1.HetznerSDConfig{
{
Role: "Hcloud",
- LabelSelector: ptr.To(""),
+ LabelSelector: new(""),
},
},
},
@@ -4583,7 +4583,7 @@ var LinodeSDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
LinodeSDConfigs: []monitoringv1alpha1.LinodeSDConfig{
{
- Region: ptr.To("us-east"),
+ Region: new("us-east"),
},
},
},
@@ -4594,7 +4594,7 @@ var LinodeSDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
LinodeSDConfigs: []monitoringv1alpha1.LinodeSDConfig{
{
- Region: ptr.To(""),
+ Region: new(""),
},
},
},
@@ -4605,7 +4605,7 @@ var LinodeSDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
LinodeSDConfigs: []monitoringv1alpha1.LinodeSDConfig{
{
- Port: ptr.To(int32(80)),
+ Port: new(int32(80)),
},
},
},
@@ -4616,7 +4616,7 @@ var LinodeSDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
LinodeSDConfigs: []monitoringv1alpha1.LinodeSDConfig{
{
- Port: ptr.To(int32(-1)),
+ Port: new(int32(-1)),
},
},
},
@@ -4627,7 +4627,7 @@ var LinodeSDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
LinodeSDConfigs: []monitoringv1alpha1.LinodeSDConfig{
{
- TagSeparator: ptr.To(","),
+ TagSeparator: new(","),
},
},
},
@@ -4660,7 +4660,7 @@ var LinodeSDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
LinodeSDConfigs: []monitoringv1alpha1.LinodeSDConfig{
{
- FollowRedirects: ptr.To(true),
+ FollowRedirects: new(true),
},
},
},
@@ -4671,7 +4671,7 @@ var LinodeSDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
LinodeSDConfigs: []monitoringv1alpha1.LinodeSDConfig{
{
- FollowRedirects: ptr.To(false),
+ FollowRedirects: new(false),
},
},
},
@@ -4682,7 +4682,7 @@ var LinodeSDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
LinodeSDConfigs: []monitoringv1alpha1.LinodeSDConfig{
{
- EnableHTTP2: ptr.To(true),
+ EnableHTTP2: new(true),
},
},
},
@@ -4693,7 +4693,7 @@ var LinodeSDTestCases = []scrapeCRDTestCase{
scrapeConfigSpec: monitoringv1alpha1.ScrapeConfigSpec{
LinodeSDConfigs: []monitoringv1alpha1.LinodeSDConfig{
{
- EnableHTTP2: ptr.To(false),
+ EnableHTTP2: new(false),
},
},
},
@@ -4741,7 +4741,7 @@ var NomadSDTestCases = []scrapeCRDTestCase{
NomadSDConfigs: []monitoringv1alpha1.NomadSDConfig{
{
Server: "http://localhost:4646",
- AllowStale: ptr.To(true),
+ AllowStale: new(true),
},
},
},
@@ -4753,7 +4753,7 @@ var NomadSDTestCases = []scrapeCRDTestCase{
NomadSDConfigs: []monitoringv1alpha1.NomadSDConfig{
{
Server: "http://localhost:4646",
- AllowStale: ptr.To(false),
+ AllowStale: new(false),
},
},
},
@@ -4765,7 +4765,7 @@ var NomadSDTestCases = []scrapeCRDTestCase{
NomadSDConfigs: []monitoringv1alpha1.NomadSDConfig{
{
Server: "http://localhost:4646",
- Namespace: ptr.To("default"),
+ Namespace: new("default"),
},
},
},
@@ -4777,7 +4777,7 @@ var NomadSDTestCases = []scrapeCRDTestCase{
NomadSDConfigs: []monitoringv1alpha1.NomadSDConfig{
{
Server: "http://localhost:4646",
- Namespace: ptr.To(""),
+ Namespace: new(""),
},
},
},
@@ -4813,7 +4813,7 @@ var NomadSDTestCases = []scrapeCRDTestCase{
NomadSDConfigs: []monitoringv1alpha1.NomadSDConfig{
{
Server: "http://localhost:4646",
- Region: ptr.To("us-east"),
+ Region: new("us-east"),
},
},
},
@@ -4825,7 +4825,7 @@ var NomadSDTestCases = []scrapeCRDTestCase{
NomadSDConfigs: []monitoringv1alpha1.NomadSDConfig{
{
Server: "http://localhost:4646",
- Region: ptr.To(""),
+ Region: new(""),
},
},
},
@@ -4837,7 +4837,7 @@ var NomadSDTestCases = []scrapeCRDTestCase{
NomadSDConfigs: []monitoringv1alpha1.NomadSDConfig{
{
Server: "http://localhost:4646",
- TagSeparator: ptr.To(","),
+ TagSeparator: new(","),
},
},
},
@@ -4849,7 +4849,7 @@ var NomadSDTestCases = []scrapeCRDTestCase{
NomadSDConfigs: []monitoringv1alpha1.NomadSDConfig{
{
Server: "http://localhost:4646",
- TagSeparator: ptr.To(""),
+ TagSeparator: new(""),
},
},
},
@@ -4861,7 +4861,7 @@ var NomadSDTestCases = []scrapeCRDTestCase{
NomadSDConfigs: []monitoringv1alpha1.NomadSDConfig{
{
Server: "http://localhost:4646",
- FollowRedirects: ptr.To(true),
+ FollowRedirects: new(true),
},
},
},
@@ -4873,7 +4873,7 @@ var NomadSDTestCases = []scrapeCRDTestCase{
NomadSDConfigs: []monitoringv1alpha1.NomadSDConfig{
{
Server: "http://localhost:4646",
- FollowRedirects: ptr.To(false),
+ FollowRedirects: new(false),
},
},
},
@@ -4885,7 +4885,7 @@ var NomadSDTestCases = []scrapeCRDTestCase{
NomadSDConfigs: []monitoringv1alpha1.NomadSDConfig{
{
Server: "http://localhost:4646",
- EnableHTTP2: ptr.To(true),
+ EnableHTTP2: new(true),
},
},
},
@@ -4897,7 +4897,7 @@ var NomadSDTestCases = []scrapeCRDTestCase{
NomadSDConfigs: []monitoringv1alpha1.NomadSDConfig{
{
Server: "http://localhost:4646",
- EnableHTTP2: ptr.To(false),
+ EnableHTTP2: new(false),
},
},
},
@@ -4971,7 +4971,7 @@ var PuppetDBSDTestCases = []scrapeCRDTestCase{
{
URL: "https://puppetdb.example.com",
Query: "nodes { certname = \"macbook-pro.local\" }",
- IncludeParameters: ptr.To(true),
+ IncludeParameters: new(true),
},
},
},
@@ -4984,7 +4984,7 @@ var PuppetDBSDTestCases = []scrapeCRDTestCase{
{
URL: "https://puppetdb.example.com",
Query: "nodes { certname = \"macbook-pro.local\" }",
- IncludeParameters: ptr.To(false),
+ IncludeParameters: new(false),
},
},
},
@@ -5023,7 +5023,7 @@ var PuppetDBSDTestCases = []scrapeCRDTestCase{
{
URL: "https://puppetdb.example.com",
Query: "nodes { certname = \"macbook-pro.local\" }",
- Port: ptr.To(int32(80)),
+ Port: new(int32(80)),
},
},
},
@@ -5036,7 +5036,7 @@ var PuppetDBSDTestCases = []scrapeCRDTestCase{
{
URL: "https://puppetdb.example.com",
Query: "nodes { certname = \"macbook-pro.local\" }",
- Port: ptr.To(int32(-1)),
+ Port: new(int32(-1)),
},
},
},
@@ -5049,7 +5049,7 @@ var PuppetDBSDTestCases = []scrapeCRDTestCase{
{
URL: "https://puppetdb.example.com",
Query: "nodes { certname = \"macbook-pro.local\" }",
- FollowRedirects: ptr.To(true),
+ FollowRedirects: new(true),
},
},
},
@@ -5062,7 +5062,7 @@ var PuppetDBSDTestCases = []scrapeCRDTestCase{
{
URL: "https://puppetdb.example.com",
Query: "nodes { certname = \"macbook-pro.local\" }",
- FollowRedirects: ptr.To(false),
+ FollowRedirects: new(false),
},
},
},
@@ -5075,7 +5075,7 @@ var PuppetDBSDTestCases = []scrapeCRDTestCase{
{
URL: "https://puppetdb.example.com",
Query: "nodes { certname = \"macbook-pro.local\" }",
- EnableHTTP2: ptr.To(true),
+ EnableHTTP2: new(true),
},
},
},
@@ -5088,7 +5088,7 @@ var PuppetDBSDTestCases = []scrapeCRDTestCase{
{
URL: "https://puppetdb.example.com",
Query: "nodes { certname = \"macbook-pro.local\" }",
- EnableHTTP2: ptr.To(false),
+ EnableHTTP2: new(false),
},
},
},
@@ -5136,7 +5136,7 @@ var EurekaSDTestCases = []scrapeCRDTestCase{
EurekaSDConfigs: []monitoringv1alpha1.EurekaSDConfig{
{
Server: "http://localhost:8761/eureka",
- FollowRedirects: ptr.To(true),
+ FollowRedirects: new(true),
},
},
},
@@ -5148,7 +5148,7 @@ var EurekaSDTestCases = []scrapeCRDTestCase{
EurekaSDConfigs: []monitoringv1alpha1.EurekaSDConfig{
{
Server: "http://localhost:8761/eureka",
- FollowRedirects: ptr.To(false),
+ FollowRedirects: new(false),
},
},
},
@@ -5160,7 +5160,7 @@ var EurekaSDTestCases = []scrapeCRDTestCase{
EurekaSDConfigs: []monitoringv1alpha1.EurekaSDConfig{
{
Server: "http://localhost:8761/eureka",
- EnableHTTP2: ptr.To(true),
+ EnableHTTP2: new(true),
},
},
},
@@ -5172,7 +5172,7 @@ var EurekaSDTestCases = []scrapeCRDTestCase{
EurekaSDConfigs: []monitoringv1alpha1.EurekaSDConfig{
{
Server: "http://localhost:8761/eureka",
- EnableHTTP2: ptr.To(false),
+ EnableHTTP2: new(false),
},
},
},
diff --git a/test/e2e/thanosruler_test.go b/test/e2e/thanosruler_test.go
index 08111eeb99d..0e175a53b18 100644
--- a/test/e2e/thanosruler_test.go
+++ b/test/e2e/thanosruler_test.go
@@ -27,7 +27,6 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/wait"
- "k8s.io/utils/ptr"
monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
testFramework "github.com/prometheus-operator/prometheus-operator/test/framework"
@@ -276,7 +275,7 @@ func testTRMinReadySeconds(t *testing.T) {
kubeClient := framework.KubeClient
thanosRuler := framework.MakeBasicThanosRuler("test-thanos", 1, "http://test.example.com")
- thanosRuler.Spec.MinReadySeconds = ptr.To(int32(5))
+ thanosRuler.Spec.MinReadySeconds = new(int32(5))
thanosRuler, err := framework.CreateThanosRulerAndWaitUntilReady(context.Background(), ns, thanosRuler)
require.NoError(t, err)
@@ -284,7 +283,7 @@ func testTRMinReadySeconds(t *testing.T) {
require.NoError(t, err)
require.Equal(t, int32(5), trSS.Spec.MinReadySeconds)
- thanosRuler.Spec.MinReadySeconds = ptr.To(int32(10))
+ thanosRuler.Spec.MinReadySeconds = new(int32(10))
_, err = framework.PatchThanosRulerAndWaitUntilReady(context.Background(), thanosRuler.Name, ns, thanosRuler.Spec)
require.NoError(t, err)
@@ -473,7 +472,7 @@ func testTRCheckStorageClass(t *testing.T) {
Storage: &monitoringv1.StorageSpec{
VolumeClaimTemplate: monitoringv1.EmbeddedPersistentVolumeClaim{
Spec: corev1.PersistentVolumeClaimSpec{
- StorageClassName: ptr.To("unknown-storage-class"),
+ StorageClassName: new("unknown-storage-class"),
Resources: corev1.VolumeResourceRequirements{
Requests: corev1.ResourceList{
corev1.ResourceStorage: resource.MustParse("200Mi"),
diff --git a/test/e2e/topology_sharding_test.go b/test/e2e/topology_sharding_test.go
index bac6619eaec..378e743aab1 100644
--- a/test/e2e/topology_sharding_test.go
+++ b/test/e2e/topology_sharding_test.go
@@ -76,7 +76,7 @@ func testPrometheusTopologySharding(t *testing.T) {
Values: []string{"zone-a", "zone-b"},
},
}
- p.Spec.Shards = ptr.To(int32(2))
+ p.Spec.Shards = new(int32(2))
shardServices := make([]*corev1.Service, 2)
for i := range shardServices {
diff --git a/test/framework/alertmanager.go b/test/framework/alertmanager.go
index f7623f3faef..ac36d3f2985 100644
--- a/test/framework/alertmanager.go
+++ b/test/framework/alertmanager.go
@@ -36,7 +36,6 @@ import (
"k8s.io/apimachinery/pkg/util/intstr"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/apimachinery/pkg/util/yaml"
- "k8s.io/utils/ptr"
"github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring"
monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
@@ -285,7 +284,7 @@ func (f *Framework) PatchAlertmanager(ctx context.Context, name, ns string, spec
types.ApplyPatchType,
b,
metav1.PatchOptions{
- Force: ptr.To(true),
+ Force: new(true),
FieldManager: "e2e-test",
},
)
@@ -303,7 +302,7 @@ func (f *Framework) UpdateAlertmanagerReplicasAndWaitUntilReady(ctx context.Cont
name,
ns,
monitoringv1.AlertmanagerSpec{
- Replicas: ptr.To(replicas),
+ Replicas: new(replicas),
},
)
}
@@ -508,7 +507,7 @@ func (f *Framework) WaitForAlertmanagerFiringAlert(ctx context.Context, ns, svcN
}
for _, alert := range alerts {
- if alert.Labels["alertname"] == alertName && alert.Status.State != ptr.To("firing") {
+ if alert.Labels["alertname"] == alertName && alert.Status.State != new("firing") {
return true, nil
}
}
diff --git a/test/framework/app.go b/test/framework/app.go
index 221790e7ce6..1b4791acc84 100644
--- a/test/framework/app.go
+++ b/test/framework/app.go
@@ -19,7 +19,6 @@ import (
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
- "k8s.io/utils/ptr"
monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
)
@@ -39,7 +38,7 @@ func (f *Framework) DeployBasicAuthApp(ctx context.Context, ns string, replicas
if err != nil {
return err
}
- dep.Spec.Replicas = ptr.To(replicas)
+ dep.Spec.Replicas = new(replicas)
if err := f.CreateDeployment(ctx, ns, dep); err != nil {
return err
diff --git a/test/framework/framework.go b/test/framework/framework.go
index 8a93c3c7a3e..76955179808 100644
--- a/test/framework/framework.go
+++ b/test/framework/framework.go
@@ -43,7 +43,6 @@ import (
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
certutil "k8s.io/client-go/util/cert"
- "k8s.io/utils/ptr"
"github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring"
monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
@@ -817,7 +816,7 @@ func (f *Framework) CreateOrUpdateAdmissionWebhookServer(
return nil, nil, err
}
if len(nodes) == 1 {
- deploy.Spec.Replicas = ptr.To(int32(1))
+ deploy.Spec.Replicas = new(int32(1))
deploy.Spec.Template.Spec.Affinity = nil
deploy.Spec.Strategy = appsv1.DeploymentStrategy{}
}
diff --git a/test/framework/prometheus.go b/test/framework/prometheus.go
index c3829fcf843..b3b3b6aa1b6 100644
--- a/test/framework/prometheus.go
+++ b/test/framework/prometheus.go
@@ -224,7 +224,7 @@ func (prwtc PromRemoteWriteTestConfig) AddRemoteWriteWithTLSToPrometheus(p *moni
URL: monitoringv1.URL(url),
MessageVersion: prwtc.RemoteWriteMessageVersion,
QueueConfig: &monitoringv1.QueueConfig{
- BatchSendDeadline: (*monitoringv1.Duration)(ptr.To("1s")),
+ BatchSendDeadline: (*monitoringv1.Duration)(new("1s")),
},
}}
@@ -234,7 +234,7 @@ func (prwtc PromRemoteWriteTestConfig) AddRemoteWriteWithTLSToPrometheus(p *moni
p.Spec.RemoteWrite[0].TLSConfig = &monitoringv1.TLSConfig{
SafeTLSConfig: monitoringv1.SafeTLSConfig{
- ServerName: ptr.To("caandserver.com"),
+ ServerName: new("caandserver.com"),
},
}
@@ -285,7 +285,7 @@ func (prwtc PromRemoteWriteTestConfig) AddRemoteWriteWithTLSToPrometheus(p *moni
}
case prwtc.InsecureSkipVerify:
- p.Spec.RemoteWrite[0].TLSConfig.InsecureSkipVerify = ptr.To(true)
+ p.Spec.RemoteWrite[0].TLSConfig.InsecureSkipVerify = new(true)
}
}
@@ -317,7 +317,7 @@ func (f *Framework) EnableRemoteWriteReceiverWithTLS(p *monitoringv1.Prometheus)
Key: PrivateKey,
},
// Liveness/readiness probes don't work when using "RequireAndVerifyClientCert".
- ClientAuthType: ptr.To("VerifyClientCertIfGiven"),
+ ClientAuthType: new("VerifyClientCertIfGiven"),
},
},
}
@@ -327,7 +327,7 @@ func (f *Framework) AddAlertingToPrometheus(p *monitoringv1.Prometheus, ns, name
p.Spec.Alerting = &monitoringv1.AlertingSpec{
Alertmanagers: []monitoringv1.AlertmanagerEndpoints{
{
- Namespace: ptr.To(ns),
+ Namespace: new(ns),
Name: fmt.Sprintf("alertmanager-%s", name),
Port: intstr.FromString("web"),
},
@@ -375,7 +375,7 @@ func (f *Framework) MakeBasicPodMonitor(name string) *monitoringv1.PodMonitor {
},
PodMetricsEndpoints: []monitoringv1.PodMetricsEndpoint{
{
- Port: ptr.To("web"),
+ Port: new("web"),
Interval: "30s",
},
},
@@ -450,7 +450,7 @@ func (f *Framework) UpdatePrometheusReplicasAndWaitUntilReady(ctx context.Contex
ns,
monitoringv1.PrometheusSpec{
CommonPrometheusFields: monitoringv1.CommonPrometheusFields{
- Replicas: ptr.To(replicas),
+ Replicas: new(replicas),
},
},
)
@@ -497,7 +497,7 @@ func (f *Framework) PatchPrometheus(ctx context.Context, name, ns string, spec m
types.ApplyPatchType,
b,
metav1.PatchOptions{
- Force: ptr.To(true),
+ Force: new(true),
FieldManager: "e2e-test",
},
)
diff --git a/test/framework/prometheusagent.go b/test/framework/prometheusagent.go
index 7bb012939f7..5ea4bdbdd0e 100644
--- a/test/framework/prometheusagent.go
+++ b/test/framework/prometheusagent.go
@@ -249,7 +249,7 @@ func (f *Framework) PatchPrometheusAgent(ctx context.Context, name, ns string, s
types.ApplyPatchType,
b,
metav1.PatchOptions{
- Force: ptr.To(true),
+ Force: new(true),
FieldManager: "e2e-test",
},
)
diff --git a/test/framework/thanosruler.go b/test/framework/thanosruler.go
index 4701d70ed41..daeb21a55f5 100644
--- a/test/framework/thanosruler.go
+++ b/test/framework/thanosruler.go
@@ -96,7 +96,7 @@ func (f *Framework) PatchThanosRuler(ctx context.Context, name, ns string, spec
types.ApplyPatchType,
b,
metav1.PatchOptions{
- Force: ptr.To(true),
+ Force: new(true),
FieldManager: "e2e-test",
},
)
@@ -114,7 +114,7 @@ func (f *Framework) UpdateThanosRulerReplicasAndWaitUntilReady(ctx context.Conte
name,
ns,
monitoringv1.ThanosRulerSpec{
- Replicas: ptr.To(replicas),
+ Replicas: new(replicas),
},
)
}
From 29482f2002413c63ee9b3296fc5eae6a1ffff872 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 6 May 2026 08:18:14 +0000
Subject: [PATCH 08/81] build(deps): bump sigs.k8s.io/controller-runtime from
0.23.3 to 0.24.0
Bumps [sigs.k8s.io/controller-runtime](https://github.com/kubernetes-sigs/controller-runtime) from 0.23.3 to 0.24.0.
- [Release notes](https://github.com/kubernetes-sigs/controller-runtime/releases)
- [Changelog](https://github.com/kubernetes-sigs/controller-runtime/blob/main/RELEASE.md)
- [Commits](https://github.com/kubernetes-sigs/controller-runtime/compare/v0.23.3...v0.24.0)
---
updated-dependencies:
- dependency-name: sigs.k8s.io/controller-runtime
dependency-version: 0.24.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
---
go.mod | 2 +-
go.sum | 12 ++++++------
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/go.mod b/go.mod
index 8ace0a7b07c..cef745c15fa 100644
--- a/go.mod
+++ b/go.mod
@@ -40,7 +40,7 @@ require (
k8s.io/component-base v0.36.0
k8s.io/klog/v2 v2.140.0
k8s.io/utils v0.0.0-20260319190234-28399d86e0b5
- sigs.k8s.io/controller-runtime v0.23.3
+ sigs.k8s.io/controller-runtime v0.24.0
sigs.k8s.io/yaml v1.6.0
)
diff --git a/go.sum b/go.sum
index a8950e75346..c35f174a888 100644
--- a/go.sum
+++ b/go.sum
@@ -263,10 +263,10 @@ github.com/oklog/run v1.2.0/go.mod h1:mgDbKRSwPhJfesJ4PntqFUbKQRZ50NgmZTSPlFA0YF
github.com/oklog/ulid/v2 v2.1.1 h1:suPZ4ARWLOJLegGFiZZ1dFAkqzhMjL3J1TzI+5wHz8s=
github.com/oklog/ulid/v2 v2.1.1/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ=
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
-github.com/onsi/ginkgo/v2 v2.27.2 h1:LzwLj0b89qtIy6SSASkzlNvX6WktqurSHwkk2ipF/Ns=
-github.com/onsi/ginkgo/v2 v2.27.2/go.mod h1:ArE1D/XhNXBXCBkKOLkbsb2c81dQHCRcF5zwn/ykDRo=
-github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A=
-github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k=
+github.com/onsi/ginkgo/v2 v2.27.4 h1:fcEcQW/A++6aZAZQNUmNjvA9PSOzefMJBerHJ4t8v8Y=
+github.com/onsi/ginkgo/v2 v2.27.4/go.mod h1:ArE1D/XhNXBXCBkKOLkbsb2c81dQHCRcF5zwn/ykDRo=
+github.com/onsi/gomega v1.39.0 h1:y2ROC3hKFmQZJNFeGAMeHZKkjBL65mIZcvrLQBF9k6Q=
+github.com/onsi/gomega v1.39.0/go.mod h1:ZCU1pkQcXDO5Sl9/VVEGlDyp+zm0m1cmeG5TOzLgdh4=
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/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0=
@@ -492,8 +492,8 @@ k8s.io/streaming v0.36.0 h1:agnTxU+NFulUrtYzXUGKO3ndEa8jKwht1Kwn9nu9x+4=
k8s.io/streaming v0.36.0/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=
-sigs.k8s.io/controller-runtime v0.23.3 h1:VjB/vhoPoA9l1kEKZHBMnQF33tdCLQKJtydy4iqwZ80=
-sigs.k8s.io/controller-runtime v0.23.3/go.mod h1:B6COOxKptp+YaUT5q4l6LqUJTRpizbgf9KSRNdQGns0=
+sigs.k8s.io/controller-runtime v0.24.0 h1:Ck6N2LdS8Lovy1o25BB4r1xjvLEKUl1s2o9kU+KWDE4=
+sigs.k8s.io/controller-runtime v0.24.0/go.mod h1:vFkfY5fGt5xAC/sKb8IBFKgWPNKG9OUG29dR8Y2wImw=
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg=
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
From 79ebbb53b3718efca9120632b69511cf50bd8e77 Mon Sep 17 00:00:00 2001
From: dongjiang
Date: Wed, 6 May 2026 17:59:55 +0800
Subject: [PATCH 09/81] Merge pull request #8554 from
kubeservice-stack/update-controller-runtime-v0.24
build(deps): update controller-runtime to v0.24.0 and bump to golangci-linter config to go 1.26
---
.golangci-kal.yml | 4 ++--
.golangci.yml | 2 +-
Makefile | 3 +--
pkg/apis/monitoring/go.mod | 2 +-
pkg/apis/monitoring/go.sum | 4 ++--
pkg/client/go.mod | 2 +-
pkg/client/go.sum | 4 ++--
7 files changed, 10 insertions(+), 11 deletions(-)
diff --git a/.golangci-kal.yml b/.golangci-kal.yml
index 99fbfb5adf1..f750f3aa181 100644
--- a/.golangci-kal.yml
+++ b/.golangci-kal.yml
@@ -6,7 +6,7 @@
# https://github.com/kubernetes-sigs/kube-api-linter/blob/main/docs/linters.md
version: "2"
run:
- go: "1.25"
+ go: "1.26"
allow-parallel-runners: true
linters:
default: none
@@ -65,4 +65,4 @@ linters:
# KAL only validates the API folders.
- path-except: pkg/apis/monitoring/
linters:
- - kubeapilinter
\ No newline at end of file
+ - kubeapilinter
diff --git a/.golangci.yml b/.golangci.yml
index 49df8753a0f..a7db7c4f936 100644
--- a/.golangci.yml
+++ b/.golangci.yml
@@ -1,6 +1,6 @@
version: "2"
run:
- go: "1.25"
+ go: "1.26"
timeout: 10m
modules-download-mode: readonly
allow-parallel-runners: true
diff --git a/Makefile b/Makefile
index eccefe85219..09e38b2d02f 100644
--- a/Makefile
+++ b/Makefile
@@ -374,8 +374,7 @@ check-docs: $(MDOX_BINARY) ## Check documentation formatting and links.
###########
.PHONY: test
-test: ## Run all tests (unit, long, and e2e).
- test-unit test-long test-e2e
+test: test-unit test-long test-e2e ## Run all tests (unit, long, and e2e).
.PHONY: test-unit
test-unit: test-prometheus-goldenfiles ## Run unit tests (short mode).
diff --git a/pkg/apis/monitoring/go.mod b/pkg/apis/monitoring/go.mod
index df6d533f9b2..b7a97123b46 100644
--- a/pkg/apis/monitoring/go.mod
+++ b/pkg/apis/monitoring/go.mod
@@ -7,7 +7,7 @@ require (
k8s.io/apiextensions-apiserver v0.36.0
k8s.io/apimachinery v0.36.0
k8s.io/utils v0.0.0-20260319190234-28399d86e0b5
- sigs.k8s.io/controller-runtime v0.23.3
+ sigs.k8s.io/controller-runtime v0.24.0
)
require (
diff --git a/pkg/apis/monitoring/go.sum b/pkg/apis/monitoring/go.sum
index 754924ab6be..9f0ad05d525 100644
--- a/pkg/apis/monitoring/go.sum
+++ b/pkg/apis/monitoring/go.sum
@@ -50,8 +50,8 @@ k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a h1:xCeOEAOoGYl2jnJoHkC3hk
k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0=
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=
-sigs.k8s.io/controller-runtime v0.23.3 h1:VjB/vhoPoA9l1kEKZHBMnQF33tdCLQKJtydy4iqwZ80=
-sigs.k8s.io/controller-runtime v0.23.3/go.mod h1:B6COOxKptp+YaUT5q4l6LqUJTRpizbgf9KSRNdQGns0=
+sigs.k8s.io/controller-runtime v0.24.0 h1:Ck6N2LdS8Lovy1o25BB4r1xjvLEKUl1s2o9kU+KWDE4=
+sigs.k8s.io/controller-runtime v0.24.0/go.mod h1:vFkfY5fGt5xAC/sKb8IBFKgWPNKG9OUG29dR8Y2wImw=
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg=
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
diff --git a/pkg/client/go.mod b/pkg/client/go.mod
index df7aa5cc2b1..158faf4ad94 100644
--- a/pkg/client/go.mod
+++ b/pkg/client/go.mod
@@ -53,7 +53,7 @@ require (
k8s.io/klog/v2 v2.140.0 // indirect
k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a // indirect
k8s.io/utils v0.0.0-20260319190234-28399d86e0b5 // indirect
- sigs.k8s.io/controller-runtime v0.23.3 // indirect
+ sigs.k8s.io/controller-runtime v0.24.0 // indirect
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect
sigs.k8s.io/randfill v1.0.0 // indirect
sigs.k8s.io/yaml v1.6.0 // indirect
diff --git a/pkg/client/go.sum b/pkg/client/go.sum
index e3bfbcccf71..1fc32a6c924 100644
--- a/pkg/client/go.sum
+++ b/pkg/client/go.sum
@@ -122,8 +122,8 @@ k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a h1:xCeOEAOoGYl2jnJoHkC3hk
k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0=
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=
-sigs.k8s.io/controller-runtime v0.23.3 h1:VjB/vhoPoA9l1kEKZHBMnQF33tdCLQKJtydy4iqwZ80=
-sigs.k8s.io/controller-runtime v0.23.3/go.mod h1:B6COOxKptp+YaUT5q4l6LqUJTRpizbgf9KSRNdQGns0=
+sigs.k8s.io/controller-runtime v0.24.0 h1:Ck6N2LdS8Lovy1o25BB4r1xjvLEKUl1s2o9kU+KWDE4=
+sigs.k8s.io/controller-runtime v0.24.0/go.mod h1:vFkfY5fGt5xAC/sKb8IBFKgWPNKG9OUG29dR8Y2wImw=
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg=
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
From fb6b43d3b86e4c161adbf27627e7f00a6fb7a8e9 Mon Sep 17 00:00:00 2001
From: dongjiang
Date: Thu, 7 May 2026 14:40:34 +0800
Subject: [PATCH 10/81] fix golangci lint in main (#8555)
Signed-off-by: dongjiang
---
Makefile | 2 +-
pkg/alertmanager/statefulset_test.go | 9 ++-------
2 files changed, 3 insertions(+), 8 deletions(-)
diff --git a/Makefile b/Makefile
index 09e38b2d02f..cee704665ce 100644
--- a/Makefile
+++ b/Makefile
@@ -350,7 +350,7 @@ fix: fix-golang fix-api ## Fix all auto-fixable issues.
.PHONY: fix-golang
fix-golang: $(GOLANGCILINTER_BINARY) ## Run golangci-lint to fix issues.
- $(GOLANGCILINTER_BINARY) run --fix
+ $(GOLANGCILINTER_BINARY) run --fix -v
.PHONY: fix-api
fix-api: $(GOLANGCIKUBEAPILINTER_BINARY) ## Run golangci-kube-api-linter to fix issues on API types.
diff --git a/pkg/alertmanager/statefulset_test.go b/pkg/alertmanager/statefulset_test.go
index 6b5d7bab9be..e982b0aeb56 100644
--- a/pkg/alertmanager/statefulset_test.go
+++ b/pkg/alertmanager/statefulset_test.go
@@ -587,14 +587,14 @@ func TestMakeStatefulSetSpecMaxPerSilenceBytes(t *testing.T) {
scenario: "no maxPerSilenceBytes old version",
version: "0.27.9",
limits: &monitoringv1.AlertmanagerLimitsSpec{
- MaxPerSilenceBytes: toPtr(monitoringv1.ByteSize("5MB")),
+ MaxPerSilenceBytes: new(monitoringv1.ByteSize("5MB")),
},
expectMaxPerSilenceBytesArg: false,
}, {
scenario: "maxPerSilenceBytes arg set if specified",
version: operator.DefaultAlertmanagerVersion,
limits: &monitoringv1.AlertmanagerLimitsSpec{
- MaxPerSilenceBytes: toPtr(monitoringv1.ByteSize("5MB")),
+ MaxPerSilenceBytes: new(monitoringv1.ByteSize("5MB")),
},
expectMaxPerSilenceBytesArg: true,
},
@@ -1392,11 +1392,6 @@ func containsString(sub string) func(string) bool {
}
}
-//go:fix inline
-func toPtr[T any](t T) *T {
- return new(t)
-}
-
func TestEnableFeatures(t *testing.T) {
tt := []struct {
name string
From 23fcd96c57d143997f31ea90ea925fe615fac8b8 Mon Sep 17 00:00:00 2001
From: Simon Pasquier
Date: Wed, 29 Apr 2026 16:41:27 +0200
Subject: [PATCH 11/81] test: extend tests for topology sharding
Signed-off-by: Simon Pasquier
---
test/e2e/topology_sharding_test.go | 103 +++++++++++++++++++++--------
test/framework/app.go | 51 +++++++++++---
2 files changed, 118 insertions(+), 36 deletions(-)
diff --git a/test/e2e/topology_sharding_test.go b/test/e2e/topology_sharding_test.go
index 378e743aab1..70e6ba4b752 100644
--- a/test/e2e/topology_sharding_test.go
+++ b/test/e2e/topology_sharding_test.go
@@ -62,10 +62,15 @@ func testPrometheusTopologySharding(t *testing.T) {
err = framework.DeployAppServiceMonitor(ctx, ns)
require.NoError(t, err)
+ // Create a pod monitor for the app deployment.
+ err = framework.DeployAppPodMonitor(ctx, ns)
+ require.NoError(t, err)
+
const (
prometheusName = "topology-sharding"
)
p := framework.MakeBasicPrometheus(ns, prometheusName, testFramework.AppGroupLabel, 1)
+ p.Spec.ServiceDiscoveryRole = ptr.To(monitoringv1.EndpointSliceRole)
p.Spec.ShardingStrategy = &monitoringv1.ShardingStrategy{
Mode: ptr.To(monitoringv1.TopologyShardingStrategyMode),
Topology: &monitoringv1.TopologyShardingStrategy{
@@ -112,35 +117,81 @@ func testPrometheusTopologySharding(t *testing.T) {
}
// Ensure that each shard scrapes a non-zero number of targets and that
- // the total across all shards equals the number of app replicas (10).
+ // the total across all shards for a given monitor resource equals the
+ // number of app replicas (10).
t.Run("target distribution", func(t *testing.T) {
- var pollErr error
- err := wait.PollUntilContextTimeout(ctx, 5*time.Second, 2*time.Minute, false, func(ctx context.Context) (bool, error) {
- total := 0
- for _, svc := range shardServices {
- err := framework.WaitForHealthyTargetsWithCondition(
- context.Background(),
- ns,
- svc.Name,
- func(targets []*testFramework.Target) error {
- if len(targets) == 0 {
- return errors.New("expected non-zero targets")
- }
- total += len(targets)
- return nil
- },
- )
- if err != nil {
- pollErr = fmt.Errorf("%s: %w", svc.Name, err)
+ t.Run("service monitor", func(t *testing.T) {
+ var pollErr error
+ err := wait.PollUntilContextTimeout(ctx, 5*time.Second, 2*time.Minute, false, func(ctx context.Context) (bool, error) {
+ total := 0
+ for _, svc := range shardServices {
+ err := framework.WaitForHealthyTargetsWithCondition(
+ context.Background(),
+ ns,
+ svc.Name,
+ func(targets []*testFramework.Target) error {
+ count := 0
+ for _, target := range targets {
+ if target.Labels["job"] == testFramework.AppGroupLabel {
+ count++
+ }
+ }
+ if count == 0 {
+ return errors.New("expected non-zero service monitor targets")
+ }
+ total += count
+ return nil
+ },
+ )
+ if err != nil {
+ pollErr = fmt.Errorf("%s: %w", svc.Name, err)
+ return false, nil
+ }
+ }
+ if total != 10 {
+ pollErr = fmt.Errorf("expected 10 service monitor targets, got %d", total)
+ return false, nil
+ }
+ return true, nil
+ })
+ require.NoError(t, err, fmt.Sprintf("%s: %s", err, pollErr))
+ })
+
+ t.Run("pod monitor", func(t *testing.T) {
+ var pollErr error
+ err := wait.PollUntilContextTimeout(ctx, 5*time.Second, 2*time.Minute, false, func(ctx context.Context) (bool, error) {
+ total := 0
+ for _, svc := range shardServices {
+ err := framework.WaitForHealthyTargetsWithCondition(
+ context.Background(),
+ ns,
+ svc.Name,
+ func(targets []*testFramework.Target) error {
+ count := 0
+ for _, target := range targets {
+ if target.Labels["job"] == ns+"/"+testFramework.AppGroupLabel {
+ count++
+ }
+ }
+ if count == 0 {
+ return errors.New("expected non-zero pod monitor targets")
+ }
+ total += count
+ return nil
+ },
+ )
+ if err != nil {
+ pollErr = fmt.Errorf("%s: %w", svc.Name, err)
+ return false, nil
+ }
+ }
+ if total != 10 {
+ pollErr = fmt.Errorf("expected 10 pod monitor targets, got %d", total)
return false, nil
}
- }
- if total != 10 {
- pollErr = fmt.Errorf("expected 10 total targets, got %d", total)
- return false, nil
- }
- return true, nil
+ return true, nil
+ })
+ require.NoError(t, err, fmt.Sprintf("%s: %s", err, pollErr))
})
- require.NoError(t, err, fmt.Sprintf("%s: %s", err, pollErr))
})
}
diff --git a/test/framework/app.go b/test/framework/app.go
index 1b4791acc84..5bdac062534 100644
--- a/test/framework/app.go
+++ b/test/framework/app.go
@@ -26,8 +26,10 @@ import (
const (
// AppGroupLabel is the value of the "group" label for the instrumented sample
// app resources.
- AppGroupLabel = "app"
- appSecretAuthName = "auth"
+ AppGroupLabel = "app"
+ appSecretAuthName = "auth"
+ appSecretAuthUserKey = "user"
+ appSecretAuthPassKey = "pass"
)
// DeployBasicAuthApp deploys the instrumented sample app with the given number
@@ -39,6 +41,9 @@ func (f *Framework) DeployBasicAuthApp(ctx context.Context, ns string, replicas
return err
}
dep.Spec.Replicas = new(replicas)
+ dep.Labels = map[string]string{"group": AppGroupLabel}
+ dep.Spec.Selector.MatchLabels = dep.Labels
+ dep.Spec.Template.Labels = dep.Labels
if err := f.CreateDeployment(ctx, ns, dep); err != nil {
return err
@@ -46,10 +51,8 @@ func (f *Framework) DeployBasicAuthApp(ctx context.Context, ns string, replicas
svc := &corev1.Service{
ObjectMeta: metav1.ObjectMeta{
- Name: AppGroupLabel,
- Labels: map[string]string{
- "group": AppGroupLabel,
- },
+ Name: AppGroupLabel,
+ Labels: dep.Labels,
},
Spec: corev1.ServiceSpec{
Selector: dep.Spec.Template.Labels,
@@ -69,10 +72,11 @@ func (f *Framework) DeployBasicAuthApp(ctx context.Context, ns string, replicas
ObjectMeta: metav1.ObjectMeta{
Name: appSecretAuthName,
Namespace: ns,
+ Labels: dep.Labels,
},
StringData: map[string]string{
- "user": "user",
- "pass": "pass",
+ appSecretAuthUserKey: "user",
+ appSecretAuthPassKey: "pass",
},
Type: corev1.SecretTypeOpaque,
}
@@ -80,6 +84,33 @@ func (f *Framework) DeployBasicAuthApp(ctx context.Context, ns string, replicas
return err
}
+// DeployAppPodMonitor creates a PodMonitor for the app deployed by DeployBasicAuthApp.
+func (f *Framework) DeployAppPodMonitor(ctx context.Context, ns string) error {
+ pm := f.MakeBasicPodMonitor(AppGroupLabel)
+ pm.Spec.PodMetricsEndpoints[0] = monitoringv1.PodMetricsEndpoint{
+ Interval: monitoringv1.Duration("5s"),
+ Port: new("web"),
+ HTTPConfigWithProxy: monitoringv1.HTTPConfigWithProxy{
+ HTTPConfig: monitoringv1.HTTPConfig{
+ HTTPConfigWithoutTLS: monitoringv1.HTTPConfigWithoutTLS{
+ BasicAuth: &monitoringv1.BasicAuth{
+ Username: corev1.SecretKeySelector{
+ Key: appSecretAuthUserKey,
+ LocalObjectReference: corev1.LocalObjectReference{Name: appSecretAuthName},
+ },
+ Password: corev1.SecretKeySelector{
+ Key: appSecretAuthPassKey,
+ LocalObjectReference: corev1.LocalObjectReference{Name: appSecretAuthName},
+ },
+ },
+ },
+ },
+ },
+ }
+ _, err := f.MonClientV1.PodMonitors(ns).Create(ctx, pm, metav1.CreateOptions{})
+ return err
+}
+
// DeployAppServiceMonitor creates a ServiceMonitor for the app deployed by DeployBasicAuthApp.
func (f *Framework) DeployAppServiceMonitor(ctx context.Context, ns string) error {
sm := f.MakeBasicServiceMonitor(AppGroupLabel)
@@ -91,11 +122,11 @@ func (f *Framework) DeployAppServiceMonitor(ctx context.Context, ns string) erro
HTTPConfigWithoutTLS: monitoringv1.HTTPConfigWithoutTLS{
BasicAuth: &monitoringv1.BasicAuth{
Username: corev1.SecretKeySelector{
- Key: "user",
+ Key: appSecretAuthUserKey,
LocalObjectReference: corev1.LocalObjectReference{Name: appSecretAuthName},
},
Password: corev1.SecretKeySelector{
- Key: "pass",
+ Key: appSecretAuthPassKey,
LocalObjectReference: corev1.LocalObjectReference{Name: appSecretAuthName},
},
},
From ca4356d41471bc2b96cd39aa53d36f5c43c5bcde Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 7 May 2026 12:43:00 +0000
Subject: [PATCH 12/81] build(deps): bump sigstore/cosign-installer from 4.1.1
to 4.1.2
Bumps [sigstore/cosign-installer](https://github.com/sigstore/cosign-installer) from 4.1.1 to 4.1.2.
- [Release notes](https://github.com/sigstore/cosign-installer/releases)
- [Commits](https://github.com/sigstore/cosign-installer/compare/cad07c2e89fa2edd6e2d7bab4c1aa38e53f76003...6f9f17788090df1f26f669e9d70d6ae9567deba6)
---
updated-dependencies:
- dependency-name: sigstore/cosign-installer
dependency-version: 4.1.2
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
.github/workflows/publish.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml
index e8e2fe80d17..ba5404471e6 100644
--- a/.github/workflows/publish.yaml
+++ b/.github/workflows/publish.yaml
@@ -36,7 +36,7 @@ jobs:
go-version: '${{ env.golang-version }}'
check-latest: true
- name: Install cosign
- uses: sigstore/cosign-installer@cad07c2e89fa2edd6e2d7bab4c1aa38e53f76003 # v4.1.1
+ uses: sigstore/cosign-installer@6f9f17788090df1f26f669e9d70d6ae9567deba6 # v4.1.2
- name: Check the Docker version
run: docker version
- name: Check the cosign version
From 3303f98aa73b09d62c5624d9e06d8ece06bcb012 Mon Sep 17 00:00:00 2001
From: Sebastien Tardif
Date: Fri, 8 May 2026 14:32:44 -0700
Subject: [PATCH 13/81] operator: return error for malformed key=value flag
input
Map.Set() panics with an index-out-of-range error when a flag value
does not contain "=" (e.g. --annotations "key"). Replace
strings.Split with strings.Cut to validate the format and return a
clear error instead of crashing.
strings.Cut also correctly preserves values containing "=" which the
previous code silently truncated.
Signed-off-by: Sebastien Tardif
---
pkg/operator/config.go | 7 +++++--
pkg/operator/config_test.go | 24 ++++++++++++++++++++++++
2 files changed, 29 insertions(+), 2 deletions(-)
diff --git a/pkg/operator/config.go b/pkg/operator/config.go
index 7700cfe8625..37a7ab71c23 100644
--- a/pkg/operator/config.go
+++ b/pkg/operator/config.go
@@ -237,8 +237,11 @@ func (m *Map) Set(value string) error {
}
for pair := range strings.SplitSeq(value, ",") {
- pair := strings.Split(pair, "=")
- (*m)[pair[0]] = pair[1]
+ k, v, ok := strings.Cut(pair, "=")
+ if !ok {
+ return fmt.Errorf("invalid key=value pair: %q", pair)
+ }
+ (*m)[k] = v
}
return nil
diff --git a/pkg/operator/config_test.go b/pkg/operator/config_test.go
index 51b8e0d92d2..a7ec3d2f268 100644
--- a/pkg/operator/config_test.go
+++ b/pkg/operator/config_test.go
@@ -34,6 +34,30 @@ func TestMap(t *testing.T) {
require.Equal(t, "foo=bar,foo2=bar2", m.String())
require.Equal(t, map[string]string{"foo": "bar", "foo2": "bar2", "foo3": "bar3"}, m.Merge(map[string]string{"foo": "xxx", "foo3": "bar3"}))
+
+ require.NoError(t, m.Set("k=v=with=equals"))
+ require.Equal(t, "v=with=equals", m["k"])
+}
+
+func TestMapSetInvalid(t *testing.T) {
+ for _, tc := range []struct {
+ name string
+ value string
+ }{
+ {
+ name: "missing value",
+ value: "key",
+ },
+ {
+ name: "one valid one invalid",
+ value: "good=value,bad",
+ },
+ } {
+ t.Run(tc.name, func(t *testing.T) {
+ var m Map
+ require.Error(t, m.Set(tc.value))
+ })
+ }
}
func TestFieldSelector(t *testing.T) {
From fb51f4887989ee6b503507a013b1d9dc54885a99 Mon Sep 17 00:00:00 2001
From: Sebastien Tardif
Date: Fri, 8 May 2026 15:56:27 -0700
Subject: [PATCH 14/81] operator: use read lock for read-only
ReconciliationTracker methods
HasRefTo and getStatus only read from maps but acquire an exclusive
write lock (Lock), serializing with all other operations including
informer event filtering and metrics collection. Use RLock instead
to allow concurrent reads, consistent with the Collect method which
already uses RLock on the same mutex.
Signed-off-by: Sebastien Tardif
---
pkg/operator/operator.go | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/pkg/operator/operator.go b/pkg/operator/operator.go
index 856c82a755e..40aa4aa31d0 100644
--- a/pkg/operator/operator.go
+++ b/pkg/operator/operator.go
@@ -113,8 +113,8 @@ func (rt *ReconciliationTracker) init() {
// HasRefTo returns true if the object identified by key has a direct or
// indirect reference to obj (secret or configmap).
func (rt *ReconciliationTracker) HasRefTo(key string, obj runtime.Object) bool {
- rt.mtx.Lock()
- defer rt.mtx.Unlock()
+ rt.mtx.RLock()
+ defer rt.mtx.RUnlock()
refTracker, found := rt.refTracker[key]
if !found {
@@ -169,8 +169,8 @@ func (rt *ReconciliationTracker) SetReasonAndMessage(key string, reason, message
// GetStatus returns the last reconciliation status for the given object.
// The second value indicates whether the object is known or not.
func (rt *ReconciliationTracker) getStatus(k string) (ReconciliationStatus, bool) {
- rt.mtx.Lock()
- defer rt.mtx.Unlock()
+ rt.mtx.RLock()
+ defer rt.mtx.RUnlock()
s, found := rt.statusByObject[k]
if !found {
From 50afffcc6edef122e92be6e63661700da9178778 Mon Sep 17 00:00:00 2001
From: Nattapong Ekudomsuk
Date: Sat, 9 May 2026 16:55:52 +0800
Subject: [PATCH 15/81] alertmanager: update with new test cases
to catch up with the latest change in main
---
pkg/alertmanager/amcfg_test.go | 114 ++++++++++++++++-----------------
1 file changed, 57 insertions(+), 57 deletions(-)
diff --git a/pkg/alertmanager/amcfg_test.go b/pkg/alertmanager/amcfg_test.go
index 19092507618..28202466c78 100644
--- a/pkg/alertmanager/amcfg_test.go
+++ b/pkg/alertmanager/amcfg_test.go
@@ -4456,9 +4456,6 @@ func TestSanitizeConfig(t *testing.T) {
versionSlackAppConfigAllowed := semver.Version{Major: 0, Minor: 30}
versionSlackAppConfigNotAllowed := semver.Version{Major: 0, Minor: 29}
- versionSlackUpdateMessageAllowed := semver.Version{Major: 0, Minor: 32}
- versionSlackUpdateMessageNotAllowed := semver.Version{Major: 0, Minor: 31}
-
versionJiraAllowed := semver.Version{Major: 0, Minor: 28}
versionJiraNotAllowed := semver.Version{Major: 0, Minor: 27}
jiraURL := commoncfg.URL{}
@@ -4666,57 +4663,6 @@ func TestSanitizeConfig(t *testing.T) {
},
golden: "test_mattermost_webhook_url_takes_precedence_over_mattermost_webhook_url_file_in_global_config.golden",
},
- {
- name: "Test slack config happy path",
- againstVersion: versionFileURLAllowed,
- in: &alertmanagerConfig{
- Global: &globalConfig{
- SlackAPIURLFile: "/test",
- },
- Receivers: []*receiver{
- {
- SlackConfigs: []*slackConfig{
- {
- APIURLFile: "/test/case",
- },
- },
- },
- },
- },
- golden: "test_slack_config_happy_path.golden",
- },
- {
- name: "Test slack update_message supported version",
- againstVersion: versionSlackUpdateMessageAllowed,
- in: &alertmanagerConfig{
- Receivers: []*receiver{
- {
- SlackConfigs: []*slackConfig{
- {
- UpdateMessage: new(true),
- },
- },
- },
- },
- },
- golden: "test_slack_update_message_supported_version.golden",
- },
- {
- name: "Test slack update_message unsupported version",
- againstVersion: versionSlackUpdateMessageNotAllowed,
- in: &alertmanagerConfig{
- Receivers: []*receiver{
- {
- SlackConfigs: []*slackConfig{
- {
- UpdateMessage: new(true),
- },
- },
- },
- },
- },
- golden: "test_slack_update_message_unsupported_version.golden",
- },
{
name: "Test inhibit rules error with unsupported syntax",
againstVersion: matcherV2SyntaxNotAllowed,
@@ -5647,7 +5593,8 @@ func TestSanitizeConfig(t *testing.T) {
},
},
golden: "test_slack_app_token_and_slack_api_url_with_same_url_is_allowed.golden",
- }, {
+ },
+ {
name: "jira_config for supported versions",
againstVersion: versionJiraAllowed,
in: &alertmanagerConfig{
@@ -9072,6 +9019,9 @@ func TestSanitizeSlackConfig(t *testing.T) {
versionTimeoutConfigAllowed := semver.Version{Major: 0, Minor: 30}
versionTimeoutConfigNotAllowed := semver.Version{Major: 0, Minor: 29}
+ versionSlackUpdateMessageAllowed := semver.Version{Major: 0, Minor: 32}
+ versionSlackUpdateMessageNotAllowed := semver.Version{Major: 0, Minor: 31}
+
for _, tc := range []struct {
name string
againstVersion semver.Version
@@ -9079,7 +9029,25 @@ func TestSanitizeSlackConfig(t *testing.T) {
golden string
expectErr bool
}{
-
+ {
+ name: "Test slack config happy path",
+ againstVersion: versionFileURLAllowed,
+ in: &alertmanagerConfig{
+ Global: &globalConfig{
+ SlackAPIURLFile: "/test",
+ },
+ Receivers: []*receiver{
+ {
+ SlackConfigs: []*slackConfig{
+ {
+ APIURLFile: "/test/case",
+ },
+ },
+ },
+ },
+ },
+ golden: "test_slack_config_happy_path.golden",
+ },
{
name: "Test api_url takes precedence in slack config",
againstVersion: versionFileURLAllowed,
@@ -9137,7 +9105,7 @@ func TestSanitizeSlackConfig(t *testing.T) {
{
SlackConfigs: []*slackConfig{
{
- Timeout: ptr.To(model.Duration(time.Minute)),
+ Timeout: new(model.Duration(time.Minute)),
},
},
},
@@ -9177,6 +9145,38 @@ func TestSanitizeSlackConfig(t *testing.T) {
},
golden: "test_slack_message_text_is_added_in_slack_config_for_supported_versions.golden",
},
+ {
+ name: "Test slack update_message unsupported version",
+ againstVersion: versionSlackUpdateMessageNotAllowed,
+ in: &alertmanagerConfig{
+ Receivers: []*receiver{
+ {
+ SlackConfigs: []*slackConfig{
+ {
+ UpdateMessage: new(true),
+ },
+ },
+ },
+ },
+ },
+ golden: "test_slack_update_message_unsupported_version.golden",
+ },
+ {
+ name: "Test slack update_message supported version",
+ againstVersion: versionSlackUpdateMessageAllowed,
+ in: &alertmanagerConfig{
+ Receivers: []*receiver{
+ {
+ SlackConfigs: []*slackConfig{
+ {
+ UpdateMessage: new(true),
+ },
+ },
+ },
+ },
+ },
+ golden: "test_slack_update_message_supported_version.golden",
+ },
} {
t.Run(tc.name, func(t *testing.T) {
err := tc.in.sanitize(tc.againstVersion, logger)
From 94789334ae4e6762498e3541edaa0a5294c074f1 Mon Sep 17 00:00:00 2001
From: dongjiang
Date: Mon, 11 May 2026 19:14:48 +0800
Subject: [PATCH 16/81] update dependabot.yml
Signed-off-by: dongjiang
---
.github/dependabot.yml | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 2551a6794af..4bc0925bc94 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -17,3 +17,8 @@ updates:
directory: /
schedule:
interval: daily
+ groups:
+ github-actions-deps:
+ applies-to: version-updates
+ patterns:
+ - "*"
From 49682a1e295560067658f6646cd69a2abba69d16 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 11 May 2026 12:03:43 +0000
Subject: [PATCH 17/81] build(deps): bump golang.org/x/net from 0.53.0 to
0.54.0
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.53.0 to 0.54.0.
- [Commits](https://github.com/golang/net/compare/v0.53.0...v0.54.0)
---
updated-dependencies:
- dependency-name: golang.org/x/net
dependency-version: 0.54.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
---
go.mod | 10 +++++-----
go.sum | 28 ++++++++++++++--------------
2 files changed, 19 insertions(+), 19 deletions(-)
diff --git a/go.mod b/go.mod
index cef745c15fa..c44bb8c9a0a 100644
--- a/go.mod
+++ b/go.mod
@@ -28,7 +28,7 @@ require (
github.com/prometheus/prometheus v0.311.3
github.com/stretchr/testify v1.11.1
github.com/thanos-io/thanos v0.41.0
- golang.org/x/net v0.53.0
+ golang.org/x/net v0.54.0
golang.org/x/sync v0.20.0
google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af
gopkg.in/yaml.v2 v2.4.0
@@ -153,11 +153,11 @@ require (
go.opentelemetry.io/otel/metric v1.43.0 // indirect
go.opentelemetry.io/otel/trace v1.43.0 // indirect
go.uber.org/atomic v1.11.0 // indirect
- golang.org/x/crypto v0.50.0 // indirect
+ golang.org/x/crypto v0.51.0 // indirect
golang.org/x/oauth2 v0.36.0 // indirect
- golang.org/x/sys v0.43.0 // indirect
- golang.org/x/term v0.42.0 // indirect
- golang.org/x/text v0.36.0 // indirect
+ golang.org/x/sys v0.44.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
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
diff --git a/go.sum b/go.sum
index c35f174a888..6d115595cdd 100644
--- a/go.sum
+++ b/go.sum
@@ -388,22 +388,22 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI=
-golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q=
+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-20260312153236-7ab1446f8b90 h1:jiDhWWeC7jfWqR9c/uplMOqJ0sbNlNWv0UkzE0vX1MA=
golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90/go.mod h1:xE1HEv6b+1SCZ5/uscMRjUBKtIxworgEcEi+/n9NQDQ=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.34.0 h1:xIHgNUUnW6sYkcM5Jleh05DvLOtwc6RitGHbDk4akRI=
-golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY=
+golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM=
+golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU=
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
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.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA=
-golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs=
+golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w=
+golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ=
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=
@@ -420,22 +420,22 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI=
-golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
-golang.org/x/term v0.42.0 h1:UiKe+zDFmJobeJ5ggPwOshJIVt6/Ft0rcfrXZDLWAWY=
-golang.org/x/term v0.42.0/go.mod h1:Dq/D+snpsbazcBG5+F9Q1n2rXV8Ma+71xEjTRufARgY=
+golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ=
+golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
+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.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg=
-golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164=
+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-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.43.0 h1:12BdW9CeB3Z+J/I/wj34VMl8X+fEXBxVR90JeMX5E7s=
-golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0=
+golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c=
+golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI=
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 97ee01d9bb130e6a69059424f189fbada78157be Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 12 May 2026 18:41:04 +0000
Subject: [PATCH 18/81] build(deps): bump sigs.k8s.io/controller-runtime from
0.24.0 to 0.24.1
Bumps [sigs.k8s.io/controller-runtime](https://github.com/kubernetes-sigs/controller-runtime) from 0.24.0 to 0.24.1.
- [Release notes](https://github.com/kubernetes-sigs/controller-runtime/releases)
- [Changelog](https://github.com/kubernetes-sigs/controller-runtime/blob/main/RELEASE.md)
- [Commits](https://github.com/kubernetes-sigs/controller-runtime/compare/v0.24.0...v0.24.1)
---
updated-dependencies:
- dependency-name: sigs.k8s.io/controller-runtime
dependency-version: 0.24.1
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index c44bb8c9a0a..fd01d59d125 100644
--- a/go.mod
+++ b/go.mod
@@ -40,7 +40,7 @@ require (
k8s.io/component-base v0.36.0
k8s.io/klog/v2 v2.140.0
k8s.io/utils v0.0.0-20260319190234-28399d86e0b5
- sigs.k8s.io/controller-runtime v0.24.0
+ sigs.k8s.io/controller-runtime v0.24.1
sigs.k8s.io/yaml v1.6.0
)
diff --git a/go.sum b/go.sum
index 6d115595cdd..4080c0ea5e0 100644
--- a/go.sum
+++ b/go.sum
@@ -492,8 +492,8 @@ k8s.io/streaming v0.36.0 h1:agnTxU+NFulUrtYzXUGKO3ndEa8jKwht1Kwn9nu9x+4=
k8s.io/streaming v0.36.0/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=
-sigs.k8s.io/controller-runtime v0.24.0 h1:Ck6N2LdS8Lovy1o25BB4r1xjvLEKUl1s2o9kU+KWDE4=
-sigs.k8s.io/controller-runtime v0.24.0/go.mod h1:vFkfY5fGt5xAC/sKb8IBFKgWPNKG9OUG29dR8Y2wImw=
+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/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg=
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
From bd0b9e59c1645974ab9b6299ca5c860799d09775 Mon Sep 17 00:00:00 2001
From: dongjiang
Date: Sat, 9 May 2026 16:54:36 +0800
Subject: [PATCH 19/81] add option in tsdbconfig
Signed-off-by: dongjiang
---
bundle.yaml | 40 ++++++++
...onitoring.coreos.com_prometheusagents.yaml | 20 ++++
.../monitoring.coreos.com_prometheuses.yaml | 20 ++++
...onitoring.coreos.com_prometheusagents.yaml | 20 ++++
.../monitoring.coreos.com_prometheuses.yaml | 20 ++++
.../prometheusagents-crd.json | 13 +++
.../prometheus-operator/prometheuses-crd.json | 13 +++
pkg/apis/monitoring/v1/prometheus_types.go | 30 ++++++
.../monitoring/v1/prometheus_types_test.go | 91 ++++++++++++++++++
.../monitoring/v1/zz_generated.deepcopy.go | 5 +
.../monitoring/v1/tsdbspec.go | 23 +++++
pkg/prometheus/promcfg.go | 67 +++++++++----
pkg/prometheus/promcfg_test.go | 94 +++++++++++++++++--
...ld_greater_than_or_equal_to_v3.10.0.golden | 9 ++
...mpactionThreshold_less_than_v3.10.0.golden | 6 ++
...ld_greater_than_or_equal_to_v3.10.0.golden | 10 ++
...mpactionThreshold_less_than_v3.10.0.golden | 7 ++
17 files changed, 462 insertions(+), 26 deletions(-)
create mode 100644 pkg/apis/monitoring/v1/prometheus_types_test.go
create mode 100644 pkg/prometheus/testdata/PrometheusAgent_TSDB_StaleSeriesCompactionThreshold_greater_than_or_equal_to_v3.10.0.golden
create mode 100644 pkg/prometheus/testdata/PrometheusAgent_TSDB_StaleSeriesCompactionThreshold_less_than_v3.10.0.golden
create mode 100644 pkg/prometheus/testdata/TSDB_StaleSeriesCompactionThreshold_greater_than_or_equal_to_v3.10.0.golden
create mode 100644 pkg/prometheus/testdata/TSDB_StaleSeriesCompactionThreshold_less_than_v3.10.0.golden
diff --git a/bundle.yaml b/bundle.yaml
index 1de3860d2bf..dca6c218cfd 100644
--- a/bundle.yaml
+++ b/bundle.yaml
@@ -34206,6 +34206,26 @@ spec:
It requires Prometheus >= v2.39.0 or PrometheusAgent >= v2.54.0.
pattern: ^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$
type: string
+ staleSeriesCompactionThreshold:
+ anyOf:
+ - type: integer
+ - type: string
+ description: |-
+ staleSeriesCompactionThreshold configures the trigger point for compacting
+ stale series from memory into persistent blocks and removing those stale
+ series from memory.
+
+ The threshold is a number between 0.0 and 1.0. It represents the ratio of
+ stale series in memory to the total series in memory. The stale series
+ compaction is triggered when this ratio crosses the configured threshold.
+ It may not trigger the stale series compaction if the usual head compaction
+ is about to happen soon.
+
+ If set to 0, stale series compaction is disabled.
+
+ It requires Prometheus >= v3.10.0.
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
type: object
updateStrategy:
description: |-
@@ -48062,6 +48082,26 @@ spec:
It requires Prometheus >= v2.39.0 or PrometheusAgent >= v2.54.0.
pattern: ^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$
type: string
+ staleSeriesCompactionThreshold:
+ anyOf:
+ - type: integer
+ - type: string
+ description: |-
+ staleSeriesCompactionThreshold configures the trigger point for compacting
+ stale series from memory into persistent blocks and removing those stale
+ series from memory.
+
+ The threshold is a number between 0.0 and 1.0. It represents the ratio of
+ stale series in memory to the total series in memory. The stale series
+ compaction is triggered when this ratio crosses the configured threshold.
+ It may not trigger the stale series compaction if the usual head compaction
+ is about to happen soon.
+
+ If set to 0, stale series compaction is disabled.
+
+ It requires Prometheus >= v3.10.0.
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
type: object
updateStrategy:
description: |-
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml
index 2828c471d7f..a87f1f98a03 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml
@@ -9020,6 +9020,26 @@ spec:
It requires Prometheus >= v2.39.0 or PrometheusAgent >= v2.54.0.
pattern: ^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$
type: string
+ staleSeriesCompactionThreshold:
+ anyOf:
+ - type: integer
+ - type: string
+ description: |-
+ staleSeriesCompactionThreshold configures the trigger point for compacting
+ stale series from memory into persistent blocks and removing those stale
+ series from memory.
+
+ The threshold is a number between 0.0 and 1.0. It represents the ratio of
+ stale series in memory to the total series in memory. The stale series
+ compaction is triggered when this ratio crosses the configured threshold.
+ It may not trigger the stale series compaction if the usual head compaction
+ is about to happen soon.
+
+ If set to 0, stale series compaction is disabled.
+
+ It requires Prometheus >= v3.10.0.
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
type: object
updateStrategy:
description: |-
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
index 5dc7986673b..d555d21a915 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
@@ -11363,6 +11363,26 @@ spec:
It requires Prometheus >= v2.39.0 or PrometheusAgent >= v2.54.0.
pattern: ^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$
type: string
+ staleSeriesCompactionThreshold:
+ anyOf:
+ - type: integer
+ - type: string
+ description: |-
+ staleSeriesCompactionThreshold configures the trigger point for compacting
+ stale series from memory into persistent blocks and removing those stale
+ series from memory.
+
+ The threshold is a number between 0.0 and 1.0. It represents the ratio of
+ stale series in memory to the total series in memory. The stale series
+ compaction is triggered when this ratio crosses the configured threshold.
+ It may not trigger the stale series compaction if the usual head compaction
+ is about to happen soon.
+
+ If set to 0, stale series compaction is disabled.
+
+ It requires Prometheus >= v3.10.0.
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
type: object
updateStrategy:
description: |-
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml
index 2828c471d7f..a87f1f98a03 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml
@@ -9020,6 +9020,26 @@ spec:
It requires Prometheus >= v2.39.0 or PrometheusAgent >= v2.54.0.
pattern: ^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$
type: string
+ staleSeriesCompactionThreshold:
+ anyOf:
+ - type: integer
+ - type: string
+ description: |-
+ staleSeriesCompactionThreshold configures the trigger point for compacting
+ stale series from memory into persistent blocks and removing those stale
+ series from memory.
+
+ The threshold is a number between 0.0 and 1.0. It represents the ratio of
+ stale series in memory to the total series in memory. The stale series
+ compaction is triggered when this ratio crosses the configured threshold.
+ It may not trigger the stale series compaction if the usual head compaction
+ is about to happen soon.
+
+ If set to 0, stale series compaction is disabled.
+
+ It requires Prometheus >= v3.10.0.
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
type: object
updateStrategy:
description: |-
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
index 5dc7986673b..d555d21a915 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
@@ -11363,6 +11363,26 @@ spec:
It requires Prometheus >= v2.39.0 or PrometheusAgent >= v2.54.0.
pattern: ^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$
type: string
+ staleSeriesCompactionThreshold:
+ anyOf:
+ - type: integer
+ - type: string
+ description: |-
+ staleSeriesCompactionThreshold configures the trigger point for compacting
+ stale series from memory into persistent blocks and removing those stale
+ series from memory.
+
+ The threshold is a number between 0.0 and 1.0. It represents the ratio of
+ stale series in memory to the total series in memory. The stale series
+ compaction is triggered when this ratio crosses the configured threshold.
+ It may not trigger the stale series compaction if the usual head compaction
+ is about to happen soon.
+
+ If set to 0, stale series compaction is disabled.
+
+ It requires Prometheus >= v3.10.0.
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
type: object
updateStrategy:
description: |-
diff --git a/jsonnet/prometheus-operator/prometheusagents-crd.json b/jsonnet/prometheus-operator/prometheusagents-crd.json
index 198a9ab2b15..43cf169f01d 100644
--- a/jsonnet/prometheus-operator/prometheusagents-crd.json
+++ b/jsonnet/prometheus-operator/prometheusagents-crd.json
@@ -7441,6 +7441,19 @@
"description": "outOfOrderTimeWindow defines how old an out-of-order/out-of-bounds sample can be with\nrespect to the TSDB max time.\n\nAn out-of-order/out-of-bounds sample is ingested into the TSDB as long as\nthe timestamp of the sample is >= (TSDB.MaxTime - outOfOrderTimeWindow).\n\nThis is an *experimental feature*, it may change in any upcoming release\nin a breaking way.\n\nIt requires Prometheus >= v2.39.0 or PrometheusAgent >= v2.54.0.",
"pattern": "^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$",
"type": "string"
+ },
+ "staleSeriesCompactionThreshold": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "staleSeriesCompactionThreshold configures the trigger point for compacting\nstale series from memory into persistent blocks and removing those stale\nseries from memory.\n\nThe threshold is a number between 0.0 and 1.0. It represents the ratio of\nstale series in memory to the total series in memory. The stale series\ncompaction is triggered when this ratio crosses the configured threshold.\nIt may not trigger the stale series compaction if the usual head compaction\nis about to happen soon.\n\nIf set to 0, stale series compaction is disabled.\n\nIt requires Prometheus >= v3.10.0.",
+ "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$",
+ "x-kubernetes-int-or-string": true
}
},
"type": "object"
diff --git a/jsonnet/prometheus-operator/prometheuses-crd.json b/jsonnet/prometheus-operator/prometheuses-crd.json
index 43e9383d649..c498155489c 100644
--- a/jsonnet/prometheus-operator/prometheuses-crd.json
+++ b/jsonnet/prometheus-operator/prometheuses-crd.json
@@ -9460,6 +9460,19 @@
"description": "outOfOrderTimeWindow defines how old an out-of-order/out-of-bounds sample can be with\nrespect to the TSDB max time.\n\nAn out-of-order/out-of-bounds sample is ingested into the TSDB as long as\nthe timestamp of the sample is >= (TSDB.MaxTime - outOfOrderTimeWindow).\n\nThis is an *experimental feature*, it may change in any upcoming release\nin a breaking way.\n\nIt requires Prometheus >= v2.39.0 or PrometheusAgent >= v2.54.0.",
"pattern": "^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$",
"type": "string"
+ },
+ "staleSeriesCompactionThreshold": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "staleSeriesCompactionThreshold configures the trigger point for compacting\nstale series from memory into persistent blocks and removing those stale\nseries from memory.\n\nThe threshold is a number between 0.0 and 1.0. It represents the ratio of\nstale series in memory to the total series in memory. The stale series\ncompaction is triggered when this ratio crosses the configured threshold.\nIt may not trigger the stale series compaction if the usual head compaction\nis about to happen soon.\n\nIf set to 0, stale series compaction is disabled.\n\nIt requires Prometheus >= v3.10.0.",
+ "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$",
+ "x-kubernetes-int-or-string": true
}
},
"type": "object"
diff --git a/pkg/apis/monitoring/v1/prometheus_types.go b/pkg/apis/monitoring/v1/prometheus_types.go
index b6ee7e7e4f1..f7c91c8d420 100644
--- a/pkg/apis/monitoring/v1/prometheus_types.go
+++ b/pkg/apis/monitoring/v1/prometheus_types.go
@@ -21,6 +21,7 @@ import (
appsv1 "k8s.io/api/apps/v1"
v1 "k8s.io/api/core/v1"
+ "k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
@@ -2466,6 +2467,35 @@ type TSDBSpec struct {
// It requires Prometheus >= v2.39.0 or PrometheusAgent >= v2.54.0.
// +optional
OutOfOrderTimeWindow *Duration `json:"outOfOrderTimeWindow,omitempty"`
+
+ // staleSeriesCompactionThreshold configures the trigger point for compacting
+ // stale series from memory into persistent blocks and removing those stale
+ // series from memory.
+ //
+ // The threshold is a number between 0.0 and 1.0. It represents the ratio of
+ // stale series in memory to the total series in memory. The stale series
+ // compaction is triggered when this ratio crosses the configured threshold.
+ // It may not trigger the stale series compaction if the usual head compaction
+ // is about to happen soon.
+ //
+ // If set to 0, stale series compaction is disabled.
+ //
+ // It requires Prometheus >= v3.10.0.
+ // +optional
+ StaleSeriesCompactionThreshold *resource.Quantity `json:"staleSeriesCompactionThreshold,omitempty"`
+}
+
+// Validate semantically validates the given TSDBSpec.
+func (ts *TSDBSpec) Validate() error {
+ if ts == nil || ts.StaleSeriesCompactionThreshold == nil {
+ return nil
+ }
+ v := ts.StaleSeriesCompactionThreshold.AsApproximateFloat64()
+ if v < 0 || v > 1 {
+ return fmt.Errorf("`staleSeriesCompactionThreshold` must be between 0 and 1. The current value is %s", ts.StaleSeriesCompactionThreshold.String())
+ }
+
+ return nil
}
type Exemplars struct {
diff --git a/pkg/apis/monitoring/v1/prometheus_types_test.go b/pkg/apis/monitoring/v1/prometheus_types_test.go
new file mode 100644
index 00000000000..9d2129b6560
--- /dev/null
+++ b/pkg/apis/monitoring/v1/prometheus_types_test.go
@@ -0,0 +1,91 @@
+// Copyright The prometheus-operator Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package v1
+
+import (
+ "testing"
+
+ "k8s.io/apimachinery/pkg/api/resource"
+)
+
+func TestValidateTSDBSpec(t *testing.T) {
+ for _, tc := range []struct {
+ name string
+ config *TSDBSpec
+ err bool
+ }{
+ {
+ name: "TSDBSpec nil",
+ config: nil,
+ err: false,
+ },
+ {
+ name: "StaleSeriesCompactionThreshold nil",
+ config: &TSDBSpec{
+ StaleSeriesCompactionThreshold: nil,
+ },
+ err: false,
+ },
+ {
+ name: "StaleSeriesCompactionThreshold simple value",
+ config: &TSDBSpec{
+ StaleSeriesCompactionThreshold: func(v resource.Quantity) *resource.Quantity { return &v }(resource.MustParse("0.5")),
+ },
+ err: false,
+ },
+ {
+ name: "StaleSeriesCompactionThreshold > 1",
+ config: &TSDBSpec{
+ StaleSeriesCompactionThreshold: resource.NewQuantity(10, resource.DecimalSI),
+ },
+ err: true,
+ },
+ {
+ name: "StaleSeriesCompactionThreshold < 0",
+ config: &TSDBSpec{
+ StaleSeriesCompactionThreshold: resource.NewQuantity(-1, resource.DecimalSI),
+ },
+ err: true,
+ },
+ {
+ name: "StaleSeriesCompactionThreshold == 0",
+ config: &TSDBSpec{
+ StaleSeriesCompactionThreshold: resource.NewQuantity(0, resource.DecimalSI),
+ },
+ err: false,
+ },
+ {
+ name: "StaleSeriesCompactionThreshold == 1",
+ config: &TSDBSpec{
+ StaleSeriesCompactionThreshold: resource.NewQuantity(1, resource.DecimalSI),
+ },
+ err: false,
+ },
+ } {
+ t.Run(tc.name, func(t *testing.T) {
+ err := tc.config.Validate()
+ if tc.err {
+ if err == nil {
+ t.Fatal("expected error but got none")
+ }
+ return
+ }
+
+ if err != nil {
+ t.Fatalf("expected no error but got: %s", err)
+ }
+ })
+ }
+}
diff --git a/pkg/apis/monitoring/v1/zz_generated.deepcopy.go b/pkg/apis/monitoring/v1/zz_generated.deepcopy.go
index 83a1648ce0e..057d42a197d 100644
--- a/pkg/apis/monitoring/v1/zz_generated.deepcopy.go
+++ b/pkg/apis/monitoring/v1/zz_generated.deepcopy.go
@@ -3829,6 +3829,11 @@ func (in *TSDBSpec) DeepCopyInto(out *TSDBSpec) {
*out = new(Duration)
**out = **in
}
+ if in.StaleSeriesCompactionThreshold != nil {
+ in, out := &in.StaleSeriesCompactionThreshold, &out.StaleSeriesCompactionThreshold
+ x := (*in).DeepCopy()
+ *out = &x
+ }
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TSDBSpec.
diff --git a/pkg/client/applyconfiguration/monitoring/v1/tsdbspec.go b/pkg/client/applyconfiguration/monitoring/v1/tsdbspec.go
index 98ce9b380f5..f15d53da37f 100644
--- a/pkg/client/applyconfiguration/monitoring/v1/tsdbspec.go
+++ b/pkg/client/applyconfiguration/monitoring/v1/tsdbspec.go
@@ -18,6 +18,7 @@ package v1
import (
monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
+ resource "k8s.io/apimachinery/pkg/api/resource"
)
// TSDBSpecApplyConfiguration represents a declarative configuration of the TSDBSpec type for use
@@ -34,6 +35,20 @@ type TSDBSpecApplyConfiguration struct {
//
// It requires Prometheus >= v2.39.0 or PrometheusAgent >= v2.54.0.
OutOfOrderTimeWindow *monitoringv1.Duration `json:"outOfOrderTimeWindow,omitempty"`
+ // staleSeriesCompactionThreshold configures the trigger point for compacting
+ // stale series from memory into persistent blocks and removing those stale
+ // series from memory.
+ //
+ // The threshold is a number between 0.0 and 1.0. It represents the ratio of
+ // stale series in memory to the total series in memory. The stale series
+ // compaction is triggered when this ratio crosses the configured threshold.
+ // It may not trigger the stale series compaction if the usual head compaction
+ // is about to happen soon.
+ //
+ // If set to 0, stale series compaction is disabled.
+ //
+ // It requires Prometheus >= v3.10.0.
+ StaleSeriesCompactionThreshold *resource.Quantity `json:"staleSeriesCompactionThreshold,omitempty"`
}
// TSDBSpecApplyConfiguration constructs a declarative configuration of the TSDBSpec type for use with
@@ -49,3 +64,11 @@ func (b *TSDBSpecApplyConfiguration) WithOutOfOrderTimeWindow(value monitoringv1
b.OutOfOrderTimeWindow = &value
return b
}
+
+// WithStaleSeriesCompactionThreshold sets the StaleSeriesCompactionThreshold field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the StaleSeriesCompactionThreshold field is set to the value of the last call.
+func (b *TSDBSpecApplyConfiguration) WithStaleSeriesCompactionThreshold(value resource.Quantity) *TSDBSpecApplyConfiguration {
+ b.StaleSeriesCompactionThreshold = &value
+ return b
+}
diff --git a/pkg/prometheus/promcfg.go b/pkg/prometheus/promcfg.go
index 6b05c758c74..8db9b0138ae 100644
--- a/pkg/prometheus/promcfg.go
+++ b/pkg/prometheus/promcfg.go
@@ -1080,6 +1080,11 @@ func (cg *ConfigGenerator) appendStorageSettingsConfig(cfg yaml.MapSlice, exempl
tsdb = cg.prom.GetCommonPrometheusFields().TSDB
)
+ err := tsdb.Validate()
+ if err != nil {
+ return cfg, err
+ }
+
if exemplars != nil && exemplars.MaxSize != nil {
storage = cgStorage.AppendMapItem(storage, "exemplars", yaml.MapSlice{
{
@@ -1089,13 +1094,24 @@ func (cg *ConfigGenerator) appendStorageSettingsConfig(cfg yaml.MapSlice, exempl
})
}
- if tsdb != nil && tsdb.OutOfOrderTimeWindow != nil {
- storage = cg.WithMinimumVersion("2.39.0").AppendMapItem(storage, "tsdb", yaml.MapSlice{
- {
- Key: "out_of_order_time_window",
- Value: *tsdb.OutOfOrderTimeWindow,
- },
- })
+ if tsdb != nil {
+ if tsdb.OutOfOrderTimeWindow != nil {
+ storage = cg.WithMinimumVersion("2.39.0").AppendMapItem(storage, "tsdb", yaml.MapSlice{
+ {
+ Key: "out_of_order_time_window",
+ Value: *tsdb.OutOfOrderTimeWindow,
+ },
+ })
+ }
+
+ if tsdb.StaleSeriesCompactionThreshold != nil {
+ storage = cg.WithMinimumVersion("3.10.0").AppendMapItem(storage, "tsdb", yaml.MapSlice{
+ {
+ Key: "stale_series_compaction_threshold",
+ Value: tsdb.StaleSeriesCompactionThreshold.AsApproximateFloat64(),
+ },
+ })
+ }
}
if len(storage) == 0 {
@@ -3254,15 +3270,34 @@ func (cg *ConfigGenerator) GenerateAgentConfiguration(
// TSDB
tsdb := cpf.TSDB
- if tsdb != nil && tsdb.OutOfOrderTimeWindow != nil {
- var storage yaml.MapSlice
- storage = cg.AppendMapItem(storage, "tsdb", yaml.MapSlice{
- {
- Key: "out_of_order_time_window",
- Value: *tsdb.OutOfOrderTimeWindow,
- },
- })
- cfg = cg.WithMinimumVersion("2.54.0").AppendMapItem(cfg, "storage", storage)
+
+ err = tsdb.Validate()
+ if err != nil {
+ return nil, err
+ }
+
+ if tsdb != nil {
+ if tsdb.OutOfOrderTimeWindow != nil {
+ var storage yaml.MapSlice
+ storage = cg.AppendMapItem(storage, "tsdb", yaml.MapSlice{
+ {
+ Key: "out_of_order_time_window",
+ Value: *tsdb.OutOfOrderTimeWindow,
+ },
+ })
+ cfg = cg.WithMinimumVersion("2.54.0").AppendMapItem(cfg, "storage", storage)
+ }
+
+ if tsdb.StaleSeriesCompactionThreshold != nil {
+ var storage yaml.MapSlice
+ storage = cg.AppendMapItem(storage, "tsdb", yaml.MapSlice{
+ {
+ Key: "stale_series_compaction_threshold",
+ Value: tsdb.StaleSeriesCompactionThreshold.AsApproximateFloat64(),
+ },
+ })
+ cfg = cg.WithMinimumVersion("3.10.0").AppendMapItem(cfg, "storage", storage)
+ }
}
// Remote write config
diff --git a/pkg/prometheus/promcfg_test.go b/pkg/prometheus/promcfg_test.go
index 84e9b04a126..688dc9374fc 100644
--- a/pkg/prometheus/promcfg_test.go
+++ b/pkg/prometheus/promcfg_test.go
@@ -6019,11 +6019,12 @@ func TestStorageSettingMaxExemplars(t *testing.T) {
func TestTSDBConfig(t *testing.T) {
for _, tc := range []struct {
- name string
- p *monitoringv1.Prometheus
- version string
- tsdb *monitoringv1.TSDBSpec
- golden string
+ name string
+ p *monitoringv1.Prometheus
+ version string
+ tsdb *monitoringv1.TSDBSpec
+ golden string
+ expectErr bool
}{
{
name: "no TSDB config",
@@ -6045,6 +6046,36 @@ func TestTSDBConfig(t *testing.T) {
},
golden: "TSDB_config_greater_than_or_equal_to_v2.39.0.golden",
},
+ {
+ name: "TSDB StaleSeriesCompactionThreshold < v3.10.0",
+ version: "v3.9.0",
+ tsdb: &monitoringv1.TSDBSpec{
+ StaleSeriesCompactionThreshold: resource.NewQuantity(1, resource.DecimalSI),
+ },
+ golden: "TSDB_StaleSeriesCompactionThreshold_less_than_v3.10.0.golden",
+ },
+ {
+ name: "TSDB StaleSeriesCompactionThreshold >= v3.10.0",
+ version: "v3.10.0",
+ tsdb: &monitoringv1.TSDBSpec{
+ StaleSeriesCompactionThreshold: resource.NewQuantity(1, resource.DecimalSI),
+ },
+ golden: "TSDB_StaleSeriesCompactionThreshold_greater_than_or_equal_to_v3.10.0.golden",
+ },
+ {
+ name: "TSDB StaleSeriesCompactionThreshold > 1",
+ tsdb: &monitoringv1.TSDBSpec{
+ StaleSeriesCompactionThreshold: resource.NewQuantity(2, resource.DecimalSI),
+ },
+ expectErr: true,
+ },
+ {
+ name: "TSDB StaleSeriesCompactionThreshold < 0",
+ tsdb: &monitoringv1.TSDBSpec{
+ StaleSeriesCompactionThreshold: resource.NewQuantity(-1, resource.DecimalSI),
+ },
+ expectErr: true,
+ },
} {
t.Run(tc.name, func(t *testing.T) {
p := defaultPrometheus()
@@ -6055,6 +6086,12 @@ func TestTSDBConfig(t *testing.T) {
p.Spec.TSDB = tc.tsdb
}
+ err := p.Spec.TSDB.Validate()
+ if tc.expectErr {
+ require.Error(t, err)
+ return
+ }
+
cg := mustNewConfigGenerator(t, p)
cfg, err := cg.GenerateServerConfiguration(
p,
@@ -6076,11 +6113,12 @@ func TestTSDBConfig(t *testing.T) {
func TestTSDBConfigPrometheusAgent(t *testing.T) {
for _, tc := range []struct {
- name string
- p *monitoringv1.Prometheus
- version string
- tsdb *monitoringv1.TSDBSpec
- golden string
+ name string
+ p *monitoringv1.Prometheus
+ version string
+ tsdb *monitoringv1.TSDBSpec
+ golden string
+ expectErr bool
}{
{
name: "PrometheusAgent no TSDB config",
@@ -6103,6 +6141,36 @@ func TestTSDBConfigPrometheusAgent(t *testing.T) {
},
golden: "PrometheusAgent_TSDB_config_greater_than_or_equal_to_v2.54.0.golden",
},
+ {
+ name: "PrometheusAgent TSDB StaleSeriesCompactionThreshold < v3.10.0",
+ version: "v2.54.0",
+ tsdb: &monitoringv1.TSDBSpec{
+ StaleSeriesCompactionThreshold: resource.NewQuantity(1, resource.DecimalSI),
+ },
+ golden: "PrometheusAgent_TSDB_StaleSeriesCompactionThreshold_less_than_v3.10.0.golden",
+ },
+ {
+ name: "PrometheusAgent TSDB StaleSeriesCompactionThreshold >= v3.10.0",
+ version: "v3.10.0",
+ tsdb: &monitoringv1.TSDBSpec{
+ StaleSeriesCompactionThreshold: resource.NewQuantity(1, resource.DecimalSI),
+ },
+ golden: "PrometheusAgent_TSDB_StaleSeriesCompactionThreshold_greater_than_or_equal_to_v3.10.0.golden",
+ },
+ {
+ name: "PrometheusAgent TSDB StaleSeriesCompactionThreshold > 1",
+ tsdb: &monitoringv1.TSDBSpec{
+ StaleSeriesCompactionThreshold: resource.NewQuantity(2, resource.DecimalSI),
+ },
+ expectErr: true,
+ },
+ {
+ name: "PrometheusAgent TSDB StaleSeriesCompactionThreshold < 0",
+ tsdb: &monitoringv1.TSDBSpec{
+ StaleSeriesCompactionThreshold: resource.NewQuantity(-1, resource.DecimalSI),
+ },
+ expectErr: true,
+ },
} {
t.Run(tc.name, func(t *testing.T) {
p := defaultPrometheus()
@@ -6113,6 +6181,12 @@ func TestTSDBConfigPrometheusAgent(t *testing.T) {
p.Spec.TSDB = tc.tsdb
}
+ err := p.Spec.TSDB.Validate()
+ if tc.expectErr {
+ require.Error(t, err)
+ return
+ }
+
cg := mustNewConfigGenerator(t, p)
cfg, err := cg.GenerateAgentConfiguration(
nil,
diff --git a/pkg/prometheus/testdata/PrometheusAgent_TSDB_StaleSeriesCompactionThreshold_greater_than_or_equal_to_v3.10.0.golden b/pkg/prometheus/testdata/PrometheusAgent_TSDB_StaleSeriesCompactionThreshold_greater_than_or_equal_to_v3.10.0.golden
new file mode 100644
index 00000000000..4af6e5cafca
--- /dev/null
+++ b/pkg/prometheus/testdata/PrometheusAgent_TSDB_StaleSeriesCompactionThreshold_greater_than_or_equal_to_v3.10.0.golden
@@ -0,0 +1,9 @@
+global:
+ scrape_interval: 30s
+ external_labels:
+ prometheus: default/test
+ prometheus_replica: $(POD_NAME)
+scrape_configs: []
+storage:
+ tsdb:
+ stale_series_compaction_threshold: 1
diff --git a/pkg/prometheus/testdata/PrometheusAgent_TSDB_StaleSeriesCompactionThreshold_less_than_v3.10.0.golden b/pkg/prometheus/testdata/PrometheusAgent_TSDB_StaleSeriesCompactionThreshold_less_than_v3.10.0.golden
new file mode 100644
index 00000000000..8d09a4dc239
--- /dev/null
+++ b/pkg/prometheus/testdata/PrometheusAgent_TSDB_StaleSeriesCompactionThreshold_less_than_v3.10.0.golden
@@ -0,0 +1,6 @@
+global:
+ scrape_interval: 30s
+ external_labels:
+ prometheus: default/test
+ prometheus_replica: $(POD_NAME)
+scrape_configs: []
diff --git a/pkg/prometheus/testdata/TSDB_StaleSeriesCompactionThreshold_greater_than_or_equal_to_v3.10.0.golden b/pkg/prometheus/testdata/TSDB_StaleSeriesCompactionThreshold_greater_than_or_equal_to_v3.10.0.golden
new file mode 100644
index 00000000000..70a901212a4
--- /dev/null
+++ b/pkg/prometheus/testdata/TSDB_StaleSeriesCompactionThreshold_greater_than_or_equal_to_v3.10.0.golden
@@ -0,0 +1,10 @@
+global:
+ scrape_interval: 30s
+ external_labels:
+ prometheus: default/test
+ prometheus_replica: $(POD_NAME)
+ evaluation_interval: 30s
+scrape_configs: []
+storage:
+ tsdb:
+ stale_series_compaction_threshold: 1
diff --git a/pkg/prometheus/testdata/TSDB_StaleSeriesCompactionThreshold_less_than_v3.10.0.golden b/pkg/prometheus/testdata/TSDB_StaleSeriesCompactionThreshold_less_than_v3.10.0.golden
new file mode 100644
index 00000000000..609303fe82c
--- /dev/null
+++ b/pkg/prometheus/testdata/TSDB_StaleSeriesCompactionThreshold_less_than_v3.10.0.golden
@@ -0,0 +1,7 @@
+global:
+ scrape_interval: 30s
+ external_labels:
+ prometheus: default/test
+ prometheus_replica: $(POD_NAME)
+ evaluation_interval: 30s
+scrape_configs: []
From 50f8a8083f3de518c3461171a1cef94551355198 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 13 May 2026 12:43:10 +0000
Subject: [PATCH 20/81] build(deps): bump the k8s-libs group with 5 updates
Bumps the k8s-libs group with 5 updates:
| Package | From | To |
| --- | --- | --- |
| [k8s.io/api](https://github.com/kubernetes/api) | `0.36.0` | `0.36.1` |
| [k8s.io/apiextensions-apiserver](https://github.com/kubernetes/apiextensions-apiserver) | `0.36.0` | `0.36.1` |
| [k8s.io/apimachinery](https://github.com/kubernetes/apimachinery) | `0.36.0` | `0.36.1` |
| [k8s.io/client-go](https://github.com/kubernetes/client-go) | `0.36.0` | `0.36.1` |
| [k8s.io/component-base](https://github.com/kubernetes/component-base) | `0.36.0` | `0.36.1` |
Updates `k8s.io/api` from 0.36.0 to 0.36.1
- [Commits](https://github.com/kubernetes/api/compare/v0.36.0...v0.36.1)
Updates `k8s.io/apiextensions-apiserver` from 0.36.0 to 0.36.1
- [Release notes](https://github.com/kubernetes/apiextensions-apiserver/releases)
- [Commits](https://github.com/kubernetes/apiextensions-apiserver/compare/v0.36.0...v0.36.1)
Updates `k8s.io/apimachinery` from 0.36.0 to 0.36.1
- [Commits](https://github.com/kubernetes/apimachinery/compare/v0.36.0...v0.36.1)
Updates `k8s.io/client-go` from 0.36.0 to 0.36.1
- [Changelog](https://github.com/kubernetes/client-go/blob/master/CHANGELOG.md)
- [Commits](https://github.com/kubernetes/client-go/compare/v0.36.0...v0.36.1)
Updates `k8s.io/component-base` from 0.36.0 to 0.36.1
- [Commits](https://github.com/kubernetes/component-base/compare/v0.36.0...v0.36.1)
---
updated-dependencies:
- dependency-name: k8s.io/api
dependency-version: 0.36.1
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: k8s-libs
- dependency-name: k8s.io/apiextensions-apiserver
dependency-version: 0.36.1
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: k8s-libs
- dependency-name: k8s.io/apimachinery
dependency-version: 0.36.1
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: k8s-libs
- dependency-name: k8s.io/client-go
dependency-version: 0.36.1
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: k8s-libs
- dependency-name: k8s.io/component-base
dependency-version: 0.36.1
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: k8s-libs
...
Signed-off-by: dependabot[bot]
---
go.mod | 14 +++++++-------
go.sum | 28 ++++++++++++++--------------
2 files changed, 21 insertions(+), 21 deletions(-)
diff --git a/go.mod b/go.mod
index fd01d59d125..dbd15814df3 100644
--- a/go.mod
+++ b/go.mod
@@ -32,12 +32,12 @@ require (
golang.org/x/sync v0.20.0
google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af
gopkg.in/yaml.v2 v2.4.0
- k8s.io/api v0.36.0
- k8s.io/apiextensions-apiserver v0.36.0
- k8s.io/apimachinery v0.36.0
- k8s.io/apiserver v0.36.0
- k8s.io/client-go v0.36.0
- k8s.io/component-base v0.36.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/component-base v0.36.1
k8s.io/klog/v2 v2.140.0
k8s.io/utils v0.0.0-20260319190234-28399d86e0b5
sigs.k8s.io/controller-runtime v0.24.1
@@ -104,7 +104,7 @@ require (
google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 // indirect
google.golang.org/grpc v1.80.0 // indirect
gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect
- k8s.io/streaming v0.36.0 // indirect
+ k8s.io/streaming v0.36.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 4080c0ea5e0..efe75b4d669 100644
--- a/go.sum
+++ b/go.sum
@@ -472,24 +472,24 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q=
gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA=
-k8s.io/api v0.36.0 h1:SgqDhZzHdOtMk40xVSvCXkP9ME0H05hPM3p9AB1kL80=
-k8s.io/api v0.36.0/go.mod h1:m1LVrGPNYax5NBHdO+QuAedXyuzTt4RryI/qnmNvs34=
-k8s.io/apiextensions-apiserver v0.36.0 h1:Wt7E8J+VBCbj4FjiBfDTK/neXDDjyJVJc7xfuOHImZ0=
-k8s.io/apiextensions-apiserver v0.36.0/go.mod h1:kGDjH0msuiIB3tgsYRV0kS9GqpMYMUsQ3GHv7TApyug=
-k8s.io/apimachinery v0.36.0 h1:jZyPzhd5Z+3h9vJLt0z9XdzW9VzNzWAUw+P1xZ9PXtQ=
-k8s.io/apimachinery v0.36.0/go.mod h1:FklypaRJt6n5wUIwWXIP6GJlIpUizTgfo1T/As+Tyxc=
-k8s.io/apiserver v0.36.0 h1:Jg5OFAENUACByUCg15CmhZAYrr5ZyJ+jodyA1mHl3YE=
-k8s.io/apiserver v0.36.0/go.mod h1:mHvwdHf+qKEm+1/hYm756SV+oREOKSPnsjagOpx6Vho=
-k8s.io/client-go v0.36.0 h1:pOYi7C4RHChYjMiHpZSpSbIM6ZxVbRXBy7CuiIwqA3c=
-k8s.io/client-go v0.36.0/go.mod h1:ZKKcpwF0aLYfkHFCjillCKaTK/yBkEDHTDXCFY6AS9Y=
-k8s.io/component-base v0.36.0 h1:hFjEktssxiJhrK1zfybkH4kJOi8iZuF+mIDCqS5+jRo=
-k8s.io/component-base v0.36.0/go.mod h1:JZvIfcNHk+uck+8LhJzhSBtydWXaZNQwX2OdL+Mnwsk=
+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/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-20260317180543-43fb72c5454a h1:xCeOEAOoGYl2jnJoHkC3hkbPJgdATINPMAxaynU2Ovg=
k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0=
-k8s.io/streaming v0.36.0 h1:agnTxU+NFulUrtYzXUGKO3ndEa8jKwht1Kwn9nu9x+4=
-k8s.io/streaming v0.36.0/go.mod h1:z6fV3D+NVkoeqRMtWwlUZK6U17SY/LqNzOxWL6GyR/s=
+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=
sigs.k8s.io/controller-runtime v0.24.1 h1:miPEwrmirImAvgME1L9qebGHrOnGJoVmVdtOU9fRfo4=
From 4f127a75733276165fa7148a2eb45d4848e94bd3 Mon Sep 17 00:00:00 2001
From: Sebastien Tardif
Date: Fri, 15 May 2026 08:55:12 -0700
Subject: [PATCH 21/81] operator: fix dropped gzip Close errors in GzipConfig
and GunzipConfig
GzipConfig uses defer to close the gzip.Writer, which silently discards
the error from Close(). Since Close() flushes buffered data and writes
the mandatory gzip footer (CRC32 checksum and uncompressed size), a
failure here produces corrupted output that the caller cannot detect.
Both Prometheus and Alertmanager config compression paths rely on this
function.
Fix by returning buf.Close() directly instead of deferring it.
GunzipConfig never calls gzip.Reader.Close(). The Go standard library
documentation states that callers must call Close when finished reading
to verify data integrity. Add the missing Close call and propagate its
error.
Signed-off-by: Sebastien Tardif
---
pkg/operator/gzip_config.go | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/pkg/operator/gzip_config.go b/pkg/operator/gzip_config.go
index 45f442946e4..787557246b9 100644
--- a/pkg/operator/gzip_config.go
+++ b/pkg/operator/gzip_config.go
@@ -27,11 +27,10 @@ func GzipConfig(w io.Writer, conf []byte) error {
}
buf := gzip.NewWriter(w)
- defer buf.Close()
if _, err := buf.Write(conf); err != nil {
return err
}
- return nil
+ return buf.Close()
}
func GunzipConfig(b []byte) (string, error) {
@@ -41,8 +40,10 @@ func GunzipConfig(b []byte) (string, error) {
return "", err
}
uncompressed := new(strings.Builder)
- _, err = io.Copy(uncompressed, reader)
- if err != nil {
+ if _, err = io.Copy(uncompressed, reader); err != nil {
+ return "", err
+ }
+ if err := reader.Close(); err != nil {
return "", err
}
return uncompressed.String(), nil
From 46ac1cbb8a8355d47d7cb3db636ee0ff314fe5e4 Mon Sep 17 00:00:00 2001
From: Sebastien Tardif
Date: Fri, 15 May 2026 13:10:58 -0700
Subject: [PATCH 22/81] ci: retrigger E2E after flaky ThanosRulerStateless
timeout
Signed-off-by: Sebastien Tardif
From 49bb7c258e6a98777f344db0782e1e833ba1d5c1 Mon Sep 17 00:00:00 2001
From: dongjiang
Date: Mon, 18 May 2026 17:29:56 +0800
Subject: [PATCH 23/81] update controller-runtime version (#8574)
Signed-off-by: dongjiang
---
pkg/apis/monitoring/go.mod | 2 +-
pkg/apis/monitoring/go.sum | 4 ++--
pkg/client/go.mod | 2 +-
pkg/client/go.sum | 4 ++--
4 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/pkg/apis/monitoring/go.mod b/pkg/apis/monitoring/go.mod
index b7a97123b46..f1ba3fa3a08 100644
--- a/pkg/apis/monitoring/go.mod
+++ b/pkg/apis/monitoring/go.mod
@@ -7,7 +7,7 @@ require (
k8s.io/apiextensions-apiserver v0.36.0
k8s.io/apimachinery v0.36.0
k8s.io/utils v0.0.0-20260319190234-28399d86e0b5
- sigs.k8s.io/controller-runtime v0.24.0
+ sigs.k8s.io/controller-runtime v0.24.1
)
require (
diff --git a/pkg/apis/monitoring/go.sum b/pkg/apis/monitoring/go.sum
index 9f0ad05d525..887f74a6bcf 100644
--- a/pkg/apis/monitoring/go.sum
+++ b/pkg/apis/monitoring/go.sum
@@ -50,8 +50,8 @@ k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a h1:xCeOEAOoGYl2jnJoHkC3hk
k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0=
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=
-sigs.k8s.io/controller-runtime v0.24.0 h1:Ck6N2LdS8Lovy1o25BB4r1xjvLEKUl1s2o9kU+KWDE4=
-sigs.k8s.io/controller-runtime v0.24.0/go.mod h1:vFkfY5fGt5xAC/sKb8IBFKgWPNKG9OUG29dR8Y2wImw=
+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/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg=
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
diff --git a/pkg/client/go.mod b/pkg/client/go.mod
index 158faf4ad94..1f24d7a5f21 100644
--- a/pkg/client/go.mod
+++ b/pkg/client/go.mod
@@ -53,7 +53,7 @@ require (
k8s.io/klog/v2 v2.140.0 // indirect
k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a // indirect
k8s.io/utils v0.0.0-20260319190234-28399d86e0b5 // indirect
- sigs.k8s.io/controller-runtime v0.24.0 // indirect
+ sigs.k8s.io/controller-runtime v0.24.1 // indirect
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect
sigs.k8s.io/randfill v1.0.0 // indirect
sigs.k8s.io/yaml v1.6.0 // indirect
diff --git a/pkg/client/go.sum b/pkg/client/go.sum
index 1fc32a6c924..066a6c29f6f 100644
--- a/pkg/client/go.sum
+++ b/pkg/client/go.sum
@@ -122,8 +122,8 @@ k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a h1:xCeOEAOoGYl2jnJoHkC3hk
k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0=
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=
-sigs.k8s.io/controller-runtime v0.24.0 h1:Ck6N2LdS8Lovy1o25BB4r1xjvLEKUl1s2o9kU+KWDE4=
-sigs.k8s.io/controller-runtime v0.24.0/go.mod h1:vFkfY5fGt5xAC/sKb8IBFKgWPNKG9OUG29dR8Y2wImw=
+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/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg=
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
From 3700280a83aac5047b82a8700263a0d5ab4f73ce Mon Sep 17 00:00:00 2001
From: Simon Pasquier
Date: Tue, 19 May 2026 14:40:49 +0200
Subject: [PATCH 24/81] test: add unit test for Alertmanager
This commit adds a unit test for Alertmanager when `matcherStrategy` is
`None` and multiple AlertmanagerConfig resources are provided.
Signed-off-by: Simon Pasquier
---
pkg/alertmanager/amcfg_test.go | 53 +++++++++++++++++++
..._CRs_with_namespaceMatcher_disabled.golden | 22 ++++++++
2 files changed, 75 insertions(+)
create mode 100644 pkg/alertmanager/testdata/skeleton_base_multiple_CRs_with_namespaceMatcher_disabled.golden
diff --git a/pkg/alertmanager/amcfg_test.go b/pkg/alertmanager/amcfg_test.go
index 9348ad48f45..cbd729b416a 100644
--- a/pkg/alertmanager/amcfg_test.go
+++ b/pkg/alertmanager/amcfg_test.go
@@ -2623,6 +2623,59 @@ func TestGenerateConfig(t *testing.T) {
},
golden: "skeleton_base_multiple_alertmanagerconfigs.golden",
},
+ {
+ name: "skeleton base, multiple CRs with namespaceMatcher disabled",
+ kclient: fake.NewClientset(),
+ baseConfig: alertmanagerConfig{
+ Route: &route{Receiver: "null"},
+ Receivers: []*receiver{{Name: "null"}},
+ },
+ matcherStrategy: monitoringv1.AlertmanagerConfigMatcherStrategy{
+ Type: "None",
+ },
+ amConfigs: map[string]*monitoringv1alpha1.AlertmanagerConfig{
+ "ns1/amc1": {
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "amc1",
+ Namespace: "ns1",
+ },
+ Spec: monitoringv1alpha1.AlertmanagerConfigSpec{
+ Route: &monitoringv1alpha1.Route{
+ Receiver: "test",
+ GroupBy: []string{"job"},
+ },
+ Receivers: []monitoringv1alpha1.Receiver{{Name: "test"}},
+ },
+ },
+ "ns2/amc1": {
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "amc1",
+ Namespace: "ns2",
+ },
+ Spec: monitoringv1alpha1.AlertmanagerConfigSpec{
+ Route: &monitoringv1alpha1.Route{
+ Receiver: "test2",
+ GroupBy: []string{"job"},
+ },
+ Receivers: []monitoringv1alpha1.Receiver{{Name: "test2"}},
+ },
+ },
+ "ns2/amc2": {
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "amc2",
+ Namespace: "ns2",
+ },
+ Spec: monitoringv1alpha1.AlertmanagerConfigSpec{
+ Route: &monitoringv1alpha1.Route{
+ Receiver: "test2",
+ GroupBy: []string{"job", "instance"},
+ },
+ Receivers: []monitoringv1alpha1.Receiver{{Name: "test2"}},
+ },
+ },
+ },
+ golden: "skeleton_base_multiple_CRs_with_namespaceMatcher_disabled.golden",
+ },
{
name: "skeleton base, simple CR with namespaceMatcher disabled",
kclient: fake.NewClientset(),
diff --git a/pkg/alertmanager/testdata/skeleton_base_multiple_CRs_with_namespaceMatcher_disabled.golden b/pkg/alertmanager/testdata/skeleton_base_multiple_CRs_with_namespaceMatcher_disabled.golden
new file mode 100644
index 00000000000..54b69775b27
--- /dev/null
+++ b/pkg/alertmanager/testdata/skeleton_base_multiple_CRs_with_namespaceMatcher_disabled.golden
@@ -0,0 +1,22 @@
+route:
+ receiver: "null"
+ routes:
+ - receiver: ns1/amc1/test
+ group_by:
+ - job
+ continue: true
+ - receiver: ns2/amc1/test2
+ group_by:
+ - job
+ continue: true
+ - receiver: ns2/amc2/test2
+ group_by:
+ - job
+ - instance
+ continue: true
+receivers:
+- name: "null"
+- name: ns1/amc1/test
+- name: ns2/amc1/test2
+- name: ns2/amc2/test2
+templates: []
From 7518798c274e7293d23f6d7cb6393730cca882a0 Mon Sep 17 00:00:00 2001
From: Simon Pasquier
Date: Tue, 19 May 2026 14:44:00 +0200
Subject: [PATCH 25/81] test: verify recreation of statefulsets
This commit extends `testPromStorageUpdate` to verify that the
statefulset is recreated when the storage spec is updated.
Signed-off-by: Simon Pasquier
---
test/e2e/prometheus_test.go | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/test/e2e/prometheus_test.go b/test/e2e/prometheus_test.go
index 1e5da0f555a..b2d0f389446 100644
--- a/test/e2e/prometheus_test.go
+++ b/test/e2e/prometheus_test.go
@@ -1049,6 +1049,10 @@ func testPromStorageUpdate(t *testing.T) {
t.Fatal(err)
}
+ sts, err := framework.KubeClient.AppsV1().StatefulSets(ns).List(context.Background(), metav1.ListOptions{LabelSelector: p.Status.Selector})
+ require.NoError(t, err)
+ require.Len(t, sts.Items, 1)
+
p, err = framework.PatchPrometheusAndWaitUntilReady(
context.Background(),
p.Name,
@@ -1077,6 +1081,11 @@ func testPromStorageUpdate(t *testing.T) {
)
require.NoError(t, err)
+ updatedSts, err := framework.KubeClient.AppsV1().StatefulSets(ns).List(context.Background(), metav1.ListOptions{LabelSelector: p.Status.Selector})
+ require.NoError(t, err)
+ require.Len(t, updatedSts.Items, 1)
+ require.NotEqual(t, sts.Items[0].UID, updatedSts.Items[0].UID, "StatefulSet should have different UIDs because the statefulset has been recreated")
+
err = framework.WaitForBoundPVC(context.Background(), ns, "test=testPromStorageUpdate", 1)
require.NoError(t, err)
From 327bb42cfb3613151c95c01109384eed4c32983e Mon Sep 17 00:00:00 2001
From: dongjiang
Date: Tue, 19 May 2026 22:04:17 +0800
Subject: [PATCH 26/81] Merge pull request #8562 from
kubeservice-stack/update-otlpconfig
feat: add `label_name_underscore_sanitization` and `label_name_preserve_multiple_underscores` to OTLPConfig
---
bundle.yaml | 40 +++++++++++++++++++
...onitoring.coreos.com_prometheusagents.yaml | 20 ++++++++++
.../monitoring.coreos.com_prometheuses.yaml | 20 ++++++++++
...onitoring.coreos.com_prometheusagents.yaml | 20 ++++++++++
.../monitoring.coreos.com_prometheuses.yaml | 20 ++++++++++
.../prometheusagents-crd.json | 8 ++++
.../prometheus-operator/prometheuses-crd.json | 8 ++++
pkg/apis/monitoring/v1/prometheus_types.go | 20 ++++++++++
.../monitoring/v1/zz_generated.deepcopy.go | 10 +++++
.../monitoring/v1/otlpconfig.go | 32 +++++++++++++++
pkg/prometheus/promcfg.go | 12 ++++++
pkg/prometheus/promcfg_test.go | 32 +++++++++++++++
..._name_preserve_multiple_underscores.golden | 9 +++++
..._multiple_underscores_wrong_version.golden | 7 ++++
..._label_name_underscore_sanitization.golden | 9 +++++
...derscore_sanitization_wrong_version.golden | 7 ++++
16 files changed, 274 insertions(+)
create mode 100644 pkg/prometheus/testdata/OTLPConfig_Config_label_name_preserve_multiple_underscores.golden
create mode 100644 pkg/prometheus/testdata/OTLPConfig_Config_label_name_preserve_multiple_underscores_wrong_version.golden
create mode 100644 pkg/prometheus/testdata/OTLPConfig_Config_label_name_underscore_sanitization.golden
create mode 100644 pkg/prometheus/testdata/OTLPConfig_Config_label_name_underscore_sanitization_wrong_version.golden
diff --git a/bundle.yaml b/bundle.yaml
index dca6c218cfd..ec0d59910fb 100644
--- a/bundle.yaml
+++ b/bundle.yaml
@@ -30246,6 +30246,26 @@ spec:
It requires Prometheus >= v3.1.0.
type: boolean
+ labelNamePreserveMultipleUnderscores:
+ description: |-
+ labelNamePreserveMultipleUnderscores enables preserving of multiple consecutive underscores in label names when translation_strategy uses
+ underscore escaping.
+ When true (default), multiple consecutive underscores are preserved during label name sanitization.
+
+ Notice: This one has no impact if `nameEscapingScheme` is `AllowUTF8`.
+
+ It requires Prometheus >= v3.8.0.
+ type: boolean
+ labelNameUnderscoreSanitization:
+ description: |-
+ labelNameUnderscoreSanitization controls whether to enable prepending of 'key_' to labels starting with '_'.
+ Reserved labels starting with '__' are not modified.
+ This is only relevant when translation_strategy uses underscore escaping (e.g., "UnderscoreEscapingWithSuffixes" or "UnderscoreEscapingWithoutSuffixes").
+
+ Notice: This one has no impact if `nameEscapingScheme` is `AllowUTF8`.
+
+ It requires Prometheus >= v3.8.0.
+ type: boolean
promoteAllResourceAttributes:
description: |-
promoteAllResourceAttributes promotes all resource attributes to metric labels except the ones defined in `ignoreResourceAttributes`.
@@ -42572,6 +42592,26 @@ spec:
It requires Prometheus >= v3.1.0.
type: boolean
+ labelNamePreserveMultipleUnderscores:
+ description: |-
+ labelNamePreserveMultipleUnderscores enables preserving of multiple consecutive underscores in label names when translation_strategy uses
+ underscore escaping.
+ When true (default), multiple consecutive underscores are preserved during label name sanitization.
+
+ Notice: This one has no impact if `nameEscapingScheme` is `AllowUTF8`.
+
+ It requires Prometheus >= v3.8.0.
+ type: boolean
+ labelNameUnderscoreSanitization:
+ description: |-
+ labelNameUnderscoreSanitization controls whether to enable prepending of 'key_' to labels starting with '_'.
+ Reserved labels starting with '__' are not modified.
+ This is only relevant when translation_strategy uses underscore escaping (e.g., "UnderscoreEscapingWithSuffixes" or "UnderscoreEscapingWithoutSuffixes").
+
+ Notice: This one has no impact if `nameEscapingScheme` is `AllowUTF8`.
+
+ It requires Prometheus >= v3.8.0.
+ type: boolean
promoteAllResourceAttributes:
description: |-
promoteAllResourceAttributes promotes all resource attributes to metric labels except the ones defined in `ignoreResourceAttributes`.
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml
index a87f1f98a03..33cf6198510 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml
@@ -5060,6 +5060,26 @@ spec:
It requires Prometheus >= v3.1.0.
type: boolean
+ labelNamePreserveMultipleUnderscores:
+ description: |-
+ labelNamePreserveMultipleUnderscores enables preserving of multiple consecutive underscores in label names when translation_strategy uses
+ underscore escaping.
+ When true (default), multiple consecutive underscores are preserved during label name sanitization.
+
+ Notice: This one has no impact if `nameEscapingScheme` is `AllowUTF8`.
+
+ It requires Prometheus >= v3.8.0.
+ type: boolean
+ labelNameUnderscoreSanitization:
+ description: |-
+ labelNameUnderscoreSanitization controls whether to enable prepending of 'key_' to labels starting with '_'.
+ Reserved labels starting with '__' are not modified.
+ This is only relevant when translation_strategy uses underscore escaping (e.g., "UnderscoreEscapingWithSuffixes" or "UnderscoreEscapingWithoutSuffixes").
+
+ Notice: This one has no impact if `nameEscapingScheme` is `AllowUTF8`.
+
+ It requires Prometheus >= v3.8.0.
+ type: boolean
promoteAllResourceAttributes:
description: |-
promoteAllResourceAttributes promotes all resource attributes to metric labels except the ones defined in `ignoreResourceAttributes`.
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
index d555d21a915..b3abe502371 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
@@ -5853,6 +5853,26 @@ spec:
It requires Prometheus >= v3.1.0.
type: boolean
+ labelNamePreserveMultipleUnderscores:
+ description: |-
+ labelNamePreserveMultipleUnderscores enables preserving of multiple consecutive underscores in label names when translation_strategy uses
+ underscore escaping.
+ When true (default), multiple consecutive underscores are preserved during label name sanitization.
+
+ Notice: This one has no impact if `nameEscapingScheme` is `AllowUTF8`.
+
+ It requires Prometheus >= v3.8.0.
+ type: boolean
+ labelNameUnderscoreSanitization:
+ description: |-
+ labelNameUnderscoreSanitization controls whether to enable prepending of 'key_' to labels starting with '_'.
+ Reserved labels starting with '__' are not modified.
+ This is only relevant when translation_strategy uses underscore escaping (e.g., "UnderscoreEscapingWithSuffixes" or "UnderscoreEscapingWithoutSuffixes").
+
+ Notice: This one has no impact if `nameEscapingScheme` is `AllowUTF8`.
+
+ It requires Prometheus >= v3.8.0.
+ type: boolean
promoteAllResourceAttributes:
description: |-
promoteAllResourceAttributes promotes all resource attributes to metric labels except the ones defined in `ignoreResourceAttributes`.
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml
index a87f1f98a03..33cf6198510 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml
@@ -5060,6 +5060,26 @@ spec:
It requires Prometheus >= v3.1.0.
type: boolean
+ labelNamePreserveMultipleUnderscores:
+ description: |-
+ labelNamePreserveMultipleUnderscores enables preserving of multiple consecutive underscores in label names when translation_strategy uses
+ underscore escaping.
+ When true (default), multiple consecutive underscores are preserved during label name sanitization.
+
+ Notice: This one has no impact if `nameEscapingScheme` is `AllowUTF8`.
+
+ It requires Prometheus >= v3.8.0.
+ type: boolean
+ labelNameUnderscoreSanitization:
+ description: |-
+ labelNameUnderscoreSanitization controls whether to enable prepending of 'key_' to labels starting with '_'.
+ Reserved labels starting with '__' are not modified.
+ This is only relevant when translation_strategy uses underscore escaping (e.g., "UnderscoreEscapingWithSuffixes" or "UnderscoreEscapingWithoutSuffixes").
+
+ Notice: This one has no impact if `nameEscapingScheme` is `AllowUTF8`.
+
+ It requires Prometheus >= v3.8.0.
+ type: boolean
promoteAllResourceAttributes:
description: |-
promoteAllResourceAttributes promotes all resource attributes to metric labels except the ones defined in `ignoreResourceAttributes`.
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
index d555d21a915..b3abe502371 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
@@ -5853,6 +5853,26 @@ spec:
It requires Prometheus >= v3.1.0.
type: boolean
+ labelNamePreserveMultipleUnderscores:
+ description: |-
+ labelNamePreserveMultipleUnderscores enables preserving of multiple consecutive underscores in label names when translation_strategy uses
+ underscore escaping.
+ When true (default), multiple consecutive underscores are preserved during label name sanitization.
+
+ Notice: This one has no impact if `nameEscapingScheme` is `AllowUTF8`.
+
+ It requires Prometheus >= v3.8.0.
+ type: boolean
+ labelNameUnderscoreSanitization:
+ description: |-
+ labelNameUnderscoreSanitization controls whether to enable prepending of 'key_' to labels starting with '_'.
+ Reserved labels starting with '__' are not modified.
+ This is only relevant when translation_strategy uses underscore escaping (e.g., "UnderscoreEscapingWithSuffixes" or "UnderscoreEscapingWithoutSuffixes").
+
+ Notice: This one has no impact if `nameEscapingScheme` is `AllowUTF8`.
+
+ It requires Prometheus >= v3.8.0.
+ type: boolean
promoteAllResourceAttributes:
description: |-
promoteAllResourceAttributes promotes all resource attributes to metric labels except the ones defined in `ignoreResourceAttributes`.
diff --git a/jsonnet/prometheus-operator/prometheusagents-crd.json b/jsonnet/prometheus-operator/prometheusagents-crd.json
index 43cf169f01d..7cc7e397edd 100644
--- a/jsonnet/prometheus-operator/prometheusagents-crd.json
+++ b/jsonnet/prometheus-operator/prometheusagents-crd.json
@@ -4273,6 +4273,14 @@
"description": "keepIdentifyingResourceAttributes enables adding `service.name`, `service.namespace` and `service.instance.id`\nresource attributes to the `target_info` metric, on top of converting them into the `instance` and `job` labels.\n\nIt requires Prometheus >= v3.1.0.",
"type": "boolean"
},
+ "labelNamePreserveMultipleUnderscores": {
+ "description": "labelNamePreserveMultipleUnderscores enables preserving of multiple consecutive underscores in label names when translation_strategy uses\nunderscore escaping.\nWhen true (default), multiple consecutive underscores are preserved during label name sanitization.\n\nNotice: This one has no impact if `nameEscapingScheme` is `AllowUTF8`.\n\nIt requires Prometheus >= v3.8.0.",
+ "type": "boolean"
+ },
+ "labelNameUnderscoreSanitization": {
+ "description": "labelNameUnderscoreSanitization controls whether to enable prepending of 'key_' to labels starting with '_'.\nReserved labels starting with '__' are not modified.\nThis is only relevant when translation_strategy uses underscore escaping (e.g., \"UnderscoreEscapingWithSuffixes\" or \"UnderscoreEscapingWithoutSuffixes\").\n\nNotice: This one has no impact if `nameEscapingScheme` is `AllowUTF8`.\n\nIt requires Prometheus >= v3.8.0.",
+ "type": "boolean"
+ },
"promoteAllResourceAttributes": {
"description": "promoteAllResourceAttributes promotes all resource attributes to metric labels except the ones defined in `ignoreResourceAttributes`.\n\nCannot be true when `promoteResourceAttributes` is defined.\nIt requires Prometheus >= v3.5.0.",
"type": "boolean"
diff --git a/jsonnet/prometheus-operator/prometheuses-crd.json b/jsonnet/prometheus-operator/prometheuses-crd.json
index c498155489c..32931f80bf3 100644
--- a/jsonnet/prometheus-operator/prometheuses-crd.json
+++ b/jsonnet/prometheus-operator/prometheuses-crd.json
@@ -4944,6 +4944,14 @@
"description": "keepIdentifyingResourceAttributes enables adding `service.name`, `service.namespace` and `service.instance.id`\nresource attributes to the `target_info` metric, on top of converting them into the `instance` and `job` labels.\n\nIt requires Prometheus >= v3.1.0.",
"type": "boolean"
},
+ "labelNamePreserveMultipleUnderscores": {
+ "description": "labelNamePreserveMultipleUnderscores enables preserving of multiple consecutive underscores in label names when translation_strategy uses\nunderscore escaping.\nWhen true (default), multiple consecutive underscores are preserved during label name sanitization.\n\nNotice: This one has no impact if `nameEscapingScheme` is `AllowUTF8`.\n\nIt requires Prometheus >= v3.8.0.",
+ "type": "boolean"
+ },
+ "labelNameUnderscoreSanitization": {
+ "description": "labelNameUnderscoreSanitization controls whether to enable prepending of 'key_' to labels starting with '_'.\nReserved labels starting with '__' are not modified.\nThis is only relevant when translation_strategy uses underscore escaping (e.g., \"UnderscoreEscapingWithSuffixes\" or \"UnderscoreEscapingWithoutSuffixes\").\n\nNotice: This one has no impact if `nameEscapingScheme` is `AllowUTF8`.\n\nIt requires Prometheus >= v3.8.0.",
+ "type": "boolean"
+ },
"promoteAllResourceAttributes": {
"description": "promoteAllResourceAttributes promotes all resource attributes to metric labels except the ones defined in `ignoreResourceAttributes`.\n\nCannot be true when `promoteResourceAttributes` is defined.\nIt requires Prometheus >= v3.5.0.",
"type": "boolean"
diff --git a/pkg/apis/monitoring/v1/prometheus_types.go b/pkg/apis/monitoring/v1/prometheus_types.go
index f7c91c8d420..f9b111277f5 100644
--- a/pkg/apis/monitoring/v1/prometheus_types.go
+++ b/pkg/apis/monitoring/v1/prometheus_types.go
@@ -2711,6 +2711,26 @@ type OTLPConfig struct {
// It requires Prometheus >= v3.6.0.
// +optional
PromoteScopeMetadata *bool `json:"promoteScopeMetadata,omitempty"` // nolint:kubeapilinter
+
+ // labelNameUnderscoreSanitization controls whether to enable prepending of 'key_' to labels starting with '_'.
+ // Reserved labels starting with '__' are not modified.
+ // This is only relevant when translation_strategy uses underscore escaping (e.g., "UnderscoreEscapingWithSuffixes" or "UnderscoreEscapingWithoutSuffixes").
+ //
+ // Notice: This one has no impact if `nameEscapingScheme` is `AllowUTF8`.
+ //
+ // It requires Prometheus >= v3.8.0.
+ // +optional
+ LabelNameUnderscoreSanitization *bool `json:"labelNameUnderscoreSanitization,omitempty"` // nolint:kubeapilinter
+
+ // labelNamePreserveMultipleUnderscores enables preserving of multiple consecutive underscores in label names when translation_strategy uses
+ // underscore escaping.
+ // When true (default), multiple consecutive underscores are preserved during label name sanitization.
+ //
+ // Notice: This one has no impact if `nameEscapingScheme` is `AllowUTF8`.
+ //
+ // It requires Prometheus >= v3.8.0.
+ // +optional
+ LabelNamePreserveMultipleUnderscores *bool `json:"labelNamePreserveMultipleUnderscores,omitempty"` // nolint:kubeapilinter
}
// Validate semantically validates the given OTLPConfig section.
diff --git a/pkg/apis/monitoring/v1/zz_generated.deepcopy.go b/pkg/apis/monitoring/v1/zz_generated.deepcopy.go
index 057d42a197d..088d0e84fb6 100644
--- a/pkg/apis/monitoring/v1/zz_generated.deepcopy.go
+++ b/pkg/apis/monitoring/v1/zz_generated.deepcopy.go
@@ -2073,6 +2073,16 @@ func (in *OTLPConfig) DeepCopyInto(out *OTLPConfig) {
*out = new(bool)
**out = **in
}
+ if in.LabelNameUnderscoreSanitization != nil {
+ in, out := &in.LabelNameUnderscoreSanitization, &out.LabelNameUnderscoreSanitization
+ *out = new(bool)
+ **out = **in
+ }
+ if in.LabelNamePreserveMultipleUnderscores != nil {
+ in, out := &in.LabelNamePreserveMultipleUnderscores, &out.LabelNamePreserveMultipleUnderscores
+ *out = new(bool)
+ **out = **in
+ }
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OTLPConfig.
diff --git a/pkg/client/applyconfiguration/monitoring/v1/otlpconfig.go b/pkg/client/applyconfiguration/monitoring/v1/otlpconfig.go
index 07ebe48ce65..02ae8289065 100644
--- a/pkg/client/applyconfiguration/monitoring/v1/otlpconfig.go
+++ b/pkg/client/applyconfiguration/monitoring/v1/otlpconfig.go
@@ -54,6 +54,22 @@ type OTLPConfigApplyConfiguration struct {
// As per the OpenTelemetry specification, the aforementioned scope metadata should be identifying, i.e. made into metric labels.
// It requires Prometheus >= v3.6.0.
PromoteScopeMetadata *bool `json:"promoteScopeMetadata,omitempty"`
+ // labelNameUnderscoreSanitization controls whether to enable prepending of 'key_' to labels starting with '_'.
+ // Reserved labels starting with '__' are not modified.
+ // This is only relevant when translation_strategy uses underscore escaping (e.g., "UnderscoreEscapingWithSuffixes" or "UnderscoreEscapingWithoutSuffixes").
+ //
+ // Notice: This one has no impact if `nameEscapingScheme` is `AllowUTF8`.
+ //
+ // It requires Prometheus >= v3.8.0.
+ LabelNameUnderscoreSanitization *bool `json:"labelNameUnderscoreSanitization,omitempty"`
+ // labelNamePreserveMultipleUnderscores enables preserving of multiple consecutive underscores in label names when translation_strategy uses
+ // underscore escaping.
+ // When true (default), multiple consecutive underscores are preserved during label name sanitization.
+ //
+ // Notice: This one has no impact if `nameEscapingScheme` is `AllowUTF8`.
+ //
+ // It requires Prometheus >= v3.8.0.
+ LabelNamePreserveMultipleUnderscores *bool `json:"labelNamePreserveMultipleUnderscores,omitempty"`
}
// OTLPConfigApplyConfiguration constructs a declarative configuration of the OTLPConfig type for use with
@@ -121,3 +137,19 @@ func (b *OTLPConfigApplyConfiguration) WithPromoteScopeMetadata(value bool) *OTL
b.PromoteScopeMetadata = &value
return b
}
+
+// WithLabelNameUnderscoreSanitization sets the LabelNameUnderscoreSanitization field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the LabelNameUnderscoreSanitization field is set to the value of the last call.
+func (b *OTLPConfigApplyConfiguration) WithLabelNameUnderscoreSanitization(value bool) *OTLPConfigApplyConfiguration {
+ b.LabelNameUnderscoreSanitization = &value
+ return b
+}
+
+// WithLabelNamePreserveMultipleUnderscores sets the LabelNamePreserveMultipleUnderscores field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the LabelNamePreserveMultipleUnderscores field is set to the value of the last call.
+func (b *OTLPConfigApplyConfiguration) WithLabelNamePreserveMultipleUnderscores(value bool) *OTLPConfigApplyConfiguration {
+ b.LabelNamePreserveMultipleUnderscores = &value
+ return b
+}
diff --git a/pkg/prometheus/promcfg.go b/pkg/prometheus/promcfg.go
index 8db9b0138ae..59425f0557b 100644
--- a/pkg/prometheus/promcfg.go
+++ b/pkg/prometheus/promcfg.go
@@ -5060,6 +5060,18 @@ func (cg *ConfigGenerator) appendOTLPConfig(cfg yaml.MapSlice) (yaml.MapSlice, e
otlpConfig.PromoteScopeMetadata)
}
+ if otlpConfig.LabelNameUnderscoreSanitization != nil {
+ otlp = cg.WithMinimumVersion("3.8.0").AppendMapItem(otlp,
+ "label_name_underscore_sanitization",
+ otlpConfig.LabelNameUnderscoreSanitization)
+ }
+
+ if otlpConfig.LabelNamePreserveMultipleUnderscores != nil {
+ otlp = cg.WithMinimumVersion("3.8.0").AppendMapItem(otlp,
+ "label_name_preserve_multiple_underscores",
+ otlpConfig.LabelNamePreserveMultipleUnderscores)
+ }
+
if len(otlp) == 0 {
return cfg, nil
}
diff --git a/pkg/prometheus/promcfg_test.go b/pkg/prometheus/promcfg_test.go
index 688dc9374fc..963e5402434 100644
--- a/pkg/prometheus/promcfg_test.go
+++ b/pkg/prometheus/promcfg_test.go
@@ -10423,6 +10423,38 @@ func TestOTLPConfig(t *testing.T) {
},
golden: "OTLPConfig_Config_promote_scope_metadata_wrong_version.golden",
},
+ {
+ name: "Config LabelNameUnderscoreSanitization with compatible version",
+ version: "v3.8.0",
+ otlpConfig: &monitoringv1.OTLPConfig{
+ LabelNameUnderscoreSanitization: new(true),
+ },
+ golden: "OTLPConfig_Config_label_name_underscore_sanitization.golden",
+ },
+ {
+ name: "Config LabelNameUnderscoreSanitization with old version",
+ version: "v3.7.0",
+ otlpConfig: &monitoringv1.OTLPConfig{
+ LabelNameUnderscoreSanitization: new(true),
+ },
+ golden: "OTLPConfig_Config_label_name_underscore_sanitization_wrong_version.golden",
+ },
+ {
+ name: "Config LabelNamePreserveMultipleUnderscores with compatible version",
+ version: "v3.8.0",
+ otlpConfig: &monitoringv1.OTLPConfig{
+ LabelNamePreserveMultipleUnderscores: new(false),
+ },
+ golden: "OTLPConfig_Config_label_name_preserve_multiple_underscores.golden",
+ },
+ {
+ name: "Config LabelNamePreserveMultipleUnderscores with old version",
+ version: "v3.7.0",
+ otlpConfig: &monitoringv1.OTLPConfig{
+ LabelNamePreserveMultipleUnderscores: new(false),
+ },
+ golden: "OTLPConfig_Config_label_name_preserve_multiple_underscores_wrong_version.golden",
+ },
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
diff --git a/pkg/prometheus/testdata/OTLPConfig_Config_label_name_preserve_multiple_underscores.golden b/pkg/prometheus/testdata/OTLPConfig_Config_label_name_preserve_multiple_underscores.golden
new file mode 100644
index 00000000000..3b069354417
--- /dev/null
+++ b/pkg/prometheus/testdata/OTLPConfig_Config_label_name_preserve_multiple_underscores.golden
@@ -0,0 +1,9 @@
+global:
+ scrape_interval: 30s
+ external_labels:
+ prometheus: default/test
+ prometheus_replica: $(POD_NAME)
+ evaluation_interval: 30s
+scrape_configs: []
+otlp:
+ label_name_preserve_multiple_underscores: false
diff --git a/pkg/prometheus/testdata/OTLPConfig_Config_label_name_preserve_multiple_underscores_wrong_version.golden b/pkg/prometheus/testdata/OTLPConfig_Config_label_name_preserve_multiple_underscores_wrong_version.golden
new file mode 100644
index 00000000000..609303fe82c
--- /dev/null
+++ b/pkg/prometheus/testdata/OTLPConfig_Config_label_name_preserve_multiple_underscores_wrong_version.golden
@@ -0,0 +1,7 @@
+global:
+ scrape_interval: 30s
+ external_labels:
+ prometheus: default/test
+ prometheus_replica: $(POD_NAME)
+ evaluation_interval: 30s
+scrape_configs: []
diff --git a/pkg/prometheus/testdata/OTLPConfig_Config_label_name_underscore_sanitization.golden b/pkg/prometheus/testdata/OTLPConfig_Config_label_name_underscore_sanitization.golden
new file mode 100644
index 00000000000..6b3960974f9
--- /dev/null
+++ b/pkg/prometheus/testdata/OTLPConfig_Config_label_name_underscore_sanitization.golden
@@ -0,0 +1,9 @@
+global:
+ scrape_interval: 30s
+ external_labels:
+ prometheus: default/test
+ prometheus_replica: $(POD_NAME)
+ evaluation_interval: 30s
+scrape_configs: []
+otlp:
+ label_name_underscore_sanitization: true
diff --git a/pkg/prometheus/testdata/OTLPConfig_Config_label_name_underscore_sanitization_wrong_version.golden b/pkg/prometheus/testdata/OTLPConfig_Config_label_name_underscore_sanitization_wrong_version.golden
new file mode 100644
index 00000000000..609303fe82c
--- /dev/null
+++ b/pkg/prometheus/testdata/OTLPConfig_Config_label_name_underscore_sanitization_wrong_version.golden
@@ -0,0 +1,7 @@
+global:
+ scrape_interval: 30s
+ external_labels:
+ prometheus: default/test
+ prometheus_replica: $(POD_NAME)
+ evaluation_interval: 30s
+scrape_configs: []
From 08f23e0815c0380fd0f4d27f65399b4fdf9e634c Mon Sep 17 00:00:00 2001
From: Vibhu Prashar
Date: Tue, 19 May 2026 19:23:46 +0400
Subject: [PATCH 27/81] test: fix retention policy flakiness (#8548)
This commit addresses the flakiness in the retention policy test.
After scaling down to 1 shard the inactive shard statefulset
doesn't disappear immeditaley. The previous `require.Len`
assertion ran the instant `ScalePrometheusAndWaitUntilReady` returned
causing race condition
Addresses #8543
Signed-off-by: vprashar2929
---
.../prometheus_shard_retention_policy_test.go | 7 +++---
test/framework/statefulset.go | 24 +++++++++++++++++++
2 files changed, 28 insertions(+), 3 deletions(-)
diff --git a/test/e2e/prometheus_shard_retention_policy_test.go b/test/e2e/prometheus_shard_retention_policy_test.go
index a8fbb8dc606..b2beed8196b 100644
--- a/test/e2e/prometheus_shard_retention_policy_test.go
+++ b/test/e2e/prometheus_shard_retention_policy_test.go
@@ -300,9 +300,10 @@ func testPrometheusRetentionPolicies(t *testing.T) {
require.NoError(t, err)
require.Equal(t, int32(1), p.Status.Shards)
- sts, err = framework.KubeClient.AppsV1().StatefulSets(ns).List(ctx, metav1.ListOptions{LabelSelector: p.Status.Selector})
- require.NoError(t, err)
- require.Len(t, sts.Items, 1)
+ // The retention reconciler runs once per minute and the
+ // API server still needs to process the StatefulSet deletion
+ // so poll until only the active shard remains.
+ require.NoError(t, framework.WaitForStatefulSetReplicas(ctx, ns, metav1.ListOptions{LabelSelector: p.Status.Selector}, 1))
})
}
}
diff --git a/test/framework/statefulset.go b/test/framework/statefulset.go
index 2051a8fa3bb..15ffc0f1317 100644
--- a/test/framework/statefulset.go
+++ b/test/framework/statefulset.go
@@ -19,9 +19,11 @@ import (
"fmt"
"maps"
"slices"
+ "time"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
+ "k8s.io/apimachinery/pkg/util/wait"
)
// RemoveAllLabelsFromStatefulSet removes all labels from a StatefulSet using JSON Patch.
@@ -51,3 +53,25 @@ func (f *Framework) RemoveAllLabelsFromStatefulSet(ctx context.Context, name, na
return nil
}
+
+// WaitForStatefulSetReplicas polls until the number of StatefulSets in the
+// given namespace matching listOpts equals expected.
+func (f *Framework) WaitForStatefulSetReplicas(ctx context.Context, ns string, listOpts metav1.ListOptions, expected int) error {
+ var loopErr error
+ err := wait.PollUntilContextTimeout(ctx, 5*time.Second, 2*time.Minute, true, func(ctx context.Context) (bool, error) {
+ sts, listErr := f.KubeClient.AppsV1().StatefulSets(ns).List(ctx, listOpts)
+ if listErr != nil {
+ loopErr = fmt.Errorf("failed to list StatefulSets in namespace %s: %w", ns, listErr)
+ return false, nil
+ }
+ if len(sts.Items) != expected {
+ loopErr = fmt.Errorf("expected %d StatefulSets in namespace %s, got %d", expected, ns, len(sts.Items))
+ return false, nil
+ }
+ return true, nil
+ })
+ if err != nil {
+ return fmt.Errorf("%v: %w", loopErr, err)
+ }
+ return nil
+}
From 98adef7a9819a640c84a8d1ca0c2ba19ca0ea77e Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 21 May 2026 13:28:33 +0000
Subject: [PATCH 28/81] build(deps): bump actions/stale in the
github-actions-deps group
Bumps the github-actions-deps group with 1 update: [actions/stale](https://github.com/actions/stale).
Updates `actions/stale` from 10.2.0 to 10.3.0
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v10.2.0...v10.3.0)
---
updated-dependencies:
- dependency-name: actions/stale
dependency-version: 10.3.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: github-actions-deps
...
Signed-off-by: dependabot[bot]
---
.github/workflows/stale.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/stale.yaml b/.github/workflows/stale.yaml
index 19c5d475ccf..4003971a0d4 100644
--- a/.github/workflows/stale.yaml
+++ b/.github/workflows/stale.yaml
@@ -8,7 +8,7 @@ jobs:
runs-on: ubuntu-latest
if: github.repository == 'prometheus-operator/prometheus-operator'
steps:
- - uses: actions/stale@v10.2.0
+ - uses: actions/stale@v10.3.0
with:
stale-issue-message: 'This issue has been automatically marked as stale because it has not had any activity in the last 60 days. Thank you for your contributions.'
close-issue-message: 'This issue was closed because it has not had any activity in the last 120 days. Please reopen if you feel this is still valid.'
From 2e8bd6f9b76c5525f7175d6cc3e3bfa1d50947b1 Mon Sep 17 00:00:00 2001
From: Sebastien Tardif
Date: Thu, 21 May 2026 07:28:29 -0700
Subject: [PATCH 29/81] admission: add missing return after http.Error on
marshal failure
When json.Marshal fails in serveAdmission, the handler calls http.Error
but does not return, causing execution to fall through to w.Write with
nil bytes on an already-committed response.
Add return after the http.Error call and move the debug log after the
error check so it doesn't log nil response bytes on failure.
Signed-off-by: Sebastien Tardif
---
pkg/admission/admission.go | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/pkg/admission/admission.go b/pkg/admission/admission.go
index 009f35f7ebc..d178d86ef79 100644
--- a/pkg/admission/admission.go
+++ b/pkg/admission/admission.go
@@ -180,13 +180,14 @@ func (a *Admission) serveAdmission(w http.ResponseWriter, r *http.Request, admit
responseAdmissionReview.Kind = requestedAdmissionReview.Kind
respBytes, err := json.Marshal(responseAdmissionReview)
-
- a.logger.Debug("sending response", "content", string(respBytes))
-
if err != nil {
a.logger.Error("Cannot serialize response", "err", err)
http.Error(w, fmt.Sprintf("could not serialize response: %v", err), http.StatusInternalServerError)
+ return
}
+
+ a.logger.Debug("sending response", "content", string(respBytes))
+
if _, err := w.Write(respBytes); err != nil {
a.logger.Error("Cannot write response", "err", err)
http.Error(w, fmt.Sprintf("could not write response: %v", err), http.StatusInternalServerError)
From 83dfeac035d6e79374a3c6561de680e57e0bc9d0 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 22 May 2026 12:42:32 +0000
Subject: [PATCH 30/81] build(deps): bump golang.org/x/net from 0.54.0 to
0.55.0
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.54.0 to 0.55.0.
- [Commits](https://github.com/golang/net/compare/v0.54.0...v0.55.0)
---
updated-dependencies:
- dependency-name: golang.org/x/net
dependency-version: 0.55.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
---
go.mod | 4 ++--
go.sum | 8 ++++----
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/go.mod b/go.mod
index dbd15814df3..7a7fc99c3a6 100644
--- a/go.mod
+++ b/go.mod
@@ -28,7 +28,7 @@ require (
github.com/prometheus/prometheus v0.311.3
github.com/stretchr/testify v1.11.1
github.com/thanos-io/thanos v0.41.0
- golang.org/x/net v0.54.0
+ golang.org/x/net v0.55.0
golang.org/x/sync v0.20.0
google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af
gopkg.in/yaml.v2 v2.4.0
@@ -155,7 +155,7 @@ require (
go.uber.org/atomic v1.11.0 // indirect
golang.org/x/crypto v0.51.0 // indirect
golang.org/x/oauth2 v0.36.0 // indirect
- golang.org/x/sys v0.44.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
diff --git a/go.sum b/go.sum
index efe75b4d669..e5e52b613be 100644
--- a/go.sum
+++ b/go.sum
@@ -402,8 +402,8 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL
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.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w=
-golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ=
+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=
@@ -420,8 +420,8 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ=
-golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
+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.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=
From 4aa06fd1409bfd4749d8831998af363a4b00c5f6 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 22 May 2026 12:42:56 +0000
Subject: [PATCH 31/81] build(deps): bump docker/login-action in the
github-actions-deps group
Bumps the github-actions-deps group with 1 update: [docker/login-action](https://github.com/docker/login-action).
Updates `docker/login-action` from 4.1.0 to 4.2.0
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/4907a6ddec9925e35a0a9e82d7399ccc52663121...650006c6eb7dba73a995cc03b0b2d7f5ca915bee)
---
updated-dependencies:
- dependency-name: docker/login-action
dependency-version: 4.2.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: github-actions-deps
...
Signed-off-by: dependabot[bot]
---
.github/workflows/publish.yaml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml
index ba5404471e6..bbb36a1b6bc 100644
--- a/.github/workflows/publish.yaml
+++ b/.github/workflows/publish.yaml
@@ -44,13 +44,13 @@ jobs:
- name: Install crane
uses: imjasonh/setup-crane@6da1ae018866400525525ce74ff892880c099987 # v0.5
- name: Login to quay.io
- uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
+ uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0
with:
registry: quay.io
username: ${{ secrets.quay_username }}
password: ${{ secrets.quay_password }}
- name: Login to ghcr.io
- uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
+ uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
From e43234edfd4ff92f21a8a575d1e13cc1d6eb338f Mon Sep 17 00:00:00 2001
From: Sebastien Tardif
Date: Fri, 22 May 2026 17:57:34 -0700
Subject: [PATCH 32/81] operator: add missing return after meta.Accessor error
in FindOwner
When meta.Accessor(owner) fails, the error is logged but execution
falls through to return the potentially nil or invalid accessor value.
Every other error path in FindOwner returns nil explicitly.
The bug was introduced in #6938 (2024-09-17).
Signed-off-by: Sebastien Tardif
---
pkg/operator/resource_reconciler.go | 1 +
1 file changed, 1 insertion(+)
diff --git a/pkg/operator/resource_reconciler.go b/pkg/operator/resource_reconciler.go
index d1d49f0d722..4264364e7dc 100644
--- a/pkg/operator/resource_reconciler.go
+++ b/pkg/operator/resource_reconciler.go
@@ -396,6 +396,7 @@ func (rr *ResourceReconciler) FindOwner(obj metav1.Object) metav1.Object {
o, err := meta.Accessor(owner)
if err != nil {
rr.logger.Error("failed to get owner meta", "err", err, "gvk", owner.GetObjectKind().GroupVersionKind().String(), "namespace", obj.GetNamespace(), "name", obj.GetName(), "kind", rr.resourceKind)
+ return nil
}
return o
From a42c944515382bdc33dce62974d38177e7ef0499 Mon Sep 17 00:00:00 2001
From: Sebastien Tardif
Date: Fri, 22 May 2026 17:58:11 -0700
Subject: [PATCH 33/81] alertmanager: return error on invalid SMTP smarthost
format
net.SplitHostPort error is silently discarded when converting email
receiver configuration. If validation is bypassed or incomplete, the
host and port fields are set to empty strings, producing a broken SMTP
configuration that fails silently at send time.
The original pattern predates validation added in #8270.
Signed-off-by: Sebastien Tardif
---
pkg/alertmanager/amcfg.go | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/pkg/alertmanager/amcfg.go b/pkg/alertmanager/amcfg.go
index c6b61bfb6d4..493fc1b41d4 100644
--- a/pkg/alertmanager/amcfg.go
+++ b/pkg/alertmanager/amcfg.go
@@ -1299,7 +1299,12 @@ func (cb *ConfigBuilder) convertEmailConfig(ctx context.Context, in monitoringv1
}
if ptr.Deref(in.Smarthost, "") != "" {
- out.Smarthost.Host, out.Smarthost.Port, _ = net.SplitHostPort(*in.Smarthost)
+ host, port, err := net.SplitHostPort(*in.Smarthost)
+ if err != nil {
+ return nil, fmt.Errorf("invalid SMTP smarthost %q: %w", *in.Smarthost, err)
+ }
+ out.Smarthost.Host = host
+ out.Smarthost.Port = port
}
if in.AuthPassword != nil {
From 18ea0e3d63290ce2aee868aa9f3711b7fee028dd Mon Sep 17 00:00:00 2001
From: Simon Pasquier
Date: Tue, 26 May 2026 11:19:17 +0200
Subject: [PATCH 34/81] chore: update cspell configuration
---
.github/workflows/cspell.json | 5 ++++-
Documentation/proposals/accepted/202405-agent-daemonset.md | 2 +-
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/cspell.json b/.github/workflows/cspell.json
index 3609a1563e3..8369d76583e 100644
--- a/.github/workflows/cspell.json
+++ b/.github/workflows/cspell.json
@@ -424,6 +424,9 @@
"FIPSSTS",
"checkmark",
"STARTTLS",
- "MLKEM"
+ "MLKEM",
+ "slashexx",
+ "Errorf",
+ "prompkg"
]
}
diff --git a/Documentation/proposals/accepted/202405-agent-daemonset.md b/Documentation/proposals/accepted/202405-agent-daemonset.md
index dbd2364b568..6c552f9a16f 100644
--- a/Documentation/proposals/accepted/202405-agent-daemonset.md
+++ b/Documentation/proposals/accepted/202405-agent-daemonset.md
@@ -135,7 +135,7 @@ CEL validation will provide immediate feedback during `kubectl apply` but we wil
This is mainly because :
1. CEL validation will require Kubernetes version 1.25+ and hence not all users might have CEL supported clusters.
-2. This will provide an in-depth defense mechamnism against misconfigurations.
+2. This will provide an in-depth defense mechanism against misconfigurations.
3. More detailed error response in case the first layer of defense fails.
```go
From ae771ad25a665fc3284e71c90054e6a67ae0d3bc Mon Sep 17 00:00:00 2001
From: dongjiang
Date: Tue, 26 May 2026 17:41:13 +0800
Subject: [PATCH 35/81] Merge pull request #8579 from
kubeservice-stack/change-url-crd
refactor(crd): change OAuth2 TokenURL type from string to URL
---
bundle.yaml | 76 +++++++++----------
...toring.coreos.com_alertmanagerconfigs.yaml | 56 +++++++-------
.../monitoring.coreos.com_alertmanagers.yaml | 2 +-
.../monitoring.coreos.com_podmonitors.yaml | 2 +-
.../monitoring.coreos.com_probes.yaml | 2 +-
...onitoring.coreos.com_prometheusagents.yaml | 2 +-
.../monitoring.coreos.com_prometheuses.yaml | 4 +-
.../monitoring.coreos.com_scrapeconfigs.yaml | 32 ++++----
...monitoring.coreos.com_servicemonitors.yaml | 2 +-
.../monitoring.coreos.com_thanosrulers.yaml | 2 +-
...toring.coreos.com_alertmanagerconfigs.yaml | 28 +++----
.../monitoring.coreos.com_alertmanagers.yaml | 2 +-
.../monitoring.coreos.com_podmonitors.yaml | 2 +-
.../monitoring.coreos.com_probes.yaml | 2 +-
...onitoring.coreos.com_prometheusagents.yaml | 2 +-
.../monitoring.coreos.com_prometheuses.yaml | 4 +-
.../monitoring.coreos.com_scrapeconfigs.yaml | 32 ++++----
...monitoring.coreos.com_servicemonitors.yaml | 2 +-
.../monitoring.coreos.com_thanosrulers.yaml | 2 +-
.../alertmanagerconfigs-crd.json | 28 +++----
.../alertmanagerconfigs-v1beta1-crd.libsonnet | 28 +++----
.../alertmanagers-crd.json | 2 +-
.../prometheus-operator/podmonitors-crd.json | 2 +-
jsonnet/prometheus-operator/probes-crd.json | 2 +-
.../prometheusagents-crd.json | 2 +-
.../prometheus-operator/prometheuses-crd.json | 4 +-
.../scrapeconfigs-crd.json | 32 ++++----
.../servicemonitors-crd.json | 2 +-
.../prometheus-operator/thanosrulers-crd.json | 2 +-
pkg/alertmanager/amcfg.go | 2 +-
pkg/apis/monitoring/v1/types.go | 5 +-
.../monitoring/v1/oauth2.go | 5 +-
32 files changed, 186 insertions(+), 186 deletions(-)
diff --git a/bundle.yaml b/bundle.yaml
index ec0d59910fb..e6c732bff06 100644
--- a/bundle.yaml
+++ b/bundle.yaml
@@ -760,7 +760,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -1833,7 +1833,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -2600,7 +2600,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -3438,7 +3438,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -4286,7 +4286,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -5146,7 +5146,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -6074,7 +6074,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -7067,7 +7067,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -7874,7 +7874,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -8761,7 +8761,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -9569,7 +9569,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -10319,7 +10319,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -11049,7 +11049,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -11861,7 +11861,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -13988,7 +13988,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the
token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -23139,7 +23139,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -24450,7 +24450,7 @@ spec:
type: object
tokenUrl:
description: tokenUrl defines the URL to fetch the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -31293,7 +31293,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -43542,7 +43542,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -44445,7 +44445,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -51448,7 +51448,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -52250,7 +52250,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -52941,7 +52941,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -53710,7 +53710,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -54424,7 +54424,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -55471,7 +55471,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -56255,7 +56255,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -56954,7 +56954,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -57577,7 +57577,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -58314,7 +58314,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -59039,7 +59039,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -59762,7 +59762,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -60414,7 +60414,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -61248,7 +61248,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -61816,7 +61816,7 @@ spec:
type: object
tokenUrl:
description: tokenUrl defines the URL to fetch the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -62746,7 +62746,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -64493,7 +64493,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -70684,7 +70684,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml
index 55218bd631a..57d75b231c8 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml
@@ -760,7 +760,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -1833,7 +1833,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -2600,7 +2600,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -3438,7 +3438,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -4286,7 +4286,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -5146,7 +5146,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -6074,7 +6074,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -7067,7 +7067,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -7874,7 +7874,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -8761,7 +8761,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -9569,7 +9569,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -10319,7 +10319,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -11049,7 +11049,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -11861,7 +11861,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -12989,7 +12989,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -14038,7 +14038,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -14797,7 +14797,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -15619,7 +15619,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -16453,7 +16453,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -17291,7 +17291,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -18193,7 +18193,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -19171,7 +19171,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -19970,7 +19970,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -20842,7 +20842,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -21635,7 +21635,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -22379,7 +22379,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -23101,7 +23101,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -23891,7 +23891,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml
index ac618de6b1a..a0ef2d2c965 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml
@@ -1628,7 +1628,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the
token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml
index f0ac5692b78..02bd4e8e5b4 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml
@@ -768,7 +768,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_probes.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_probes.yaml
index 0074f2bcd4d..5523d1e1d65 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_probes.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_probes.yaml
@@ -680,7 +680,7 @@ spec:
type: object
tokenUrl:
description: tokenUrl defines the URL to fetch the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml
index 33cf6198510..c461179f2b0 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml
@@ -6107,7 +6107,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
index b3abe502371..4fb9bf3116b 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
@@ -6803,7 +6803,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -7706,7 +7706,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_scrapeconfigs.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_scrapeconfigs.yaml
index 73b24f01332..b2c27d5e55e 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_scrapeconfigs.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_scrapeconfigs.yaml
@@ -573,7 +573,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -1375,7 +1375,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -2066,7 +2066,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -2835,7 +2835,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -3549,7 +3549,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -4596,7 +4596,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -5380,7 +5380,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -6079,7 +6079,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -6702,7 +6702,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -7439,7 +7439,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -8164,7 +8164,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -8887,7 +8887,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -9539,7 +9539,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -10373,7 +10373,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -10941,7 +10941,7 @@ spec:
type: object
tokenUrl:
description: tokenUrl defines the URL to fetch the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -11871,7 +11871,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml
index 5548f726251..a6793007d02 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml
@@ -689,7 +689,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml
index a749366291c..2b7adc2ff83 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml
@@ -5467,7 +5467,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml
index 47941d6f62a..23233a285a0 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml
@@ -760,7 +760,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -1833,7 +1833,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -2600,7 +2600,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -3438,7 +3438,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -4286,7 +4286,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -5146,7 +5146,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -6074,7 +6074,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -7067,7 +7067,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -7874,7 +7874,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -8761,7 +8761,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -9569,7 +9569,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -10319,7 +10319,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -11049,7 +11049,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -11861,7 +11861,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch
the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml
index ac618de6b1a..a0ef2d2c965 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml
@@ -1628,7 +1628,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the
token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml
index f0ac5692b78..02bd4e8e5b4 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml
@@ -768,7 +768,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml
index 0074f2bcd4d..5523d1e1d65 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml
@@ -680,7 +680,7 @@ spec:
type: object
tokenUrl:
description: tokenUrl defines the URL to fetch the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml
index 33cf6198510..c461179f2b0 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml
@@ -6107,7 +6107,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
index b3abe502371..4fb9bf3116b 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
@@ -6803,7 +6803,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -7706,7 +7706,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml
index 73b24f01332..b2c27d5e55e 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml
@@ -573,7 +573,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -1375,7 +1375,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -2066,7 +2066,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -2835,7 +2835,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -3549,7 +3549,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -4596,7 +4596,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -5380,7 +5380,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -6079,7 +6079,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -6702,7 +6702,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -7439,7 +7439,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -8164,7 +8164,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -8887,7 +8887,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -9539,7 +9539,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -10373,7 +10373,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -10941,7 +10941,7 @@ spec:
type: object
tokenUrl:
description: tokenUrl defines the URL to fetch the token from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
@@ -11871,7 +11871,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml
index 5548f726251..a6793007d02 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml
@@ -689,7 +689,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml
index a749366291c..2b7adc2ff83 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml
@@ -5467,7 +5467,7 @@ spec:
tokenUrl:
description: tokenUrl defines the URL to fetch the token
from.
- minLength: 1
+ pattern: ^(http|https)://.+$
type: string
required:
- clientId
diff --git a/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json b/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json
index 56fc8b77898..03b860eb755 100644
--- a/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json
+++ b/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json
@@ -705,7 +705,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -1687,7 +1687,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -2381,7 +2381,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -3142,7 +3142,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -3921,7 +3921,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -4702,7 +4702,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -5529,7 +5529,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -6422,7 +6422,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -7158,7 +7158,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -7959,7 +7959,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -8693,7 +8693,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -9377,7 +9377,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -10045,7 +10045,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -10777,7 +10777,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
diff --git a/jsonnet/prometheus-operator/alertmanagerconfigs-v1beta1-crd.libsonnet b/jsonnet/prometheus-operator/alertmanagerconfigs-v1beta1-crd.libsonnet
index 2ad3eaafb6e..1e007f3e567 100644
--- a/jsonnet/prometheus-operator/alertmanagerconfigs-v1beta1-crd.libsonnet
+++ b/jsonnet/prometheus-operator/alertmanagerconfigs-v1beta1-crd.libsonnet
@@ -563,7 +563,7 @@
},
tokenUrl: {
description: 'tokenUrl defines the URL to fetch the token from.',
- minLength: 1,
+ pattern: '^(http|https)://.+$',
type: 'string',
},
},
@@ -1533,7 +1533,7 @@
},
tokenUrl: {
description: 'tokenUrl defines the URL to fetch the token from.',
- minLength: 1,
+ pattern: '^(http|https)://.+$',
type: 'string',
},
},
@@ -2223,7 +2223,7 @@
},
tokenUrl: {
description: 'tokenUrl defines the URL to fetch the token from.',
- minLength: 1,
+ pattern: '^(http|https)://.+$',
type: 'string',
},
},
@@ -2976,7 +2976,7 @@
},
tokenUrl: {
description: 'tokenUrl defines the URL to fetch the token from.',
- minLength: 1,
+ pattern: '^(http|https)://.+$',
type: 'string',
},
},
@@ -3746,7 +3746,7 @@
},
tokenUrl: {
description: 'tokenUrl defines the URL to fetch the token from.',
- minLength: 1,
+ pattern: '^(http|https)://.+$',
type: 'string',
},
},
@@ -4517,7 +4517,7 @@
},
tokenUrl: {
description: 'tokenUrl defines the URL to fetch the token from.',
- minLength: 1,
+ pattern: '^(http|https)://.+$',
type: 'string',
},
},
@@ -5330,7 +5330,7 @@
},
tokenUrl: {
description: 'tokenUrl defines the URL to fetch the token from.',
- minLength: 1,
+ pattern: '^(http|https)://.+$',
type: 'string',
},
},
@@ -6216,7 +6216,7 @@
},
tokenUrl: {
description: 'tokenUrl defines the URL to fetch the token from.',
- minLength: 1,
+ pattern: '^(http|https)://.+$',
type: 'string',
},
},
@@ -6948,7 +6948,7 @@
},
tokenUrl: {
description: 'tokenUrl defines the URL to fetch the token from.',
- minLength: 1,
+ pattern: '^(http|https)://.+$',
type: 'string',
},
},
@@ -7742,7 +7742,7 @@
},
tokenUrl: {
description: 'tokenUrl defines the URL to fetch the token from.',
- minLength: 1,
+ pattern: '^(http|https)://.+$',
type: 'string',
},
},
@@ -8469,7 +8469,7 @@
},
tokenUrl: {
description: 'tokenUrl defines the URL to fetch the token from.',
- minLength: 1,
+ pattern: '^(http|https)://.+$',
type: 'string',
},
},
@@ -9149,7 +9149,7 @@
},
tokenUrl: {
description: 'tokenUrl defines the URL to fetch the token from.',
- minLength: 1,
+ pattern: '^(http|https)://.+$',
type: 'string',
},
},
@@ -9813,7 +9813,7 @@
},
tokenUrl: {
description: 'tokenUrl defines the URL to fetch the token from.',
- minLength: 1,
+ pattern: '^(http|https)://.+$',
type: 'string',
},
},
@@ -10535,7 +10535,7 @@
},
tokenUrl: {
description: 'tokenUrl defines the URL to fetch the token from.',
- minLength: 1,
+ pattern: '^(http|https)://.+$',
type: 'string',
},
},
diff --git a/jsonnet/prometheus-operator/alertmanagers-crd.json b/jsonnet/prometheus-operator/alertmanagers-crd.json
index 6bc9f9c74a8..40718057eef 100644
--- a/jsonnet/prometheus-operator/alertmanagers-crd.json
+++ b/jsonnet/prometheus-operator/alertmanagers-crd.json
@@ -1404,7 +1404,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
diff --git a/jsonnet/prometheus-operator/podmonitors-crd.json b/jsonnet/prometheus-operator/podmonitors-crd.json
index f52e8ab0606..91616813fc3 100644
--- a/jsonnet/prometheus-operator/podmonitors-crd.json
+++ b/jsonnet/prometheus-operator/podmonitors-crd.json
@@ -642,7 +642,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
diff --git a/jsonnet/prometheus-operator/probes-crd.json b/jsonnet/prometheus-operator/probes-crd.json
index 8290a1d292d..bb514d6bdc0 100644
--- a/jsonnet/prometheus-operator/probes-crd.json
+++ b/jsonnet/prometheus-operator/probes-crd.json
@@ -593,7 +593,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
diff --git a/jsonnet/prometheus-operator/prometheusagents-crd.json b/jsonnet/prometheus-operator/prometheusagents-crd.json
index 7cc7e397edd..222261b07d2 100644
--- a/jsonnet/prometheus-operator/prometheusagents-crd.json
+++ b/jsonnet/prometheus-operator/prometheusagents-crd.json
@@ -5138,7 +5138,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
diff --git a/jsonnet/prometheus-operator/prometheuses-crd.json b/jsonnet/prometheus-operator/prometheuses-crd.json
index 32931f80bf3..6ab6a1384b3 100644
--- a/jsonnet/prometheus-operator/prometheuses-crd.json
+++ b/jsonnet/prometheus-operator/prometheuses-crd.json
@@ -5725,7 +5725,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -6537,7 +6537,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
diff --git a/jsonnet/prometheus-operator/scrapeconfigs-crd.json b/jsonnet/prometheus-operator/scrapeconfigs-crd.json
index ffa25cf6764..a55f225355a 100644
--- a/jsonnet/prometheus-operator/scrapeconfigs-crd.json
+++ b/jsonnet/prometheus-operator/scrapeconfigs-crd.json
@@ -521,7 +521,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -1258,7 +1258,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -1905,7 +1905,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -2628,7 +2628,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -3299,7 +3299,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -4274,7 +4274,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -4996,7 +4996,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -5647,7 +5647,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -6231,7 +6231,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -6908,7 +6908,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -7590,7 +7590,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -8264,7 +8264,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -8875,7 +8875,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -9638,7 +9638,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -10177,7 +10177,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
@@ -11037,7 +11037,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
diff --git a/jsonnet/prometheus-operator/servicemonitors-crd.json b/jsonnet/prometheus-operator/servicemonitors-crd.json
index 60e7de8f285..6456429d322 100644
--- a/jsonnet/prometheus-operator/servicemonitors-crd.json
+++ b/jsonnet/prometheus-operator/servicemonitors-crd.json
@@ -576,7 +576,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
diff --git a/jsonnet/prometheus-operator/thanosrulers-crd.json b/jsonnet/prometheus-operator/thanosrulers-crd.json
index 934673d950e..05c877f17aa 100644
--- a/jsonnet/prometheus-operator/thanosrulers-crd.json
+++ b/jsonnet/prometheus-operator/thanosrulers-crd.json
@@ -4718,7 +4718,7 @@
},
"tokenUrl": {
"description": "tokenUrl defines the URL to fetch the token from.",
- "minLength": 1,
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
diff --git a/pkg/alertmanager/amcfg.go b/pkg/alertmanager/amcfg.go
index 493fc1b41d4..9d0bf36da1a 100644
--- a/pkg/alertmanager/amcfg.go
+++ b/pkg/alertmanager/amcfg.go
@@ -1906,7 +1906,7 @@ func (cb *ConfigBuilder) convertHTTPConfig(ctx context.Context, in *monitoringv1
ClientID: clientID,
ClientSecret: clientSecret,
Scopes: in.OAuth2.Scopes,
- TokenURL: in.OAuth2.TokenURL,
+ TokenURL: string(in.OAuth2.TokenURL),
EndpointParams: in.OAuth2.EndpointParams,
proxyConfig: proxyConfig,
}
diff --git a/pkg/apis/monitoring/v1/types.go b/pkg/apis/monitoring/v1/types.go
index 520efc21f5d..95eb1652f44 100644
--- a/pkg/apis/monitoring/v1/types.go
+++ b/pkg/apis/monitoring/v1/types.go
@@ -673,9 +673,8 @@ type OAuth2 struct {
// tokenUrl defines the URL to fetch the token from.
//
- // +kubebuilder:validation:MinLength=1
// +required
- TokenURL string `json:"tokenUrl"`
+ TokenURL URL `json:"tokenUrl"`
// scopes defines the OAuth2 scopes used for the token request.
//
@@ -707,7 +706,7 @@ func (o *OAuth2) Validate() error {
return nil
}
- if o.TokenURL == "" {
+ if string(o.TokenURL) == "" {
return errors.New("OAuth2 tokenURL must be specified")
}
diff --git a/pkg/client/applyconfiguration/monitoring/v1/oauth2.go b/pkg/client/applyconfiguration/monitoring/v1/oauth2.go
index 7c6425caece..6c70ff8f14f 100644
--- a/pkg/client/applyconfiguration/monitoring/v1/oauth2.go
+++ b/pkg/client/applyconfiguration/monitoring/v1/oauth2.go
@@ -17,6 +17,7 @@
package v1
import (
+ monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
corev1 "k8s.io/api/core/v1"
)
@@ -32,7 +33,7 @@ type OAuth2ApplyConfiguration struct {
// client's secret.
ClientSecret *corev1.SecretKeySelector `json:"clientSecret,omitempty"`
// tokenUrl defines the URL to fetch the token from.
- TokenURL *string `json:"tokenUrl,omitempty"`
+ TokenURL *monitoringv1.URL `json:"tokenUrl,omitempty"`
// scopes defines the OAuth2 scopes used for the token request.
Scopes []string `json:"scopes,omitempty"`
// endpointParams configures the HTTP parameters to append to the token
@@ -71,7 +72,7 @@ func (b *OAuth2ApplyConfiguration) WithClientSecret(value corev1.SecretKeySelect
// WithTokenURL sets the TokenURL field in the declarative configuration to the given value
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
// If called multiple times, the TokenURL field is set to the value of the last call.
-func (b *OAuth2ApplyConfiguration) WithTokenURL(value string) *OAuth2ApplyConfiguration {
+func (b *OAuth2ApplyConfiguration) WithTokenURL(value monitoringv1.URL) *OAuth2ApplyConfiguration {
b.TokenURL = &value
return b
}
From 5e1a48f434be2c4b6061616bd72b04f843b732e1 Mon Sep 17 00:00:00 2001
From: dongjiang
Date: Tue, 26 May 2026 17:47:07 +0800
Subject: [PATCH 36/81] refactor(crd): refactoring `resource.Quantity` validate
(#8569)
* refactoring resource.Quantity validate
Signed-off-by: dongjiang
* fix codereview bug
Signed-off-by: dongjiang
* Update pkg/apis/monitoring/v1/types.go
Co-authored-by: Simon Pasquier
---------
Signed-off-by: dongjiang
Co-authored-by: Simon Pasquier
---
pkg/apis/monitoring/v1/types.go | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/pkg/apis/monitoring/v1/types.go b/pkg/apis/monitoring/v1/types.go
index 95eb1652f44..8fa7baed626 100644
--- a/pkg/apis/monitoring/v1/types.go
+++ b/pkg/apis/monitoring/v1/types.go
@@ -1077,10 +1077,8 @@ func (tc *TracingConfig) Validate() error {
}
if tc.SamplingFraction != nil {
- min, _ := resource.ParseQuantity("0")
- max, _ := resource.ParseQuantity("1")
-
- if tc.SamplingFraction.Cmp(min) < 0 || tc.SamplingFraction.Cmp(max) > 0 {
+ v := tc.SamplingFraction.AsApproximateFloat64()
+ if v < 0 || v > 1 {
return fmt.Errorf("`samplingFraction` must be between 0 and 1")
}
}
From ea5e57f1b90e79c351f600ba6212be1177013337 Mon Sep 17 00:00:00 2001
From: Lohit Kolluri
Date: Tue, 26 May 2026 17:13:24 +0530
Subject: [PATCH 37/81] chore(api): enable notimestamp KAL linter
Enable the notimestamp kube-api-linter rule for monitoring API types.
Existing legacy Timestamp field names remain allowed via nolint comments.
Fixes #8127
---
.golangci-kal.yml | 1 +
1 file changed, 1 insertion(+)
diff --git a/.golangci-kal.yml b/.golangci-kal.yml
index f750f3aa181..17cfa1a985e 100644
--- a/.golangci-kal.yml
+++ b/.golangci-kal.yml
@@ -35,6 +35,7 @@ linters:
- "statusoptional"
- "nophase"
- "nonullable"
+ - "notimestamp"
- "forbiddenmarkers"
- "nomaps"
disable:
From 38e3a7b2c8acbd73816f95ad92fb0cf74511eae6 Mon Sep 17 00:00:00 2001
From: dongjiang
Date: Wed, 27 May 2026 20:34:52 +0800
Subject: [PATCH 38/81] update .golangci-kal.yml
Signed-off-by: dongjiang
---
.golangci-kal.yml | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/.golangci-kal.yml b/.golangci-kal.yml
index 17cfa1a985e..5643ace6ffa 100644
--- a/.golangci-kal.yml
+++ b/.golangci-kal.yml
@@ -23,21 +23,23 @@ linters:
# Whenever a new linter is added, it should not break the backward
# compatibility of existing APIs (at least for v1 APIs).
enable:
- - "nobools"
- "commentstart"
- "conflictingmarkers"
- "duplicatemarkers"
+ - "forbiddenmarkers"
+ - "nobools"
+ - "nodurations"
- "nofloats"
- - "optionalorrequired"
- - "statussubresource"
- - "uniquemarkers"
- - "jsontags"
- - "statusoptional"
+ - "nomaps"
- "nophase"
- "nonullable"
+ - "noreferences"
- "notimestamp"
- - "forbiddenmarkers"
- - "nomaps"
+ - "optionalorrequired"
+ - "jsontags"
+ - "statusoptional"
+ - "statussubresource"
+ - "uniquemarkers"
disable:
- "*"
lintersConfig:
From 2123c6ea27632d76f286fcc761962ae97b13e0d1 Mon Sep 17 00:00:00 2001
From: Nutmos
Date: Wed, 27 May 2026 21:47:08 +0800
Subject: [PATCH 39/81] Merge pull request #8273 from
nutmos/feat/add-missing-e2e-am-receivers
Feat: Add E2E test case to cover new receivers and AM Config and Global Config
---
test/e2e/alertmanager_test.go | 121 +++++++++++++++++++++++++++++++---
1 file changed, 112 insertions(+), 9 deletions(-)
diff --git a/test/e2e/alertmanager_test.go b/test/e2e/alertmanager_test.go
index 7f1d81b4e69..622ad351cef 100644
--- a/test/e2e/alertmanager_test.go
+++ b/test/e2e/alertmanager_test.go
@@ -1076,6 +1076,18 @@ func testAlertmanagerConfigCRD(t *testing.T) {
_, err = framework.KubeClient.CoreV1().Secrets(configNs).Create(context.Background(), webexAPITokenSecret, metav1.CreateOptions{})
require.NoError(t, err)
+ msteamsWebhookURL := "https://msteams.webhook.url"
+ msteamsSecret := &corev1.Secret{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "msteams",
+ },
+ Data: map[string][]byte{
+ "webhook-url": []byte(msteamsWebhookURL),
+ },
+ }
+ _, err = framework.KubeClient.CoreV1().Secrets(configNs).Create(context.Background(), msteamsSecret, metav1.CreateOptions{})
+ require.NoError(t, err)
+
// A valid AlertmanagerConfig resource with many receivers.
configCR := &monitoringv1alpha1.AlertmanagerConfig{
ObjectMeta: metav1.ObjectMeta{
@@ -1224,15 +1236,9 @@ func testAlertmanagerConfigCRD(t *testing.T) {
},
},
WebexConfigs: []monitoringv1alpha1.WebexConfig{{
- APIURL: func() *monitoringv1alpha1.URL {
- res := monitoringv1alpha1.URL("https://webex.api.url")
- return &res
- }(),
- RoomID: "testingRoomID",
- Message: func() *string {
- res := "testingMessage"
- return &res
- }(),
+ APIURL: ptr.To(monitoringv1alpha1.URL("https://webex.api.url")),
+ RoomID: "testingRoomID",
+ Message: new("testingMessage"),
HTTPConfig: &monitoringv1alpha1.HTTPConfig{
Authorization: &monitoringv1.SafeAuthorization{
Type: "Bearer",
@@ -1245,6 +1251,15 @@ func testAlertmanagerConfigCRD(t *testing.T) {
},
},
}},
+ MSTeamsConfigs: []monitoringv1alpha1.MSTeamsConfig{{
+ WebhookURL: corev1.SecretKeySelector{
+ LocalObjectReference: corev1.LocalObjectReference{
+ Name: "msteams",
+ },
+ Key: "webhook-url",
+ },
+ Title: new("Alert"),
+ }},
}},
},
}
@@ -1590,6 +1605,9 @@ receivers:
api_url: https://webex.api.url
message: testingMessage
room_id: testingRoomID
+ msteams_configs:
+ - webhook_url: https://msteams.webhook.url
+ title: Alert
- name: %s/e2e-test-amconfig-sub-routes/e2e
webhook_configs:
- url: http://test.url
@@ -1968,6 +1986,49 @@ func testUserDefinedAlertmanagerConfigFromCustomResource(t *testing.T) {
},
},
},
+ TelegramConfig: &monitoringv1.GlobalTelegramConfig{
+ APIURL: ptr.To(monitoringv1.URL("https://telegram.api.url")),
+ },
+ WeChatConfig: &monitoringv1.GlobalWeChatConfig{
+ APIURL: ptr.To(monitoringv1.URL("https://wechat.api.url")),
+ APISecret: &corev1.SecretKeySelector{
+ LocalObjectReference: corev1.LocalObjectReference{
+ Name: "wechat",
+ },
+ Key: "apisecret",
+ },
+ APICorpID: new("abc123"),
+ },
+ VictorOpsConfig: &monitoringv1.GlobalVictorOpsConfig{
+ APIURL: ptr.To(monitoringv1.URL("https://victorops.api.url")),
+ APIKey: &corev1.SecretKeySelector{
+ LocalObjectReference: corev1.LocalObjectReference{
+ Name: "victorops",
+ },
+ Key: "apikey",
+ },
+ },
+ JiraConfig: &monitoringv1.GlobalJiraConfig{
+ APIURL: ptr.To(monitoringv1.URL("https://jira.api.url")),
+ },
+ RocketChatConfig: &monitoringv1.GlobalRocketChatConfig{
+ APIURL: ptr.To(monitoringv1.URL("https://rocketchat.api.url")),
+ Token: &corev1.SecretKeySelector{
+ LocalObjectReference: corev1.LocalObjectReference{
+ Name: "rocketchat",
+ },
+ Key: "token",
+ },
+ TokenID: &corev1.SecretKeySelector{
+ LocalObjectReference: corev1.LocalObjectReference{
+ Name: "rocketchat",
+ },
+ Key: "tokenid",
+ },
+ },
+ WebexConfig: &monitoringv1.GlobalWebexConfig{
+ APIURL: ptr.To(monitoringv1.URL("https://webex.api.url")),
+ },
},
Templates: []monitoringv1.SecretOrConfigMap{
{
@@ -2033,6 +2094,31 @@ func testUserDefinedAlertmanagerConfigFromCustomResource(t *testing.T) {
"template2.tmpl": "template2",
},
}
+ victorops := corev1.Secret{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "victorops",
+ },
+ Data: map[string][]byte{
+ "apikey": []byte(`abcdef1234567890`),
+ },
+ }
+ wechat := corev1.Secret{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "wechat",
+ },
+ Data: map[string][]byte{
+ "apisecret": []byte(`abcdef1234567890`),
+ },
+ }
+ rocketchat := corev1.Secret{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "rocketchat",
+ },
+ Data: map[string][]byte{
+ "token": []byte(`abcdef1234567890`),
+ "tokenid": []byte(`abc123`),
+ },
+ }
ctx := context.Background()
_, err = framework.KubeClient.CoreV1().ConfigMaps(ns).Create(ctx, &cm, metav1.CreateOptions{})
@@ -2045,6 +2131,12 @@ func testUserDefinedAlertmanagerConfigFromCustomResource(t *testing.T) {
require.NoError(t, err)
_, err = framework.KubeClient.CoreV1().ConfigMaps(ns).Create(ctx, &tpl2, metav1.CreateOptions{})
require.NoError(t, err)
+ _, err = framework.KubeClient.CoreV1().Secrets(ns).Create(ctx, &victorops, metav1.CreateOptions{})
+ require.NoError(t, err)
+ _, err = framework.KubeClient.CoreV1().Secrets(ns).Create(ctx, &wechat, metav1.CreateOptions{})
+ require.NoError(t, err)
+ _, err = framework.KubeClient.CoreV1().Secrets(ns).Create(ctx, &rocketchat, metav1.CreateOptions{})
+ require.NoError(t, err)
_, err = framework.CreateAlertmanagerAndWaitUntilReady(ctx, alertmanager)
require.NoError(t, err)
@@ -2069,6 +2161,17 @@ func testUserDefinedAlertmanagerConfigFromCustomResource(t *testing.T) {
smtp_auth_secret: secret
smtp_auth_identity: dev@smtp.example.org
smtp_require_tls: true
+ wechat_api_url: https://wechat.api.url
+ wechat_api_secret: abcdef1234567890
+ wechat_api_corp_id: abc123
+ victorops_api_url: https://victorops.api.url
+ victorops_api_key: abcdef1234567890
+ telegram_api_url: https://telegram.api.url
+ webex_api_url: https://webex.api.url
+ jira_api_url: https://jira.api.url
+ rocketchat_api_url: https://rocketchat.api.url
+ rocketchat_token: abcdef1234567890
+ rocketchat_token_id: abc123
route:
receiver: %[1]s
routes:
From 336ed11d347ec4d036f44ba2df14f89dde6edf1c Mon Sep 17 00:00:00 2001
From: Lohit Kolluri
Date: Wed, 27 May 2026 09:33:17 +0530
Subject: [PATCH 40/81] test: fix testThanosRulerStateless duplicate ALERTS
Apply RuleSelector=nil before creating Prometheus so it does not
evaluate rules alongside Thanos Ruler remote-write.
---
test/e2e/thanosruler_test.go | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/test/e2e/thanosruler_test.go b/test/e2e/thanosruler_test.go
index 0e175a53b18..1740eed1242 100644
--- a/test/e2e/thanosruler_test.go
+++ b/test/e2e/thanosruler_test.go
@@ -574,9 +574,9 @@ func testThanosRulerStateless(t *testing.T) {
// remote-write receiver for Thanos ruler.
prometheus := framework.MakeBasicPrometheus(ns, name, name, 1)
prometheus.Spec.EnableRemoteWriteReceiver = true
- prometheus, err := framework.CreatePrometheusAndWaitUntilReady(ctx, ns, prometheus)
- // Ensure that the Promehteus resource selects no rule.
+ // Ensure that Prometheus does not evaluate rules; only Thanos Ruler should.
prometheus.Spec.RuleSelector = nil
+ prometheus, err := framework.CreatePrometheusAndWaitUntilReady(ctx, ns, prometheus)
require.NoError(t, err)
promSVC := framework.MakePrometheusService(prometheus.Name, name, corev1.ServiceTypeClusterIP)
From 2fb25bc49dc883abc5b95e0708c0982282a0ae2b Mon Sep 17 00:00:00 2001
From: Lohit Kolluri
Date: Wed, 27 May 2026 21:13:02 +0530
Subject: [PATCH 41/81] pkg/prometheus: validate Probe static target labels
Reject invalid label names in Probe static target labels based on the Prometheus version.
Also validate static target labels in a deterministic order.
Signed-off-by: Lohit Kolluri
---
CHANGELOG.md | 4 ++++
pkg/prometheus/resource_selector.go | 21 +++++++++++++++++----
pkg/prometheus/resource_selector_test.go | 23 +++++++++++++++++++++++
3 files changed, 44 insertions(+), 4 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index eabe63ded94..5266ee80b7e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## UNRELEASED
+
+* [BUGFIX] Validate target labels in `Probe` static configuration to prevent invalid Prometheus scrape configs. #7901
+
## 0.91.0 / 2026-05-05
* [CHANGE] Enforce mutual exclusion of `basicAuth`, `authorization` and `oauth2` in `ScrapeConfig` CRD. #8480
diff --git a/pkg/prometheus/resource_selector.go b/pkg/prometheus/resource_selector.go
index 3a3bb274256..9fb24b449a2 100644
--- a/pkg/prometheus/resource_selector.go
+++ b/pkg/prometheus/resource_selector.go
@@ -19,6 +19,7 @@ import (
"errors"
"fmt"
"log/slog"
+ "maps"
"net"
"net/url"
"slices"
@@ -470,6 +471,9 @@ func (rs *ResourceSelector) checkProbe(ctx context.Context, probe *monitoringv1.
}
if probe.Spec.Targets.StaticConfig != nil {
+ if err := rs.validateStaticConfigLabels(probe.Spec.Targets.StaticConfig.Labels); err != nil {
+ return fmt.Errorf("targets.staticConfig.labels: %w", err)
+ }
if err := rs.ValidateRelabelConfigs(probe.Spec.Targets.StaticConfig.RelabelConfigs); err != nil {
return fmt.Errorf("targets.staticConfig.relabelConfigs: %w", err)
}
@@ -492,6 +496,17 @@ func (rs *ResourceSelector) checkProbe(ctx context.Context, probe *monitoringv1.
return nil
}
+func (rs *ResourceSelector) validateStaticConfigLabels(labels map[string]string) error {
+ keys := slices.Collect(maps.Keys(labels))
+ slices.Sort(keys)
+ for _, labelName := range keys {
+ if !isValidLabelName(labelName, rs.version) {
+ return fmt.Errorf("invalid label %q", labelName)
+ }
+ }
+ return nil
+}
+
// validateProberURL checks that the prober URL is a valid host or host:port.
// We use govalidator.IsHost() because the standard library doesn't offer a
// single function that validates a string as an IP (v4/v6) or DNS hostname.
@@ -1317,10 +1332,8 @@ func (rs *ResourceSelector) validateScalewaySDConfigs(ctx context.Context, sc *m
func (rs *ResourceSelector) validateStaticConfig(sc *monitoringv1alpha1.ScrapeConfig) error {
for i, config := range sc.Spec.StaticConfigs {
- for labelName := range config.Labels {
- if !isValidLabelName(labelName, rs.version) {
- return fmt.Errorf("[%d]: invalid label in map %s", i, labelName)
- }
+ if err := rs.validateStaticConfigLabels(config.Labels); err != nil {
+ return fmt.Errorf("[%d]: %w", i, err)
}
}
diff --git a/pkg/prometheus/resource_selector_test.go b/pkg/prometheus/resource_selector_test.go
index 919645bd831..444077da704 100644
--- a/pkg/prometheus/resource_selector_test.go
+++ b/pkg/prometheus/resource_selector_test.go
@@ -317,6 +317,29 @@ func TestSelectProbes(t *testing.T) {
},
valid: true,
},
+ {
+ scenario: "valid static target labels",
+ updateSpec: func(ps *monitoringv1.ProbeSpec) {
+ ps.Targets.StaticConfig.Labels = map[string]string{"owner": "team-a"}
+ },
+ valid: true,
+ },
+ {
+ scenario: "invalid static target label with prom2",
+ updateSpec: func(ps *monitoringv1.ProbeSpec) {
+ ps.Targets.StaticConfig.Labels = map[string]string{"cluster-id": "xxx"}
+ },
+ promVersion: "2.55.0",
+ valid: false,
+ },
+ {
+ scenario: "static target label with prom3",
+ promVersion: "3.0.0",
+ updateSpec: func(ps *monitoringv1.ProbeSpec) {
+ ps.Targets.StaticConfig.Labels = map[string]string{"cluster-id": "xxx"}
+ },
+ valid: true,
+ },
{
scenario: "utf-8 static relabeling config with prom2",
updateSpec: func(ps *monitoringv1.ProbeSpec) {
From de96e39848b2895964686a9a0e66be886e0e0db6 Mon Sep 17 00:00:00 2001
From: dongjiang
Date: Thu, 28 May 2026 18:55:58 +0800
Subject: [PATCH 42/81] changet url string to URL type (#8596)
Signed-off-by: dongjiang
---
bundle.yaml | 6 +++++-
.../monitoring.coreos.com_prometheuses.yaml | 6 +++++-
.../monitoring.coreos.com_prometheuses.yaml | 6 +++++-
jsonnet/prometheus-operator/prometheuses-crd.json | 3 ++-
pkg/apis/monitoring/v1/prometheus_types.go | 4 +++-
.../applyconfiguration/monitoring/v1/remotereadspec.go | 6 ++++--
6 files changed, 24 insertions(+), 7 deletions(-)
diff --git a/bundle.yaml b/bundle.yaml
index e6c732bff06..83c106d48cb 100644
--- a/bundle.yaml
+++ b/bundle.yaml
@@ -43790,7 +43790,11 @@ spec:
type: string
type: object
url:
- description: url defines the URL of the endpoint to query from.
+ description: |-
+ url defines the URL of the endpoint to query from.
+
+ It must use the HTTP or HTTPS scheme.
+ pattern: ^(http|https)://.+$
type: string
required:
- url
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
index 4fb9bf3116b..db655a7a09c 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
@@ -7051,7 +7051,11 @@ spec:
type: string
type: object
url:
- description: url defines the URL of the endpoint to query from.
+ description: |-
+ url defines the URL of the endpoint to query from.
+
+ It must use the HTTP or HTTPS scheme.
+ pattern: ^(http|https)://.+$
type: string
required:
- url
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
index 4fb9bf3116b..db655a7a09c 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
@@ -7051,7 +7051,11 @@ spec:
type: string
type: object
url:
- description: url defines the URL of the endpoint to query from.
+ description: |-
+ url defines the URL of the endpoint to query from.
+
+ It must use the HTTP or HTTPS scheme.
+ pattern: ^(http|https)://.+$
type: string
required:
- url
diff --git a/jsonnet/prometheus-operator/prometheuses-crd.json b/jsonnet/prometheus-operator/prometheuses-crd.json
index 6ab6a1384b3..b166d5bfc8f 100644
--- a/jsonnet/prometheus-operator/prometheuses-crd.json
+++ b/jsonnet/prometheus-operator/prometheuses-crd.json
@@ -5966,7 +5966,8 @@
"type": "object"
},
"url": {
- "description": "url defines the URL of the endpoint to query from.",
+ "description": "url defines the URL of the endpoint to query from.\n\nIt must use the HTTP or HTTPS scheme.",
+ "pattern": "^(http|https)://.+$",
"type": "string"
}
},
diff --git a/pkg/apis/monitoring/v1/prometheus_types.go b/pkg/apis/monitoring/v1/prometheus_types.go
index f9b111277f5..b1e4be71667 100644
--- a/pkg/apis/monitoring/v1/prometheus_types.go
+++ b/pkg/apis/monitoring/v1/prometheus_types.go
@@ -2069,8 +2069,10 @@ type AzureWorkloadIdentity struct {
// +k8s:openapi-gen=true
type RemoteReadSpec struct {
// url defines the URL of the endpoint to query from.
+ //
+ // It must use the HTTP or HTTPS scheme.
// +required
- URL string `json:"url"`
+ URL URL `json:"url"`
// name of the remote read queue, it must be unique if specified. The
// name is used in metrics and logging in order to differentiate read
diff --git a/pkg/client/applyconfiguration/monitoring/v1/remotereadspec.go b/pkg/client/applyconfiguration/monitoring/v1/remotereadspec.go
index eb16390a246..6720cee0eac 100644
--- a/pkg/client/applyconfiguration/monitoring/v1/remotereadspec.go
+++ b/pkg/client/applyconfiguration/monitoring/v1/remotereadspec.go
@@ -28,7 +28,9 @@ import (
// from a remote endpoint.
type RemoteReadSpecApplyConfiguration struct {
// url defines the URL of the endpoint to query from.
- URL *string `json:"url,omitempty"`
+ //
+ // It must use the HTTP or HTTPS scheme.
+ URL *monitoringv1.URL `json:"url,omitempty"`
// name of the remote read queue, it must be unique if specified. The
// name is used in metrics and logging in order to differentiate read
// configurations.
@@ -94,7 +96,7 @@ func RemoteReadSpec() *RemoteReadSpecApplyConfiguration {
// WithURL sets the URL field in the declarative configuration to the given value
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
// If called multiple times, the URL field is set to the value of the last call.
-func (b *RemoteReadSpecApplyConfiguration) WithURL(value string) *RemoteReadSpecApplyConfiguration {
+func (b *RemoteReadSpecApplyConfiguration) WithURL(value monitoringv1.URL) *RemoteReadSpecApplyConfiguration {
b.URL = &value
return b
}
From fdb112d9d28e5756f8fe681368070233b68c9092 Mon Sep 17 00:00:00 2001
From: Lohit Kolluri
Date: Thu, 28 May 2026 20:14:42 +0530
Subject: [PATCH 43/81] docs: clarify attachMetadata.node label behavior
Clarify in the API docs that attachMetadata.node only exposes node labels at
discovery time (as __meta_kubernetes_node_label_*), and that relabeling is
required to copy selected labels onto scraped metrics.
Regenerate CRDs, bundle, and API reference docs.
Fixes #7166
Signed-off-by: Lohit Kolluri
---
Documentation/api-reference/api.md | 859 ++++++++++++++++--
bundle.yaml | 16 +
.../monitoring.coreos.com_podmonitors.yaml | 4 +
...onitoring.coreos.com_prometheusagents.yaml | 4 +
.../monitoring.coreos.com_prometheuses.yaml | 4 +
...monitoring.coreos.com_servicemonitors.yaml | 4 +
.../monitoring.coreos.com_podmonitors.yaml | 4 +
...onitoring.coreos.com_prometheusagents.yaml | 4 +
.../monitoring.coreos.com_prometheuses.yaml | 4 +
...monitoring.coreos.com_servicemonitors.yaml | 4 +
.../prometheus-operator/podmonitors-crd.json | 2 +-
.../prometheusagents-crd.json | 2 +-
.../prometheus-operator/prometheuses-crd.json | 2 +-
.../servicemonitors-crd.json | 2 +-
pkg/apis/monitoring/v1/types.go | 4 +
.../monitoring/v1/attachmetadata.go | 4 +
16 files changed, 834 insertions(+), 89 deletions(-)
diff --git a/Documentation/api-reference/api.md b/Documentation/api-reference/api.md
index 315e8cc7826..7f179a1b60a 100644
--- a/Documentation/api-reference/api.md
+++ b/Documentation/api-reference/api.md
@@ -445,6 +445,18 @@ map[string]string
+schedulerName
+
+string
+
+
+
+(Optional)
+schedulerName defines the scheduler to use for Pod scheduling. If not specified, the default scheduler is used.
+
+
+
+
resources
@@ -2203,7 +2215,8 @@ gzipped Prometheus configuration under the prometheus.yaml.gz key.
This behavior is deprecated and will be removed in the next major version
of the custom resource definition. It is recommended to use
spec.additionalScrapeConfigs instead.
-Note that the ScrapeConfig custom resource definition is currently at Alpha level.
+Note that the ScrapeConfig custom resource definition is currently at Alpha level
+and will be graduated to Beta in a future release.
@@ -2220,7 +2233,8 @@ Kubernetes meta/v1.LabelSelector
scrapeConfigNamespaceSelector defines the namespaces to match for ScrapeConfig discovery. An empty label selector
matches all namespaces. A null label selector matches the current
namespace only.
-Note that the ScrapeConfig custom resource definition is currently at Alpha level.
+Note that the ScrapeConfig custom resource definition is currently at Alpha level
+and will be graduated to Beta in a future release.
@@ -2349,6 +2363,22 @@ the label value isn’t empty, all Prometheus shards will scrape the target.
+shardingStrategy
+
+
+ShardingStrategy
+
+
+
+
+(Optional)
+shardingStrategy defines the sharding strategy for distributing scraped targets across Prometheus shards.
+When not defined, the operator defaults to the ‘Address’ mode which distributes
+targets based on a hash of the target address.
+
+
+
+
replicaExternalLabelName
string
@@ -2666,6 +2696,18 @@ map[string]string
+schedulerName
+
+string
+
+
+
+(Optional)
+schedulerName defines the scheduler to use for Pod scheduling. If not specified, the default scheduler is used.
+
+
+
+
serviceAccountName
string
@@ -4818,6 +4860,18 @@ map[string]string
+schedulerName
+
+string
+
+
+
+(Optional)
+schedulerName defines the scheduler to use for Pod scheduling. If not specified, the default scheduler is used.
+
+
+
+
resources
@@ -5515,17 +5569,16 @@ string
grpcServerTlsConfig
-
-TLSConfig
+
+GRPCServerTLSConfig
(Optional)
grpcServerTlsConfig defines the gRPC server from which Thanos Querier reads
-recorded rule data.
-Note: Currently only the CAFile, CertFile, and KeyFile fields are supported.
-Maps to the ‘–grpc-server-tls-*’ CLI args.
+recorded rule data.
+Note: Currently only the minVersion, caFile, certFile, keyFile, cipherSuites and curves fields are supported.
@@ -6571,6 +6624,20 @@ GlobalWeChatConfig
wechat defines the default WeChat Config
+
+
+mattermost
+
+
+GlobalMattermostConfig
+
+
+
+
+(Optional)
+mattermost defines the default Mattermost Config
+
+
-Note that the ScrapeConfig custom resource definition is currently at Alpha level.
+Note that the ScrapeConfig custom resource definition is currently at Alpha level
+and will be graduated to Beta in a future release.
@@ -8454,7 +8537,8 @@ Kubernetes meta/v1.LabelSelector
scrapeConfigNamespaceSelector defines the namespaces to match for ScrapeConfig discovery. An empty label selector
matches all namespaces. A null label selector matches the current
namespace only.
-Note that the ScrapeConfig custom resource definition is currently at Alpha level.
+Note that the ScrapeConfig custom resource definition is currently at Alpha level
+and will be graduated to Beta in a future release.
@@ -8583,6 +8667,22 @@ the label value isn’t empty, all Prometheus shards will scrape the target.
+shardingStrategy
+
+
+ShardingStrategy
+
+
+
+
+(Optional)
+shardingStrategy defines the sharding strategy for distributing scraped targets across Prometheus shards.
+When not defined, the operator defaults to the ‘Address’ mode which distributes
+targets based on a hash of the target address.
+
+
+
+
replicaExternalLabelName
string
@@ -8900,6 +9000,18 @@ map[string]string
+schedulerName
+
+string
+
+
+
+(Optional)
+schedulerName defines the scheduler to use for Pod scheduling. If not specified, the default scheduler is used.
+
+
+
+
serviceAccountName
string
@@ -10648,7 +10760,7 @@ Kubernetes core/v1.VolumeResourceRequirements
(Optional)
resources represents the minimum resources the volume should have.
-If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements
+Users are allowed to specify resource requirements
that are lower than previous value but must still be higher than capacity recorded in the
status field of the claim.
More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources
@@ -11213,6 +11325,192 @@ than zero disables the storage.
+GRPCServerTLSConfig
+
+
+(Appears on: ThanosRulerSpec , ThanosSpec )
+
+
+
GRPCServerTLSConfig defines TLS configuration for a gRPC server.
+
+
+
+
+Field
+Description
+
+
+
+
+
+ca
+
+
+SecretOrConfigMap
+
+
+
+
+(Optional)
+ca defines the Certificate authority used when verifying server certificates.
+
+
+
+
+cert
+
+
+SecretOrConfigMap
+
+
+
+
+(Optional)
+cert defines the Client certificate to present when doing client-authentication.
+
+
+
+
+keySecret
+
+
+Kubernetes core/v1.SecretKeySelector
+
+
+
+
+(Optional)
+keySecret defines the Secret containing the client key file for the targets.
+
+
+
+
+serverName
+
+string
+
+
+
+(Optional)
+serverName is used to verify the hostname for the targets.
+
+
+
+
+insecureSkipVerify
+
+bool
+
+
+
+(Optional)
+insecureSkipVerify defines how to disable target certificate validation.
+
+
+
+
+minVersion
+
+
+TLSVersion
+
+
+
+
+(Optional)
+minVersion defines the minimum acceptable TLS version.
+It requires Prometheus >= v2.35.0 or Thanos >= v0.28.0.
+
+
+
+
+maxVersion
+
+
+TLSVersion
+
+
+
+
+(Optional)
+maxVersion defines the maximum acceptable TLS version.
+It requires Prometheus >= v2.41.0 or Thanos >= v0.31.0.
+
+
+
+
+caFile
+
+string
+
+
+
+(Optional)
+caFile defines the path to the CA cert in the Prometheus container to use for the targets.
+
+
+
+
+certFile
+
+string
+
+
+
+(Optional)
+certFile defines the path to the client cert file in the Prometheus container for the targets.
+
+
+
+
+keyFile
+
+string
+
+
+
+(Optional)
+keyFile defines the path to the client key file in the Prometheus container for the targets.
+
+
+
+
+cipherSuites
+
+[]string
+
+
+
+(Optional)
+cipherSuites defines the list of supported cipher suites for TLS
+versions up to TLS 1.2.
+If not defined, the Go default cipher suites are used.
+Available cipher suites are documented in the Go documentation:
+https://golang.org/pkg/crypto/tls/#pkg-constants
+It requires Thanos >= v0.42.0. Note that the operator doesn’t verify if
+the Thanos version supports the provided values.
+
+
+
+
+curves
+
+[]string
+
+
+
+(Optional)
+curves defines the list of preferred elliptic curves for
+TLS handshakes.
+If not defined, the Go default curves are used.
+Available curves are documented in the Go documentation:
+https://golang.org/pkg/crypto/tls/#CurveID
+It requires Thanos >= v0.42.0. Note that the operator doesn’t verify if
+the Thanos version supports the provided values.
+
+
+
+
GlobalJiraConfig
@@ -11246,6 +11544,39 @@ URL
+
GlobalMattermostConfig
+
+
+(Appears on: AlertmanagerGlobalConfig )
+
+
+
GlobalMattermostConfig configures global Mattermost parameters.
+
+
+
+
+Field
+Description
+
+
+
+
+
+webhookURL
+
+
+Kubernetes core/v1.SecretKeySelector
+
+
+
+
+(Optional)
+webhookURL defines the default Mattermost Webhook URL.
+It requires Alertmanager >= v0.32.0.
+
+
+
+
GlobalRocketChatConfig
@@ -12801,7 +13132,9 @@ client’s secret.
tokenUrl
-string
+
+URL
+
@@ -13018,6 +13351,38 @@ As per the OpenTelemetry specification, the aforementioned scope metadata should
It requires Prometheus >= v3.6.0.
+
+
+labelNameUnderscoreSanitization
+
+bool
+
+
+
+(Optional)
+labelNameUnderscoreSanitization controls whether to enable prepending of ‘key’ to labels starting with ‘ ’.
+Reserved labels starting with ‘__’ are not modified.
+This is only relevant when translation_strategy uses underscore escaping (e.g., “UnderscoreEscapingWithSuffixes” or “UnderscoreEscapingWithoutSuffixes”).
+Notice: This one has no impact if nameEscapingScheme is AllowUTF8.
+It requires Prometheus >= v3.8.0.
+
+
+
+
+labelNamePreserveMultipleUnderscores
+
+bool
+
+
+
+(Optional)
+labelNamePreserveMultipleUnderscores enables preserving of multiple consecutive underscores in label names when translation_strategy uses
+underscore escaping.
+When true (default), multiple consecutive underscores are preserved during label name sanitization.
+Notice: This one has no impact if nameEscapingScheme is AllowUTF8.
+It requires Prometheus >= v3.8.0.
+
+
ObjectReference
@@ -14976,7 +15341,8 @@ gzipped Prometheus configuration under the prometheus.yaml.gz key.
This behavior is deprecated and will be removed in the next major version
of the custom resource definition. It is recommended to use
spec.additionalScrapeConfigs instead.
- Note that the ScrapeConfig custom resource definition is currently at Alpha level.
+Note that the ScrapeConfig custom resource definition is currently at Alpha level
+and will be graduated to Beta in a future release.
@@ -14993,7 +15359,8 @@ Kubernetes meta/v1.LabelSelector
scrapeConfigNamespaceSelector defines the namespaces to match for ScrapeConfig discovery. An empty label selector
matches all namespaces. A null label selector matches the current
namespace only.
-Note that the ScrapeConfig custom resource definition is currently at Alpha level.
+Note that the ScrapeConfig custom resource definition is currently at Alpha level
+and will be graduated to Beta in a future release.
@@ -15122,6 +15489,22 @@ the label value isn’t empty, all Prometheus shards will scrape the target.
+shardingStrategy
+
+
+ShardingStrategy
+
+
+
+
+(Optional)
+shardingStrategy defines the sharding strategy for distributing scraped targets across Prometheus shards.
+When not defined, the operator defaults to the ‘Address’ mode which distributes
+targets based on a hash of the target address.
+
+
+
+
replicaExternalLabelName
string
@@ -15439,6 +15822,18 @@ map[string]string
+schedulerName
+
+string
+
+
+
+(Optional)
+schedulerName defines the scheduler to use for Pod scheduling. If not specified, the default scheduler is used.
+
+
+
+
serviceAccountName
string
@@ -17811,11 +18206,14 @@ to a remote endpoint.
url
-string
+
+URL
+
url defines the URL of the endpoint to send samples to.
+It must use the HTTP or HTTPS scheme.
@@ -18204,7 +18602,8 @@ Duration
-retentionPeriod defines the retentionPeriod for shard retention policy.
+retentionPeriod defines how long the scaled-down shard(s) need to be
+kept before being deleted.
@@ -19451,8 +19850,11 @@ RetainConfig
(Optional)
-retain defines the config for retention when the retention policy is set to Retain.
-This field is ineffective as of now.
+retain defines the config for retention when the retention policy is set
+to Retain.
+If not defined, the operator will use the retention duration configured
+for the Prometheus data. If the resource uses size-based retention, the
+shard(s) are kept forever (unless manually deleted).
@@ -19531,6 +19933,85 @@ int32
+ShardingStrategy
+
+
+(Appears on: CommonPrometheusFields )
+
+
+
ShardingStrategy defines the sharding strategy for Prometheus.
+
+
+
+
+Field
+Description
+
+
+
+
+
+mode
+
+
+ShardingStrategyMode
+
+
+
+
+(Optional)
+mode defines the sharding mode. Can be ‘Address’ or ‘Topology’.
+‘Address’ is the default mode and distributes targets across shards
+based on a hash of the target address.
+‘Topology’ enables zone-aware sharding where each shard is assigned to a
+specific topology zone and only scrapes targets in that zone.
+(Alpha) Using the ‘Topology’ mode requires the PrometheusTopologySharding
+feature gate to be enabled.
+
+
+
+
+topology
+
+
+TopologyShardingStrategy
+
+
+
+
+(Optional)
+topology defines the configuration for topology-aware sharding.
+This field is only valid when mode is set to ‘Topology’.
+
+
+
+
+ShardingStrategyMode
+(string alias)
+
+(Appears on: ShardingStrategy )
+
+
+
ShardingStrategyMode defines the sharding mode for Prometheus.
+
+
+
+
+Value
+Description
+
+
+"Address"
+AddressShardingStrategyMode is the default sharding mode.
+Targets are distributed across shards based on a hash of the target address.
+
+"Topology"
+TopologyShardingStrategyMode enables zone-aware sharding.
+Each shard is assigned to a specific topology zone and only scrapes targets in that zone.
+(Alpha) Using this mode requires the PrometheusTopologySharding feature gate to be enabled.
+
+
+
Sigv4
@@ -19616,6 +20097,19 @@ string
+externalId
+
+string
+
+
+
+(Optional)
+externalId defines the external ID used when assuming an AWS role. Can only be used with roleArn.
+It requires Prometheus >= v3.11.0 or Alertmanager >= v0.33.0. Currently not supported by Thanos.
+
+
+
+
useFIPSSTSEndpoint
bool
@@ -19797,7 +20291,7 @@ is to use a label selector alongside manually created PersistentVolumes.
TLSConfig
-(Appears on: APIServerConfig , AlertmanagerEndpoints , HTTPConfigWithTLSFiles , RemoteReadSpec , RemoteWriteSpec , ScrapeClass , ThanosRulerSpec , ThanosSpec , TracingConfig )
+(Appears on: APIServerConfig , AlertmanagerEndpoints , GRPCServerTLSConfig , HTTPConfigWithTLSFiles , RemoteReadSpec , RemoteWriteSpec , ScrapeClass , TracingConfig )
TLSConfig defines full TLS configuration.
@@ -20057,6 +20551,29 @@ in a breaking way.
It requires Prometheus >= v2.39.0 or PrometheusAgent >= v2.54.0.
+
+
+staleSeriesCompactionThreshold
+
+
+k8s.io/apimachinery/pkg/api/resource.Quantity
+
+
+
+
+(Optional)
+staleSeriesCompactionThreshold configures the trigger point for compacting
+stale series from memory into persistent blocks and removing those stale
+series from memory.
+The threshold is a number between 0.0 and 1.0. It represents the ratio of
+stale series in memory to the total series in memory. The stale series
+compaction is triggered when this ratio crosses the configured threshold.
+It may not trigger the stale series compaction if the usual head compaction
+is about to happen soon.
+If set to 0, stale series compaction is disabled.
+It requires Prometheus >= v3.10.0.
+
+
ThanosRulerSpec
@@ -20190,6 +20707,18 @@ map[string]string
+schedulerName
+
+string
+
+
+
+(Optional)
+schedulerName defines the scheduler to use for Pod scheduling. If not specified, the default scheduler is used.
+
+
+
+
resources
@@ -20887,17 +21416,16 @@ string
grpcServerTlsConfig
-
-TLSConfig
+
+GRPCServerTLSConfig
(Optional)
grpcServerTlsConfig defines the gRPC server from which Thanos Querier reads
-recorded rule data.
-Note: Currently only the CAFile, CertFile, and KeyFile fields are supported.
-Maps to the ‘–grpc-server-tls-*’ CLI args.
+recorded rule data.
+Note: Currently only the minVersion, caFile, certFile, keyFile, cipherSuites and curves fields are supported.
@@ -21433,15 +21961,15 @@ in a breaking way.
grpcServerTlsConfig
-
-TLSConfig
+
+GRPCServerTLSConfig
(Optional)
grpcServerTlsConfig defines the TLS parameters for the gRPC server providing the StoreAPI.
-Note: Currently only the caFile, certFile, and keyFile fields are supported.
+Note: Currently only the minVersion, caFile, certFile, keyFile, cipherSuites and curves fields are supported.
@@ -21583,6 +22111,53 @@ fail and an error will be logged.
+TopologyShardingStrategy
+
+
+(Appears on: ShardingStrategy )
+
+
+
TopologyShardingStrategy defines the configuration for topology-aware sharding.
+
+
+
+
+Field
+Description
+
+
+
+
+
+externalLabelName
+
+string
+
+
+
+(Optional)
+externalLabelName defines the name of the Prometheus external label used
+to communicate the topology zone assigned to the Prometheus instance.
+If not defined, it defaults to “zone”.
+If set to the empty string, no external label is added to the Prometheus configuration.
+
+
+
+
+values
+
+[]string
+
+
+
+(Optional)
+values defines the list of topology values (e.g. zone names) to be used
+for sharding. The configured number of shards must be greater than or
+equal to the number of values.
+
+
+
+
TopologySpreadConstraint
@@ -21946,7 +22521,7 @@ Supported values are:
URL
(string alias)
-(Appears on: AlertmanagerGlobalConfig , GlobalJiraConfig , GlobalRocketChatConfig , GlobalTelegramConfig , GlobalVictorOpsConfig , GlobalWeChatConfig , GlobalWebexConfig )
+(Appears on: AlertmanagerGlobalConfig , GlobalJiraConfig , GlobalRocketChatConfig , GlobalTelegramConfig , GlobalVictorOpsConfig , GlobalWeChatConfig , GlobalWebexConfig , OAuth2 , RemoteWriteSpec )
URL represents a valid URL
@@ -22798,7 +23373,8 @@ gzipped Prometheus configuration under the
prometheus.yaml.gz key.
This behavior is
deprecated and will be removed in the next major version
of the custom resource definition. It is recommended to use
spec.additionalScrapeConfigs instead.
-
Note that the ScrapeConfig custom resource definition is currently at Alpha level.
+
Note that the ScrapeConfig custom resource definition is currently at Alpha level
+and will be graduated to Beta in a future release.
@@ -22815,7 +23391,8 @@ Kubernetes meta/v1.LabelSelector
scrapeConfigNamespaceSelector defines the namespaces to match for ScrapeConfig discovery. An empty label selector
matches all namespaces. A null label selector matches the current
namespace only.
-Note that the ScrapeConfig custom resource definition is currently at Alpha level.
+Note that the ScrapeConfig custom resource definition is currently at Alpha level
+and will be graduated to Beta in a future release.
@@ -22944,6 +23521,22 @@ the label value isn’t empty, all Prometheus shards will scrape the target.
+shardingStrategy
+
+
+ShardingStrategy
+
+
+
+
+(Optional)
+shardingStrategy defines the sharding strategy for distributing scraped targets across Prometheus shards.
+When not defined, the operator defaults to the ‘Address’ mode which distributes
+targets based on a hash of the target address.
+
+
+
+
replicaExternalLabelName
string
@@ -23261,6 +23854,18 @@ map[string]string
+schedulerName
+
+string
+
+
+
+(Optional)
+schedulerName defines the scheduler to use for Pod scheduling. If not specified, the default scheduler is used.
+
+
+
+
serviceAccountName
string
@@ -25408,6 +26013,8 @@ Only valid for Pod, Endpoint and Endpointslice roles.
"SDK"
+"WorkloadIdentity"
+
AzureSDConfig
@@ -25682,7 +26289,7 @@ SafeTLSConfig
(Optional)
-tlsConfig defies the TLS configuration applying to the target HTTP endpoint.
+tlsConfig defines the TLS configuration applying to the target HTTP endpoint.
@@ -25854,12 +26461,26 @@ string
(Optional)
filter defines the filter expression used to filter the catalog results.
-See https://www.consul.io/api-docs/catalog#list-services
+See https://developer.hashicorp.com/consul/api-docs/catalog#filtering
It requires Prometheus >= 3.0.0.
+healthFilter
+
+string
+
+
+
+(Optional)
+healthFilter defines the filter expression used to filter the health results.
+See https://developer.hashicorp.com/consul/api-docs/health#filtering
+It requires Prometheus >= 3.11.2.
+
+
+
+
allowStale
bool
@@ -27354,6 +27975,22 @@ This includes settings for certificates, CA validation, and TLS protocol options
+forceImplicitTLS
+
+bool
+
+
+
+(Optional)
+forceImplicitTLS defines whether to force use of implicit TLS (direct TLS connection) for better security.
+true: force use of implicit TLS (direct TLS connection on any port)
+false: force disable implicit TLS (use explicit TLS/STARTTLS if required)
+nil (default): auto-detect based on port (465=implicit, other=explicit) for backward compatibility
+It requires Alertmanager >= v0.31.0.
+
+
+
+
threading
@@ -27363,7 +28000,8 @@ EmailThreadingConfig
(Optional)
-threading defines the threading configuration for email receiver.
+threading defines the threading configuration for email receiver.
+It requires Alertmanager >= v0.30.0.
@@ -27385,34 +28023,16 @@ EmailThreadingConfig
-enabled
-forceImplicitTLS
-
-bool
-
-
-
-(Optional)
-enabled defines whether to enable threading, which makes alert notifications in the same
-alert group show up in the same email thread.
-
-
-
-
threadByDate
-string
+
+ThreadByDateType
+
-(Optional)
-threadByDate defines what granularity of current date to thread by. Accepted values: daily, none.
-(none means group by alert group key, no date).
-forceImplicitTLS defines whether to force use of implicit TLS (direct TLS connection) for better security.
-true: force use of implicit TLS (direct TLS connection on any port)
-false: force disable implicit TLS (use explicit TLS/STARTTLS if required)
-nil (default): auto-detect based on port (465=implicit, other=explicit) for backward compatibility
-It requires Alertmanager >= v0.31.0.
+threadByDate defines what granularity of current date to thread by. Accepted values: Daily, None.
+(None means group by alert group key, no date).
@@ -29208,8 +29828,7 @@ bool
@@ -31596,7 +32215,8 @@ gzipped Prometheus configuration under the prometheus.yaml.gz key.
This behavior is deprecated and will be removed in the next major version
of the custom resource definition. It is recommended to use
spec.additionalScrapeConfigs instead.
-Note that the ScrapeConfig custom resource definition is currently at Alpha level.
+Note that the ScrapeConfig custom resource definition is currently at Alpha level
+and will be graduated to Beta in a future release.
@@ -31613,7 +32233,8 @@ Kubernetes meta/v1.LabelSelector
scrapeConfigNamespaceSelector defines the namespaces to match for ScrapeConfig discovery. An empty label selector
matches all namespaces. A null label selector matches the current
namespace only.
-Note that the ScrapeConfig custom resource definition is currently at Alpha level.
+Note that the ScrapeConfig custom resource definition is currently at Alpha level
+and will be graduated to Beta in a future release.
@@ -31742,6 +32363,22 @@ the label value isn’t empty, all Prometheus shards will scrape the target.
+shardingStrategy
+
+
+ShardingStrategy
+
+
+
+
+(Optional)
+shardingStrategy defines the sharding strategy for distributing scraped targets across Prometheus shards.
+When not defined, the operator defaults to the ‘Address’ mode which distributes
+targets based on a hash of the target address.
+
+
+
+
replicaExternalLabelName
string
@@ -32059,6 +32696,18 @@ map[string]string
+schedulerName
+
+string
+
+
+
+(Optional)
+schedulerName defines the scheduler to use for Pod scheduling. If not specified, the default scheduler is used.
+
+
+
+
serviceAccountName
string
@@ -34578,8 +35227,9 @@ HTTPConfig
@@ -36462,6 +37112,26 @@ HTTPConfig
+ThreadByDateType
+(string alias)
+
+(Appears on: EmailThreadingConfig )
+
+
+
+
+
+
+Value
+Description
+
+
+"Daily"
+
+"None"
+
+
+
Time
(string alias)
@@ -37767,6 +38437,22 @@ This includes settings for certificates, CA validation, and TLS protocol options
+forceImplicitTLS
+
+bool
+
+
+
+(Optional)
+forceImplicitTLS defines whether to force use of implicit TLS (direct TLS connection) for better security.
+true: force use of implicit TLS (direct TLS connection on any port)
+false: force disable implicit TLS (use explicit TLS/STARTTLS if required)
+nil (default): auto-detect based on port (465=implicit, other=explicit) for backward compatibility
+It requires Alertmanager >= v0.31.0.
+
+
+
+
threading
@@ -37776,7 +38462,8 @@ EmailThreadingConfig
(Optional)
-threading defines the threading configuration for email receiver.
+threading defines the threading configuration for email receiver.
+It requires Alertmanager >= v0.30.0.
@@ -37798,34 +38485,16 @@ EmailThreadingConfig
-enabled
-forceImplicitTLS
-
-bool
-
-
-
-(Optional)
-enabled defines whether to enable threading, which makes alert notifications in the same
-alert group show up in the same email thread.
-
-
-
-
threadByDate
-string
+
+ThreadByDateType
+
-(Optional)
-threadByDate defines what granularity of current date to thread by. Accepted values: daily, none.
-(none means group by alert group key, no date).
-forceImplicitTLS defines whether to force use of implicit TLS (direct TLS connection) for better security.
-true: force use of implicit TLS (direct TLS connection on any port)
-false: force disable implicit TLS (use explicit TLS/STARTTLS if required)
-nil (default): auto-detect based on port (465=implicit, other=explicit) for backward compatibility
-It requires Alertmanager >= v0.31.0.
+threadByDate defines what granularity of current date to thread by. Accepted values: Daily, None.
+(None means group by alert group key, no date).
@@ -41078,6 +41747,26 @@ HTTPConfig
+
ThreadByDateType
+(string alias)
+
+(Appears on: EmailThreadingConfig )
+
+
+
+
+
+
+Value
+Description
+
+
+"Daily"
+
+"None"
+
+
+
Time
(string alias)
diff --git a/bundle.yaml b/bundle.yaml
index 83c106d48cb..0134763995d 100644
--- a/bundle.yaml
+++ b/bundle.yaml
@@ -22438,6 +22438,10 @@ spec:
The Prometheus service account must have the `list` and `watch`
permissions on the `Nodes` objects.
+
+ Node metadata labels are not automatically added to scraped metrics. They are
+ exposed as `__meta_kubernetes_node_*` labels and can be copied to timeseries
+ with relabeling configuration.
type: boolean
type: object
bodySizeLimit:
@@ -31943,6 +31947,10 @@ spec:
The Prometheus service account must have the `list` and `watch`
permissions on the `Nodes` objects.
+
+ Node metadata labels are not automatically added to scraped metrics. They are
+ exposed as `__meta_kubernetes_node_*` labels and can be copied to timeseries
+ with relabeling configuration.
type: boolean
type: object
authorization:
@@ -45244,6 +45252,10 @@ spec:
The Prometheus service account must have the `list` and `watch`
permissions on the `Nodes` objects.
+
+ Node metadata labels are not automatically added to scraped metrics. They are
+ exposed as `__meta_kubernetes_node_*` labels and can be copied to timeseries
+ with relabeling configuration.
type: boolean
type: object
authorization:
@@ -63876,6 +63888,10 @@ spec:
The Prometheus service account must have the `list` and `watch`
permissions on the `Nodes` objects.
+
+ Node metadata labels are not automatically added to scraped metrics. They are
+ exposed as `__meta_kubernetes_node_*` labels and can be copied to timeseries
+ with relabeling configuration.
type: boolean
type: object
bodySizeLimit:
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml
index 02bd4e8e5b4..61c03e2e73b 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml
@@ -67,6 +67,10 @@ spec:
The Prometheus service account must have the `list` and `watch`
permissions on the `Nodes` objects.
+
+ Node metadata labels are not automatically added to scraped metrics. They are
+ exposed as `__meta_kubernetes_node_*` labels and can be copied to timeseries
+ with relabeling configuration.
type: boolean
type: object
bodySizeLimit:
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml
index c461179f2b0..ede8698eef7 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml
@@ -6757,6 +6757,10 @@ spec:
The Prometheus service account must have the `list` and `watch`
permissions on the `Nodes` objects.
+
+ Node metadata labels are not automatically added to scraped metrics. They are
+ exposed as `__meta_kubernetes_node_*` labels and can be copied to timeseries
+ with relabeling configuration.
type: boolean
type: object
authorization:
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
index db655a7a09c..4133a77e099 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
@@ -8505,6 +8505,10 @@ spec:
The Prometheus service account must have the `list` and `watch`
permissions on the `Nodes` objects.
+
+ Node metadata labels are not automatically added to scraped metrics. They are
+ exposed as `__meta_kubernetes_node_*` labels and can be copied to timeseries
+ with relabeling configuration.
type: boolean
type: object
authorization:
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml
index a6793007d02..bd5e14a8e10 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml
@@ -68,6 +68,10 @@ spec:
The Prometheus service account must have the `list` and `watch`
permissions on the `Nodes` objects.
+
+ Node metadata labels are not automatically added to scraped metrics. They are
+ exposed as `__meta_kubernetes_node_*` labels and can be copied to timeseries
+ with relabeling configuration.
type: boolean
type: object
bodySizeLimit:
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml
index 02bd4e8e5b4..61c03e2e73b 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml
@@ -67,6 +67,10 @@ spec:
The Prometheus service account must have the `list` and `watch`
permissions on the `Nodes` objects.
+
+ Node metadata labels are not automatically added to scraped metrics. They are
+ exposed as `__meta_kubernetes_node_*` labels and can be copied to timeseries
+ with relabeling configuration.
type: boolean
type: object
bodySizeLimit:
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml
index c461179f2b0..ede8698eef7 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml
@@ -6757,6 +6757,10 @@ spec:
The Prometheus service account must have the `list` and `watch`
permissions on the `Nodes` objects.
+
+ Node metadata labels are not automatically added to scraped metrics. They are
+ exposed as `__meta_kubernetes_node_*` labels and can be copied to timeseries
+ with relabeling configuration.
type: boolean
type: object
authorization:
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
index db655a7a09c..4133a77e099 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
@@ -8505,6 +8505,10 @@ spec:
The Prometheus service account must have the `list` and `watch`
permissions on the `Nodes` objects.
+
+ Node metadata labels are not automatically added to scraped metrics. They are
+ exposed as `__meta_kubernetes_node_*` labels and can be copied to timeseries
+ with relabeling configuration.
type: boolean
type: object
authorization:
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml
index a6793007d02..bd5e14a8e10 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml
@@ -68,6 +68,10 @@ spec:
The Prometheus service account must have the `list` and `watch`
permissions on the `Nodes` objects.
+
+ Node metadata labels are not automatically added to scraped metrics. They are
+ exposed as `__meta_kubernetes_node_*` labels and can be copied to timeseries
+ with relabeling configuration.
type: boolean
type: object
bodySizeLimit:
diff --git a/jsonnet/prometheus-operator/podmonitors-crd.json b/jsonnet/prometheus-operator/podmonitors-crd.json
index 91616813fc3..c3defc499f1 100644
--- a/jsonnet/prometheus-operator/podmonitors-crd.json
+++ b/jsonnet/prometheus-operator/podmonitors-crd.json
@@ -48,7 +48,7 @@
"description": "attachMetadata defines additional metadata which is added to the\ndiscovered targets.\n\nIt requires Prometheus >= v2.35.0.",
"properties": {
"node": {
- "description": "node when set to true, Prometheus attaches node metadata to the discovered\ntargets.\n\nThe Prometheus service account must have the `list` and `watch`\npermissions on the `Nodes` objects.",
+ "description": "node when set to true, Prometheus attaches node metadata to the discovered\ntargets.\n\nThe Prometheus service account must have the `list` and `watch`\npermissions on the `Nodes` objects.\n\nNode metadata labels are not automatically added to scraped metrics. They are\nexposed as `__meta_kubernetes_node_*` labels and can be copied to timeseries\nwith relabeling configuration.",
"type": "boolean"
}
},
diff --git a/jsonnet/prometheus-operator/prometheusagents-crd.json b/jsonnet/prometheus-operator/prometheusagents-crd.json
index 222261b07d2..2b9167b7a79 100644
--- a/jsonnet/prometheus-operator/prometheusagents-crd.json
+++ b/jsonnet/prometheus-operator/prometheusagents-crd.json
@@ -5708,7 +5708,7 @@
"description": "attachMetadata defines additional metadata to the discovered targets.\nWhen the scrape object defines its own configuration, it takes\nprecedence over the scrape class configuration.",
"properties": {
"node": {
- "description": "node when set to true, Prometheus attaches node metadata to the discovered\ntargets.\n\nThe Prometheus service account must have the `list` and `watch`\npermissions on the `Nodes` objects.",
+ "description": "node when set to true, Prometheus attaches node metadata to the discovered\ntargets.\n\nThe Prometheus service account must have the `list` and `watch`\npermissions on the `Nodes` objects.\n\nNode metadata labels are not automatically added to scraped metrics. They are\nexposed as `__meta_kubernetes_node_*` labels and can be copied to timeseries\nwith relabeling configuration.",
"type": "boolean"
}
},
diff --git a/jsonnet/prometheus-operator/prometheuses-crd.json b/jsonnet/prometheus-operator/prometheuses-crd.json
index b166d5bfc8f..c0d5f522e39 100644
--- a/jsonnet/prometheus-operator/prometheuses-crd.json
+++ b/jsonnet/prometheus-operator/prometheuses-crd.json
@@ -7237,7 +7237,7 @@
"description": "attachMetadata defines additional metadata to the discovered targets.\nWhen the scrape object defines its own configuration, it takes\nprecedence over the scrape class configuration.",
"properties": {
"node": {
- "description": "node when set to true, Prometheus attaches node metadata to the discovered\ntargets.\n\nThe Prometheus service account must have the `list` and `watch`\npermissions on the `Nodes` objects.",
+ "description": "node when set to true, Prometheus attaches node metadata to the discovered\ntargets.\n\nThe Prometheus service account must have the `list` and `watch`\npermissions on the `Nodes` objects.\n\nNode metadata labels are not automatically added to scraped metrics. They are\nexposed as `__meta_kubernetes_node_*` labels and can be copied to timeseries\nwith relabeling configuration.",
"type": "boolean"
}
},
diff --git a/jsonnet/prometheus-operator/servicemonitors-crd.json b/jsonnet/prometheus-operator/servicemonitors-crd.json
index 6456429d322..e9a6a770d68 100644
--- a/jsonnet/prometheus-operator/servicemonitors-crd.json
+++ b/jsonnet/prometheus-operator/servicemonitors-crd.json
@@ -48,7 +48,7 @@
"description": "attachMetadata defines additional metadata which is added to the\ndiscovered targets.\n\nIt requires Prometheus >= v2.37.0.",
"properties": {
"node": {
- "description": "node when set to true, Prometheus attaches node metadata to the discovered\ntargets.\n\nThe Prometheus service account must have the `list` and `watch`\npermissions on the `Nodes` objects.",
+ "description": "node when set to true, Prometheus attaches node metadata to the discovered\ntargets.\n\nThe Prometheus service account must have the `list` and `watch`\npermissions on the `Nodes` objects.\n\nNode metadata labels are not automatically added to scraped metrics. They are\nexposed as `__meta_kubernetes_node_*` labels and can be copied to timeseries\nwith relabeling configuration.",
"type": "boolean"
}
},
diff --git a/pkg/apis/monitoring/v1/types.go b/pkg/apis/monitoring/v1/types.go
index 8fa7baed626..58d5cf9e945 100644
--- a/pkg/apis/monitoring/v1/types.go
+++ b/pkg/apis/monitoring/v1/types.go
@@ -653,6 +653,10 @@ type AttachMetadata struct {
// The Prometheus service account must have the `list` and `watch`
// permissions on the `Nodes` objects.
//
+ // Node metadata labels are not automatically added to scraped metrics. They are
+ // exposed as `__meta_kubernetes_node_*` labels and can be copied to timeseries
+ // with relabeling configuration.
+ //
// +optional
Node *bool `json:"node,omitempty"` // nolint:kubeapilinter
}
diff --git a/pkg/client/applyconfiguration/monitoring/v1/attachmetadata.go b/pkg/client/applyconfiguration/monitoring/v1/attachmetadata.go
index d8a949c9b3a..bda48eb98ee 100644
--- a/pkg/client/applyconfiguration/monitoring/v1/attachmetadata.go
+++ b/pkg/client/applyconfiguration/monitoring/v1/attachmetadata.go
@@ -24,6 +24,10 @@ type AttachMetadataApplyConfiguration struct {
//
// The Prometheus service account must have the `list` and `watch`
// permissions on the `Nodes` objects.
+ //
+ // Node metadata labels are not automatically added to scraped metrics. They are
+ // exposed as `__meta_kubernetes_node_*` labels and can be copied to timeseries
+ // with relabeling configuration.
Node *bool `json:"node,omitempty"`
}
From 797a34d1ce1d6a10a7c5fe341e55888abbcef145 Mon Sep 17 00:00:00 2001
From: Simon Pasquier
Date: Fri, 29 May 2026 15:39:16 +0200
Subject: [PATCH 44/81] chore: document usage of WithInlineTLSConfig()
---
pkg/prometheus/promcfg.go | 2 ++
1 file changed, 2 insertions(+)
diff --git a/pkg/prometheus/promcfg.go b/pkg/prometheus/promcfg.go
index 59425f0557b..5999b1c7674 100644
--- a/pkg/prometheus/promcfg.go
+++ b/pkg/prometheus/promcfg.go
@@ -117,6 +117,8 @@ func WithPrometheusRetentionPolicies() ConfigGeneratorOption {
}
}
+// WithInlineTLSConfig is an API only used by
+// https://github.com/open-telemetry/opentelemetry-operator.
func WithInlineTLSConfig() ConfigGeneratorOption {
return func(cg *ConfigGenerator) {
cg.inlineTLSConfig = true
From 744405c482876358bb1be8c1ced1030b442be532 Mon Sep 17 00:00:00 2001
From: Jayapriya Pai
Date: Sat, 30 May 2026 10:29:41 +0530
Subject: [PATCH 45/81] chore: add slashpai as release shepherd for v0.92
Signed-off-by: Jayapriya Pai
---
RELEASE.md | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/RELEASE.md b/RELEASE.md
index c620319331e..df9c4bc0884 100644
--- a/RELEASE.md
+++ b/RELEASE.md
@@ -18,7 +18,12 @@ The release cycle for cutting releases is every 6 weeks
| Release | Date of release (year-month-day) | Release shepherd |
|---------|----------------------------------|-------------------------------------------|
-| v0.92 | 2026-06-10 | **searching for volunteer** |
+| v0.97 | 2027-01-06 | **searching for volunteer** |
+| v0.96 | 2026-11-25 | **searching for volunteer** |
+| v0.95 | 2026-10-14 | **searching for volunteer** |
+| v0.94 | 2026-09-02 | **searching for volunteer** |
+| v0.93 | 2026-07-22 | **searching for volunteer** |
+| v0.92 | 2026-06-10 | Jayapriya Pai (Github: @slashpai) |
| v0.91 | 2026-04-29 | Simon Pasquier (GitHub: @simonpasquier) |
| v0.90 | 2026-03-18 | Jayapriya Pai (Github: @slashpai) |
| v0.89 | 2026-02-04 | Simon Pasquier (GitHub: @simonpasquier) |
@@ -41,11 +46,6 @@ The release cycle for cutting releases is every 6 weeks
| v0.72 | 2024-02-21 | Arthur Sens (Github: @ArthurSens) |
| v0.71 | 2024-01-10 | Simon Pasquier (GitHub: @simonpasquier) |
| v0.70 | 2023-11-29 | Pawel Krupa (GitHub: @paulfantom) |
-| v0.69 | 2023-10-18 | Simon Pasquier (GitHub: @simonpasquier) |
-| v0.68 | 2023-09-06 | Arthur Sens (Github: @ArthurSens) |
-| v0.67 | 2023-07-26 | Simon Pasquier (GitHub: @simonpasquier) |
-| v0.66 | 2023-06-14 | Arthur Sens (Github: @ArthurSens) |
-| v0.65 | 2023-05-03 | Philip Gough (GitHub: @PhilipGough) |
If any of the maintainers is interested in volunteering please create a pull request against the [prometheus-operator/prometheus-operator](https://github.com/prometheus-operator/prometheus-operator) repository and propose yourself for the release series of your choice.
From 68238b761ac3ea4f8e498f6d4e5009735a0b0ed0 Mon Sep 17 00:00:00 2001
From: Jayapriya Pai
Date: Sat, 30 May 2026 10:31:49 +0530
Subject: [PATCH 46/81] chore: add simonpasquier as release shepherd for v0.93
Signed-off-by: Jayapriya Pai
---
RELEASE.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/RELEASE.md b/RELEASE.md
index df9c4bc0884..88ed732a085 100644
--- a/RELEASE.md
+++ b/RELEASE.md
@@ -22,7 +22,7 @@ The release cycle for cutting releases is every 6 weeks
| v0.96 | 2026-11-25 | **searching for volunteer** |
| v0.95 | 2026-10-14 | **searching for volunteer** |
| v0.94 | 2026-09-02 | **searching for volunteer** |
-| v0.93 | 2026-07-22 | **searching for volunteer** |
+| v0.93 | 2026-07-22 | Simon Pasquier (GitHub: @simonpasquier) |
| v0.92 | 2026-06-10 | Jayapriya Pai (Github: @slashpai) |
| v0.91 | 2026-04-29 | Simon Pasquier (GitHub: @simonpasquier) |
| v0.90 | 2026-03-18 | Jayapriya Pai (Github: @slashpai) |
From 966824c69d030e37fb7eb55260ad4770a5b7c30d Mon Sep 17 00:00:00 2001
From: vprashar2929
Date: Wed, 29 Apr 2026 23:02:55 +0530
Subject: [PATCH 47/81] feat: migrate retention options to config file
This commit migrates retention options from CLI flags to config file
as per Prometheus v3 release which deprecates the
`storage.tsdb.retention` flags (prometheus/prometheus#18200)
With this change the operator writes the retention options to the
config file. For older Prometheus versions the CLI flags continue
to be used
Addresses #8522
Written with the help of Claude Code
Signed-off-by: vprashar2929
---
pkg/prometheus/common.go | 11 +++
pkg/prometheus/promcfg.go | 40 ++++++----
pkg/prometheus/promcfg_test.go | 66 ++++++++++++++++
pkg/prometheus/server/operator.go | 2 +-
pkg/prometheus/server/statefulset.go | 12 +--
pkg/prometheus/server/statefulset_test.go | 77 +++++++++++--------
...itionalAlertRelabelConfigs_Expected.golden | 4 +
...lScrapeConfigs_one_prometheus_shard.golden | 4 +
...nalScrapeConfigs_sharded prometheus.golden | 4 +
...lScrapeConfigs_unsharded_prometheus.golden | 4 +
.../testdata/AlertmanagerBearerToken.golden | 4 +
.../testdata/AlertmanagerConfigEmpty.golden | 4 +
.../AlertmanagerConfigEndpointSlice.golden | 4 +
.../AlertmanagerConfigOtherNamespace.golden | 4 +
.../AlertmanagerConfigProxyconfig.golden | 4 +
.../AlertmanagerConfigTLSconfig.golden | 4 +
...anagerConfigTLSconfigOtherNamespace.golden | 4 +
.../testdata/AlertmanagerTimeoutConfig.golden | 4 +
.../Alertmanager_with_RelabelConfigs.golden | 4 +
.../testdata/ConsulScrapeConfig.golden | 4 +
.../ConsulScrapeConfigAuthorization.golden | 4 +
.../ConsulScrapeConfigBasicAuth.golden | 4 +
.../testdata/ConsulScrapeConfigOAuth.golden | 4 +
.../ConsulScrapeConfigTLSConfig.golden | 4 +
.../ConsulScrapeConfigWithHealthFilter.golden | 4 +
.../testdata/EmptyEndpointPorts.golden | 4 +
...eLabelOnExcludedPodMonitor_Expected.golden | 4 +
...elOnExcludedServiceMonitor_Expected.golden | 4 +
...edNamespaceLabelPodMonitor_Expected.golden | 4 +
...mespaceLabelServiceMonitor_Expected.golden | 4 +
.../testdata/GenerateRelabelConfig.golden | 4 +
.../testdata/HonorLabelsOverriding.golden | 4 +
.../testdata/HonorTimestampsOverriding.golden | 4 +
.../MatchExpressionsServiceMonitor.golden | 4 +
...mespaceLabelServiceMonitor_Expected.golden | 4 +
...tSliceSelectorAndMatchLabelSelector.golden | 4 +
...orObjectWithMatchExpressionSelector.golden | 4 +
...MonitorObjectWithMatchLabelSelector.golden | 4 +
...hSelectorAndMatchExpressionSelector.golden | 4 +
.../testdata/PodMonitorPhaseFilter.golden | 4 +
.../testdata/PodTargetLabels.golden | 4 +
.../PodTargetLabelsFromPodMonitor.golden | 4 +
...TargetLabelsFromPodMonitorAndGlobal.golden | 4 +
.../ProbeIngressSDConfigGeneration.golden | 4 +
...sSDConfigGenerationWithLabelEnforce.golden | 4 +
...IngressSDConfigGenerationWithShards.golden | 4 +
.../ProbeSpecConfig_empty_probe.golden | 4 +
.../ProbeSpecConfig_module_config.golden | 4 +
...pecConfig_module_config_with_params.golden | 4 +
..._with_params_define_module_in_param.golden | 4 +
...dule_config_with_params_skip_module.golden | 4 +
.../ProbeSpecConfig_prober_spec.golden | 4 +
...obeSpecConfig_targets_static_config.golden | 4 +
...cTargetsConfigGenerationWithJobName.golden | 4 +
...etsConfigGenerationWithLabelEnforce.golden | 4 +
...argetsConfigGenerationWithoutModule.golden | 4 +
.../ProbeWithDefaultScrapeClassAuthz.golden | 4 +
.../testdata/ProbeWithHttp2Disabled.golden | 4 +
...ProbeWithNonDefaultScrapeClassAuthz.golden | 4 +
...nDefaultScrapeClassUserDefinedAuthz.golden | 4 +
...eWriteConfigWithEmptyMetadataConfig.golden | 4 +
.../testdata/RemoteWriteConfig_3.11.0.golden | 4 +
...RetentionConfigFile_default_v3.11.0.golden | 11 +++
.../RetentionConfigFile_size_v3.11.0.golden | 11 +++
...tentionConfigFile_time_size_v3.11.0.golden | 12 +++
.../RetentionConfigFile_time_v3.11.0.golden | 11 +++
.../RetentionConfigFile_v3.10.0.golden | 7 ++
...apeConfigSpecConfig_Already_Sharded.golden | 4 +
...crapeConfigSpecConfig_Authorization.golden | 4 +
...ConfigSpecConfig_AzureSDConfigEmpty.golden | 4 +
...ConfigSpecConfig_AzureSDConfigValid.golden | 4 +
...zureSDConfigValidWithSubscriptionID.golden | 4 +
...reSDConfigValid_ManagedIdentityAuth.golden | 4 +
...ecConfig_AzureSDConfigValid_SDKAuth.golden | 4 +
...eSDConfigValid_WorkloadIdentityAuth.golden | 4 +
...ureSDConfigValid_basic_auth_and_TLS.golden | 4 +
...nfig_AzureSDConfigValid_http_config.golden | 4 +
...nfig_AzureSDConfigValid_with_oauth2.golden | 4 +
.../ScrapeConfigSpecConfig_BasicAuth.golden | 4 +
...crapeConfigSpecConfig_DNSSD_ARecord.golden | 4 +
...apeConfigSpecConfig_DNSSD_SRVRecord.golden | 4 +
...rapeConfigSpecConfig_DockerSDConfig.golden | 4 +
...gSpecConfig_DockerSD_with_BasicAuth.golden | 4 +
...onfigSpecConfig_DockerSD_with_OAuth.golden | 4 +
...crapeConfigSpecConfig_DockerswarmSD.golden | 4 +
...cConfig_DockerswarmSD_withBasicAuth.golden | 4 +
...SpecConfig_DockerswarmSD_with_OAuth.golden | 4 +
...Config_DockerswarmSD_with_TLSConfig.golden | 4 +
...peConfigSpecConfig_EC2SDConfigEmpty.golden | 4 +
...gSpecConfig_EC2SDConfigValidAPIKeys.golden | 4 +
...gSpecConfig_EC2SDConfigValidRoleARN.golden | 4 +
...figSpecConfig_EC2SD_withProxyConfig.golden | 4 +
.../ScrapeConfigSpecConfig_Empty.golden | 4 +
...ConfigSpecConfig_EmptyRelabelConfig.golden | 4 +
...gSpecConfig_EnableCompression_False.golden | 4 +
...igSpecConfig_EnableCompression_True.golden | 4 +
.../ScrapeConfigSpecConfig_EurekaSD.golden | 4 +
...onfigSpecConfig_EurekaSD_with_OAuth.golden | 4 +
...gSpecConfig_EurekaSD_with_TLSConfig.golden | 4 +
.../ScrapeConfigSpecConfig_FileSD.golden | 4 +
...peConfigSpecConfig_GCESDConfigEmpty.golden | 4 +
...peConfigSpecConfig_GCESDConfigValid.golden | 4 +
...nfig_GCESDConfigValidRequiredFields.golden | 4 +
...Config_GCESDConfigValid_all_options.golden | 4 +
.../ScrapeConfigSpecConfig_HTTPSD.golden | 4 +
...pecConfig_HTTPSD_with_Authorization.golden | 4 +
...figSpecConfig_HTTPSD_with_BasicAuth.golden | 4 +
...eConfigSpecConfig_HTTPSD_with_OAuth.golden | 4 +
...gSpecConfig_HTTPSD_with_ProxyConfig.golden | 4 +
...figSpecConfig_HTTPSD_with_TLSConfig.golden | 4 +
.../ScrapeConfigSpecConfig_HetznerSD.golden | 4 +
...Config_HetznerSD_with_Authorization.golden | 4 +
...SpecConfig_HetznerSD_with_BasicAuth.golden | 4 +
...nfigSpecConfig_HetznerSD_with_OAuth.golden | 4 +
...SpecConfig_HetznerSD_with_TLSConfig.golden | 4 +
.../ScrapeConfigSpecConfig_HonorLabels.golden | 4 +
...rapeConfigSpecConfig_HonorTimeStamp.golden | 4 +
...peConfigSpecConfig_Inline_TLSConfig.golden | 4 +
.../ScrapeConfigSpecConfig_IonosSD.golden | 4 +
...ConfigSpecConfig_IonosSD_withOAuth2.golden | 4 +
...figSpecConfig_IonosSD_withTLSConfig.golden | 4 +
.../ScrapeConfigSpecConfig_K8SSD.golden | 4 +
...pecConfig_K8SSD_with_AttachMetadata.golden | 4 +
...SpecConfig_K8SSD_with_Authorization.golden | 4 +
...nfigSpecConfig_K8SSD_with_BasicAuth.golden | 4 +
...onfig_K8SSD_with_NamespaceDiscovery.golden | 4 +
...NamespaceDiscovery_and_OwnNamespace.golden | 4 +
...peConfigSpecConfig_K8SSD_with_OAuth.golden | 4 +
...nfigSpecConfig_K8SSD_with_TLSConfig.golden | 4 +
...ith_Unsupported_Role_AttachMetadata.golden | 4 +
.../ScrapeConfigSpecConfig_KumaSD.golden | 4 +
...eConfigSpecConfig_KumaSD_with_OAuth.golden | 4 +
...figSpecConfig_KumaSD_with_TLSConfig.golden | 4 +
...ig_KumaSD_with_TLSConfig_TLSVersion.golden | 4 +
.../ScrapeConfigSpecConfig_LightSailSD.golden | 4 +
...onfig_LightSailSDConfigValidAPIKeys.golden | 4 +
...onfig_LightSailSDConfigValidRoleARN.golden | 4 +
...pecConfig_LightSailSD_withBasicAuth.golden | 4 +
...igSpecConfig_LightSailSD_with_OAuth.golden | 4 +
...ecConfig_LightSailSD_with_TLSConfig.golden | 4 +
.../ScrapeConfigSpecConfig_Limits.golden | 4 +
...rapeConfigSpecConfig_LinodeSDConfig.golden | 4 +
...onfigSpecConfig_LinodeSD_with_OAuth.golden | 4 +
.../ScrapeConfigSpecConfig_MetricPath.golden | 4 +
.../ScrapeConfigSpecConfig_NomadSD.golden | 4 +
...ConfigSpecConfig_NomadSD_with_OAuth.golden | 4 +
...igSpecConfig_NomadSD_with_TLSConfig.golden | 4 +
...cConfig_NonEmptyMetricRelabelConfig.golden | 4 +
...figSpecConfig_NonEmptyRelabelConfig.golden | 4 +
.../ScrapeConfigSpecConfig_OVHCloudSD.golden | 4 +
...igSpecConfig_OpenStackSDConfigEmpty.golden | 4 +
...igSpecConfig_OpenStackSDConfigValid.golden | 4 +
.../ScrapeConfigSpecConfig_Params.golden | 4 +
...crapeConfigSpecConfig_ProxySettings.golden | 4 +
...ngsWithMutiProxyConnectHeaderValues.golden | 4 +
.../ScrapeConfigSpecConfig_PuppetDBSD.golden | 4 +
...SpecConfig_PuppetDBSD_withBasicAuth.golden | 4 +
...figSpecConfig_PuppetDBSD_with_OAuth.golden | 4 +
...pecConfig_PuppetDBSD_with_TLSConfig.golden | 4 +
.../ScrapeConfigSpecConfig_ScaleWaySD.golden | 4 +
...pecConfig_ScaleWaySD_with_TLSConfig.golden | 4 +
.../ScrapeConfigSpecConfig_Scheme.golden | 4 +
...rapeConfigSpecConfig_ScrapeInterval.golden | 4 +
...apeConfigSpecConfig_ScrapeProtocols.golden | 4 +
...crapeConfigSpecConfig_ScrapeTimeout.golden | 4 +
.../ScrapeConfigSpecConfig_Sharded.golden | 4 +
.../ScrapeConfigSpecConfig_Static.golden | 4 +
.../ScrapeConfigSpecConfig_TLSConfig.golden | 4 +
...SpecConfig_TrackTimestampsStaleness.golden | 4 +
.../ScrapeConfigSpecConfig_WithJobName.golden | 4 +
...cConfig_WithJobNameAndRelabelConfig.golden | 4 +
...peConfigWithDefaultScrapeClassAuthz.golden | 4 +
...onfigWithNonDefaultScrapeClassAuthz.golden | 4 +
...nDefaultScrapeClassUserDefinedAuthz.golden | 4 +
...tSliceSelectorAndMatchLabelSelector.golden | 4 +
...orObjectWithMatchExpressionSelector.golden | 4 +
...MonitorObjectWithMatchLabelSelector.golden | 4 +
...hSelectorAndMatchExpressionSelector.golden | 4 +
.../testdata/SettingHonorLabels.golden | 4 +
.../SettingHonorTimestampsInPodMonitor.golden | 4 +
...tingHonorTimestampsInServiceMonitor.golden | 4 +
...rackTimestampsStalenessInPodMonitor.golden | 4 +
...TimestampsStalenessInServiceMonitor.golden | 4 +
...abelConfigs_with_retention_2_shards.golden | 4 +
...abelConfigs_with_retention_3_shards.golden | 4 +
...ingRelabelConfigs_without_retention.golden | 4 +
...eSettingMaxExemplars_MaxSize5000000.golden | 3 +
...tingMaxExemplars_MaxSizeNotSetAtAll.golden | 4 +
...ig_greater_than_or_equal_to_v2.39.0.golden | 2 +
pkg/prometheus/testdata/TargetLabels.golden | 4 +
...estAdditionalAlertmanagers_Expected.golden | 4 +
...itorWithDefaultServiceDiscoveryRole.golden | 4 +
...EndpointSliceAndPrometheusEndpoints.golden | 4 +
...torWithEndpointSliceEnable_Expected.golden | 4 +
...EndpointsAndPrometheusEndpointSlice.golden | 4 +
...ySharding_PodMonitor_4shards_2zones.golden | 4 +
...rding_ServiceMonitor_4shards_2zones.golden | 4 +
...rding_ServiceMonitor_6shards_3zones.golden | 4 +
...Monitor_force_attach_metadata_false.golden | 4 +
...ceMonitor_force_attach_metadata_nil.golden | 4 +
...ingConfig_Config_only_with_endpoint.golden | 4 +
.../TracingConfig_Expect_valid_config.golden | 4 +
...tWithDefaultScrapeClassAndTLSConfig.golden | 4 +
...thNonDefaultScrapeClassAndTLSConfig.golden | 4 +
.../monitorObjectWithoutScrapeClass.golden | 4 +
pkg/prometheus/testdata/no_TSDB_config.golden | 4 +
...orObjectWithDefaultScrapeClassAuthz.golden | 4 +
...efaultScrapeClassWithAttachMetadata.golden | 4 +
...rapeClassWithFallbackScrapeProtocol.golden | 4 +
...ultScrapeClassWithMetricRelabelings.golden | 4 +
...thDefaultScrapeClassWithRelabelings.golden | 4 +
...aultScrapeClassAndExistingTLSConfig.golden | 4 +
...eClassAndExistingTLSConfigMissingCA.golden | 4 +
...bjectWithNonDefaultScrapeClassAuthz.golden | 4 +
...nDefaultScrapeClassUserDefinedAuthz.golden | 4 +
...efaultScrapeClassWithAttachMetadata.golden | 4 +
...rapeClassWithFallbackScrapeProtocol.golden | 4 +
...ultScrapeClassWithMetricRelabelings.golden | 4 +
...onDefaultScrapeClassWithRelabelings.golden | 4 +
.../podMonitorObjectWithPodName.golden | 4 +
.../podMonitorObjectWithPortNumber.golden | 4 +
.../podMonitorObjectWithTargetPortInt.golden | 4 +
...odMonitorObjectWithTargetPortString.golden | 4 +
.../testdata/pod_monitor_with_oauth2.golden | 4 +
...rapeClassWithFallbackScrapeProtocol.golden | 4 +
...rapeClassWithFallbackScrapeProtocol.golden | 4 +
.../testdata/probe_monitor_with_oauth2.golden | 4 +
...rapeClassWithFallbackScrapeProtocol.golden | 4 +
...rapeClassWithFallbackScrapeProtocol.golden | 4 +
...orObjectWithDefaultScrapeClassAuthz.golden | 4 +
...efaultScrapeClassWithAttachMetadata.golden | 4 +
...rapeClassWithFallbackScrapeProtocol.golden | 4 +
...ultScrapeClassWithMetricRelabelings.golden | 4 +
...thDefaultScrapeClassWithRelabelings.golden | 4 +
...aultScrapeClassAndExistingTLSConfig.golden | 4 +
...eClassAndExistingTLSConfigMissingCA.golden | 4 +
...bjectWithNonDefaultScrapeClassAuthz.golden | 4 +
...nDefaultScrapeClassUserDefinedAuthz.golden | 4 +
...efaultScrapeClassWithAttachMetadata.golden | 4 +
...rapeClassWithFallbackScrapeProtocol.golden | 4 +
...ultScrapeClassWithMetricRelabelings.golden | 4 +
...onDefaultScrapeClassWithRelabelings.golden | 4 +
.../service_monitor_with_oauth2.golden | 4 +
...gy_zone_external_label_address_mode.golden | 4 +
...ogy_zone_external_label_custom_name.golden | 4 +
...gy_zone_external_label_default_name.golden | 4 +
...pology_zone_external_label_disabled.golden | 4 +
...zone_external_label_no_feature_gate.golden | 4 +
248 files changed, 1150 insertions(+), 55 deletions(-)
create mode 100644 pkg/prometheus/testdata/RetentionConfigFile_default_v3.11.0.golden
create mode 100644 pkg/prometheus/testdata/RetentionConfigFile_size_v3.11.0.golden
create mode 100644 pkg/prometheus/testdata/RetentionConfigFile_time_size_v3.11.0.golden
create mode 100644 pkg/prometheus/testdata/RetentionConfigFile_time_v3.11.0.golden
create mode 100644 pkg/prometheus/testdata/RetentionConfigFile_v3.10.0.golden
diff --git a/pkg/prometheus/common.go b/pkg/prometheus/common.go
index ad543702d6c..f2927e12f87 100644
--- a/pkg/prometheus/common.go
+++ b/pkg/prometheus/common.go
@@ -50,6 +50,7 @@ const (
DefaultPortName = "web"
DefaultLogFileVolume = "log-file"
DefaultLogDirectory = "/var/log/prometheus"
+ DefaultRetention = "24h"
// DefaultTerminationGracePeriodSeconds defines how long Kubernetes should
// wait before killing Prometheus on pod termination.
@@ -73,6 +74,16 @@ var (
LabelPrometheusName = "prometheus-name"
)
+// RetentionTimeOrDefault returns the configured time-based retention or the
+// default retention when neither time nor size are configured.
+func RetentionTimeOrDefault(retention monitoringv1.Duration, retentionSize monitoringv1.ByteSize) monitoringv1.Duration {
+ if retention == "" && retentionSize == "" {
+ return monitoringv1.Duration(DefaultRetention)
+ }
+
+ return retention
+}
+
// LabelSelectorForStatefulSets returns a label selector which selects
// statefulsets deployed with the server or agent mode.
func LabelSelectorForStatefulSets(mode string) string {
diff --git a/pkg/prometheus/promcfg.go b/pkg/prometheus/promcfg.go
index 59425f0557b..4a21c4a0719 100644
--- a/pkg/prometheus/promcfg.go
+++ b/pkg/prometheus/promcfg.go
@@ -1036,7 +1036,7 @@ func (cg *ConfigGenerator) GenerateServerConfiguration(
})
// Storage config
- cfg, err = cg.appendStorageSettingsConfig(cfg, p.Spec.Exemplars)
+ cfg, err = cg.appendStorageSettingsConfig(cfg, p.Spec.Exemplars, p.Spec.Retention, p.Spec.RetentionSize)
if err != nil {
return nil, fmt.Errorf("generating storage_settings configuration failed: %w", err)
}
@@ -1073,9 +1073,15 @@ func (cg *ConfigGenerator) GenerateServerConfiguration(
return yaml.Marshal(cfg)
}
-func (cg *ConfigGenerator) appendStorageSettingsConfig(cfg yaml.MapSlice, exemplars *monitoringv1.Exemplars) (yaml.MapSlice, error) {
+func (cg *ConfigGenerator) appendStorageSettingsConfig(
+ cfg yaml.MapSlice,
+ exemplars *monitoringv1.Exemplars,
+ retention monitoringv1.Duration,
+ retentionSize monitoringv1.ByteSize,
+) (yaml.MapSlice, error) {
var (
storage yaml.MapSlice
+ tsdbSlice yaml.MapSlice
cgStorage = cg.WithMinimumVersion("2.29.0")
tsdb = cg.prom.GetCommonPrometheusFields().TSDB
)
@@ -1096,24 +1102,30 @@ func (cg *ConfigGenerator) appendStorageSettingsConfig(cfg yaml.MapSlice, exempl
if tsdb != nil {
if tsdb.OutOfOrderTimeWindow != nil {
- storage = cg.WithMinimumVersion("2.39.0").AppendMapItem(storage, "tsdb", yaml.MapSlice{
- {
- Key: "out_of_order_time_window",
- Value: *tsdb.OutOfOrderTimeWindow,
- },
- })
+ tsdbSlice = cg.WithMinimumVersion("2.39.0").AppendMapItem(tsdbSlice, "out_of_order_time_window", *tsdb.OutOfOrderTimeWindow)
}
if tsdb.StaleSeriesCompactionThreshold != nil {
- storage = cg.WithMinimumVersion("3.10.0").AppendMapItem(storage, "tsdb", yaml.MapSlice{
- {
- Key: "stale_series_compaction_threshold",
- Value: tsdb.StaleSeriesCompactionThreshold.AsApproximateFloat64(),
- },
- })
+ tsdbSlice = cg.WithMinimumVersion("3.10.0").AppendMapItem(tsdbSlice, "stale_series_compaction_threshold", tsdb.StaleSeriesCompactionThreshold.AsApproximateFloat64())
}
}
+ if cg.WithMinimumVersion("3.11.0").IsCompatible() {
+ var retentionSlice yaml.MapSlice
+ retentionTime := string(RetentionTimeOrDefault(retention, retentionSize))
+ if retentionTime != "" {
+ retentionSlice = append(retentionSlice, yaml.MapItem{Key: "time", Value: retentionTime})
+ }
+ if retentionSize != "" {
+ retentionSlice = append(retentionSlice, yaml.MapItem{Key: "size", Value: string(retentionSize)})
+ }
+ tsdbSlice = append(tsdbSlice, yaml.MapItem{Key: "retention", Value: retentionSlice})
+ }
+
+ if len(tsdbSlice) > 0 {
+ storage = append(storage, yaml.MapItem{Key: "tsdb", Value: tsdbSlice})
+ }
+
if len(storage) == 0 {
return cfg, nil
}
diff --git a/pkg/prometheus/promcfg_test.go b/pkg/prometheus/promcfg_test.go
index 963e5402434..ea100c9ab9d 100644
--- a/pkg/prometheus/promcfg_test.go
+++ b/pkg/prometheus/promcfg_test.go
@@ -5934,6 +5934,7 @@ func TestRuntimeConfig(t *testing.T) {
},
{
Scenario: "Runtime GoGC not specified",
+ Version: "v2.52.0",
Golden: "RuntimeConfig_GoGC_Not_Set.golden",
},
} {
@@ -6111,6 +6112,71 @@ func TestTSDBConfig(t *testing.T) {
}
}
+func TestRetentionConfigFile(t *testing.T) {
+ for _, tc := range []struct {
+ name string
+ version string
+ retention monitoringv1.Duration
+ retentionSize monitoringv1.ByteSize
+ golden string
+ }{
+ {
+ name: "retention.time set with Prometheus >= v3.11.0",
+ version: "v3.11.0",
+ retention: "2d",
+ golden: "RetentionConfigFile_time_v3.11.0.golden",
+ },
+ {
+ name: "retention.size set with Prometheus >= v3.11.0",
+ version: "v3.11.0",
+ retentionSize: "512MB",
+ golden: "RetentionConfigFile_size_v3.11.0.golden",
+ },
+ {
+ name: "retention.time and retention.size set with Prometheus >= v3.11.0",
+ version: "v3.11.0",
+ retention: "2d",
+ retentionSize: "512MB",
+ golden: "RetentionConfigFile_time_size_v3.11.0.golden",
+ },
+ {
+ name: "retention defaults to 24h when neither field is set with Prometheus >= v3.11.0",
+ version: "v3.11.0",
+ golden: "RetentionConfigFile_default_v3.11.0.golden",
+ },
+ {
+ name: "retention is not in the configuration file for Prometheus < v3.11.0",
+ version: "v3.10.0",
+ retention: "2d",
+ retentionSize: "512MB",
+ golden: "RetentionConfigFile_v3.10.0.golden",
+ },
+ } {
+ t.Run(tc.name, func(t *testing.T) {
+ p := defaultPrometheus()
+ p.Spec.CommonPrometheusFields.Version = tc.version
+ p.Spec.Retention = tc.retention
+ p.Spec.RetentionSize = tc.retentionSize
+
+ cg := mustNewConfigGenerator(t, p)
+ cfg, err := cg.GenerateServerConfiguration(
+ p,
+ nil,
+ nil,
+ nil,
+ nil,
+ &assets.StoreBuilder{},
+ nil,
+ nil,
+ nil,
+ nil,
+ )
+ require.NoError(t, err)
+ golden.Assert(t, string(cfg), tc.golden)
+ })
+ }
+}
+
func TestTSDBConfigPrometheusAgent(t *testing.T) {
for _, tc := range []struct {
name string
diff --git a/pkg/prometheus/server/operator.go b/pkg/prometheus/server/operator.go
index e2152cfd58b..c2abd793715 100644
--- a/pkg/prometheus/server/operator.go
+++ b/pkg/prometheus/server/operator.go
@@ -1337,7 +1337,7 @@ func gracePeriodForPrometheusStorage(p *monitoringv1.Prometheus) (time.Duration,
retention = p.Spec.Retention
if retention == "" {
- retention = defaultRetention
+ retention = monitoringv1.Duration(prompkg.DefaultRetention)
}
}
diff --git a/pkg/prometheus/server/statefulset.go b/pkg/prometheus/server/statefulset.go
index a086dee84f7..f2eb3296d86 100644
--- a/pkg/prometheus/server/statefulset.go
+++ b/pkg/prometheus/server/statefulset.go
@@ -34,7 +34,6 @@ import (
)
const (
- defaultRetention = "24h"
prometheusMode = "server"
governingServiceName = "prometheus-operated"
thanosSupportedVersionHTTPClientFlag = "0.24.0"
@@ -396,17 +395,18 @@ func buildServerArgs(cg *prompkg.ConfigGenerator, p *monitoringv1.Prometheus) []
if cg.WithMaximumVersion("2.7.0").IsCompatible() {
retentionTimeFlagName = "storage.tsdb.retention"
if p.Spec.Retention == "" {
- retentionTimeFlagValue = defaultRetention
+ retentionTimeFlagValue = prompkg.DefaultRetention
}
- } else if p.Spec.Retention == "" && p.Spec.RetentionSize == "" {
- retentionTimeFlagValue = defaultRetention
+ } else {
+ retentionTimeFlagValue = string(prompkg.RetentionTimeOrDefault(p.Spec.Retention, p.Spec.RetentionSize))
}
- if retentionTimeFlagValue != "" {
+ // Starting with Prometheus v3.11.0, retention settings are populated in the configuration file.
+ if retentionTimeFlagValue != "" && cg.Version().LT(semver.MustParse("3.11.0")) {
promArgs = append(promArgs, monitoringv1.Argument{Name: retentionTimeFlagName, Value: retentionTimeFlagValue})
}
- if p.Spec.RetentionSize != "" {
+ if p.Spec.RetentionSize != "" && cg.Version().LT(semver.MustParse("3.11.0")) {
retentionSizeFlag := monitoringv1.Argument{Name: "storage.tsdb.retention.size", Value: string(p.Spec.RetentionSize)}
promArgs = cg.WithMinimumVersion("2.7.0").AppendCommandlineArgument(promArgs, retentionSizeFlag)
}
diff --git a/pkg/prometheus/server/statefulset_test.go b/pkg/prometheus/server/statefulset_test.go
index cef804d29ce..336a690d804 100644
--- a/pkg/prometheus/server/statefulset_test.go
+++ b/pkg/prometheus/server/statefulset_test.go
@@ -1288,47 +1288,58 @@ func TestRetentionAndRetentionSize(t *testing.T) {
{"v2.7.0", "1d", "", "--storage.tsdb.retention.time=1d", "--storage.tsdb.retention.size=", true, false},
{"v2.7.0", "", "512MB", "--storage.tsdb.retention.time=24h", "--storage.tsdb.retention.size=512MB", false, true},
{"v2.7.0", "1d", "512MB", "--storage.tsdb.retention.time=1d", "--storage.tsdb.retention.size=512MB", true, true},
+ {"v3.10.0", "1d", "512MB", "--storage.tsdb.retention.time=1d", "--storage.tsdb.retention.size=512MB", true, true},
+ {"v3.11.0", "", "", "--storage.tsdb.retention.time=24h", "--storage.tsdb.retention.size=", false, false},
+ {"v3.11.0", "1d", "", "--storage.tsdb.retention.time=1d", "--storage.tsdb.retention.size=", false, false},
+ {"v3.11.0", "", "512MB", "--storage.tsdb.retention.time=24h", "--storage.tsdb.retention.size=512MB", false, false},
+ {"v3.11.0", "1d", "512MB", "--storage.tsdb.retention.time=1d", "--storage.tsdb.retention.size=512MB", false, false},
}
for _, test := range tests {
- sset, err := makeStatefulSetFromPrometheus(monitoringv1.Prometheus{
- Spec: monitoringv1.PrometheusSpec{
- CommonPrometheusFields: monitoringv1.CommonPrometheusFields{
- Version: test.version,
+ t.Run(fmt.Sprintf("%s retention=%q retentionSize=%q", test.version, test.specRetention, test.specRetentionSize), func(t *testing.T) {
+ sset, err := makeStatefulSetFromPrometheus(monitoringv1.Prometheus{
+ Spec: monitoringv1.PrometheusSpec{
+ CommonPrometheusFields: monitoringv1.CommonPrometheusFields{
+ Version: test.version,
+ },
+ Retention: test.specRetention,
+ RetentionSize: test.specRetentionSize,
},
- Retention: test.specRetention,
- RetentionSize: test.specRetentionSize,
- },
- })
- require.NoError(t, err)
+ })
+ require.NoError(t, err)
- promArgs := sset.Spec.Template.Spec.Containers[0].Args
- retentionFlag := strings.Split(test.expectedRetentionArg, "=")[0]
- foundRetentionFlag := false
- foundRetentionSizeFlag := false
- foundRetention := false
- foundRetentionSize := false
- for _, flag := range promArgs {
- if flag == test.expectedRetentionArg {
- foundRetention = true
- } else if flag == test.expectedRetentionSizeArg {
- foundRetentionSize = true
- }
+ promArgs := sset.Spec.Template.Spec.Containers[0].Args
+ retentionFlag := strings.Split(test.expectedRetentionArg, "=")[0]
+ foundRetentionFlag := false
+ foundRetentionSizeFlag := false
+ foundRetention := false
+ foundRetentionSize := false
+ for _, flag := range promArgs {
+ if flag == test.expectedRetentionArg {
+ foundRetention = true
+ } else if flag == test.expectedRetentionSizeArg {
+ foundRetentionSize = true
+ }
- if strings.HasPrefix(flag, retentionFlag) {
- foundRetentionFlag = true
- } else if strings.HasPrefix(flag, "--storage.tsdb.retention.size") {
- foundRetentionSizeFlag = true
+ if strings.HasPrefix(flag, retentionFlag) {
+ foundRetentionFlag = true
+ } else if strings.HasPrefix(flag, "--storage.tsdb.retention.size") {
+ foundRetentionSizeFlag = true
+ }
}
- }
- if test.shouldContainRetention {
- require.True(t, (foundRetention && foundRetentionFlag))
- }
+ if test.shouldContainRetention {
+ require.True(t, (foundRetention && foundRetentionFlag))
+ } else {
+ require.False(t, foundRetentionFlag, "retention flag must not be set for Prometheus %s", test.version)
+ }
- if test.shouldContainRetentionSize {
- require.True(t, (foundRetentionSize && foundRetentionSizeFlag))
- }
+ if test.shouldContainRetentionSize {
+ require.True(t, (foundRetentionSize && foundRetentionSizeFlag))
+ } else {
+ require.False(t, foundRetentionSizeFlag, "retention size flag must not be set for Prometheus %s", test.version)
+ }
+ })
}
}
@@ -2334,7 +2345,6 @@ func TestPrometheusAdditionalArgsNoError(t *testing.T) {
for _, argTest := range argTests {
t.Run(argTest.version, func(t *testing.T) {
-
labels := map[string]string{
"testlabel": "testlabelvalue",
}
@@ -2368,7 +2378,6 @@ func TestPrometheusAdditionalArgsNoError(t *testing.T) {
// web.console.templates and web.console.libraries should be present in prometheus versisons < 3
require.Equal(t, argTest.expectedArgs, ssetContainerArgs, "expected Prometheus container args to match, want %s, got %s", argTest.expectedArgs, ssetContainerArgs)
})
-
}
}
diff --git a/pkg/prometheus/testdata/AdditionalAlertRelabelConfigs_Expected.golden b/pkg/prometheus/testdata/AdditionalAlertRelabelConfigs_Expected.golden
index e879d118a30..dfea43023cf 100644
--- a/pkg/prometheus/testdata/AdditionalAlertRelabelConfigs_Expected.golden
+++ b/pkg/prometheus/testdata/AdditionalAlertRelabelConfigs_Expected.golden
@@ -5,6 +5,10 @@ global:
prometheus_replica: $(POD_NAME)
evaluation_interval: 30s
scrape_configs: []
+storage:
+ tsdb:
+ retention:
+ time: 24h
alerting:
alert_relabel_configs:
- action: labeldrop
diff --git a/pkg/prometheus/testdata/AdditionalScrapeConfigs_one_prometheus_shard.golden b/pkg/prometheus/testdata/AdditionalScrapeConfigs_one_prometheus_shard.golden
index be7c749029f..583f6c30ec1 100644
--- a/pkg/prometheus/testdata/AdditionalScrapeConfigs_one_prometheus_shard.golden
+++ b/pkg/prometheus/testdata/AdditionalScrapeConfigs_one_prometheus_shard.golden
@@ -40,3 +40,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/AdditionalScrapeConfigs_sharded prometheus.golden b/pkg/prometheus/testdata/AdditionalScrapeConfigs_sharded prometheus.golden
index f74e6d8a921..88493746959 100644
--- a/pkg/prometheus/testdata/AdditionalScrapeConfigs_sharded prometheus.golden
+++ b/pkg/prometheus/testdata/AdditionalScrapeConfigs_sharded prometheus.golden
@@ -75,3 +75,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/AdditionalScrapeConfigs_unsharded_prometheus.golden b/pkg/prometheus/testdata/AdditionalScrapeConfigs_unsharded_prometheus.golden
index be7c749029f..583f6c30ec1 100644
--- a/pkg/prometheus/testdata/AdditionalScrapeConfigs_unsharded_prometheus.golden
+++ b/pkg/prometheus/testdata/AdditionalScrapeConfigs_unsharded_prometheus.golden
@@ -40,3 +40,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/AlertmanagerBearerToken.golden b/pkg/prometheus/testdata/AlertmanagerBearerToken.golden
index 10652852d8d..1a4675d646d 100644
--- a/pkg/prometheus/testdata/AlertmanagerBearerToken.golden
+++ b/pkg/prometheus/testdata/AlertmanagerBearerToken.golden
@@ -5,6 +5,10 @@ global:
prometheus_replica: $(POD_NAME)
evaluation_interval: 30s
scrape_configs: []
+storage:
+ tsdb:
+ retention:
+ time: 24h
alerting:
alert_relabel_configs:
- action: labeldrop
diff --git a/pkg/prometheus/testdata/AlertmanagerConfigEmpty.golden b/pkg/prometheus/testdata/AlertmanagerConfigEmpty.golden
index 609303fe82c..ecbee05becb 100644
--- a/pkg/prometheus/testdata/AlertmanagerConfigEmpty.golden
+++ b/pkg/prometheus/testdata/AlertmanagerConfigEmpty.golden
@@ -5,3 +5,7 @@ global:
prometheus_replica: $(POD_NAME)
evaluation_interval: 30s
scrape_configs: []
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/AlertmanagerConfigEndpointSlice.golden b/pkg/prometheus/testdata/AlertmanagerConfigEndpointSlice.golden
index fc2b4b67413..f83c4c8ef63 100644
--- a/pkg/prometheus/testdata/AlertmanagerConfigEndpointSlice.golden
+++ b/pkg/prometheus/testdata/AlertmanagerConfigEndpointSlice.golden
@@ -5,6 +5,10 @@ global:
prometheus_replica: $(POD_NAME)
evaluation_interval: 30s
scrape_configs: []
+storage:
+ tsdb:
+ retention:
+ time: 24h
alerting:
alert_relabel_configs:
- action: labeldrop
diff --git a/pkg/prometheus/testdata/AlertmanagerConfigOtherNamespace.golden b/pkg/prometheus/testdata/AlertmanagerConfigOtherNamespace.golden
index 7f27f66e129..2dd0c66d018 100644
--- a/pkg/prometheus/testdata/AlertmanagerConfigOtherNamespace.golden
+++ b/pkg/prometheus/testdata/AlertmanagerConfigOtherNamespace.golden
@@ -5,6 +5,10 @@ global:
prometheus_replica: $(POD_NAME)
evaluation_interval: 30s
scrape_configs: []
+storage:
+ tsdb:
+ retention:
+ time: 24h
alerting:
alert_relabel_configs:
- action: labeldrop
diff --git a/pkg/prometheus/testdata/AlertmanagerConfigProxyconfig.golden b/pkg/prometheus/testdata/AlertmanagerConfigProxyconfig.golden
index 20e2ed4ac8c..3bb407169a2 100644
--- a/pkg/prometheus/testdata/AlertmanagerConfigProxyconfig.golden
+++ b/pkg/prometheus/testdata/AlertmanagerConfigProxyconfig.golden
@@ -5,6 +5,10 @@ global:
prometheus_replica: $(POD_NAME)
evaluation_interval: 30s
scrape_configs: []
+storage:
+ tsdb:
+ retention:
+ time: 24h
alerting:
alert_relabel_configs:
- action: labeldrop
diff --git a/pkg/prometheus/testdata/AlertmanagerConfigTLSconfig.golden b/pkg/prometheus/testdata/AlertmanagerConfigTLSconfig.golden
index 25c2a286b5d..92cb10238ea 100644
--- a/pkg/prometheus/testdata/AlertmanagerConfigTLSconfig.golden
+++ b/pkg/prometheus/testdata/AlertmanagerConfigTLSconfig.golden
@@ -5,6 +5,10 @@ global:
prometheus_replica: $(POD_NAME)
evaluation_interval: 30s
scrape_configs: []
+storage:
+ tsdb:
+ retention:
+ time: 24h
alerting:
alert_relabel_configs:
- action: labeldrop
diff --git a/pkg/prometheus/testdata/AlertmanagerConfigTLSconfigOtherNamespace.golden b/pkg/prometheus/testdata/AlertmanagerConfigTLSconfigOtherNamespace.golden
index 6350a6f9f56..2cabf1553d1 100644
--- a/pkg/prometheus/testdata/AlertmanagerConfigTLSconfigOtherNamespace.golden
+++ b/pkg/prometheus/testdata/AlertmanagerConfigTLSconfigOtherNamespace.golden
@@ -5,6 +5,10 @@ global:
prometheus_replica: $(POD_NAME)
evaluation_interval: 30s
scrape_configs: []
+storage:
+ tsdb:
+ retention:
+ time: 24h
alerting:
alert_relabel_configs:
- action: labeldrop
diff --git a/pkg/prometheus/testdata/AlertmanagerTimeoutConfig.golden b/pkg/prometheus/testdata/AlertmanagerTimeoutConfig.golden
index 19d8bba5ad9..a9e7e402227 100644
--- a/pkg/prometheus/testdata/AlertmanagerTimeoutConfig.golden
+++ b/pkg/prometheus/testdata/AlertmanagerTimeoutConfig.golden
@@ -5,6 +5,10 @@ global:
prometheus_replica: $(POD_NAME)
evaluation_interval: 30s
scrape_configs: []
+storage:
+ tsdb:
+ retention:
+ time: 24h
alerting:
alert_relabel_configs:
- action: labeldrop
diff --git a/pkg/prometheus/testdata/Alertmanager_with_RelabelConfigs.golden b/pkg/prometheus/testdata/Alertmanager_with_RelabelConfigs.golden
index f560f290b25..b1a3bfc4a21 100644
--- a/pkg/prometheus/testdata/Alertmanager_with_RelabelConfigs.golden
+++ b/pkg/prometheus/testdata/Alertmanager_with_RelabelConfigs.golden
@@ -5,6 +5,10 @@ global:
prometheus_replica: $(POD_NAME)
evaluation_interval: 30s
scrape_configs: []
+storage:
+ tsdb:
+ retention:
+ time: 24h
alerting:
alert_relabel_configs:
- action: labeldrop
diff --git a/pkg/prometheus/testdata/ConsulScrapeConfig.golden b/pkg/prometheus/testdata/ConsulScrapeConfig.golden
index 799f97f72df..e8761a0f0f1 100644
--- a/pkg/prometheus/testdata/ConsulScrapeConfig.golden
+++ b/pkg/prometheus/testdata/ConsulScrapeConfig.golden
@@ -36,3 +36,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ConsulScrapeConfigAuthorization.golden b/pkg/prometheus/testdata/ConsulScrapeConfigAuthorization.golden
index 4aa6082ee36..d4c50b1e3e9 100644
--- a/pkg/prometheus/testdata/ConsulScrapeConfigAuthorization.golden
+++ b/pkg/prometheus/testdata/ConsulScrapeConfigAuthorization.golden
@@ -15,3 +15,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ConsulScrapeConfigBasicAuth.golden b/pkg/prometheus/testdata/ConsulScrapeConfigBasicAuth.golden
index 15f52dea43c..d5d3bd80d5e 100644
--- a/pkg/prometheus/testdata/ConsulScrapeConfigBasicAuth.golden
+++ b/pkg/prometheus/testdata/ConsulScrapeConfigBasicAuth.golden
@@ -15,3 +15,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ConsulScrapeConfigOAuth.golden b/pkg/prometheus/testdata/ConsulScrapeConfigOAuth.golden
index 08be2ffe278..e5ee617d97a 100644
--- a/pkg/prometheus/testdata/ConsulScrapeConfigOAuth.golden
+++ b/pkg/prometheus/testdata/ConsulScrapeConfigOAuth.golden
@@ -22,3 +22,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ConsulScrapeConfigTLSConfig.golden b/pkg/prometheus/testdata/ConsulScrapeConfigTLSConfig.golden
index f77cb3a5bc6..7dd5b4de5df 100644
--- a/pkg/prometheus/testdata/ConsulScrapeConfigTLSConfig.golden
+++ b/pkg/prometheus/testdata/ConsulScrapeConfigTLSConfig.golden
@@ -16,3 +16,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ConsulScrapeConfigWithHealthFilter.golden b/pkg/prometheus/testdata/ConsulScrapeConfigWithHealthFilter.golden
index 57a6ef48559..13f87a08d8d 100644
--- a/pkg/prometheus/testdata/ConsulScrapeConfigWithHealthFilter.golden
+++ b/pkg/prometheus/testdata/ConsulScrapeConfigWithHealthFilter.golden
@@ -13,3 +13,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/EmptyEndpointPorts.golden b/pkg/prometheus/testdata/EmptyEndpointPorts.golden
index d72c2bdcfd7..d2ca0bc6be2 100644
--- a/pkg/prometheus/testdata/EmptyEndpointPorts.golden
+++ b/pkg/prometheus/testdata/EmptyEndpointPorts.golden
@@ -72,3 +72,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/EnforcedNamespaceLabelOnExcludedPodMonitor_Expected.golden b/pkg/prometheus/testdata/EnforcedNamespaceLabelOnExcludedPodMonitor_Expected.golden
index 8cd2556540a..11c0ee3792c 100644
--- a/pkg/prometheus/testdata/EnforcedNamespaceLabelOnExcludedPodMonitor_Expected.golden
+++ b/pkg/prometheus/testdata/EnforcedNamespaceLabelOnExcludedPodMonitor_Expected.golden
@@ -77,3 +77,7 @@ scrape_configs:
target_label: my-ns
regex: my-job-pod-.+
action: drop
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/EnforcedNamespaceLabelOnExcludedServiceMonitor_Expected.golden b/pkg/prometheus/testdata/EnforcedNamespaceLabelOnExcludedServiceMonitor_Expected.golden
index 2071aa0d10a..ee22b281053 100644
--- a/pkg/prometheus/testdata/EnforcedNamespaceLabelOnExcludedServiceMonitor_Expected.golden
+++ b/pkg/prometheus/testdata/EnforcedNamespaceLabelOnExcludedServiceMonitor_Expected.golden
@@ -91,3 +91,7 @@ scrape_configs:
target_label: ns-key
regex: my-job-pod-.+
action: drop
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/EnforcedNamespaceLabelPodMonitor_Expected.golden b/pkg/prometheus/testdata/EnforcedNamespaceLabelPodMonitor_Expected.golden
index 411c04bf7ae..fc8302bf0a5 100644
--- a/pkg/prometheus/testdata/EnforcedNamespaceLabelPodMonitor_Expected.golden
+++ b/pkg/prometheus/testdata/EnforcedNamespaceLabelPodMonitor_Expected.golden
@@ -81,3 +81,7 @@ scrape_configs:
action: drop
- target_label: ns-key
replacement: pod-monitor-ns
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/EnforcedNamespaceLabelServiceMonitor_Expected.golden b/pkg/prometheus/testdata/EnforcedNamespaceLabelServiceMonitor_Expected.golden
index 64c78c24c77..da2272f64b5 100644
--- a/pkg/prometheus/testdata/EnforcedNamespaceLabelServiceMonitor_Expected.golden
+++ b/pkg/prometheus/testdata/EnforcedNamespaceLabelServiceMonitor_Expected.golden
@@ -100,3 +100,7 @@ scrape_configs:
action: drop
- target_label: ns-key
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/GenerateRelabelConfig.golden b/pkg/prometheus/testdata/GenerateRelabelConfig.golden
index 50668fd63ed..7187bf76296 100644
--- a/pkg/prometheus/testdata/GenerateRelabelConfig.golden
+++ b/pkg/prometheus/testdata/GenerateRelabelConfig.golden
@@ -103,3 +103,7 @@ scrape_configs:
- target_label: job
replacement: ""
action: replace
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/HonorLabelsOverriding.golden b/pkg/prometheus/testdata/HonorLabelsOverriding.golden
index 45412c73940..7b34835eb7c 100644
--- a/pkg/prometheus/testdata/HonorLabelsOverriding.golden
+++ b/pkg/prometheus/testdata/HonorLabelsOverriding.golden
@@ -84,3 +84,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/HonorTimestampsOverriding.golden b/pkg/prometheus/testdata/HonorTimestampsOverriding.golden
index 9fafc9c1e4f..ccf70ff9f44 100644
--- a/pkg/prometheus/testdata/HonorTimestampsOverriding.golden
+++ b/pkg/prometheus/testdata/HonorTimestampsOverriding.golden
@@ -85,3 +85,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/MatchExpressionsServiceMonitor.golden b/pkg/prometheus/testdata/MatchExpressionsServiceMonitor.golden
index c49ab9d2f30..4f440aad8bb 100644
--- a/pkg/prometheus/testdata/MatchExpressionsServiceMonitor.golden
+++ b/pkg/prometheus/testdata/MatchExpressionsServiceMonitor.golden
@@ -79,3 +79,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/NoEnforcedNamespaceLabelServiceMonitor_Expected.golden b/pkg/prometheus/testdata/NoEnforcedNamespaceLabelServiceMonitor_Expected.golden
index d8b9e365c61..fdfb3c655fb 100644
--- a/pkg/prometheus/testdata/NoEnforcedNamespaceLabelServiceMonitor_Expected.golden
+++ b/pkg/prometheus/testdata/NoEnforcedNamespaceLabelServiceMonitor_Expected.golden
@@ -93,3 +93,7 @@ scrape_configs:
- __name__
regex: container_(network_tcp_usage_total|network_udp_usage_total|tasks_state|cpu_load_average_10s)
action: drop
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/PodMonitorObjectWithEndpointSliceSelectorAndMatchLabelSelector.golden b/pkg/prometheus/testdata/PodMonitorObjectWithEndpointSliceSelectorAndMatchLabelSelector.golden
index 9bc6760432f..d3022ecd276 100644
--- a/pkg/prometheus/testdata/PodMonitorObjectWithEndpointSliceSelectorAndMatchLabelSelector.golden
+++ b/pkg/prometheus/testdata/PodMonitorObjectWithEndpointSliceSelectorAndMatchLabelSelector.golden
@@ -58,3 +58,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/PodMonitorObjectWithMatchExpressionSelector.golden b/pkg/prometheus/testdata/PodMonitorObjectWithMatchExpressionSelector.golden
index 6de3adf1e84..f433970d534 100644
--- a/pkg/prometheus/testdata/PodMonitorObjectWithMatchExpressionSelector.golden
+++ b/pkg/prometheus/testdata/PodMonitorObjectWithMatchExpressionSelector.golden
@@ -58,3 +58,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/PodMonitorObjectWithMatchLabelSelector.golden b/pkg/prometheus/testdata/PodMonitorObjectWithMatchLabelSelector.golden
index 9bc6760432f..d3022ecd276 100644
--- a/pkg/prometheus/testdata/PodMonitorObjectWithMatchLabelSelector.golden
+++ b/pkg/prometheus/testdata/PodMonitorObjectWithMatchLabelSelector.golden
@@ -58,3 +58,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/PodMonitorObjectWithSelectorAndMatchExpressionSelector.golden b/pkg/prometheus/testdata/PodMonitorObjectWithSelectorAndMatchExpressionSelector.golden
index 81d0f199c73..7e9a6e30d54 100644
--- a/pkg/prometheus/testdata/PodMonitorObjectWithSelectorAndMatchExpressionSelector.golden
+++ b/pkg/prometheus/testdata/PodMonitorObjectWithSelectorAndMatchExpressionSelector.golden
@@ -58,3 +58,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/PodMonitorPhaseFilter.golden b/pkg/prometheus/testdata/PodMonitorPhaseFilter.golden
index 9fe2b779391..f73ddc61f32 100644
--- a/pkg/prometheus/testdata/PodMonitorPhaseFilter.golden
+++ b/pkg/prometheus/testdata/PodMonitorPhaseFilter.golden
@@ -50,3 +50,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/PodTargetLabels.golden b/pkg/prometheus/testdata/PodTargetLabels.golden
index 98ce68e9d67..52b60f891c4 100644
--- a/pkg/prometheus/testdata/PodTargetLabels.golden
+++ b/pkg/prometheus/testdata/PodTargetLabels.golden
@@ -84,3 +84,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/PodTargetLabelsFromPodMonitor.golden b/pkg/prometheus/testdata/PodTargetLabelsFromPodMonitor.golden
index 5599d10d628..837478b3055 100644
--- a/pkg/prometheus/testdata/PodTargetLabelsFromPodMonitor.golden
+++ b/pkg/prometheus/testdata/PodTargetLabelsFromPodMonitor.golden
@@ -65,3 +65,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/PodTargetLabelsFromPodMonitorAndGlobal.golden b/pkg/prometheus/testdata/PodTargetLabelsFromPodMonitorAndGlobal.golden
index faa39312490..c62330ee046 100644
--- a/pkg/prometheus/testdata/PodTargetLabelsFromPodMonitorAndGlobal.golden
+++ b/pkg/prometheus/testdata/PodTargetLabelsFromPodMonitorAndGlobal.golden
@@ -65,3 +65,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ProbeIngressSDConfigGeneration.golden b/pkg/prometheus/testdata/ProbeIngressSDConfigGeneration.golden
index 0128f65e40b..23bf9f9ec17 100644
--- a/pkg/prometheus/testdata/ProbeIngressSDConfigGeneration.golden
+++ b/pkg/prometheus/testdata/ProbeIngressSDConfigGeneration.golden
@@ -70,3 +70,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ProbeIngressSDConfigGenerationWithLabelEnforce.golden b/pkg/prometheus/testdata/ProbeIngressSDConfigGenerationWithLabelEnforce.golden
index 7947808e97c..bf3caf8f0c9 100644
--- a/pkg/prometheus/testdata/ProbeIngressSDConfigGenerationWithLabelEnforce.golden
+++ b/pkg/prometheus/testdata/ProbeIngressSDConfigGenerationWithLabelEnforce.golden
@@ -75,3 +75,7 @@ scrape_configs:
metric_relabel_configs:
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ProbeIngressSDConfigGenerationWithShards.golden b/pkg/prometheus/testdata/ProbeIngressSDConfigGenerationWithShards.golden
index d9f60611b54..58c10313e7b 100644
--- a/pkg/prometheus/testdata/ProbeIngressSDConfigGenerationWithShards.golden
+++ b/pkg/prometheus/testdata/ProbeIngressSDConfigGenerationWithShards.golden
@@ -70,3 +70,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ProbeSpecConfig_empty_probe.golden b/pkg/prometheus/testdata/ProbeSpecConfig_empty_probe.golden
index 5820e6cfb87..0c8851c19ac 100644
--- a/pkg/prometheus/testdata/ProbeSpecConfig_empty_probe.golden
+++ b/pkg/prometheus/testdata/ProbeSpecConfig_empty_probe.golden
@@ -29,3 +29,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ProbeSpecConfig_module_config.golden b/pkg/prometheus/testdata/ProbeSpecConfig_module_config.golden
index 7f1a966cd30..47eae6b8232 100644
--- a/pkg/prometheus/testdata/ProbeSpecConfig_module_config.golden
+++ b/pkg/prometheus/testdata/ProbeSpecConfig_module_config.golden
@@ -32,3 +32,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ProbeSpecConfig_module_config_with_params.golden b/pkg/prometheus/testdata/ProbeSpecConfig_module_config_with_params.golden
index a4ca8d56e57..2e0f7d347c6 100644
--- a/pkg/prometheus/testdata/ProbeSpecConfig_module_config_with_params.golden
+++ b/pkg/prometheus/testdata/ProbeSpecConfig_module_config_with_params.golden
@@ -34,3 +34,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ProbeSpecConfig_module_config_with_params_define_module_in_param.golden b/pkg/prometheus/testdata/ProbeSpecConfig_module_config_with_params_define_module_in_param.golden
index 3ef6d51a9c7..9912658a4fe 100644
--- a/pkg/prometheus/testdata/ProbeSpecConfig_module_config_with_params_define_module_in_param.golden
+++ b/pkg/prometheus/testdata/ProbeSpecConfig_module_config_with_params_define_module_in_param.golden
@@ -34,3 +34,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ProbeSpecConfig_module_config_with_params_skip_module.golden b/pkg/prometheus/testdata/ProbeSpecConfig_module_config_with_params_skip_module.golden
index a4ca8d56e57..2e0f7d347c6 100644
--- a/pkg/prometheus/testdata/ProbeSpecConfig_module_config_with_params_skip_module.golden
+++ b/pkg/prometheus/testdata/ProbeSpecConfig_module_config_with_params_skip_module.golden
@@ -34,3 +34,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ProbeSpecConfig_prober_spec.golden b/pkg/prometheus/testdata/ProbeSpecConfig_prober_spec.golden
index 3d605306605..35ef7dd0bd0 100644
--- a/pkg/prometheus/testdata/ProbeSpecConfig_prober_spec.golden
+++ b/pkg/prometheus/testdata/ProbeSpecConfig_prober_spec.golden
@@ -36,3 +36,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ProbeSpecConfig_targets_static_config.golden b/pkg/prometheus/testdata/ProbeSpecConfig_targets_static_config.golden
index f54b046760b..23b506e46e1 100644
--- a/pkg/prometheus/testdata/ProbeSpecConfig_targets_static_config.golden
+++ b/pkg/prometheus/testdata/ProbeSpecConfig_targets_static_config.golden
@@ -50,3 +50,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ProbeStaticTargetsConfigGenerationWithJobName.golden b/pkg/prometheus/testdata/ProbeStaticTargetsConfigGenerationWithJobName.golden
index 28044942005..c604ce858fd 100644
--- a/pkg/prometheus/testdata/ProbeStaticTargetsConfigGenerationWithJobName.golden
+++ b/pkg/prometheus/testdata/ProbeStaticTargetsConfigGenerationWithJobName.golden
@@ -49,3 +49,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ProbeStaticTargetsConfigGenerationWithLabelEnforce.golden b/pkg/prometheus/testdata/ProbeStaticTargetsConfigGenerationWithLabelEnforce.golden
index c6f7b6a8306..934479ed49c 100644
--- a/pkg/prometheus/testdata/ProbeStaticTargetsConfigGenerationWithLabelEnforce.golden
+++ b/pkg/prometheus/testdata/ProbeStaticTargetsConfigGenerationWithLabelEnforce.golden
@@ -55,3 +55,7 @@ scrape_configs:
action: labeldrop
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ProbeStaticTargetsConfigGenerationWithoutModule.golden b/pkg/prometheus/testdata/ProbeStaticTargetsConfigGenerationWithoutModule.golden
index f04fe6ddc32..ba3bf06e14c 100644
--- a/pkg/prometheus/testdata/ProbeStaticTargetsConfigGenerationWithoutModule.golden
+++ b/pkg/prometheus/testdata/ProbeStaticTargetsConfigGenerationWithoutModule.golden
@@ -46,3 +46,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ProbeWithDefaultScrapeClassAuthz.golden b/pkg/prometheus/testdata/ProbeWithDefaultScrapeClassAuthz.golden
index 93bbc2a069b..c65edf28951 100644
--- a/pkg/prometheus/testdata/ProbeWithDefaultScrapeClassAuthz.golden
+++ b/pkg/prometheus/testdata/ProbeWithDefaultScrapeClassAuthz.golden
@@ -58,3 +58,7 @@ scrape_configs:
action: labeldrop
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ProbeWithHttp2Disabled.golden b/pkg/prometheus/testdata/ProbeWithHttp2Disabled.golden
index 035c9f646f8..da5e77ed6df 100644
--- a/pkg/prometheus/testdata/ProbeWithHttp2Disabled.golden
+++ b/pkg/prometheus/testdata/ProbeWithHttp2Disabled.golden
@@ -56,3 +56,7 @@ scrape_configs:
action: labeldrop
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ProbeWithNonDefaultScrapeClassAuthz.golden b/pkg/prometheus/testdata/ProbeWithNonDefaultScrapeClassAuthz.golden
index 98246e18c1f..bdd70254b09 100644
--- a/pkg/prometheus/testdata/ProbeWithNonDefaultScrapeClassAuthz.golden
+++ b/pkg/prometheus/testdata/ProbeWithNonDefaultScrapeClassAuthz.golden
@@ -58,3 +58,7 @@ scrape_configs:
action: labeldrop
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ProbeWithNonDefaultScrapeClassUserDefinedAuthz.golden b/pkg/prometheus/testdata/ProbeWithNonDefaultScrapeClassUserDefinedAuthz.golden
index 4e1e8efba8e..c0e4720a720 100644
--- a/pkg/prometheus/testdata/ProbeWithNonDefaultScrapeClassUserDefinedAuthz.golden
+++ b/pkg/prometheus/testdata/ProbeWithNonDefaultScrapeClassUserDefinedAuthz.golden
@@ -58,3 +58,7 @@ scrape_configs:
action: labeldrop
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/RemoteWriteConfigWithEmptyMetadataConfig.golden b/pkg/prometheus/testdata/RemoteWriteConfigWithEmptyMetadataConfig.golden
index 7a52dfff65b..2ef178f68b9 100644
--- a/pkg/prometheus/testdata/RemoteWriteConfigWithEmptyMetadataConfig.golden
+++ b/pkg/prometheus/testdata/RemoteWriteConfigWithEmptyMetadataConfig.golden
@@ -5,6 +5,10 @@ global:
prometheus_replica: $(POD_NAME)
evaluation_interval: 30s
scrape_configs: []
+storage:
+ tsdb:
+ retention:
+ time: 24h
remote_write:
- url: http://example.com
metadata_config:
diff --git a/pkg/prometheus/testdata/RemoteWriteConfig_3.11.0.golden b/pkg/prometheus/testdata/RemoteWriteConfig_3.11.0.golden
index 51e81776f84..e87dd0360f6 100644
--- a/pkg/prometheus/testdata/RemoteWriteConfig_3.11.0.golden
+++ b/pkg/prometheus/testdata/RemoteWriteConfig_3.11.0.golden
@@ -5,6 +5,10 @@ global:
prometheus_replica: $(POD_NAME)
evaluation_interval: 30s
scrape_configs: []
+storage:
+ tsdb:
+ retention:
+ time: 24h
remote_write:
- url: http://example.com
sigv4:
diff --git a/pkg/prometheus/testdata/RetentionConfigFile_default_v3.11.0.golden b/pkg/prometheus/testdata/RetentionConfigFile_default_v3.11.0.golden
new file mode 100644
index 00000000000..ecbee05becb
--- /dev/null
+++ b/pkg/prometheus/testdata/RetentionConfigFile_default_v3.11.0.golden
@@ -0,0 +1,11 @@
+global:
+ scrape_interval: 30s
+ external_labels:
+ prometheus: default/test
+ prometheus_replica: $(POD_NAME)
+ evaluation_interval: 30s
+scrape_configs: []
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/RetentionConfigFile_size_v3.11.0.golden b/pkg/prometheus/testdata/RetentionConfigFile_size_v3.11.0.golden
new file mode 100644
index 00000000000..2f94c8d30f9
--- /dev/null
+++ b/pkg/prometheus/testdata/RetentionConfigFile_size_v3.11.0.golden
@@ -0,0 +1,11 @@
+global:
+ scrape_interval: 30s
+ external_labels:
+ prometheus: default/test
+ prometheus_replica: $(POD_NAME)
+ evaluation_interval: 30s
+scrape_configs: []
+storage:
+ tsdb:
+ retention:
+ size: 512MB
diff --git a/pkg/prometheus/testdata/RetentionConfigFile_time_size_v3.11.0.golden b/pkg/prometheus/testdata/RetentionConfigFile_time_size_v3.11.0.golden
new file mode 100644
index 00000000000..174d84eff53
--- /dev/null
+++ b/pkg/prometheus/testdata/RetentionConfigFile_time_size_v3.11.0.golden
@@ -0,0 +1,12 @@
+global:
+ scrape_interval: 30s
+ external_labels:
+ prometheus: default/test
+ prometheus_replica: $(POD_NAME)
+ evaluation_interval: 30s
+scrape_configs: []
+storage:
+ tsdb:
+ retention:
+ time: 2d
+ size: 512MB
diff --git a/pkg/prometheus/testdata/RetentionConfigFile_time_v3.11.0.golden b/pkg/prometheus/testdata/RetentionConfigFile_time_v3.11.0.golden
new file mode 100644
index 00000000000..0e874517803
--- /dev/null
+++ b/pkg/prometheus/testdata/RetentionConfigFile_time_v3.11.0.golden
@@ -0,0 +1,11 @@
+global:
+ scrape_interval: 30s
+ external_labels:
+ prometheus: default/test
+ prometheus_replica: $(POD_NAME)
+ evaluation_interval: 30s
+scrape_configs: []
+storage:
+ tsdb:
+ retention:
+ time: 2d
diff --git a/pkg/prometheus/testdata/RetentionConfigFile_v3.10.0.golden b/pkg/prometheus/testdata/RetentionConfigFile_v3.10.0.golden
new file mode 100644
index 00000000000..609303fe82c
--- /dev/null
+++ b/pkg/prometheus/testdata/RetentionConfigFile_v3.10.0.golden
@@ -0,0 +1,7 @@
+global:
+ scrape_interval: 30s
+ external_labels:
+ prometheus: default/test
+ prometheus_replica: $(POD_NAME)
+ evaluation_interval: 30s
+scrape_configs: []
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Already_Sharded.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Already_Sharded.golden
index 5e2ceb4e9f9..26e09445d60 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Already_Sharded.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Already_Sharded.golden
@@ -25,3 +25,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Authorization.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Authorization.golden
index 1f03f84f628..c0a9df8f97b 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Authorization.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Authorization.golden
@@ -18,3 +18,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigEmpty.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigEmpty.golden
index 26f7d0393d5..2f125e0578d 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigEmpty.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigEmpty.golden
@@ -10,3 +10,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid.golden
index 5d1a39f1881..95b4fb2cc59 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid.golden
@@ -20,3 +20,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValidWithSubscriptionID.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValidWithSubscriptionID.golden
index 640c45ce422..df193d8e04d 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValidWithSubscriptionID.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValidWithSubscriptionID.golden
@@ -13,3 +13,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid_ManagedIdentityAuth.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid_ManagedIdentityAuth.golden
index 4518a3f498d..079ba5c6ff5 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid_ManagedIdentityAuth.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid_ManagedIdentityAuth.golden
@@ -14,3 +14,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid_SDKAuth.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid_SDKAuth.golden
index 06bf2148fae..9172ca35b63 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid_SDKAuth.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid_SDKAuth.golden
@@ -17,3 +17,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid_WorkloadIdentityAuth.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid_WorkloadIdentityAuth.golden
index c47078a44d9..873949db029 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid_WorkloadIdentityAuth.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid_WorkloadIdentityAuth.golden
@@ -14,3 +14,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid_basic_auth_and_TLS.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid_basic_auth_and_TLS.golden
index a6ffdb8b8a9..2fbf7643d4f 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid_basic_auth_and_TLS.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid_basic_auth_and_TLS.golden
@@ -16,3 +16,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid_http_config.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid_http_config.golden
index ce3d6475933..9752b42b4cb 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid_http_config.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid_http_config.golden
@@ -22,3 +22,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid_with_oauth2.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid_with_oauth2.golden
index 0cfb25cf58b..b706ef3d6be 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid_with_oauth2.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_AzureSDConfigValid_with_oauth2.golden
@@ -23,3 +23,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_BasicAuth.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_BasicAuth.golden
index b5b8b461174..9e6dd563d6b 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_BasicAuth.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_BasicAuth.golden
@@ -18,3 +18,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DNSSD_ARecord.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DNSSD_ARecord.golden
index ab81b616701..46eb43c0303 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DNSSD_ARecord.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DNSSD_ARecord.golden
@@ -15,3 +15,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DNSSD_SRVRecord.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DNSSD_SRVRecord.golden
index ce4cd35260f..0cb1bdecdf7 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DNSSD_SRVRecord.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DNSSD_SRVRecord.golden
@@ -13,3 +13,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerSDConfig.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerSDConfig.golden
index 644b1eac252..4e50779b12e 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerSDConfig.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerSDConfig.golden
@@ -42,3 +42,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerSD_with_BasicAuth.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerSD_with_BasicAuth.golden
index 8a5afc63a81..10ef7770b29 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerSD_with_BasicAuth.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerSD_with_BasicAuth.golden
@@ -27,3 +27,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerSD_with_OAuth.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerSD_with_OAuth.golden
index b649c3d6117..655d2a14557 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerSD_with_OAuth.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerSD_with_OAuth.golden
@@ -34,3 +34,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerswarmSD.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerswarmSD.golden
index 4432ed511bf..8a077334d9f 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerswarmSD.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerswarmSD.golden
@@ -29,3 +29,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerswarmSD_withBasicAuth.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerswarmSD_withBasicAuth.golden
index 5658b54ae60..d276626aec4 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerswarmSD_withBasicAuth.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerswarmSD_withBasicAuth.golden
@@ -25,3 +25,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerswarmSD_with_OAuth.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerswarmSD_with_OAuth.golden
index 2a47da398e3..fd701ae6067 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerswarmSD_with_OAuth.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerswarmSD_with_OAuth.golden
@@ -23,3 +23,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerswarmSD_with_TLSConfig.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerswarmSD_with_TLSConfig.golden
index de7060bf0f7..47c7b914662 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerswarmSD_with_TLSConfig.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DockerswarmSD_with_TLSConfig.golden
@@ -20,3 +20,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigEmpty.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigEmpty.golden
index 26f7d0393d5..2f125e0578d 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigEmpty.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigEmpty.golden
@@ -10,3 +10,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigValidAPIKeys.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigValidAPIKeys.golden
index 10a93e77ead..1f33ebf2633 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigValidAPIKeys.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigValidAPIKeys.golden
@@ -16,3 +16,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigValidRoleARN.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigValidRoleARN.golden
index d99c8181c49..bd61c8ed982 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigValidRoleARN.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigValidRoleARN.golden
@@ -15,3 +15,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SD_withProxyConfig.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SD_withProxyConfig.golden
index 0cad0368088..1f1bf2924e1 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SD_withProxyConfig.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SD_withProxyConfig.golden
@@ -21,3 +21,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Empty.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Empty.golden
index 26f7d0393d5..2f125e0578d 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Empty.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Empty.golden
@@ -10,3 +10,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EmptyRelabelConfig.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EmptyRelabelConfig.golden
index 26f7d0393d5..2f125e0578d 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EmptyRelabelConfig.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EmptyRelabelConfig.golden
@@ -10,3 +10,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EnableCompression_False.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EnableCompression_False.golden
index f0832062bf0..376676488b7 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EnableCompression_False.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EnableCompression_False.golden
@@ -11,3 +11,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EnableCompression_True.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EnableCompression_True.golden
index 9a6e4ca2216..180480c5c21 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EnableCompression_True.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EnableCompression_True.golden
@@ -11,3 +11,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EurekaSD.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EurekaSD.golden
index fa135104910..05f8e951137 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EurekaSD.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EurekaSD.golden
@@ -24,3 +24,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EurekaSD_with_OAuth.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EurekaSD_with_OAuth.golden
index 01ac16c3a98..040fe083651 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EurekaSD_with_OAuth.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EurekaSD_with_OAuth.golden
@@ -22,3 +22,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EurekaSD_with_TLSConfig.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EurekaSD_with_TLSConfig.golden
index 5d020652298..23990956457 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EurekaSD_with_TLSConfig.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EurekaSD_with_TLSConfig.golden
@@ -19,3 +19,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_FileSD.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_FileSD.golden
index 17904aaac4c..cd81be12b80 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_FileSD.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_FileSD.golden
@@ -14,3 +14,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_GCESDConfigEmpty.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_GCESDConfigEmpty.golden
index 26f7d0393d5..2f125e0578d 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_GCESDConfigEmpty.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_GCESDConfigEmpty.golden
@@ -10,3 +10,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_GCESDConfigValid.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_GCESDConfigValid.golden
index d79b0337ab6..7a642915dba 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_GCESDConfigValid.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_GCESDConfigValid.golden
@@ -15,3 +15,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_GCESDConfigValidRequiredFields.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_GCESDConfigValidRequiredFields.golden
index df10775dc45..fa63627c653 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_GCESDConfigValidRequiredFields.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_GCESDConfigValidRequiredFields.golden
@@ -13,3 +13,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_GCESDConfigValid_all_options.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_GCESDConfigValid_all_options.golden
index 8ffdd32724d..8af1bfbec76 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_GCESDConfigValid_all_options.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_GCESDConfigValid_all_options.golden
@@ -17,3 +17,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD.golden
index 6b9d5fc7b41..190c77bf33e 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD.golden
@@ -19,3 +19,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD_with_Authorization.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD_with_Authorization.golden
index 8de183ba163..3c8e201a852 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD_with_Authorization.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD_with_Authorization.golden
@@ -15,3 +15,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD_with_BasicAuth.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD_with_BasicAuth.golden
index 7d6e89826b7..ce791bc4f04 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD_with_BasicAuth.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD_with_BasicAuth.golden
@@ -15,3 +15,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD_with_OAuth.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD_with_OAuth.golden
index e995fcfafed..321bc25aea6 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD_with_OAuth.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD_with_OAuth.golden
@@ -22,3 +22,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD_with_ProxyConfig.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD_with_ProxyConfig.golden
index 47b68e3757c..f7306c773c9 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD_with_ProxyConfig.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD_with_ProxyConfig.golden
@@ -20,3 +20,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD_with_TLSConfig.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD_with_TLSConfig.golden
index d3a9ce0de49..2f2a851e708 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD_with_TLSConfig.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD_with_TLSConfig.golden
@@ -16,3 +16,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HetznerSD.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HetznerSD.golden
index 77e3a32c559..36ddf75ad92 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HetznerSD.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HetznerSD.golden
@@ -22,3 +22,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HetznerSD_with_Authorization.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HetznerSD_with_Authorization.golden
index e676eef99cf..e86b3496ade 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HetznerSD_with_Authorization.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HetznerSD_with_Authorization.golden
@@ -15,3 +15,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HetznerSD_with_BasicAuth.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HetznerSD_with_BasicAuth.golden
index cba312ce96e..d0c0c9059cd 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HetznerSD_with_BasicAuth.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HetznerSD_with_BasicAuth.golden
@@ -15,3 +15,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HetznerSD_with_OAuth.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HetznerSD_with_OAuth.golden
index 1e3ece018f6..2c48f6189a4 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HetznerSD_with_OAuth.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HetznerSD_with_OAuth.golden
@@ -22,3 +22,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HetznerSD_with_TLSConfig.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HetznerSD_with_TLSConfig.golden
index e6e7b5cd506..3287b472d5c 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HetznerSD_with_TLSConfig.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HetznerSD_with_TLSConfig.golden
@@ -16,3 +16,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HonorLabels.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HonorLabels.golden
index 33a168b8b4a..93c7c0773da 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HonorLabels.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HonorLabels.golden
@@ -11,3 +11,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HonorTimeStamp.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HonorTimeStamp.golden
index 7ecef16e064..1cf534f5133 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HonorTimeStamp.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HonorTimeStamp.golden
@@ -11,3 +11,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Inline_TLSConfig.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Inline_TLSConfig.golden
index bba3f094af6..e5698c169d4 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Inline_TLSConfig.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Inline_TLSConfig.golden
@@ -19,3 +19,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_IonosSD.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_IonosSD.golden
index 2be8df4ad0f..80ca4ae0d17 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_IonosSD.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_IonosSD.golden
@@ -25,3 +25,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_IonosSD_withOAuth2.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_IonosSD_withOAuth2.golden
index 56fde14b399..445723e0b63 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_IonosSD_withOAuth2.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_IonosSD_withOAuth2.golden
@@ -22,3 +22,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_IonosSD_withTLSConfig.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_IonosSD_withTLSConfig.golden
index 192e78c03af..199b4277a05 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_IonosSD_withTLSConfig.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_IonosSD_withTLSConfig.golden
@@ -19,3 +19,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD.golden
index 77a4c1ee60f..6e3a40d35be 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD.golden
@@ -21,3 +21,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_AttachMetadata.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_AttachMetadata.golden
index 1e15788aade..cc24d08bb92 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_AttachMetadata.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_AttachMetadata.golden
@@ -14,3 +14,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_Authorization.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_Authorization.golden
index 8a016db2d42..849fea5166d 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_Authorization.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_Authorization.golden
@@ -16,3 +16,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_BasicAuth.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_BasicAuth.golden
index d42fbdb4cf7..7ecffc2dd08 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_BasicAuth.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_BasicAuth.golden
@@ -16,3 +16,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_NamespaceDiscovery.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_NamespaceDiscovery.golden
index 4331a09f127..d5cf0353693 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_NamespaceDiscovery.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_NamespaceDiscovery.golden
@@ -16,3 +16,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_NamespaceDiscovery_and_OwnNamespace.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_NamespaceDiscovery_and_OwnNamespace.golden
index 5e639b218eb..ece452c1df1 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_NamespaceDiscovery_and_OwnNamespace.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_NamespaceDiscovery_and_OwnNamespace.golden
@@ -17,3 +17,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_OAuth.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_OAuth.golden
index f7b6e0ce107..4ba671cb8d2 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_OAuth.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_OAuth.golden
@@ -23,3 +23,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_TLSConfig.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_TLSConfig.golden
index baaaf6702a4..ba0a57d64c6 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_TLSConfig.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_TLSConfig.golden
@@ -17,3 +17,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_Unsupported_Role_AttachMetadata.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_Unsupported_Role_AttachMetadata.golden
index deea1dd88db..a18f54328c1 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_Unsupported_Role_AttachMetadata.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_Unsupported_Role_AttachMetadata.golden
@@ -12,3 +12,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_KumaSD.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_KumaSD.golden
index 215866e34a4..9639d967694 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_KumaSD.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_KumaSD.golden
@@ -26,3 +26,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_KumaSD_with_OAuth.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_KumaSD_with_OAuth.golden
index 523b61fa691..f48a5756f7d 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_KumaSD_with_OAuth.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_KumaSD_with_OAuth.golden
@@ -22,3 +22,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_KumaSD_with_TLSConfig.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_KumaSD_with_TLSConfig.golden
index 288dc80baeb..3e2e21e51d3 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_KumaSD_with_TLSConfig.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_KumaSD_with_TLSConfig.golden
@@ -19,3 +19,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_KumaSD_with_TLSConfig_TLSVersion.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_KumaSD_with_TLSConfig_TLSVersion.golden
index 5c2b7b1496d..83eac8b83c1 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_KumaSD_with_TLSConfig_TLSVersion.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_KumaSD_with_TLSConfig_TLSVersion.golden
@@ -21,3 +21,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LightSailSD.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LightSailSD.golden
index b870fc4fc81..9c5c512462d 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LightSailSD.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LightSailSD.golden
@@ -25,3 +25,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LightSailSDConfigValidAPIKeys.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LightSailSDConfigValidAPIKeys.golden
index bd4e9d608ce..454845a55e2 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LightSailSDConfigValidAPIKeys.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LightSailSDConfigValidAPIKeys.golden
@@ -17,3 +17,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LightSailSDConfigValidRoleARN.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LightSailSDConfigValidRoleARN.golden
index 75e800181bf..cac600fb394 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LightSailSDConfigValidRoleARN.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LightSailSDConfigValidRoleARN.golden
@@ -16,3 +16,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LightSailSD_withBasicAuth.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LightSailSD_withBasicAuth.golden
index 12c64abcba1..292a8c214f4 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LightSailSD_withBasicAuth.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LightSailSD_withBasicAuth.golden
@@ -25,3 +25,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LightSailSD_with_OAuth.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LightSailSD_with_OAuth.golden
index 26910363eac..a116fd3dc74 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LightSailSD_with_OAuth.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LightSailSD_with_OAuth.golden
@@ -23,3 +23,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LightSailSD_with_TLSConfig.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LightSailSD_with_TLSConfig.golden
index 5f503aa9d1f..0566716f01b 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LightSailSD_with_TLSConfig.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LightSailSD_with_TLSConfig.golden
@@ -20,3 +20,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Limits.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Limits.golden
index ab76d5804b4..97a6afc36e6 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Limits.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Limits.golden
@@ -15,3 +15,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LinodeSDConfig.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LinodeSDConfig.golden
index 776b577ec35..83883f00535 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LinodeSDConfig.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LinodeSDConfig.golden
@@ -29,3 +29,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LinodeSD_with_OAuth.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LinodeSD_with_OAuth.golden
index d880f80f200..dadd4812f0b 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LinodeSD_with_OAuth.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_LinodeSD_with_OAuth.golden
@@ -28,3 +28,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_MetricPath.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_MetricPath.golden
index 5f9f83f4e24..2b4c8412c91 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_MetricPath.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_MetricPath.golden
@@ -11,3 +11,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NomadSD.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NomadSD.golden
index 03b44f1e185..850465574d6 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NomadSD.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NomadSD.golden
@@ -28,3 +28,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NomadSD_with_OAuth.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NomadSD_with_OAuth.golden
index 68633e5b573..e89abd70bf6 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NomadSD_with_OAuth.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NomadSD_with_OAuth.golden
@@ -22,3 +22,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NomadSD_with_TLSConfig.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NomadSD_with_TLSConfig.golden
index 8251c1cacb4..b3549dcc13d 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NomadSD_with_TLSConfig.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NomadSD_with_TLSConfig.golden
@@ -19,3 +19,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NonEmptyMetricRelabelConfig.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NonEmptyMetricRelabelConfig.golden
index 789619d38a5..11c13643a62 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NonEmptyMetricRelabelConfig.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NonEmptyMetricRelabelConfig.golden
@@ -13,3 +13,7 @@ scrape_configs:
metric_relabel_configs:
- regex: noisy_labels.*
action: labeldrop
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NonEmptyRelabelConfig.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NonEmptyRelabelConfig.golden
index 5e31cff0893..15d93f4eefd 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NonEmptyRelabelConfig.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NonEmptyRelabelConfig.golden
@@ -16,3 +16,7 @@ scrape_configs:
regex: (.+)(?::d+)
replacement: $1:9537
action: replace
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_OVHCloudSD.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_OVHCloudSD.golden
index f166854c0cc..ea51cc38750 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_OVHCloudSD.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_OVHCloudSD.golden
@@ -17,3 +17,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_OpenStackSDConfigEmpty.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_OpenStackSDConfigEmpty.golden
index 26f7d0393d5..2f125e0578d 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_OpenStackSDConfigEmpty.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_OpenStackSDConfigEmpty.golden
@@ -10,3 +10,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_OpenStackSDConfigValid.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_OpenStackSDConfigValid.golden
index 2ec8f276bc7..990f3c6e117 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_OpenStackSDConfigValid.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_OpenStackSDConfigValid.golden
@@ -19,3 +19,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Params.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Params.golden
index a6de2070ae5..46f2ec31115 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Params.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Params.golden
@@ -15,3 +15,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ProxySettings.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ProxySettings.golden
index 19bde9d5b97..17abf2138c6 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ProxySettings.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ProxySettings.golden
@@ -16,3 +16,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ProxySettingsWithMutiProxyConnectHeaderValues.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ProxySettingsWithMutiProxyConnectHeaderValues.golden
index 2f037d97168..79f3d3cb692 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ProxySettingsWithMutiProxyConnectHeaderValues.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ProxySettingsWithMutiProxyConnectHeaderValues.golden
@@ -21,3 +21,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_PuppetDBSD.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_PuppetDBSD.golden
index fe9160d6b7d..e0426ce3e82 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_PuppetDBSD.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_PuppetDBSD.golden
@@ -25,3 +25,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_PuppetDBSD_withBasicAuth.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_PuppetDBSD_withBasicAuth.golden
index 437fe6ce43b..5725095f736 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_PuppetDBSD_withBasicAuth.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_PuppetDBSD_withBasicAuth.golden
@@ -25,3 +25,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_PuppetDBSD_with_OAuth.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_PuppetDBSD_with_OAuth.golden
index 6d8fe1d3c15..99ffeddc9a5 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_PuppetDBSD_with_OAuth.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_PuppetDBSD_with_OAuth.golden
@@ -23,3 +23,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_PuppetDBSD_with_TLSConfig.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_PuppetDBSD_with_TLSConfig.golden
index 1bf5394b8d3..862c01689ce 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_PuppetDBSD_with_TLSConfig.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_PuppetDBSD_with_TLSConfig.golden
@@ -20,3 +20,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScaleWaySD.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScaleWaySD.golden
index 693a8802a12..3ea9c6b9576 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScaleWaySD.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScaleWaySD.golden
@@ -31,3 +31,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScaleWaySD_with_TLSConfig.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScaleWaySD_with_TLSConfig.golden
index 7ac66295beb..413a41442b4 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScaleWaySD_with_TLSConfig.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScaleWaySD_with_TLSConfig.golden
@@ -19,3 +19,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Scheme.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Scheme.golden
index 3c6673658b3..0f61f9d3636 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Scheme.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Scheme.golden
@@ -11,3 +11,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScrapeInterval.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScrapeInterval.golden
index 0fa8cdc0961..0eefa240cd3 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScrapeInterval.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScrapeInterval.golden
@@ -11,3 +11,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScrapeProtocols.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScrapeProtocols.golden
index 7c6caa2d6fe..8b9b19ebe81 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScrapeProtocols.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScrapeProtocols.golden
@@ -15,3 +15,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScrapeTimeout.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScrapeTimeout.golden
index 4bcb1181311..4c9a202173d 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScrapeTimeout.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScrapeTimeout.golden
@@ -11,3 +11,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Sharded.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Sharded.golden
index 226bdd466a9..fda91e5b800 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Sharded.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Sharded.golden
@@ -32,3 +32,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Static.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Static.golden
index 1183663a5ff..c07dd614212 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Static.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Static.golden
@@ -15,3 +15,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_TLSConfig.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_TLSConfig.golden
index 3e0e989960c..277eac1cb0d 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_TLSConfig.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_TLSConfig.golden
@@ -19,3 +19,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_TrackTimestampsStaleness.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_TrackTimestampsStaleness.golden
index f4a4f50fb93..5ad20809839 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_TrackTimestampsStaleness.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_TrackTimestampsStaleness.golden
@@ -11,3 +11,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_WithJobName.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_WithJobName.golden
index d85f2227f59..e409f142569 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_WithJobName.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_WithJobName.golden
@@ -13,3 +13,7 @@ scrape_configs:
- target_label: job
action: replace
replacement: explicit-test-scrape-config3
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_WithJobNameAndRelabelConfig.golden b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_WithJobNameAndRelabelConfig.golden
index 181b8551ff2..ffebb4f7401 100644
--- a/pkg/prometheus/testdata/ScrapeConfigSpecConfig_WithJobNameAndRelabelConfig.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigSpecConfig_WithJobNameAndRelabelConfig.golden
@@ -19,3 +19,7 @@ scrape_configs:
regex: (.+)(?::d+)
replacement: $1:9537
action: replace
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigWithDefaultScrapeClassAuthz.golden b/pkg/prometheus/testdata/ScrapeConfigWithDefaultScrapeClassAuthz.golden
index 23cec0a7f83..c2d166e1c71 100644
--- a/pkg/prometheus/testdata/ScrapeConfigWithDefaultScrapeClassAuthz.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigWithDefaultScrapeClassAuthz.golden
@@ -22,3 +22,7 @@ scrape_configs:
metric_relabel_configs:
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigWithNonDefaultScrapeClassAuthz.golden b/pkg/prometheus/testdata/ScrapeConfigWithNonDefaultScrapeClassAuthz.golden
index f34e221a092..666547f1532 100644
--- a/pkg/prometheus/testdata/ScrapeConfigWithNonDefaultScrapeClassAuthz.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigWithNonDefaultScrapeClassAuthz.golden
@@ -22,3 +22,7 @@ scrape_configs:
metric_relabel_configs:
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ScrapeConfigWithNonDefaultScrapeClassUserDefinedAuthz.golden b/pkg/prometheus/testdata/ScrapeConfigWithNonDefaultScrapeClassUserDefinedAuthz.golden
index d0b22d45389..24e13701ebc 100644
--- a/pkg/prometheus/testdata/ScrapeConfigWithNonDefaultScrapeClassUserDefinedAuthz.golden
+++ b/pkg/prometheus/testdata/ScrapeConfigWithNonDefaultScrapeClassUserDefinedAuthz.golden
@@ -22,3 +22,7 @@ scrape_configs:
metric_relabel_configs:
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ServiceMonitorObjectWithEndpointSliceSelectorAndMatchLabelSelector.golden b/pkg/prometheus/testdata/ServiceMonitorObjectWithEndpointSliceSelectorAndMatchLabelSelector.golden
index 40c89b1011b..9738ad92075 100644
--- a/pkg/prometheus/testdata/ServiceMonitorObjectWithEndpointSliceSelectorAndMatchLabelSelector.golden
+++ b/pkg/prometheus/testdata/ServiceMonitorObjectWithEndpointSliceSelectorAndMatchLabelSelector.golden
@@ -79,3 +79,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ServiceMonitorObjectWithMatchExpressionSelector.golden b/pkg/prometheus/testdata/ServiceMonitorObjectWithMatchExpressionSelector.golden
index 3a5dff05b17..6e78fef2455 100644
--- a/pkg/prometheus/testdata/ServiceMonitorObjectWithMatchExpressionSelector.golden
+++ b/pkg/prometheus/testdata/ServiceMonitorObjectWithMatchExpressionSelector.golden
@@ -79,3 +79,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ServiceMonitorObjectWithMatchLabelSelector.golden b/pkg/prometheus/testdata/ServiceMonitorObjectWithMatchLabelSelector.golden
index 76d4d4ea0c5..493ce7353a7 100644
--- a/pkg/prometheus/testdata/ServiceMonitorObjectWithMatchLabelSelector.golden
+++ b/pkg/prometheus/testdata/ServiceMonitorObjectWithMatchLabelSelector.golden
@@ -79,3 +79,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ServiceMonitorObjectWithSelectorAndMatchExpressionSelector.golden b/pkg/prometheus/testdata/ServiceMonitorObjectWithSelectorAndMatchExpressionSelector.golden
index d4e5a571a2d..d0b33b76010 100644
--- a/pkg/prometheus/testdata/ServiceMonitorObjectWithSelectorAndMatchExpressionSelector.golden
+++ b/pkg/prometheus/testdata/ServiceMonitorObjectWithSelectorAndMatchExpressionSelector.golden
@@ -79,3 +79,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/SettingHonorLabels.golden b/pkg/prometheus/testdata/SettingHonorLabels.golden
index 67a4bc656eb..6fd3d23323b 100644
--- a/pkg/prometheus/testdata/SettingHonorLabels.golden
+++ b/pkg/prometheus/testdata/SettingHonorLabels.golden
@@ -84,3 +84,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/SettingHonorTimestampsInPodMonitor.golden b/pkg/prometheus/testdata/SettingHonorTimestampsInPodMonitor.golden
index a32ff109ea7..b307fd57a1e 100644
--- a/pkg/prometheus/testdata/SettingHonorTimestampsInPodMonitor.golden
+++ b/pkg/prometheus/testdata/SettingHonorTimestampsInPodMonitor.golden
@@ -66,3 +66,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/SettingHonorTimestampsInServiceMonitor.golden b/pkg/prometheus/testdata/SettingHonorTimestampsInServiceMonitor.golden
index 9fafc9c1e4f..ccf70ff9f44 100644
--- a/pkg/prometheus/testdata/SettingHonorTimestampsInServiceMonitor.golden
+++ b/pkg/prometheus/testdata/SettingHonorTimestampsInServiceMonitor.golden
@@ -85,3 +85,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/SettingTrackTimestampsStalenessInPodMonitor.golden b/pkg/prometheus/testdata/SettingTrackTimestampsStalenessInPodMonitor.golden
index bfa701e76f3..0da87b5626a 100644
--- a/pkg/prometheus/testdata/SettingTrackTimestampsStalenessInPodMonitor.golden
+++ b/pkg/prometheus/testdata/SettingTrackTimestampsStalenessInPodMonitor.golden
@@ -66,3 +66,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/SettingTrackTimestampsStalenessInServiceMonitor.golden b/pkg/prometheus/testdata/SettingTrackTimestampsStalenessInServiceMonitor.golden
index f63fd0c31e5..7d41c48d808 100644
--- a/pkg/prometheus/testdata/SettingTrackTimestampsStalenessInServiceMonitor.golden
+++ b/pkg/prometheus/testdata/SettingTrackTimestampsStalenessInServiceMonitor.golden
@@ -85,3 +85,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ShardingRelabelConfigs_with_retention_2_shards.golden b/pkg/prometheus/testdata/ShardingRelabelConfigs_with_retention_2_shards.golden
index ebb4cd0d02d..22913863b41 100644
--- a/pkg/prometheus/testdata/ShardingRelabelConfigs_with_retention_2_shards.golden
+++ b/pkg/prometheus/testdata/ShardingRelabelConfigs_with_retention_2_shards.golden
@@ -86,3 +86,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ShardingRelabelConfigs_with_retention_3_shards.golden b/pkg/prometheus/testdata/ShardingRelabelConfigs_with_retention_3_shards.golden
index a5b7831c477..cacae11b049 100644
--- a/pkg/prometheus/testdata/ShardingRelabelConfigs_with_retention_3_shards.golden
+++ b/pkg/prometheus/testdata/ShardingRelabelConfigs_with_retention_3_shards.golden
@@ -86,3 +86,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/ShardingRelabelConfigs_without_retention.golden b/pkg/prometheus/testdata/ShardingRelabelConfigs_without_retention.golden
index 508e7b457e6..f84cf66c7dc 100644
--- a/pkg/prometheus/testdata/ShardingRelabelConfigs_without_retention.golden
+++ b/pkg/prometheus/testdata/ShardingRelabelConfigs_without_retention.golden
@@ -79,3 +79,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/StorageSettingMaxExemplars_MaxSize5000000.golden b/pkg/prometheus/testdata/StorageSettingMaxExemplars_MaxSize5000000.golden
index e878a48a400..dfdf1044898 100644
--- a/pkg/prometheus/testdata/StorageSettingMaxExemplars_MaxSize5000000.golden
+++ b/pkg/prometheus/testdata/StorageSettingMaxExemplars_MaxSize5000000.golden
@@ -8,3 +8,6 @@ scrape_configs: []
storage:
exemplars:
max_exemplars: 5000000
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/StorageSettingMaxExemplars_MaxSizeNotSetAtAll.golden b/pkg/prometheus/testdata/StorageSettingMaxExemplars_MaxSizeNotSetAtAll.golden
index 609303fe82c..ecbee05becb 100644
--- a/pkg/prometheus/testdata/StorageSettingMaxExemplars_MaxSizeNotSetAtAll.golden
+++ b/pkg/prometheus/testdata/StorageSettingMaxExemplars_MaxSizeNotSetAtAll.golden
@@ -5,3 +5,7 @@ global:
prometheus_replica: $(POD_NAME)
evaluation_interval: 30s
scrape_configs: []
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/TSDB_config_greater_than_or_equal_to_v2.39.0.golden b/pkg/prometheus/testdata/TSDB_config_greater_than_or_equal_to_v2.39.0.golden
index 3012c6447e3..6b3e78c6184 100644
--- a/pkg/prometheus/testdata/TSDB_config_greater_than_or_equal_to_v2.39.0.golden
+++ b/pkg/prometheus/testdata/TSDB_config_greater_than_or_equal_to_v2.39.0.golden
@@ -8,3 +8,5 @@ scrape_configs: []
storage:
tsdb:
out_of_order_time_window: 10m
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/TargetLabels.golden b/pkg/prometheus/testdata/TargetLabels.golden
index 45412c73940..7b34835eb7c 100644
--- a/pkg/prometheus/testdata/TargetLabels.golden
+++ b/pkg/prometheus/testdata/TargetLabels.golden
@@ -84,3 +84,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/TestAdditionalAlertmanagers_Expected.golden b/pkg/prometheus/testdata/TestAdditionalAlertmanagers_Expected.golden
index 85b4341279e..9a11ed6de69 100644
--- a/pkg/prometheus/testdata/TestAdditionalAlertmanagers_Expected.golden
+++ b/pkg/prometheus/testdata/TestAdditionalAlertmanagers_Expected.golden
@@ -5,6 +5,10 @@ global:
prometheus_replica: $(POD_NAME)
evaluation_interval: 30s
scrape_configs: []
+storage:
+ tsdb:
+ retention:
+ time: 24h
alerting:
alert_relabel_configs:
- action: labeldrop
diff --git a/pkg/prometheus/testdata/TestServiceMonitorWithDefaultServiceDiscoveryRole.golden b/pkg/prometheus/testdata/TestServiceMonitorWithDefaultServiceDiscoveryRole.golden
index 7c9c7822bdb..06c868d7ba8 100644
--- a/pkg/prometheus/testdata/TestServiceMonitorWithDefaultServiceDiscoveryRole.golden
+++ b/pkg/prometheus/testdata/TestServiceMonitorWithDefaultServiceDiscoveryRole.golden
@@ -84,3 +84,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/TestServiceMonitorWithEndpointSliceAndPrometheusEndpoints.golden b/pkg/prometheus/testdata/TestServiceMonitorWithEndpointSliceAndPrometheusEndpoints.golden
index 345f1fda9dc..8dc50ec0191 100644
--- a/pkg/prometheus/testdata/TestServiceMonitorWithEndpointSliceAndPrometheusEndpoints.golden
+++ b/pkg/prometheus/testdata/TestServiceMonitorWithEndpointSliceAndPrometheusEndpoints.golden
@@ -84,3 +84,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/TestServiceMonitorWithEndpointSliceEnable_Expected.golden b/pkg/prometheus/testdata/TestServiceMonitorWithEndpointSliceEnable_Expected.golden
index 345f1fda9dc..8dc50ec0191 100644
--- a/pkg/prometheus/testdata/TestServiceMonitorWithEndpointSliceEnable_Expected.golden
+++ b/pkg/prometheus/testdata/TestServiceMonitorWithEndpointSliceEnable_Expected.golden
@@ -84,3 +84,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/TestServiceMonitorWithEndpointsAndPrometheusEndpointSlice.golden b/pkg/prometheus/testdata/TestServiceMonitorWithEndpointsAndPrometheusEndpointSlice.golden
index 7c9c7822bdb..06c868d7ba8 100644
--- a/pkg/prometheus/testdata/TestServiceMonitorWithEndpointsAndPrometheusEndpointSlice.golden
+++ b/pkg/prometheus/testdata/TestServiceMonitorWithEndpointsAndPrometheusEndpointSlice.golden
@@ -84,3 +84,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/TopologySharding_PodMonitor_4shards_2zones.golden b/pkg/prometheus/testdata/TopologySharding_PodMonitor_4shards_2zones.golden
index 9405ce2d18b..627f8489196 100644
--- a/pkg/prometheus/testdata/TopologySharding_PodMonitor_4shards_2zones.golden
+++ b/pkg/prometheus/testdata/TopologySharding_PodMonitor_4shards_2zones.golden
@@ -83,3 +83,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(INZONE_SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/TopologySharding_ServiceMonitor_4shards_2zones.golden b/pkg/prometheus/testdata/TopologySharding_ServiceMonitor_4shards_2zones.golden
index dae56206d42..5dd62aaba2d 100644
--- a/pkg/prometheus/testdata/TopologySharding_ServiceMonitor_4shards_2zones.golden
+++ b/pkg/prometheus/testdata/TopologySharding_ServiceMonitor_4shards_2zones.golden
@@ -102,3 +102,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(INZONE_SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/TopologySharding_ServiceMonitor_6shards_3zones.golden b/pkg/prometheus/testdata/TopologySharding_ServiceMonitor_6shards_3zones.golden
index dae56206d42..5dd62aaba2d 100644
--- a/pkg/prometheus/testdata/TopologySharding_ServiceMonitor_6shards_3zones.golden
+++ b/pkg/prometheus/testdata/TopologySharding_ServiceMonitor_6shards_3zones.golden
@@ -102,3 +102,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(INZONE_SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/TopologySharding_ServiceMonitor_force_attach_metadata_false.golden b/pkg/prometheus/testdata/TopologySharding_ServiceMonitor_force_attach_metadata_false.golden
index dae56206d42..5dd62aaba2d 100644
--- a/pkg/prometheus/testdata/TopologySharding_ServiceMonitor_force_attach_metadata_false.golden
+++ b/pkg/prometheus/testdata/TopologySharding_ServiceMonitor_force_attach_metadata_false.golden
@@ -102,3 +102,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(INZONE_SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/TopologySharding_ServiceMonitor_force_attach_metadata_nil.golden b/pkg/prometheus/testdata/TopologySharding_ServiceMonitor_force_attach_metadata_nil.golden
index dae56206d42..5dd62aaba2d 100644
--- a/pkg/prometheus/testdata/TopologySharding_ServiceMonitor_force_attach_metadata_nil.golden
+++ b/pkg/prometheus/testdata/TopologySharding_ServiceMonitor_force_attach_metadata_nil.golden
@@ -102,3 +102,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(INZONE_SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/TracingConfig_Config_only_with_endpoint.golden b/pkg/prometheus/testdata/TracingConfig_Config_only_with_endpoint.golden
index 0dda9c1696d..4358202d867 100644
--- a/pkg/prometheus/testdata/TracingConfig_Config_only_with_endpoint.golden
+++ b/pkg/prometheus/testdata/TracingConfig_Config_only_with_endpoint.golden
@@ -5,5 +5,9 @@ global:
prometheus_replica: $(POD_NAME)
evaluation_interval: 30s
scrape_configs: []
+storage:
+ tsdb:
+ retention:
+ time: 24h
tracing:
endpoint: https://otel-collector.default.svc.local:3333
diff --git a/pkg/prometheus/testdata/TracingConfig_Expect_valid_config.golden b/pkg/prometheus/testdata/TracingConfig_Expect_valid_config.golden
index 12d51108a98..7b126d0c093 100644
--- a/pkg/prometheus/testdata/TracingConfig_Expect_valid_config.golden
+++ b/pkg/prometheus/testdata/TracingConfig_Expect_valid_config.golden
@@ -5,6 +5,10 @@ global:
prometheus_replica: $(POD_NAME)
evaluation_interval: 30s
scrape_configs: []
+storage:
+ tsdb:
+ retention:
+ time: 24h
tracing:
endpoint: https://otel-collector.default.svc.local:3333
client_type: grpc
diff --git a/pkg/prometheus/testdata/monitorObjectWithDefaultScrapeClassAndTLSConfig.golden b/pkg/prometheus/testdata/monitorObjectWithDefaultScrapeClassAndTLSConfig.golden
index 949df7f9d56..3bd8e7b991d 100644
--- a/pkg/prometheus/testdata/monitorObjectWithDefaultScrapeClassAndTLSConfig.golden
+++ b/pkg/prometheus/testdata/monitorObjectWithDefaultScrapeClassAndTLSConfig.golden
@@ -207,3 +207,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/monitorObjectWithNonDefaultScrapeClassAndTLSConfig.golden b/pkg/prometheus/testdata/monitorObjectWithNonDefaultScrapeClassAndTLSConfig.golden
index 9c05781fb4b..479e3d19c62 100644
--- a/pkg/prometheus/testdata/monitorObjectWithNonDefaultScrapeClassAndTLSConfig.golden
+++ b/pkg/prometheus/testdata/monitorObjectWithNonDefaultScrapeClassAndTLSConfig.golden
@@ -207,3 +207,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/monitorObjectWithoutScrapeClass.golden b/pkg/prometheus/testdata/monitorObjectWithoutScrapeClass.golden
index 0e72210293a..4fd36b5e27c 100644
--- a/pkg/prometheus/testdata/monitorObjectWithoutScrapeClass.golden
+++ b/pkg/prometheus/testdata/monitorObjectWithoutScrapeClass.golden
@@ -191,3 +191,7 @@ scrape_configs:
- source_labels:
- job
target_label: __tmp_prometheus_job_name
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/no_TSDB_config.golden b/pkg/prometheus/testdata/no_TSDB_config.golden
index 609303fe82c..ecbee05becb 100644
--- a/pkg/prometheus/testdata/no_TSDB_config.golden
+++ b/pkg/prometheus/testdata/no_TSDB_config.golden
@@ -5,3 +5,7 @@ global:
prometheus_replica: $(POD_NAME)
evaluation_interval: 30s
scrape_configs: []
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/podMonitorObjectWithDefaultScrapeClassAuthz.golden b/pkg/prometheus/testdata/podMonitorObjectWithDefaultScrapeClassAuthz.golden
index b0b95e62d78..d7a12071d4d 100644
--- a/pkg/prometheus/testdata/podMonitorObjectWithDefaultScrapeClassAuthz.golden
+++ b/pkg/prometheus/testdata/podMonitorObjectWithDefaultScrapeClassAuthz.golden
@@ -68,3 +68,7 @@ scrape_configs:
metric_relabel_configs:
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/podMonitorObjectWithDefaultScrapeClassWithAttachMetadata.golden b/pkg/prometheus/testdata/podMonitorObjectWithDefaultScrapeClassWithAttachMetadata.golden
index 21dc1b399bb..f0580e4eae2 100644
--- a/pkg/prometheus/testdata/podMonitorObjectWithDefaultScrapeClassWithAttachMetadata.golden
+++ b/pkg/prometheus/testdata/podMonitorObjectWithDefaultScrapeClassWithAttachMetadata.golden
@@ -67,3 +67,7 @@ scrape_configs:
metric_relabel_configs:
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/podMonitorObjectWithDefaultScrapeClassWithFallbackScrapeProtocol.golden b/pkg/prometheus/testdata/podMonitorObjectWithDefaultScrapeClassWithFallbackScrapeProtocol.golden
index f984477e4cb..faf63b68954 100644
--- a/pkg/prometheus/testdata/podMonitorObjectWithDefaultScrapeClassWithFallbackScrapeProtocol.golden
+++ b/pkg/prometheus/testdata/podMonitorObjectWithDefaultScrapeClassWithFallbackScrapeProtocol.golden
@@ -66,3 +66,7 @@ scrape_configs:
metric_relabel_configs:
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/podMonitorObjectWithDefaultScrapeClassWithMetricRelabelings.golden b/pkg/prometheus/testdata/podMonitorObjectWithDefaultScrapeClassWithMetricRelabelings.golden
index 0878d67d403..ebf59f69b2b 100644
--- a/pkg/prometheus/testdata/podMonitorObjectWithDefaultScrapeClassWithMetricRelabelings.golden
+++ b/pkg/prometheus/testdata/podMonitorObjectWithDefaultScrapeClassWithMetricRelabelings.golden
@@ -75,3 +75,7 @@ scrape_configs:
replacement: tenant2
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/podMonitorObjectWithDefaultScrapeClassWithRelabelings.golden b/pkg/prometheus/testdata/podMonitorObjectWithDefaultScrapeClassWithRelabelings.golden
index 3c3d3ccca47..7d98a9d93bb 100644
--- a/pkg/prometheus/testdata/podMonitorObjectWithDefaultScrapeClassWithRelabelings.golden
+++ b/pkg/prometheus/testdata/podMonitorObjectWithDefaultScrapeClassWithRelabelings.golden
@@ -64,3 +64,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassAndExistingTLSConfig.golden b/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassAndExistingTLSConfig.golden
index 0017829f882..47636148f0d 100644
--- a/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassAndExistingTLSConfig.golden
+++ b/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassAndExistingTLSConfig.golden
@@ -64,3 +64,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassAndExistingTLSConfigMissingCA.golden b/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassAndExistingTLSConfigMissingCA.golden
index 9e20706f38f..b73fc5479c0 100644
--- a/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassAndExistingTLSConfigMissingCA.golden
+++ b/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassAndExistingTLSConfigMissingCA.golden
@@ -64,3 +64,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassAuthz.golden b/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassAuthz.golden
index f7c001f5f93..3a75b9bbcbc 100644
--- a/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassAuthz.golden
+++ b/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassAuthz.golden
@@ -68,3 +68,7 @@ scrape_configs:
metric_relabel_configs:
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassUserDefinedAuthz.golden b/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassUserDefinedAuthz.golden
index bdf5acd75fa..fdd45444e6f 100644
--- a/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassUserDefinedAuthz.golden
+++ b/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassUserDefinedAuthz.golden
@@ -68,3 +68,7 @@ scrape_configs:
metric_relabel_configs:
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassWithAttachMetadata.golden b/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassWithAttachMetadata.golden
index 21dc1b399bb..f0580e4eae2 100644
--- a/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassWithAttachMetadata.golden
+++ b/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassWithAttachMetadata.golden
@@ -67,3 +67,7 @@ scrape_configs:
metric_relabel_configs:
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassWithFallbackScrapeProtocol.golden b/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassWithFallbackScrapeProtocol.golden
index bdb4189c50c..5974c157bf6 100644
--- a/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassWithFallbackScrapeProtocol.golden
+++ b/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassWithFallbackScrapeProtocol.golden
@@ -66,3 +66,7 @@ scrape_configs:
metric_relabel_configs:
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassWithMetricRelabelings.golden b/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassWithMetricRelabelings.golden
index f78c06bdf0b..4a65e4973cd 100644
--- a/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassWithMetricRelabelings.golden
+++ b/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassWithMetricRelabelings.golden
@@ -67,3 +67,7 @@ scrape_configs:
replacement: value1
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassWithRelabelings.golden b/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassWithRelabelings.golden
index 0b9cde3ce36..1b7f2e3996b 100644
--- a/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassWithRelabelings.golden
+++ b/pkg/prometheus/testdata/podMonitorObjectWithNonDefaultScrapeClassWithRelabelings.golden
@@ -64,3 +64,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/podMonitorObjectWithPodName.golden b/pkg/prometheus/testdata/podMonitorObjectWithPodName.golden
index 4976feffb0c..c3be5af7956 100644
--- a/pkg/prometheus/testdata/podMonitorObjectWithPodName.golden
+++ b/pkg/prometheus/testdata/podMonitorObjectWithPodName.golden
@@ -60,3 +60,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/podMonitorObjectWithPortNumber.golden b/pkg/prometheus/testdata/podMonitorObjectWithPortNumber.golden
index c8d25dbfd79..c159b2248f6 100644
--- a/pkg/prometheus/testdata/podMonitorObjectWithPortNumber.golden
+++ b/pkg/prometheus/testdata/podMonitorObjectWithPortNumber.golden
@@ -60,3 +60,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/podMonitorObjectWithTargetPortInt.golden b/pkg/prometheus/testdata/podMonitorObjectWithTargetPortInt.golden
index 83f221cc42f..dc2b8bb0e0a 100644
--- a/pkg/prometheus/testdata/podMonitorObjectWithTargetPortInt.golden
+++ b/pkg/prometheus/testdata/podMonitorObjectWithTargetPortInt.golden
@@ -60,3 +60,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/podMonitorObjectWithTargetPortString.golden b/pkg/prometheus/testdata/podMonitorObjectWithTargetPortString.golden
index 0ee1a030b11..ee0100e9624 100644
--- a/pkg/prometheus/testdata/podMonitorObjectWithTargetPortString.golden
+++ b/pkg/prometheus/testdata/podMonitorObjectWithTargetPortString.golden
@@ -60,3 +60,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/pod_monitor_with_oauth2.golden b/pkg/prometheus/testdata/pod_monitor_with_oauth2.golden
index 972390d18d2..de5c41e1b4d 100644
--- a/pkg/prometheus/testdata/pod_monitor_with_oauth2.golden
+++ b/pkg/prometheus/testdata/pod_monitor_with_oauth2.golden
@@ -73,3 +73,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/probeObjectWithDefaultScrapeClassWithFallbackScrapeProtocol.golden b/pkg/prometheus/testdata/probeObjectWithDefaultScrapeClassWithFallbackScrapeProtocol.golden
index 40fb45bdf1a..9afced6e486 100644
--- a/pkg/prometheus/testdata/probeObjectWithDefaultScrapeClassWithFallbackScrapeProtocol.golden
+++ b/pkg/prometheus/testdata/probeObjectWithDefaultScrapeClassWithFallbackScrapeProtocol.golden
@@ -56,3 +56,7 @@ scrape_configs:
action: labeldrop
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/probeObjectWithNonDefaultScrapeClassWithFallbackScrapeProtocol.golden b/pkg/prometheus/testdata/probeObjectWithNonDefaultScrapeClassWithFallbackScrapeProtocol.golden
index f97c08c1117..ad1998d56e2 100644
--- a/pkg/prometheus/testdata/probeObjectWithNonDefaultScrapeClassWithFallbackScrapeProtocol.golden
+++ b/pkg/prometheus/testdata/probeObjectWithNonDefaultScrapeClassWithFallbackScrapeProtocol.golden
@@ -56,3 +56,7 @@ scrape_configs:
action: labeldrop
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/probe_monitor_with_oauth2.golden b/pkg/prometheus/testdata/probe_monitor_with_oauth2.golden
index 6554bf6145a..e83c511ac74 100644
--- a/pkg/prometheus/testdata/probe_monitor_with_oauth2.golden
+++ b/pkg/prometheus/testdata/probe_monitor_with_oauth2.golden
@@ -61,3 +61,7 @@ scrape_configs:
tls_config:
insecure_skip_verify: true
ca_file: /etc/prometheus/certs/0_default_tls_ca2
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/scrapeConfigObjectWithDefaultScrapeClassWithFallbackScrapeProtocol.golden b/pkg/prometheus/testdata/scrapeConfigObjectWithDefaultScrapeClassWithFallbackScrapeProtocol.golden
index aee59dda297..32045bd9a42 100644
--- a/pkg/prometheus/testdata/scrapeConfigObjectWithDefaultScrapeClassWithFallbackScrapeProtocol.golden
+++ b/pkg/prometheus/testdata/scrapeConfigObjectWithDefaultScrapeClassWithFallbackScrapeProtocol.golden
@@ -20,3 +20,7 @@ scrape_configs:
metric_relabel_configs:
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/scrapeConfigObjectWithNonDefaultScrapeClassWithFallbackScrapeProtocol.golden b/pkg/prometheus/testdata/scrapeConfigObjectWithNonDefaultScrapeClassWithFallbackScrapeProtocol.golden
index 91eded626ef..b84e5da30ff 100644
--- a/pkg/prometheus/testdata/scrapeConfigObjectWithNonDefaultScrapeClassWithFallbackScrapeProtocol.golden
+++ b/pkg/prometheus/testdata/scrapeConfigObjectWithNonDefaultScrapeClassWithFallbackScrapeProtocol.golden
@@ -20,3 +20,7 @@ scrape_configs:
metric_relabel_configs:
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/serviceMonitorObjectWithDefaultScrapeClassAuthz.golden b/pkg/prometheus/testdata/serviceMonitorObjectWithDefaultScrapeClassAuthz.golden
index 0aca5e900ba..129541eeb29 100644
--- a/pkg/prometheus/testdata/serviceMonitorObjectWithDefaultScrapeClassAuthz.golden
+++ b/pkg/prometheus/testdata/serviceMonitorObjectWithDefaultScrapeClassAuthz.golden
@@ -87,3 +87,7 @@ scrape_configs:
metric_relabel_configs:
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/serviceMonitorObjectWithDefaultScrapeClassWithAttachMetadata.golden b/pkg/prometheus/testdata/serviceMonitorObjectWithDefaultScrapeClassWithAttachMetadata.golden
index 1cae8fd6fc5..5a652e697b1 100644
--- a/pkg/prometheus/testdata/serviceMonitorObjectWithDefaultScrapeClassWithAttachMetadata.golden
+++ b/pkg/prometheus/testdata/serviceMonitorObjectWithDefaultScrapeClassWithAttachMetadata.golden
@@ -86,3 +86,7 @@ scrape_configs:
metric_relabel_configs:
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/serviceMonitorObjectWithDefaultScrapeClassWithFallbackScrapeProtocol.golden b/pkg/prometheus/testdata/serviceMonitorObjectWithDefaultScrapeClassWithFallbackScrapeProtocol.golden
index 924aeb0ab3c..d1bf25c05bb 100644
--- a/pkg/prometheus/testdata/serviceMonitorObjectWithDefaultScrapeClassWithFallbackScrapeProtocol.golden
+++ b/pkg/prometheus/testdata/serviceMonitorObjectWithDefaultScrapeClassWithFallbackScrapeProtocol.golden
@@ -85,3 +85,7 @@ scrape_configs:
metric_relabel_configs:
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/serviceMonitorObjectWithDefaultScrapeClassWithMetricRelabelings.golden b/pkg/prometheus/testdata/serviceMonitorObjectWithDefaultScrapeClassWithMetricRelabelings.golden
index d24f6b2067a..ae0c4944953 100644
--- a/pkg/prometheus/testdata/serviceMonitorObjectWithDefaultScrapeClassWithMetricRelabelings.golden
+++ b/pkg/prometheus/testdata/serviceMonitorObjectWithDefaultScrapeClassWithMetricRelabelings.golden
@@ -94,3 +94,7 @@ scrape_configs:
replacement: tenant2
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/serviceMonitorObjectWithDefaultScrapeClassWithRelabelings.golden b/pkg/prometheus/testdata/serviceMonitorObjectWithDefaultScrapeClassWithRelabelings.golden
index f0f988365c3..1ed4bf6fdf9 100644
--- a/pkg/prometheus/testdata/serviceMonitorObjectWithDefaultScrapeClassWithRelabelings.golden
+++ b/pkg/prometheus/testdata/serviceMonitorObjectWithDefaultScrapeClassWithRelabelings.golden
@@ -83,3 +83,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassAndExistingTLSConfig.golden b/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassAndExistingTLSConfig.golden
index fe5b5632a9f..b50a01fed3f 100644
--- a/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassAndExistingTLSConfig.golden
+++ b/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassAndExistingTLSConfig.golden
@@ -83,3 +83,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassAndExistingTLSConfigMissingCA.golden b/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassAndExistingTLSConfigMissingCA.golden
index dcb2c94894a..69ed8d59e84 100644
--- a/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassAndExistingTLSConfigMissingCA.golden
+++ b/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassAndExistingTLSConfigMissingCA.golden
@@ -83,3 +83,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassAuthz.golden b/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassAuthz.golden
index 0aca5e900ba..129541eeb29 100644
--- a/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassAuthz.golden
+++ b/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassAuthz.golden
@@ -87,3 +87,7 @@ scrape_configs:
metric_relabel_configs:
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassUserDefinedAuthz.golden b/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassUserDefinedAuthz.golden
index 70ea8ffc788..3266630d842 100644
--- a/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassUserDefinedAuthz.golden
+++ b/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassUserDefinedAuthz.golden
@@ -87,3 +87,7 @@ scrape_configs:
metric_relabel_configs:
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassWithAttachMetadata.golden b/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassWithAttachMetadata.golden
index 1cae8fd6fc5..5a652e697b1 100644
--- a/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassWithAttachMetadata.golden
+++ b/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassWithAttachMetadata.golden
@@ -86,3 +86,7 @@ scrape_configs:
metric_relabel_configs:
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassWithFallbackScrapeProtocol.golden b/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassWithFallbackScrapeProtocol.golden
index e6dce8c9ffd..88be0582706 100644
--- a/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassWithFallbackScrapeProtocol.golden
+++ b/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassWithFallbackScrapeProtocol.golden
@@ -85,3 +85,7 @@ scrape_configs:
metric_relabel_configs:
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassWithMetricRelabelings.golden b/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassWithMetricRelabelings.golden
index 105df5184b5..25e725a6880 100644
--- a/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassWithMetricRelabelings.golden
+++ b/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassWithMetricRelabelings.golden
@@ -86,3 +86,7 @@ scrape_configs:
replacement: value1
- target_label: namespace
replacement: default
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassWithRelabelings.golden b/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassWithRelabelings.golden
index d0c748dd1ec..efdfa0c0848 100644
--- a/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassWithRelabelings.golden
+++ b/pkg/prometheus/testdata/serviceMonitorObjectWithNonDefaultScrapeClassWithRelabelings.golden
@@ -83,3 +83,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/service_monitor_with_oauth2.golden b/pkg/prometheus/testdata/service_monitor_with_oauth2.golden
index 33a4f1b7f19..1a6574b1047 100644
--- a/pkg/prometheus/testdata/service_monitor_with_oauth2.golden
+++ b/pkg/prometheus/testdata/service_monitor_with_oauth2.golden
@@ -92,3 +92,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/topology_zone_external_label_address_mode.golden b/pkg/prometheus/testdata/topology_zone_external_label_address_mode.golden
index 14f3838700f..eed9a2997e7 100644
--- a/pkg/prometheus/testdata/topology_zone_external_label_address_mode.golden
+++ b/pkg/prometheus/testdata/topology_zone_external_label_address_mode.golden
@@ -5,3 +5,7 @@ global:
prometheus_replica: $(POD_NAME)
evaluation_interval: 30s
scrape_configs: []
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/topology_zone_external_label_custom_name.golden b/pkg/prometheus/testdata/topology_zone_external_label_custom_name.golden
index 7c164b02bde..9d9ad2ef174 100644
--- a/pkg/prometheus/testdata/topology_zone_external_label_custom_name.golden
+++ b/pkg/prometheus/testdata/topology_zone_external_label_custom_name.golden
@@ -6,3 +6,7 @@ global:
topology_zone: $(TOPOLOGY_ZONE)
evaluation_interval: 30s
scrape_configs: []
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/topology_zone_external_label_default_name.golden b/pkg/prometheus/testdata/topology_zone_external_label_default_name.golden
index 1114b0d01d4..020a131afb4 100644
--- a/pkg/prometheus/testdata/topology_zone_external_label_default_name.golden
+++ b/pkg/prometheus/testdata/topology_zone_external_label_default_name.golden
@@ -6,3 +6,7 @@ global:
zone: $(TOPOLOGY_ZONE)
evaluation_interval: 30s
scrape_configs: []
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/topology_zone_external_label_disabled.golden b/pkg/prometheus/testdata/topology_zone_external_label_disabled.golden
index 14f3838700f..eed9a2997e7 100644
--- a/pkg/prometheus/testdata/topology_zone_external_label_disabled.golden
+++ b/pkg/prometheus/testdata/topology_zone_external_label_disabled.golden
@@ -5,3 +5,7 @@ global:
prometheus_replica: $(POD_NAME)
evaluation_interval: 30s
scrape_configs: []
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/topology_zone_external_label_no_feature_gate.golden b/pkg/prometheus/testdata/topology_zone_external_label_no_feature_gate.golden
index 14f3838700f..eed9a2997e7 100644
--- a/pkg/prometheus/testdata/topology_zone_external_label_no_feature_gate.golden
+++ b/pkg/prometheus/testdata/topology_zone_external_label_no_feature_gate.golden
@@ -5,3 +5,7 @@ global:
prometheus_replica: $(POD_NAME)
evaluation_interval: 30s
scrape_configs: []
+storage:
+ tsdb:
+ retention:
+ time: 24h
From a96bc8de6f0c8a38e8f2f87905222593ded878e2 Mon Sep 17 00:00:00 2001
From: SANCHIT KUMAR
Date: Mon, 1 Jun 2026 15:44:11 +0530
Subject: [PATCH 48/81] Merge pull request #8564 from
Sanchit2662/zone-aware-sharding-downward-api
prometheus: use pod topology labels for zone sharding on K8s >= 1.35
---
cmd/operator/main.go | 10 ++
pkg/prometheus/agent/operator.go | 12 ++
pkg/prometheus/promcfg.go | 70 +++++++++---
pkg/prometheus/promcfg_test.go | 58 ++++++++--
pkg/prometheus/server/operator.go | 14 +++
...ogyLabels_PodMonitor_4shards_2zones.golden | 83 ++++++++++++++
...abels_ServiceMonitor_4shards_2zones.golden | 102 +++++++++++++++++
...abels_ServiceMonitor_6shards_3zones.golden | 102 +++++++++++++++++
...erviceMonitor_attach_metadata_false.golden | 104 ++++++++++++++++++
9 files changed, 533 insertions(+), 22 deletions(-)
create mode 100644 pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_PodMonitor_4shards_2zones.golden
create mode 100644 pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_4shards_2zones.golden
create mode 100644 pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_6shards_3zones.golden
create mode 100644 pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_attach_metadata_false.golden
diff --git a/cmd/operator/main.go b/cmd/operator/main.go
index 036eac71a09..27898865402 100644
--- a/cmd/operator/main.go
+++ b/cmd/operator/main.go
@@ -432,6 +432,16 @@ func start() int {
promAgentControllerOptions = append(promAgentControllerOptions, prometheusagentcontroller.WithEndpointSlice())
}
+ // PodTopologyLabelsAdmission (KEP-4742) is enabled by default in K8s >= 1.35.
+ // It injects topology.kubernetes.io/zone as a pod label, removing the need
+ // for attach_metadata.node=true in topology sharding configurations.
+ podTopologyLabelsSupported := cfg.KubernetesVersion.GTE(semver.MustParse("1.35.0"))
+ logger.Info("Kubernetes API capabilities", "pod_topology_labels", podTopologyLabelsSupported)
+ if podTopologyLabelsSupported {
+ promControllerOptions = append(promControllerOptions, prometheuscontroller.WithPodTopologyLabels())
+ promAgentControllerOptions = append(promAgentControllerOptions, prometheusagentcontroller.WithPodTopologyLabels())
+ }
+
prometheusSupported, err := checkPrerequisites(
ctx,
logger,
diff --git a/pkg/prometheus/agent/operator.go b/pkg/prometheus/agent/operator.go
index c7f1f85548c..0bb654bc40e 100644
--- a/pkg/prometheus/agent/operator.go
+++ b/pkg/prometheus/agent/operator.go
@@ -99,6 +99,7 @@ type Operator struct {
daemonSetFeatureGateEnabled bool
configResourcesStatusEnabled bool
topologyShardingEnabled bool
+ podTopologyLabelsSupported bool
finalizerSyncer *operator.FinalizerSyncer
}
@@ -135,6 +136,14 @@ func WithConfigResourceStatus() ControllerOption {
}
}
+// WithPodTopologyLabels tells that the cluster runs K8s >= 1.35 where
+// PodTopologyLabelsAdmission automatically injects topology labels onto pods.
+func WithPodTopologyLabels() ControllerOption {
+ return func(o *Operator) {
+ o.podTopologyLabelsSupported = true
+ }
+}
+
// New creates a new controller.
func New(ctx context.Context, restConfig *rest.Config, c operator.Config, logger *slog.Logger, r prometheus.Registerer, options ...ControllerOption) (*Operator, error) {
logger = logger.With("component", controllerName)
@@ -677,6 +686,9 @@ func (c *Operator) sync(ctx context.Context, key string) error {
if c.topologyShardingEnabled {
opts = append(opts, prompkg.WithPrometheusTopologySharding())
}
+ if c.podTopologyLabelsSupported {
+ opts = append(opts, prompkg.WithPodTopologyLabelsSupport())
+ }
cg, err := prompkg.NewConfigGenerator(logger, p, opts...)
if err != nil {
diff --git a/pkg/prometheus/promcfg.go b/pkg/prometheus/promcfg.go
index 5999b1c7674..e7c8b8d35ff 100644
--- a/pkg/prometheus/promcfg.go
+++ b/pkg/prometheus/promcfg.go
@@ -65,6 +65,10 @@ const (
nodeZoneMetaLabel = "__meta_kubernetes_node_label_topology_kubernetes_io_zone"
nodeZonePresentMetaLabel = "__meta_kubernetes_node_labelpresent_topology_kubernetes_io_zone"
endpointSliceZoneMetaLabel = "__meta_kubernetes_endpointslice_endpoint_zone"
+ // podZoneMetaLabel and podZonePresentMetaLabel are the SD meta labels for the
+ // topology.kubernetes.io/zone pod label injected by PodTopologyLabelsAdmission (K8s >= 1.35).
+ podZoneMetaLabel = "__meta_kubernetes_pod_label_topology_kubernetes_io_zone"
+ podZonePresentMetaLabel = "__meta_kubernetes_pod_labelpresent_topology_kubernetes_io_zone"
)
var invalidLabelCharRE = regexp.MustCompile(`[^a-zA-Z0-9_]`)
@@ -86,6 +90,7 @@ type ConfigGenerator struct {
daemonSet bool
prometheusTopologySharding bool
prometheusRetentionPolicies bool
+ podTopologyLabelsSupported bool
inlineTLSConfig bool
bypassVersionCheck bool
@@ -117,6 +122,15 @@ func WithPrometheusRetentionPolicies() ConfigGeneratorOption {
}
}
+// WithPodTopologyLabelsSupport tells the config generator that the topology.kubernetes.io/zone label is injected as a pod label. In that case, the operator
+// no longer forces attach_metadata.node=true for topology sharding and instead
+// uses the pod label for zone detection.
+func WithPodTopologyLabelsSupport() ConfigGeneratorOption {
+ return func(cg *ConfigGenerator) {
+ cg.podTopologyLabelsSupported = true
+ }
+}
+
// WithInlineTLSConfig is an API only used by
// https://github.com/open-telemetry/opentelemetry-operator.
func WithInlineTLSConfig() ConfigGeneratorOption {
@@ -270,6 +284,7 @@ func (cg *ConfigGenerator) WithKeyVals(keyvals ...any) *ConfigGenerator {
daemonSet: cg.daemonSet,
prometheusTopologySharding: cg.prometheusTopologySharding,
prometheusRetentionPolicies: cg.prometheusRetentionPolicies,
+ podTopologyLabelsSupported: cg.podTopologyLabelsSupported,
inlineTLSConfig: cg.inlineTLSConfig,
bypassVersionCheck: cg.bypassVersionCheck,
}
@@ -296,6 +311,7 @@ func (cg *ConfigGenerator) WithMinimumVersion(version string) *ConfigGenerator {
daemonSet: cg.daemonSet,
prometheusTopologySharding: cg.prometheusTopologySharding,
prometheusRetentionPolicies: cg.prometheusRetentionPolicies,
+ podTopologyLabelsSupported: cg.podTopologyLabelsSupported,
inlineTLSConfig: cg.inlineTLSConfig,
bypassVersionCheck: cg.bypassVersionCheck,
}
@@ -325,6 +341,7 @@ func (cg *ConfigGenerator) WithMaximumVersion(version string) *ConfigGenerator {
daemonSet: cg.daemonSet,
prometheusTopologySharding: cg.prometheusTopologySharding,
prometheusRetentionPolicies: cg.prometheusRetentionPolicies,
+ podTopologyLabelsSupported: cg.podTopologyLabelsSupported,
inlineTLSConfig: cg.inlineTLSConfig,
bypassVersionCheck: cg.bypassVersionCheck,
}
@@ -2268,8 +2285,9 @@ func (cg *ConfigGenerator) appendShardingRelabelingWithLabel(relabelings []yaml.
if cg.isTopologyShardingActive() {
modulus = cg.shardsPerZone(shards)
shardEnvVar = operator.InzoneShardEnvVar
+
+ // Step 1: populate __tmp_topology from endpointslice zone (no-op for pod role).
relabelings = append(relabelings,
- // Populate __tmp_topology from endpointslice zone label (no-op for pod role).
yaml.MapSlice{
{Key: "source_labels", Value: []string{endpointSliceZoneMetaLabel, topologyTmpLabel}},
{Key: "target_label", Value: topologyTmpLabel},
@@ -2277,15 +2295,35 @@ func (cg *ConfigGenerator) appendShardingRelabelingWithLabel(relabelings []yaml.
{Key: "replacement", Value: "$1"},
{Key: "action", Value: "replace"},
},
- // Fallback to node topology label (requires attach_metadata: {node: true}).
- yaml.MapSlice{
- {Key: "source_labels", Value: []string{nodeZoneMetaLabel, nodeZonePresentMetaLabel, topologyTmpLabel}},
- {Key: "target_label", Value: topologyTmpLabel},
- {Key: "regex", Value: "(.+);true;"},
- {Key: "replacement", Value: "$1"},
- {Key: "action", Value: "replace"},
- },
- // Keep only targets in the assigned zone, unless __tmp_disable_sharding is set.
+ )
+
+ // Step 2: if __tmp_topology is still empty, use the pod topology label
+ // (K8s >= 1.35, PodTopologyLabelsAdmission) or the node label (older clusters,
+ // requires attach_metadata: {node: true}) as fallback.
+ if cg.podTopologyLabelsSupported {
+ relabelings = append(relabelings,
+ yaml.MapSlice{
+ {Key: "source_labels", Value: []string{podZoneMetaLabel, podZonePresentMetaLabel, topologyTmpLabel}},
+ {Key: "target_label", Value: topologyTmpLabel},
+ {Key: "regex", Value: "(.+);true;"},
+ {Key: "replacement", Value: "$1"},
+ {Key: "action", Value: "replace"},
+ },
+ )
+ } else {
+ relabelings = append(relabelings,
+ yaml.MapSlice{
+ {Key: "source_labels", Value: []string{nodeZoneMetaLabel, nodeZonePresentMetaLabel, topologyTmpLabel}},
+ {Key: "target_label", Value: topologyTmpLabel},
+ {Key: "regex", Value: "(.+);true;"},
+ {Key: "replacement", Value: "$1"},
+ {Key: "action", Value: "replace"},
+ },
+ )
+ }
+
+ // Step 3: keep only targets in the assigned zone, unless __tmp_disable_sharding is set.
+ relabelings = append(relabelings,
yaml.MapSlice{
{Key: "source_labels", Value: []string{topologyTmpLabel, hashLabelNameForDisablingSharding}},
{Key: "regex", Value: fmt.Sprintf("$(%s);|.+;.+", operator.TopologyZoneEnvVar)},
@@ -5368,14 +5406,18 @@ func (cg *ConfigGenerator) InzoneShardForShard(shardIndex int32) int32 {
return shardIndex / numZones
}
-// mergeAttachMetadataForTopology forces attach_metadata.node=true when topology
-// sharding is active. Node metadata is required to determine the target's zone via
-// the __meta_kubernetes_node_label_topology_kubernetes_io_zone label.
-// Returns amc unchanged when topology sharding is not active or node is already true.
+// mergeAttachMetadataForTopology returns amc unchanged when topology sharding is
+// not active, when podTopologyLabelsSupported is true (zone label is injected
+// directly onto pods), or when node metadata is already requested.
+// Otherwise it forces attach_metadata.node=true so that zone detection via node
+// labels is available.
func (cg *ConfigGenerator) mergeAttachMetadataForTopology(amc *attachMetadataConfig, minimumVersion string) *attachMetadataConfig {
if !cg.isTopologyShardingActive() {
return amc
}
+ if cg.podTopologyLabelsSupported {
+ return amc
+ }
if amc != nil && amc.node() {
return amc
}
diff --git a/pkg/prometheus/promcfg_test.go b/pkg/prometheus/promcfg_test.go
index 963e5402434..e563771fcc9 100644
--- a/pkg/prometheus/promcfg_test.go
+++ b/pkg/prometheus/promcfg_test.go
@@ -14573,13 +14573,13 @@ func TestTopologyShardingRelabeling(t *testing.T) {
}
for _, tc := range []struct {
- name string
- shards int32
- zones []string
- serviceMonitor map[string]*monitoringv1.ServiceMonitor
- podMonitor map[string]*monitoringv1.PodMonitor
- attachMetadata *monitoringv1.AttachMetadata
- golden string
+ name string
+ shards int32
+ zones []string
+ serviceMonitor map[string]*monitoringv1.ServiceMonitor
+ podMonitor map[string]*monitoringv1.PodMonitor
+ podTopologyLabels bool
+ golden string
}{
{
name: "service_monitor_4shards_2zones",
@@ -14627,6 +14627,43 @@ func TestTopologyShardingRelabeling(t *testing.T) {
}(),
golden: "TopologySharding_ServiceMonitor_force_attach_metadata_false.golden",
},
+ // Pod topology labels (K8s >= 1.35) — no attach_metadata.node required.
+ {
+ name: "pod_topology_labels_service_monitor_4shards_2zones",
+ shards: 4,
+ zones: []string{"zone-a", "zone-b"},
+ serviceMonitor: basicServiceMonitor(),
+ podTopologyLabels: true,
+ golden: "TopologySharding_PodTopologyLabels_ServiceMonitor_4shards_2zones.golden",
+ },
+ {
+ name: "pod_topology_labels_pod_monitor_4shards_2zones",
+ shards: 4,
+ zones: []string{"zone-a", "zone-b"},
+ podMonitor: basicPodMonitor(),
+ podTopologyLabels: true,
+ golden: "TopologySharding_PodTopologyLabels_PodMonitor_4shards_2zones.golden",
+ },
+ {
+ name: "pod_topology_labels_service_monitor_6shards_3zones",
+ shards: 6,
+ zones: []string{"zone-a", "zone-b", "zone-c"},
+ serviceMonitor: basicServiceMonitor(),
+ podTopologyLabels: true,
+ golden: "TopologySharding_PodTopologyLabels_ServiceMonitor_6shards_3zones.golden",
+ },
+ {
+ name: "pod_topology_labels_attach_metadata_false_is_respected",
+ shards: 4,
+ zones: []string{"zone-a", "zone-b"},
+ serviceMonitor: func() map[string]*monitoringv1.ServiceMonitor {
+ sm := basicServiceMonitor()
+ sm["test"].Spec.AttachMetadata = &monitoringv1.AttachMetadata{Node: new(bool)}
+ return sm
+ }(),
+ podTopologyLabels: true,
+ golden: "TopologySharding_PodTopologyLabels_ServiceMonitor_attach_metadata_false.golden",
+ },
} {
t.Run(tc.name, func(t *testing.T) {
p := defaultPrometheus()
@@ -14636,7 +14673,12 @@ func TestTopologyShardingRelabeling(t *testing.T) {
Topology: &monitoringv1.TopologyShardingStrategy{Values: tc.zones},
}
- cg := mustNewConfigGenerator(t, p, WithPrometheusTopologySharding())
+ opts := []ConfigGeneratorOption{WithPrometheusTopologySharding()}
+ if tc.podTopologyLabels {
+ opts = append(opts, WithPodTopologyLabelsSupport())
+ }
+
+ cg := mustNewConfigGenerator(t, p, opts...)
cfg, err := cg.GenerateServerConfiguration(
p,
tc.serviceMonitor,
diff --git a/pkg/prometheus/server/operator.go b/pkg/prometheus/server/operator.go
index e2152cfd58b..6d99dfd7020 100644
--- a/pkg/prometheus/server/operator.go
+++ b/pkg/prometheus/server/operator.go
@@ -109,6 +109,7 @@ type Operator struct {
retentionPoliciesEnabled bool
configResourcesStatusEnabled bool
topologyShardingEnabled bool
+ podTopologyLabelsSupported bool
newEventRecorder operator.NewEventRecorderFunc
finalizerSyncer *operator.FinalizerSyncer
@@ -172,6 +173,16 @@ func WithConfigResourceStatus() ControllerOption {
}
}
+// WithPodTopologyLabels tells that the cluster runs K8s >= 1.35 where
+// PodTopologyLabelsAdmission automatically injects topology labels onto pods.
+// When set, the operator uses pod label SD meta labels for zone detection in
+// topology sharding instead of forcing attach_metadata.node=true.
+func WithPodTopologyLabels() ControllerOption {
+ return func(o *Operator) {
+ o.podTopologyLabelsSupported = true
+ }
+}
+
// New creates a new controller.
func New(ctx context.Context, restConfig *rest.Config, c operator.Config, logger *slog.Logger, r prometheus.Registerer, opts ...ControllerOption) (*Operator, error) {
logger = logger.With("component", controllerName)
@@ -958,6 +969,9 @@ func (c *Operator) sync(ctx context.Context, key string) (func(context.Context)
if c.topologyShardingEnabled {
opts = append(opts, prompkg.WithPrometheusTopologySharding())
}
+ if c.podTopologyLabelsSupported {
+ opts = append(opts, prompkg.WithPodTopologyLabelsSupport())
+ }
cg, err := prompkg.NewConfigGenerator(logger, p, opts...)
if err != nil {
return closure, err
diff --git a/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_PodMonitor_4shards_2zones.golden b/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_PodMonitor_4shards_2zones.golden
new file mode 100644
index 00000000000..0629593189d
--- /dev/null
+++ b/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_PodMonitor_4shards_2zones.golden
@@ -0,0 +1,83 @@
+global:
+ scrape_interval: 30s
+ external_labels:
+ prometheus: default/test
+ prometheus_replica: $(POD_NAME)
+ zone: $(TOPOLOGY_ZONE)
+ evaluation_interval: 30s
+scrape_configs:
+- job_name: podMonitor/default/test/0
+ honor_labels: false
+ kubernetes_sd_configs:
+ - role: pod
+ namespaces:
+ names:
+ - default
+ scrape_interval: 30s
+ relabel_configs:
+ - source_labels:
+ - job
+ target_label: __tmp_prometheus_job_name
+ - action: drop
+ source_labels:
+ - __meta_kubernetes_pod_phase
+ regex: (Failed|Succeeded)
+ - action: keep
+ source_labels:
+ - __meta_kubernetes_pod_label_foo
+ - __meta_kubernetes_pod_labelpresent_foo
+ regex: (bar);true
+ - action: keep
+ source_labels:
+ - __meta_kubernetes_pod_container_port_name
+ regex: web
+ - source_labels:
+ - __meta_kubernetes_namespace
+ target_label: namespace
+ - source_labels:
+ - __meta_kubernetes_pod_container_name
+ target_label: container
+ - source_labels:
+ - __meta_kubernetes_pod_name
+ target_label: pod
+ - target_label: job
+ replacement: default/test
+ - target_label: endpoint
+ replacement: web
+ - source_labels:
+ - __meta_kubernetes_endpointslice_endpoint_zone
+ - __tmp_topology
+ target_label: __tmp_topology
+ regex: (.+);
+ replacement: $1
+ action: replace
+ - source_labels:
+ - __meta_kubernetes_pod_label_topology_kubernetes_io_zone
+ - __meta_kubernetes_pod_labelpresent_topology_kubernetes_io_zone
+ - __tmp_topology
+ target_label: __tmp_topology
+ regex: (.+);true;
+ replacement: $1
+ action: replace
+ - source_labels:
+ - __tmp_topology
+ - __tmp_disable_sharding
+ regex: $(TOPOLOGY_ZONE);|.+;.+
+ action: keep
+ - source_labels:
+ - __address__
+ - __tmp_hash
+ target_label: __tmp_hash
+ regex: (.+);
+ replacement: $1
+ action: replace
+ - source_labels:
+ - __tmp_hash
+ target_label: __tmp_hash
+ modulus: 2
+ action: hashmod
+ - source_labels:
+ - __tmp_hash
+ - __tmp_disable_sharding
+ regex: $(INZONE_SHARD);|.+;.+
+ action: keep
diff --git a/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_4shards_2zones.golden b/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_4shards_2zones.golden
new file mode 100644
index 00000000000..ce82933b566
--- /dev/null
+++ b/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_4shards_2zones.golden
@@ -0,0 +1,102 @@
+global:
+ scrape_interval: 30s
+ external_labels:
+ prometheus: default/test
+ prometheus_replica: $(POD_NAME)
+ zone: $(TOPOLOGY_ZONE)
+ evaluation_interval: 30s
+scrape_configs:
+- job_name: serviceMonitor/default/test/0
+ honor_labels: false
+ kubernetes_sd_configs:
+ - role: endpoints
+ namespaces:
+ names:
+ - default
+ scrape_interval: 30s
+ relabel_configs:
+ - source_labels:
+ - job
+ target_label: __tmp_prometheus_job_name
+ - action: keep
+ source_labels:
+ - __meta_kubernetes_service_label_foo
+ - __meta_kubernetes_service_labelpresent_foo
+ regex: (bar);true
+ - action: keep
+ source_labels:
+ - __meta_kubernetes_endpoint_port_name
+ regex: web
+ - source_labels:
+ - __meta_kubernetes_endpoint_address_target_kind
+ - __meta_kubernetes_endpoint_address_target_name
+ separator: ;
+ regex: Node;(.*)
+ replacement: ${1}
+ target_label: node
+ - source_labels:
+ - __meta_kubernetes_endpoint_address_target_kind
+ - __meta_kubernetes_endpoint_address_target_name
+ separator: ;
+ regex: Pod;(.*)
+ replacement: ${1}
+ target_label: pod
+ - source_labels:
+ - __meta_kubernetes_namespace
+ target_label: namespace
+ - source_labels:
+ - __meta_kubernetes_service_name
+ target_label: service
+ - source_labels:
+ - __meta_kubernetes_pod_name
+ target_label: pod
+ - source_labels:
+ - __meta_kubernetes_pod_container_name
+ target_label: container
+ - action: drop
+ source_labels:
+ - __meta_kubernetes_pod_phase
+ regex: (Failed|Succeeded)
+ - source_labels:
+ - __meta_kubernetes_service_name
+ target_label: job
+ replacement: ${1}
+ - target_label: endpoint
+ replacement: web
+ - source_labels:
+ - __meta_kubernetes_endpointslice_endpoint_zone
+ - __tmp_topology
+ target_label: __tmp_topology
+ regex: (.+);
+ replacement: $1
+ action: replace
+ - source_labels:
+ - __meta_kubernetes_pod_label_topology_kubernetes_io_zone
+ - __meta_kubernetes_pod_labelpresent_topology_kubernetes_io_zone
+ - __tmp_topology
+ target_label: __tmp_topology
+ regex: (.+);true;
+ replacement: $1
+ action: replace
+ - source_labels:
+ - __tmp_topology
+ - __tmp_disable_sharding
+ regex: $(TOPOLOGY_ZONE);|.+;.+
+ action: keep
+ - source_labels:
+ - __address__
+ - __tmp_hash
+ target_label: __tmp_hash
+ regex: (.+);
+ replacement: $1
+ action: replace
+ - source_labels:
+ - __tmp_hash
+ target_label: __tmp_hash
+ modulus: 2
+ action: hashmod
+ - source_labels:
+ - __tmp_hash
+ - __tmp_disable_sharding
+ regex: $(INZONE_SHARD);|.+;.+
+ action: keep
diff --git a/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_6shards_3zones.golden b/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_6shards_3zones.golden
new file mode 100644
index 00000000000..ce82933b566
--- /dev/null
+++ b/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_6shards_3zones.golden
@@ -0,0 +1,102 @@
+global:
+ scrape_interval: 30s
+ external_labels:
+ prometheus: default/test
+ prometheus_replica: $(POD_NAME)
+ zone: $(TOPOLOGY_ZONE)
+ evaluation_interval: 30s
+scrape_configs:
+- job_name: serviceMonitor/default/test/0
+ honor_labels: false
+ kubernetes_sd_configs:
+ - role: endpoints
+ namespaces:
+ names:
+ - default
+ scrape_interval: 30s
+ relabel_configs:
+ - source_labels:
+ - job
+ target_label: __tmp_prometheus_job_name
+ - action: keep
+ source_labels:
+ - __meta_kubernetes_service_label_foo
+ - __meta_kubernetes_service_labelpresent_foo
+ regex: (bar);true
+ - action: keep
+ source_labels:
+ - __meta_kubernetes_endpoint_port_name
+ regex: web
+ - source_labels:
+ - __meta_kubernetes_endpoint_address_target_kind
+ - __meta_kubernetes_endpoint_address_target_name
+ separator: ;
+ regex: Node;(.*)
+ replacement: ${1}
+ target_label: node
+ - source_labels:
+ - __meta_kubernetes_endpoint_address_target_kind
+ - __meta_kubernetes_endpoint_address_target_name
+ separator: ;
+ regex: Pod;(.*)
+ replacement: ${1}
+ target_label: pod
+ - source_labels:
+ - __meta_kubernetes_namespace
+ target_label: namespace
+ - source_labels:
+ - __meta_kubernetes_service_name
+ target_label: service
+ - source_labels:
+ - __meta_kubernetes_pod_name
+ target_label: pod
+ - source_labels:
+ - __meta_kubernetes_pod_container_name
+ target_label: container
+ - action: drop
+ source_labels:
+ - __meta_kubernetes_pod_phase
+ regex: (Failed|Succeeded)
+ - source_labels:
+ - __meta_kubernetes_service_name
+ target_label: job
+ replacement: ${1}
+ - target_label: endpoint
+ replacement: web
+ - source_labels:
+ - __meta_kubernetes_endpointslice_endpoint_zone
+ - __tmp_topology
+ target_label: __tmp_topology
+ regex: (.+);
+ replacement: $1
+ action: replace
+ - source_labels:
+ - __meta_kubernetes_pod_label_topology_kubernetes_io_zone
+ - __meta_kubernetes_pod_labelpresent_topology_kubernetes_io_zone
+ - __tmp_topology
+ target_label: __tmp_topology
+ regex: (.+);true;
+ replacement: $1
+ action: replace
+ - source_labels:
+ - __tmp_topology
+ - __tmp_disable_sharding
+ regex: $(TOPOLOGY_ZONE);|.+;.+
+ action: keep
+ - source_labels:
+ - __address__
+ - __tmp_hash
+ target_label: __tmp_hash
+ regex: (.+);
+ replacement: $1
+ action: replace
+ - source_labels:
+ - __tmp_hash
+ target_label: __tmp_hash
+ modulus: 2
+ action: hashmod
+ - source_labels:
+ - __tmp_hash
+ - __tmp_disable_sharding
+ regex: $(INZONE_SHARD);|.+;.+
+ action: keep
diff --git a/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_attach_metadata_false.golden b/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_attach_metadata_false.golden
new file mode 100644
index 00000000000..c8564457319
--- /dev/null
+++ b/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_attach_metadata_false.golden
@@ -0,0 +1,104 @@
+global:
+ scrape_interval: 30s
+ external_labels:
+ prometheus: default/test
+ prometheus_replica: $(POD_NAME)
+ zone: $(TOPOLOGY_ZONE)
+ evaluation_interval: 30s
+scrape_configs:
+- job_name: serviceMonitor/default/test/0
+ honor_labels: false
+ kubernetes_sd_configs:
+ - role: endpoints
+ namespaces:
+ names:
+ - default
+ attach_metadata:
+ node: false
+ scrape_interval: 30s
+ relabel_configs:
+ - source_labels:
+ - job
+ target_label: __tmp_prometheus_job_name
+ - action: keep
+ source_labels:
+ - __meta_kubernetes_service_label_foo
+ - __meta_kubernetes_service_labelpresent_foo
+ regex: (bar);true
+ - action: keep
+ source_labels:
+ - __meta_kubernetes_endpoint_port_name
+ regex: web
+ - source_labels:
+ - __meta_kubernetes_endpoint_address_target_kind
+ - __meta_kubernetes_endpoint_address_target_name
+ separator: ;
+ regex: Node;(.*)
+ replacement: ${1}
+ target_label: node
+ - source_labels:
+ - __meta_kubernetes_endpoint_address_target_kind
+ - __meta_kubernetes_endpoint_address_target_name
+ separator: ;
+ regex: Pod;(.*)
+ replacement: ${1}
+ target_label: pod
+ - source_labels:
+ - __meta_kubernetes_namespace
+ target_label: namespace
+ - source_labels:
+ - __meta_kubernetes_service_name
+ target_label: service
+ - source_labels:
+ - __meta_kubernetes_pod_name
+ target_label: pod
+ - source_labels:
+ - __meta_kubernetes_pod_container_name
+ target_label: container
+ - action: drop
+ source_labels:
+ - __meta_kubernetes_pod_phase
+ regex: (Failed|Succeeded)
+ - source_labels:
+ - __meta_kubernetes_service_name
+ target_label: job
+ replacement: ${1}
+ - target_label: endpoint
+ replacement: web
+ - source_labels:
+ - __meta_kubernetes_endpointslice_endpoint_zone
+ - __tmp_topology
+ target_label: __tmp_topology
+ regex: (.+);
+ replacement: $1
+ action: replace
+ - source_labels:
+ - __meta_kubernetes_pod_label_topology_kubernetes_io_zone
+ - __meta_kubernetes_pod_labelpresent_topology_kubernetes_io_zone
+ - __tmp_topology
+ target_label: __tmp_topology
+ regex: (.+);true;
+ replacement: $1
+ action: replace
+ - source_labels:
+ - __tmp_topology
+ - __tmp_disable_sharding
+ regex: $(TOPOLOGY_ZONE);|.+;.+
+ action: keep
+ - source_labels:
+ - __address__
+ - __tmp_hash
+ target_label: __tmp_hash
+ regex: (.+);
+ replacement: $1
+ action: replace
+ - source_labels:
+ - __tmp_hash
+ target_label: __tmp_hash
+ modulus: 2
+ action: hashmod
+ - source_labels:
+ - __tmp_hash
+ - __tmp_disable_sharding
+ regex: $(INZONE_SHARD);|.+;.+
+ action: keep
From d34861ea99c5c26f24fbe07ab43f230c3b6835fb Mon Sep 17 00:00:00 2001
From: Simon Pasquier
Date: Mon, 1 Jun 2026 14:36:29 +0200
Subject: [PATCH 49/81] chore: simplify TLS configuration validation
---
pkg/apis/monitoring/v1/tls_types.go | 50 +++++++++++++----------------
1 file changed, 23 insertions(+), 27 deletions(-)
diff --git a/pkg/apis/monitoring/v1/tls_types.go b/pkg/apis/monitoring/v1/tls_types.go
index 8a977fc593e..8ebc0b0c70e 100644
--- a/pkg/apis/monitoring/v1/tls_types.go
+++ b/pkg/apis/monitoring/v1/tls_types.go
@@ -81,25 +81,17 @@ func (c *TLSConfig) Validate() error {
return nil
}
- if !reflect.ValueOf(c.CA).IsZero() {
- if c.CAFile != "" {
- return fmt.Errorf("cannot specify both 'caFile' and 'ca'")
- }
+ if err := c.innerValidate(); err != nil {
+ return err
+ }
- if err := c.CA.Validate(); err != nil {
- return fmt.Errorf("ca: %w", err)
- }
+ if !reflect.ValueOf(c.CA).IsZero() && c.CAFile != "" {
+ return fmt.Errorf("cannot specify both 'caFile' and 'ca'")
}
hasCert := !reflect.ValueOf(c.Cert).IsZero()
- if hasCert {
- if c.CertFile != "" {
- return fmt.Errorf("cannot specify both 'certFile' and 'cert'")
- }
-
- if err := c.Cert.Validate(); err != nil {
- return fmt.Errorf("cert: %w", err)
- }
+ if hasCert && c.CertFile != "" {
+ return fmt.Errorf("cannot specify both 'certFile' and 'cert'")
}
if c.KeyFile != "" && c.KeySecret != nil {
@@ -117,10 +109,6 @@ func (c *TLSConfig) Validate() error {
return fmt.Errorf("cannot specify client key without client cert")
}
- if c.MaxVersion != nil && c.MinVersion != nil && strings.Compare(string(*c.MaxVersion), string(*c.MinVersion)) == -1 {
- return fmt.Errorf("'maxVersion' must greater than or equal to 'minVersion'")
- }
-
return nil
}
@@ -166,6 +154,22 @@ func (c *SafeTLSConfig) Validate() error {
return nil
}
+ if err := c.innerValidate(); err != nil {
+ return err
+ }
+
+ if c.Cert != (SecretOrConfigMap{}) && c.KeySecret == nil {
+ return fmt.Errorf("client cert specified without client key")
+ }
+
+ if c.KeySecret != nil && c.Cert == (SecretOrConfigMap{}) {
+ return fmt.Errorf("client key specified without client cert")
+ }
+
+ return nil
+}
+
+func (c *SafeTLSConfig) innerValidate() error {
if c.CA != (SecretOrConfigMap{}) {
if err := c.CA.Validate(); err != nil {
return fmt.Errorf("ca %s: %w", c.CA.String(), err)
@@ -178,14 +182,6 @@ func (c *SafeTLSConfig) Validate() error {
}
}
- if c.Cert != (SecretOrConfigMap{}) && c.KeySecret == nil {
- return fmt.Errorf("client cert specified without client key")
- }
-
- if c.KeySecret != nil && c.Cert == (SecretOrConfigMap{}) {
- return fmt.Errorf("client key specified without client cert")
- }
-
if c.MaxVersion != nil && c.MinVersion != nil && strings.Compare(string(*c.MaxVersion), string(*c.MinVersion)) == -1 {
return fmt.Errorf("maxVersion must more than or equal to minVersion")
}
From ae56d53133e05b9f48cfaeff4d983e9c821cf197 Mon Sep 17 00:00:00 2001
From: Simon Pasquier
Date: Tue, 2 Jun 2026 10:46:47 +0200
Subject: [PATCH 50/81] chore: update Prometheus to v3.12.0
---
.../getting-started/compatibility.md | 8 +-
go.mod | 66 +++---
go.sum | 188 +++++++++---------
pkg/operator/defaults.go | 1 +
pkg/operator/rules.go | 2 +-
5 files changed, 134 insertions(+), 131 deletions(-)
diff --git a/Documentation/getting-started/compatibility.md b/Documentation/getting-started/compatibility.md
index ebe2d3b8d25..1a125ff6d00 100644
--- a/Documentation/getting-started/compatibility.md
+++ b/Documentation/getting-started/compatibility.md
@@ -24,7 +24,7 @@ The Prometheus Operator uses the official [Go client](https://github.com/kuberne
The current version of the Prometheus operator uses the following Go client version:
```$ mdox-exec="go list -m -f '{{ .Version }}' k8s.io/client-go"
-v0.36.0
+v0.36.1
```
## Prometheus
@@ -79,12 +79,14 @@ Prometheus Operator supports all Prometheus versions >= v2.0.0. The operator's e
* v3.11.0
* v3.11.1
* v3.11.2
+* v3.11.3
+* v3.12.0
```
The end-to-end tests are mostly tested against
```$ mdox-exec="go run ./cmd/po-docgen/. compatibility defaultPrometheusVersion"
-* v3.11.2
+* v3.12.0
```
## Alertmanager
@@ -94,7 +96,7 @@ The Prometheus Operator is compatible with Alertmanager v0.15 and above.
The end-to-end tests are mostly tested against
```$ mdox-exec="go run ./cmd/po-docgen/. compatibility defaultAlertmanagerVersion"
-* v0.32.0
+* v0.32.1
```
## Thanos
diff --git a/go.mod b/go.mod
index 7a7fc99c3a6..0c3b607c48d 100644
--- a/go.mod
+++ b/go.mod
@@ -25,7 +25,7 @@ require (
github.com/prometheus/client_golang v1.23.2
github.com/prometheus/common v0.67.5
github.com/prometheus/exporter-toolkit v0.16.0
- github.com/prometheus/prometheus v0.311.3
+ github.com/prometheus/prometheus v0.312.0
github.com/stretchr/testify v1.11.1
github.com/thanos-io/thanos v0.41.0
golang.org/x/net v0.55.0
@@ -45,20 +45,20 @@ require (
)
require (
- github.com/aws/aws-sdk-go-v2 v1.41.5 // indirect
- github.com/aws/aws-sdk-go-v2/config v1.32.13 // indirect
- github.com/aws/aws-sdk-go-v2/credentials v1.19.13 // indirect
- github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.21 // indirect
- github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21 // indirect
- github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21 // indirect
- github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect
- github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect
- github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21 // indirect
- github.com/aws/aws-sdk-go-v2/service/signin v1.0.9 // indirect
- github.com/aws/aws-sdk-go-v2/service/sso v1.30.14 // indirect
- github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.18 // indirect
- github.com/aws/aws-sdk-go-v2/service/sts v1.41.10 // indirect
- github.com/aws/smithy-go v1.24.2 // indirect
+ github.com/aws/aws-sdk-go-v2 v1.41.7 // indirect
+ github.com/aws/aws-sdk-go-v2/config v1.32.18 // indirect
+ github.com/aws/aws-sdk-go-v2/credentials v1.19.17 // indirect
+ github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.23 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23 // indirect
+ github.com/aws/aws-sdk-go-v2/service/signin v1.0.11 // indirect
+ github.com/aws/aws-sdk-go-v2/service/sso v1.30.17 // indirect
+ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.0 // indirect
+ github.com/aws/aws-sdk-go-v2/service/sts v1.42.1 // indirect
+ github.com/aws/smithy-go v1.26.0 // indirect
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
github.com/coreos/go-systemd/v22 v22.7.0 // indirect
github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb // indirect
@@ -68,7 +68,7 @@ require (
github.com/go-openapi/swag/cmdutils v0.25.5 // indirect
github.com/go-openapi/swag/conv v0.25.5 // indirect
github.com/go-openapi/swag/fileutils v0.25.5 // indirect
- github.com/go-openapi/swag/jsonname v0.25.5 // indirect
+ github.com/go-openapi/swag/jsonname v0.26.0 // indirect
github.com/go-openapi/swag/jsonutils v0.25.5 // indirect
github.com/go-openapi/swag/loading v0.25.5 // indirect
github.com/go-openapi/swag/mangling v0.25.5 // indirect
@@ -80,7 +80,7 @@ require (
github.com/golang-jwt/jwt/v5 v5.3.1 // indirect
github.com/google/gnostic-models v0.7.1 // indirect
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect
- github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect
+ github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect
github.com/mdlayher/socket v0.5.1 // indirect
github.com/mdlayher/vsock v1.2.1 // indirect
github.com/mitchellh/go-ps v1.0.0 // indirect
@@ -90,19 +90,19 @@ require (
github.com/prometheus/sigv4 v0.4.1 // indirect
github.com/x448/float16 v0.8.4 // indirect
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
- go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.67.0 // indirect
- go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0 // indirect
- go.opentelemetry.io/otel/sdk v1.43.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.69.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.44.0 // indirect
+ go.opentelemetry.io/otel/sdk v1.44.0 // indirect
go.opentelemetry.io/proto/otlp v1.10.0 // indirect
go.yaml.in/yaml/v2 v2.4.4 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 // indirect
- google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 // indirect
- google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 // indirect
- google.golang.org/grpc v1.80.0 // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa // indirect
+ google.golang.org/grpc v1.81.1 // indirect
gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect
k8s.io/streaming v0.36.1 // indirect
sigs.k8s.io/randfill v1.0.0 // indirect
@@ -113,21 +113,21 @@ require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/dennwc/varint v1.0.0 // indirect
- github.com/edsrzf/mmap-go v1.2.0 // indirect
+ github.com/edsrzf/mmap-go v1.2.1-0.20241212181136-fad1cd13edbd // indirect
github.com/efficientgo/core v1.0.0-rc.3 // indirect
github.com/emicklei/go-restful/v3 v3.13.0 // indirect
- github.com/fsnotify/fsnotify v1.9.0 // indirect
+ github.com/fsnotify/fsnotify v1.10.1 // indirect
github.com/go-logfmt/logfmt v0.6.1 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-openapi/analysis v0.25.0 // indirect
github.com/go-openapi/errors v0.22.7 // indirect
- github.com/go-openapi/jsonpointer v0.22.5 // indirect
+ github.com/go-openapi/jsonpointer v0.23.1 // indirect
github.com/go-openapi/jsonreference v0.21.5 // indirect
github.com/go-openapi/loads v0.23.3 // indirect
github.com/go-openapi/runtime v0.29.3 // indirect
github.com/go-openapi/spec v0.22.4 // indirect
- github.com/go-openapi/strfmt v0.26.1 // indirect
+ github.com/go-openapi/strfmt v0.26.2 // indirect
github.com/go-openapi/validate v0.25.2 // indirect
github.com/google/uuid v1.6.0
github.com/grafana/regexp v0.0.0-20250905093917-f7b3be9d1853 // indirect
@@ -149,9 +149,9 @@ require (
github.com/spf13/cobra v1.10.2 // indirect
github.com/spf13/pflag v1.0.10 // indirect
github.com/xhit/go-str2duration/v2 v2.1.0 // indirect
- go.opentelemetry.io/otel v1.43.0 // indirect
- go.opentelemetry.io/otel/metric v1.43.0 // indirect
- go.opentelemetry.io/otel/trace v1.43.0 // indirect
+ go.opentelemetry.io/otel v1.44.0 // indirect
+ go.opentelemetry.io/otel/metric v1.44.0 // indirect
+ go.opentelemetry.io/otel/trace v1.44.0 // indirect
go.uber.org/atomic v1.11.0 // indirect
golang.org/x/crypto v0.51.0 // indirect
golang.org/x/oauth2 v0.36.0 // indirect
diff --git a/go.sum b/go.sum
index e5e52b613be..3d95f81d60d 100644
--- a/go.sum
+++ b/go.sum
@@ -1,16 +1,16 @@
cloud.google.com/go v0.120.0 h1:wc6bgG9DHyKqF5/vQvX1CiZrtHnxJjBlKUyF9nP6meA=
-cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM=
-cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M=
+cloud.google.com/go/auth v0.20.0 h1:kXTssoVb4azsVDoUiF8KvxAqrsQcQtB53DcSgta74CA=
+cloud.google.com/go/auth v0.20.0/go.mod h1:942/yi/itH1SsmpyrbnTMDgGfdy2BUqIKyd0cyYLc5Q=
cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc=
cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c=
cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs=
cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10=
-github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0 h1:fou+2+WFTib47nS+nz/ozhEBnvU96bKHy6LjRsY4E28=
-github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0/go.mod h1:t76Ruy8AHvUAC8GfMWJMa0ElSbuIcO03NLpynfbgsPA=
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.1 h1:jHb/wfvRikGdxMXYV3QG/SzUOPYN9KEUUuC0Yd0/vC0=
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.1/go.mod h1:pzBXCYn05zvYIrwLgtK8Ap8QcjRg+0i76tMQdWN6wOk=
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1 h1:Hk5QBxZQC1jb2Fwj6mpzme37xbCDdNTxU7O9eb5+LB4=
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1/go.mod h1:IYus9qsFobWIc2YVwe/WPjcnyCkPKtnHAqUYeebc8z0=
-github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 h1:9iefClla7iYpfYWdzPCRDozdmndjTm8DXdpCzPajMgA=
-github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2/go.mod h1:XtLgD3ZD34DAaVIIAyG3objl5DynM3CQ/vMcbBNJZGI=
+github.com/Azure/azure-sdk-for-go/sdk/internal v1.12.0 h1:fhqpLE3UEXi9lPaBRpQ6XuRW0nU7hgg4zlmZZa+a9q4=
+github.com/Azure/azure-sdk-for-go/sdk/internal v1.12.0/go.mod h1:7dCRMLwisfRH3dBupKeNCioWYUZ4SS09Z14H+7i8ZoY=
github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 h1:XRzhVemXdgvJqCH0sFfrBUTnUJSBrBf7++ypk+twtRs=
github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk=
github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
@@ -30,34 +30,34 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPd
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
-github.com/aws/aws-sdk-go-v2 v1.41.5 h1:dj5kopbwUsVUVFgO4Fi5BIT3t4WyqIDjGKCangnV/yY=
-github.com/aws/aws-sdk-go-v2 v1.41.5/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o=
-github.com/aws/aws-sdk-go-v2/config v1.32.13 h1:5KgbxMaS2coSWRrx9TX/QtWbqzgQkOdEa3sZPhBhCSg=
-github.com/aws/aws-sdk-go-v2/config v1.32.13/go.mod h1:8zz7wedqtCbw5e9Mi2doEwDyEgHcEE9YOJp6a8jdSMY=
-github.com/aws/aws-sdk-go-v2/credentials v1.19.13 h1:mA59E3fokBvyEGHKFdnpNNrvaR351cqiHgRg+JzOSRI=
-github.com/aws/aws-sdk-go-v2/credentials v1.19.13/go.mod h1:yoTXOQKea18nrM69wGF9jBdG4WocSZA1h38A+t/MAsk=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.21 h1:NUS3K4BTDArQqNu2ih7yeDLaS3bmHD0YndtA6UP884g=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.21/go.mod h1:YWNWJQNjKigKY1RHVJCuupeWDrrHjRqHm0N9rdrWzYI=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21 h1:Rgg6wvjjtX8bNHcvi9OnXWwcE0a2vGpbwmtICOsvcf4=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21/go.mod h1:A/kJFst/nm//cyqonihbdpQZwiUhhzpqTsdbhDdRF9c=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21 h1:PEgGVtPoB6NTpPrBgqSE5hE/o47Ij9qk/SEZFbUOe9A=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21/go.mod h1:p+hz+PRAYlY3zcpJhPwXlLC4C+kqn70WIHwnzAfs6ps=
-github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw=
-github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY=
-github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY=
-github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21 h1:c31//R3xgIJMSC8S6hEVq+38DcvUlgFY0FM6mSI5oto=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21/go.mod h1:r6+pf23ouCB718FUxaqzZdbpYFyDtehyZcmP5KL9FkA=
-github.com/aws/aws-sdk-go-v2/service/signin v1.0.9 h1:QKZH0S178gCmFEgst8hN0mCX1KxLgHBKKY/CLqwP8lg=
-github.com/aws/aws-sdk-go-v2/service/signin v1.0.9/go.mod h1:7yuQJoT+OoH8aqIxw9vwF+8KpvLZ8AWmvmUWHsGQZvI=
-github.com/aws/aws-sdk-go-v2/service/sso v1.30.14 h1:GcLE9ba5ehAQma6wlopUesYg/hbcOhFNWTjELkiWkh4=
-github.com/aws/aws-sdk-go-v2/service/sso v1.30.14/go.mod h1:WSvS1NLr7JaPunCXqpJnWk1Bjo7IxzZXrZi1QQCkuqM=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.18 h1:mP49nTpfKtpXLt5SLn8Uv8z6W+03jYVoOSAl/c02nog=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.18/go.mod h1:YO8TrYtFdl5w/4vmjL8zaBSsiNp3w0L1FfKVKenZT7w=
-github.com/aws/aws-sdk-go-v2/service/sts v1.41.10 h1:p8ogvvLugcR/zLBXTXrTkj0RYBUdErbMnAFFp12Lm/U=
-github.com/aws/aws-sdk-go-v2/service/sts v1.41.10/go.mod h1:60dv0eZJfeVXfbT1tFJinbHrDfSJ2GZl4Q//OSSNAVw=
-github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng=
-github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc=
+github.com/aws/aws-sdk-go-v2 v1.41.7 h1:DWpAJt66FmnnaRIOT/8ASTucrvuDPZASqhhLey6tLY8=
+github.com/aws/aws-sdk-go-v2 v1.41.7/go.mod h1:4LAfZOPHNVNQEckOACQx60Y8pSRjIkNZQz1w92xpMJc=
+github.com/aws/aws-sdk-go-v2/config v1.32.18 h1:Hcia46bxhGgF3BaSnG8nSNCWmqTK6bj9xN9/FJ3WK6Q=
+github.com/aws/aws-sdk-go-v2/config v1.32.18/go.mod h1:zEjCAYmxqDadH1WX8CdBvmLKhUEUVFgKRQG38zjDmrY=
+github.com/aws/aws-sdk-go-v2/credentials v1.19.17 h1:gP2nkGsS+KMvF/jfFz2Vv2qiiOqWKyPACSzPsqHgoW8=
+github.com/aws/aws-sdk-go-v2/credentials v1.19.17/go.mod h1:Bsew3S/moG5iT77giPj1q8wb/s0RE5/QfH+ASjYtuQc=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23 h1:UuSfcORqNSz/ey3VPRS8TcVH2Ikf0/sC+Hdj400QI6U=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23/go.mod h1:+G/OSGiOFnSOkYloKj/9M35s74LgVAdJBSD5lsFfqKg=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23 h1:GpT/TrnBYuE5gan2cZbTtvP+JlHsutdmlV2YfEyNde0=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23/go.mod h1:xYWD6BS9ywC5bS3sz9Xh04whO/hzK2plt2Zkyrp4JuA=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.23 h1:bpd8vxhlQi2r1hiueOw02f/duEPTMK59Q4QMAoTTtTo=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.23/go.mod h1:15DfR2nw+CRHIk0tqNyifu3G1YdAOy68RftkhMDDwYk=
+github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24 h1:OQqn11BtaYv1WLUowvcA30MpzIu8Ti4pcLPIIyoKZrA=
+github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24/go.mod h1:X5ZJyfwVrWA96GzPmUCWFQaEARPR7gCrpq2E92PJwAE=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9 h1:FLudkZLt5ci0ozzgkVo8BJGwvqNaZbTWb3UcucAateA=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9/go.mod h1:w7wZ/s9qK7c8g4al+UyoF1Sp/Z45UwMGcqIzLWVQHWk=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23 h1:pbrxO/kuIwgEsOPLkaHu0O+m4fNgLU8B3vxQ+72jTPw=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23/go.mod h1:/CMNUqoj46HpS3MNRDEDIwcgEnrtZlKRaHNaHxIFpNA=
+github.com/aws/aws-sdk-go-v2/service/signin v1.0.11 h1:TdJ+HdzOBhU8+iVAOGUTU63VXopcumCOF1paFulHWZc=
+github.com/aws/aws-sdk-go-v2/service/signin v1.0.11/go.mod h1:R82ZRExE/nheo0N+T8zHPcLRTcH8MGsnR3BiVGX0TwI=
+github.com/aws/aws-sdk-go-v2/service/sso v1.30.17 h1:7byT8HUWrgoRp6sXjxtZwgOKfhss5fW6SkLBtqzgRoE=
+github.com/aws/aws-sdk-go-v2/service/sso v1.30.17/go.mod h1:xNWknVi4Ezm1vg1QsB/5EWpAJURq22uqd38U8qKvOJc=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.0 h1:nDARhv/oF55bcxF7rCI/4PDxOKnVXVWwDuDwCs2I2SQ=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.0/go.mod h1:4vIRDq+CJB2xFAXZ+YgGUTiEft7oAQlhIs71xcSeuVg=
+github.com/aws/aws-sdk-go-v2/service/sts v1.42.1 h1:F/M5Y9I3nwr2IEpshZgh1GeHpOItExNM9L1euNuh/fk=
+github.com/aws/aws-sdk-go-v2/service/sts v1.42.1/go.mod h1:mTNxImtovCOEEuD65mKW7DCsL+2gjEH+RPEAexAzAio=
+github.com/aws/smithy-go v1.26.0 h1:9ouqbi+NyKP7fV3Te7UElCwdAb6Y8uk7LGwPE5tVe/s=
+github.com/aws/smithy-go v1.26.0/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc=
github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 h1:6df1vn4bBlDDo4tARvBm7l6KA9iVMnE3NWizDeWSrps=
github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3/go.mod h1:CIWtjkly68+yqLPbvwwR/fjNJA/idrtULjZWh2v1ys0=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
@@ -82,8 +82,8 @@ github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE=
github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA=
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/edsrzf/mmap-go v1.2.0 h1:hXLYlkbaPzt1SaQk+anYwKSRNhufIDCchSPkUD6dD84=
-github.com/edsrzf/mmap-go v1.2.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q=
+github.com/edsrzf/mmap-go v1.2.1-0.20241212181136-fad1cd13edbd h1:I4PrRZuNMeDP3VbFrak4QsqwO5tWkQf0tqrrr1L2DsU=
+github.com/edsrzf/mmap-go v1.2.1-0.20241212181136-fad1cd13edbd/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q=
github.com/efficientgo/core v1.0.0-rc.3 h1:X6CdgycYWDcbYiJr1H1+lQGzx13o7bq3EUkbB9DsSPc=
github.com/efficientgo/core v1.0.0-rc.3/go.mod h1:FfGdkzWarkuzOlY04VY+bGfb1lWrjaL6x/GLcQ4vJps=
github.com/emicklei/go-restful/v3 v3.13.0 h1:C4Bl2xDndpU6nJ4bc1jXd+uTmYPVUwkD6bFY/oTyCes=
@@ -94,8 +94,8 @@ github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb h1:IT4JYU7k4ikYg1S
github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb/go.mod h1:bH6Xx7IW64qjjJq8M2u4dxNaBiDfKK+z/3eGDpXEQhc=
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
-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/fsnotify/fsnotify v1.10.1 h1:b0/UzAf9yR5rhf3RPm9gf3ehBPpf0oZKIjtpKrx59Ho=
+github.com/fsnotify/fsnotify v1.10.1/go.mod h1:TLheqan6HD6GBK6PrDWyDPBaEV8LspOxvPSjC+bVfgo=
github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM=
github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
@@ -117,8 +117,8 @@ github.com/go-openapi/analysis v0.25.0 h1:EnjAq1yO8wEO9HbPmY8vLPEIkdZuuFhCAKBPvC
github.com/go-openapi/analysis v0.25.0/go.mod h1:5WFTRE43WLkPG9r9OtlMfqkkvUTYLVVCIxLlEpyF8kE=
github.com/go-openapi/errors v0.22.7 h1:JLFBGC0Apwdzw3484MmBqspjPbwa2SHvpDm0u5aGhUA=
github.com/go-openapi/errors v0.22.7/go.mod h1://QW6SD9OsWtH6gHllUCddOXDL0tk0ZGNYHwsw4sW3w=
-github.com/go-openapi/jsonpointer v0.22.5 h1:8on/0Yp4uTb9f4XvTrM2+1CPrV05QPZXu+rvu2o9jcA=
-github.com/go-openapi/jsonpointer v0.22.5/go.mod h1:gyUR3sCvGSWchA2sUBJGluYMbe1zazrYWIkWPjjMUY0=
+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/loads v0.23.3 h1:g5Xap1JfwKkUnZdn+S0L3SzBDpcTIYzZ5Qaag0YDkKQ=
@@ -127,8 +127,8 @@ github.com/go-openapi/runtime v0.29.3 h1:h5twGaEqxtQg40ePiYm9vFFH1q06Czd7Ot6ufdK
github.com/go-openapi/runtime v0.29.3/go.mod h1:8A1W0/L5eyNJvKciqZtvIVQvYO66NlB7INMSZ9bw/oI=
github.com/go-openapi/spec v0.22.4 h1:4pxGjipMKu0FzFiu/DPwN3CTBRlVM2yLf/YTWorYfDQ=
github.com/go-openapi/spec v0.22.4/go.mod h1:WQ6Ai0VPWMZgMT4XySjlRIE6GP1bGQOtEThn3gcWLtQ=
-github.com/go-openapi/strfmt v0.26.1 h1:7zGCHji7zSYDC2tCXIusoxYQz/48jAf2q+sF6wXTG+c=
-github.com/go-openapi/strfmt v0.26.1/go.mod h1:Zslk5VZPOISLwmWTMBIS7oiVFem1o1EI6zULY8Uer7Y=
+github.com/go-openapi/strfmt v0.26.2 h1:ysjheCh4i1rmFEo2LanhELDNucNzfWTZhUDKgWWPaFM=
+github.com/go-openapi/strfmt v0.26.2/go.mod h1:fXh1e449cyUn2NYuz+wb3wARBUdMl7qPEZwX00nqivY=
github.com/go-openapi/swag v0.25.5 h1:pNkwbUEeGwMtcgxDr+2GBPAk4kT+kJ+AaB+TMKAg+TU=
github.com/go-openapi/swag v0.25.5/go.mod h1:B3RT6l8q7X803JRxa2e59tHOiZlX1t8viplOcs9CwTA=
github.com/go-openapi/swag/cmdutils v0.25.5 h1:yh5hHrpgsw4NwM9KAEtaDTXILYzdXh/I8Whhx9hKj7c=
@@ -137,8 +137,8 @@ github.com/go-openapi/swag/conv v0.25.5 h1:wAXBYEXJjoKwE5+vc9YHhpQOFj2JYBMF2DUi+
github.com/go-openapi/swag/conv v0.25.5/go.mod h1:CuJ1eWvh1c4ORKx7unQnFGyvBbNlRKbnRyAvDvzWA4k=
github.com/go-openapi/swag/fileutils v0.25.5 h1:B6JTdOcs2c0dBIs9HnkyTW+5gC+8NIhVBUwERkFhMWk=
github.com/go-openapi/swag/fileutils v0.25.5/go.mod h1:V3cT9UdMQIaH4WiTrUc9EPtVA4txS0TOmRURmhGF4kc=
-github.com/go-openapi/swag/jsonname v0.25.5 h1:8p150i44rv/Drip4vWI3kGi9+4W9TdI3US3uUYSFhSo=
-github.com/go-openapi/swag/jsonname v0.25.5/go.mod h1:jNqqikyiAK56uS7n8sLkdaNY/uq6+D2m2LANat09pKU=
+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.25.5 h1:XUZF8awQr75MXeC+/iaw5usY/iM7nXPDwdG3Jbl9vYo=
github.com/go-openapi/swag/jsonutils v0.25.5/go.mod h1:48FXUaz8YsDAA9s5AnaUvAmry1UcLcNVWUjY42XkrN4=
github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.5 h1:SX6sE4FrGb4sEnnxbFL/25yZBb5Hcg1inLeErd86Y1U=
@@ -157,8 +157,8 @@ github.com/go-openapi/swag/yamlutils v0.25.5 h1:kASCIS+oIeoc55j28T4o8KwlV2S4ZLPT
github.com/go-openapi/swag/yamlutils v0.25.5/go.mod h1:Gek1/SjjfbYvM+Iq4QGwa/2lEXde9n2j4a3wI3pNuOQ=
github.com/go-openapi/testify/enable/yaml/v2 v2.4.1 h1:NZOrZmIb6PTv5LTFxr5/mKV/FjbUzGE7E6gLz7vFoOQ=
github.com/go-openapi/testify/enable/yaml/v2 v2.4.1/go.mod h1:r7dwsujEHawapMsxA69i+XMGZrQ5tRauhLAjV/sxg3Q=
-github.com/go-openapi/testify/v2 v2.4.1 h1:zB34HDKj4tHwyUQHrUkpV0Q0iXQ6dUCOQtIqn8hE6Iw=
-github.com/go-openapi/testify/v2 v2.4.1/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54=
+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-openapi/validate v0.25.2 h1:12NsfLAwGegqbGWr2CnvT65X/Q2USJipmJ9b7xDJZz0=
github.com/go-openapi/validate v0.25.2/go.mod h1:Pgl1LpPPGFnZ+ys4/hTlDiRYQdI1ocKypgE+8Q8BLfY=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
@@ -187,23 +187,23 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/google/pprof v0.0.0-20260302011040-a15ffb7f9dcc h1:VBbFa1lDYWEeV5FZKUiYKYT0VxCp9twUmmaq9eb8sXw=
-github.com/google/pprof v0.0.0-20260302011040-a15ffb7f9dcc/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI=
+github.com/google/pprof v0.0.0-20260507013755-92041b743c96 h1:YDDnaZ9afWajDboPMt9Vikqca/yWAX7KAxVzb4lJU1M=
+github.com/google/pprof v0.0.0-20260507013755-92041b743c96/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI=
github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0=
github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/googleapis/enterprise-certificate-proxy v0.3.14 h1:yh8ncqsbUY4shRD5dA6RlzjJaT4hi3kII+zYw8wmLb8=
-github.com/googleapis/enterprise-certificate-proxy v0.3.14/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg=
+github.com/googleapis/enterprise-certificate-proxy v0.3.15 h1:xolVQTEXusUcAA5UgtyRLjelpFFHWlPQ4XfWGc7MBas=
+github.com/googleapis/enterprise-certificate-proxy v0.3.15/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg=
github.com/googleapis/gax-go v2.0.2+incompatible h1:silFMLAnr330+NRuag/VjIGF7TLp/LBrV2CJKFLWEww=
-github.com/googleapis/gax-go/v2 v2.18.0 h1:jxP5Uuo3bxm3M6gGtV94P4lliVetoCB4Wk2x8QA86LI=
-github.com/googleapis/gax-go/v2 v2.18.0/go.mod h1:uSzZN4a356eRG985CzJ3WfbFSpqkLTjsnhWGJR6EwrE=
+github.com/googleapis/gax-go/v2 v2.22.0 h1:PjIWBpgGIVKGoCXuiCoP64altEJCj3/Ei+kSU5vlZD4=
+github.com/googleapis/gax-go/v2 v2.22.0/go.mod h1:irWBbALSr0Sk3qlqb9SyJ1h68WjgeFuiOzI4Rqw5+aY=
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/grafana/regexp v0.0.0-20250905093917-f7b3be9d1853 h1:cLN4IBkmkYZNnk7EAJ0BHIethd+J6LqxFNw5mSiI2bM=
github.com/grafana/regexp v0.0.0-20250905093917-f7b3be9d1853/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 h1:5VipnvEpbqr2gA2VbM+nYVbkIF28c5ZQfqCBQ5g2xfk=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0/go.mod h1:Hyl3n6Twe1hvtd9XUXDec4pTvgMSEixRuQKPTMH2bNs=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
@@ -215,8 +215,8 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
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.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE=
-github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ=
+github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao=
+github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ=
github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE=
github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
@@ -290,8 +290,8 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn
github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
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_golang/exp v0.0.0-20260325093428-d8591d0db856 h1:1Y6bmpZb8peQCy1IpctnAhIFuyhrdtMaDnETChhSNns=
-github.com/prometheus/client_golang/exp v0.0.0-20260325093428-d8591d0db856/go.mod h1:Vf0QcmVhGqpjLxZOaWrFSep86vchQtJmbztFaMM4f6Q=
+github.com/prometheus/client_golang/exp v0.0.0-20260518105423-c9d5bc4c50a9 h1:e33IfrrwrJkylWwAGcQ2jMvbWVv13lv0suTXjGNeiqY=
+github.com/prometheus/client_golang/exp v0.0.0-20260518105423-c9d5bc4c50a9/go.mod h1:vW/EVguzbNw6xMRmozJQWbY60/+Zsg0TgVJOSXGx2iI=
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.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
@@ -310,8 +310,8 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc=
github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo=
-github.com/prometheus/prometheus v0.311.3 h1:3IrVxQv6v5i/ZCGi6OrYeBhtCwaPTn6Z3DYruXoYm3M=
-github.com/prometheus/prometheus v0.311.3/go.mod h1:gjsCxTKtHO1Q8T9333u1s+lUR1OjPyM7ruuGH8RvVyo=
+github.com/prometheus/prometheus v0.312.0 h1:f9jdv2fQhQ1fks9a9YwlGZrKr4hih0rRP/rh0mu3Q18=
+github.com/prometheus/prometheus v0.312.0/go.mod h1:8oAYd2XPgHXLP4fFKam594R/ZLlPicrrBkVdaWt74Sw=
github.com/prometheus/sigv4 v0.4.1 h1:EIc3j+8NBea9u1iV6O5ZAN8uvPq2xOIUPcqCTivHuXs=
github.com/prometheus/sigv4 v0.4.1/go.mod h1:eu+ZbRvsc5TPiHwqh77OWuCnWK73IdkETYY46P4dXOU=
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
@@ -350,26 +350,26 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
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/net/http/httptrace/otelhttptrace v0.67.0 h1:c9r/G1CSw4dPI1jaNNG9RnQP+q4SvZnHciDQJVIvchU=
-go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.67.0/go.mod h1:gO9smoZe9KnZcJCqcB0lMmQ4Z5VEifYmjMTpnwtTSuQ=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 h1:OyrsyzuttWTSur2qN/Lm0m2a8yqyIjUVBZcxFPuXq2o=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0/go.mod h1:C2NGBr+kAB4bk3xtMXfZ94gqFDtg/GkI7e9zqGh5Beg=
-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.43.0 h1:88Y4s2C8oTui1LGM6bTWkw0ICGcOLCAI5l6zsD1j20k=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0/go.mod h1:Vl1/iaggsuRlrHf/hfPJPvVag77kKyvrLeD10kpMl+A=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0 h1:zWWrB1U6nqhS/k6zYB74CjRpuiitRtLLi68VcgmOEto=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0/go.mod h1:2qXPNBX1OVRC0IwOnfo1ljoid+RD0QK3443EaqVlsOU=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0 h1:3iZJKlCZufyRzPzlQhUIWVmfltrXuGyfjREgGP3UUjc=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0/go.mod h1:/G+nUPfhq2e+qiXMGxMwumDrP5jtzU+mWN7/sjT2rak=
-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/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.69.0 h1:MCcYL7J6Vt/X0kjqbMZkekCmwsurbQRbL69vkiye2lk=
+go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.69.0/go.mod h1:3jnStNwSufK+f5ktjL4EPcwtig4rtd81NS70lqHuXl8=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 h1:8tvICD4vSTOOsNrsI4Ljf6C+6UKvpTEH5XY3JMoyPoo=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0/go.mod h1:z9+yiacE0IHRqM4qFfkbt/JYlmYXgss8GY/jXoNuPJI=
+go.opentelemetry.io/otel v1.44.0 h1:JjwHmHpA4iZ3wBxluu2fbbE7j4kqlE8jXyAyPXH7HqU=
+go.opentelemetry.io/otel v1.44.0/go.mod h1:BMgjTHL9WPRlRjL2oZCBTL4whCGtXch2H4BhOPIAyYc=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 h1:4YsVu3B8+3qtWYYrsUYgn0OG78pN0rnNPRGX4SbokQI=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0/go.mod h1:+wnlSn0mD1ADVMe3v9Z/WIaiz6q6gL2J/ejaAmdmv80=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 h1:qazEJlUOQzhCpzQpFETGby7EdqjI1wsd0W+6Gg1SCTU=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0/go.mod h1:fOD2Yefuxixkx3ahVNf0O/PERb6r4OlbxfATVnYvzCo=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.44.0 h1:lgh3PiVrRUWMLOVSkQicxzZll5NjF1r+AtsX1XRIHw0=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.44.0/go.mod h1:5Cnhth3m/AgOeTgE3ex12pPmiu/gGtZit03kSzx9X7s=
+go.opentelemetry.io/otel/metric v1.44.0 h1:1w0gILTcHdr3YI+ixLyjemwrVnsMURbTZFrSYCdDdmc=
+go.opentelemetry.io/otel/metric v1.44.0/go.mod h1:8O7hanEPBNgEMmybD3s2VBKcgWOCsA6tzHBPODAiquo=
+go.opentelemetry.io/otel/sdk v1.44.0 h1:nHYwb9lK+fJPU/dnT6s7W7Z8itMWyqrnVfbheVYrZ58=
+go.opentelemetry.io/otel/sdk v1.44.0/go.mod h1:Osuydd3Se74nqjAKxid74N5eC+jfEqfTegHRnq58oK0=
+go.opentelemetry.io/otel/sdk/metric v1.44.0 h1:3LlKgI+VjbVsjNRFZJZAJ30WjXC5VkNRks6si09iEfI=
+go.opentelemetry.io/otel/sdk/metric v1.44.0/go.mod h1:5B5pMARnXxKhltooO4xUuCBorl65a4EpnTalObqOigA=
+go.opentelemetry.io/otel/trace v1.44.0 h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk=
+go.opentelemetry.io/otel/trace v1.44.0/go.mod h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE=
go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g=
go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
@@ -378,8 +378,8 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
-go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc=
-go.uber.org/zap v1.27.1/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=
@@ -394,8 +394,8 @@ golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 h1:jiDhWWeC7jfWqR9c/uplMOqJ0
golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90/go.mod h1:xE1HEv6b+1SCZ5/uscMRjUBKtIxworgEcEi+/n9NQDQ=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM=
-golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU=
+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-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@@ -434,22 +434,22 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c=
-golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI=
+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=
gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=
gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E=
-google.golang.org/api v0.272.0 h1:eLUQZGnAS3OHn31URRf9sAmRk3w2JjMx37d2k8AjJmA=
-google.golang.org/api v0.272.0/go.mod h1:wKjowi5LNJc5qarNvDCvNQBn3rVK8nSy6jg2SwRwzIA=
-google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 h1:VPWxll4HlMw1Vs/qXtN7BvhZqsS9cdAittCNvVENElA=
-google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:7QBABkRtR8z+TEnmXTqIqwJLlzrZKVfAUm7tY3yGv0M=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 h1:m8qni9SQFH0tJc1X0vmnpw/0t+AImlSvp30sEupozUg=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
-google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM=
-google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4=
+google.golang.org/api v0.278.0 h1:W7jiRvRi53VYFfZ/HoZjQBtJk7gOFbHD8ot1RzVZU6E=
+google.golang.org/api v0.278.0/go.mod h1:B9TqLBwJqVjp1mtt7WeoQwWRwvu/400y5lETOql+giQ=
+google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa h1:Kjn0N0tCrDgiAFW+lGO4JZ3ck44CehvJQMAwj9QF0G8=
+google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:q4lMZS6kskjT5HvCPrnnypcDPVJqT/f4nfxmkE7gryY=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa h1:mZHHdPZl0dbGHCflZgAq/Q468DWVFcU2whhB2KAo8fk=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa/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.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=
diff --git a/pkg/operator/defaults.go b/pkg/operator/defaults.go
index ca41abaac1c..38b6752a35e 100644
--- a/pkg/operator/defaults.go
+++ b/pkg/operator/defaults.go
@@ -104,6 +104,7 @@ var (
"v3.11.1",
"v3.11.2",
"v3.11.3",
+ "v3.12.0",
}
)
diff --git a/pkg/operator/rules.go b/pkg/operator/rules.go
index 42dffa05b22..a470a8f3447 100644
--- a/pkg/operator/rules.go
+++ b/pkg/operator/rules.go
@@ -231,7 +231,7 @@ func ValidateRule(promRuleSpec monitoringv1.PrometheusRuleSpec, validationScheme
return []error{fmt.Errorf("the length of rendered Prometheus Rule is %d bytes which is above the maximum limit of %d bytes", promRuleSize, MaxConfigMapDataSize)}
}
- _, errs := rulefmt.Parse(content, false, validationScheme, parser.NewParser(parserOptions))
+ _, errs := rulefmt.Parse(content, false, validationScheme, parser.NewParser(parserOptions), slog.New(slog.DiscardHandler))
return errs
}
From 005fbd816b89a6184e096efacf727005bd37dab3 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 2 Jun 2026 12:50:45 +0000
Subject: [PATCH 51/81] build(deps): bump github.com/prometheus/common from
0.67.5 to 0.68.0
Bumps [github.com/prometheus/common](https://github.com/prometheus/common) from 0.67.5 to 0.68.0.
- [Release notes](https://github.com/prometheus/common/releases)
- [Changelog](https://github.com/prometheus/common/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prometheus/common/compare/v0.67.5...v0.68.0)
---
updated-dependencies:
- dependency-name: github.com/prometheus/common
dependency-version: 0.68.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index 0c3b607c48d..642a43a0d4c 100644
--- a/go.mod
+++ b/go.mod
@@ -23,7 +23,7 @@ require (
github.com/prometheus-operator/prometheus-operator/pkg/client v0.91.0
github.com/prometheus/alertmanager v0.32.1
github.com/prometheus/client_golang v1.23.2
- github.com/prometheus/common v0.67.5
+ github.com/prometheus/common v0.68.0
github.com/prometheus/exporter-toolkit v0.16.0
github.com/prometheus/prometheus v0.312.0
github.com/stretchr/testify v1.11.1
diff --git a/go.sum b/go.sum
index 3d95f81d60d..cb69d46c9d8 100644
--- a/go.sum
+++ b/go.sum
@@ -299,8 +299,8 @@ github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNw
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.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
-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/common v0.68.0 h1:8rQJvQmYltsR2L7h8Zw0Iyj8WYNNmpwikoQTZXwfVeA=
+github.com/prometheus/common v0.68.0/go.mod h1:4soH+U8yJSROk7OJ//hmTiWKsxapv6zRGgTt3keN8gQ=
github.com/prometheus/exporter-toolkit v0.16.0 h1:xT/j7L2XKF+VJd6B4fpUw6xWabHrSmsUf6mYmFqyu0s=
github.com/prometheus/exporter-toolkit v0.16.0/go.mod h1:d1EL8Z9674xQe/iWhwP2wDyCEoBPbXVeqDbqAUsgJWY=
github.com/prometheus/otlptranslator v1.0.0 h1:s0LJW/iN9dkIH+EnhiD3BlkkP5QVIUVEoIwkU+A6qos=
From 6beab5ff95abce764a315dc054a56b0f16a573ca Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 2 Jun 2026 12:51:12 +0000
Subject: [PATCH 52/81] build(deps): bump imjasonh/setup-crane in the
github-actions-deps group
Bumps the github-actions-deps group with 1 update: [imjasonh/setup-crane](https://github.com/imjasonh/setup-crane).
Updates `imjasonh/setup-crane` from 0.5 to 0.6
- [Release notes](https://github.com/imjasonh/setup-crane/releases)
- [Commits](https://github.com/imjasonh/setup-crane/compare/6da1ae018866400525525ce74ff892880c099987...59c71e96a00b28651f10369ba3359a6d730740a0)
---
updated-dependencies:
- dependency-name: imjasonh/setup-crane
dependency-version: '0.6'
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: github-actions-deps
...
Signed-off-by: dependabot[bot]
---
.github/workflows/publish.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml
index bbb36a1b6bc..775658cb558 100644
--- a/.github/workflows/publish.yaml
+++ b/.github/workflows/publish.yaml
@@ -42,7 +42,7 @@ jobs:
- name: Check the cosign version
run: cosign version
- name: Install crane
- uses: imjasonh/setup-crane@6da1ae018866400525525ce74ff892880c099987 # v0.5
+ uses: imjasonh/setup-crane@59c71e96a00b28651f10369ba3359a6d730740a0 # v0.6
- name: Login to quay.io
uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0
with:
From 0adddc952a5b7da9dbc78caa1305e16a20765479 Mon Sep 17 00:00:00 2001
From: Simon Pasquier
Date: Wed, 3 Jun 2026 09:18:15 +0200
Subject: [PATCH 53/81] chore: update Kind and Kubernetes (v1.36.1)
---
.github/env | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/env b/.github/env
index 91775b52c85..f73d142513b 100644
--- a/.github/env
+++ b/.github/env
@@ -1,3 +1,3 @@
golang-version=1.26
-kind-version=v0.31.0
-kind-image=kindest/node:v1.35.1
+kind-version=v0.32.0
+kind-image=kindest/node:v1.36.1
From 8fcdb0c2e3f475f28be96da031bd1f9123a3a310 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 4 Jun 2026 01:39:42 +0000
Subject: [PATCH 54/81] build(deps): bump actions/checkout in the
github-actions-deps group
Bumps the github-actions-deps group with 1 update: [actions/checkout](https://github.com/actions/checkout).
Updates `actions/checkout` from 6.0.2 to 6.0.3
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v6.0.2...v6.0.3)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: 6.0.3
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: github-actions-deps
...
Signed-off-by: dependabot[bot]
---
.github/workflows/actionlint.yml | 2 +-
.github/workflows/changed-files.yaml | 2 +-
.github/workflows/checks.yaml | 12 ++++++------
.github/workflows/e2e-feature-gated.yaml | 2 +-
.github/workflows/e2e-prometheus-v2.yaml | 2 +-
.github/workflows/e2e.yaml | 2 +-
.github/workflows/publish.yaml | 2 +-
.github/workflows/release.yaml | 2 +-
.github/workflows/spell-check.yaml | 2 +-
.github/workflows/test-prom-version-upgrade.yaml | 2 +-
.github/workflows/unit.yaml | 4 ++--
11 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/.github/workflows/actionlint.yml b/.github/workflows/actionlint.yml
index f2df1027539..2ad989c3887 100644
--- a/.github/workflows/actionlint.yml
+++ b/.github/workflows/actionlint.yml
@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
- uses: actions/checkout@v6.0.2
+ uses: actions/checkout@v6.0.3
- name: Download actionlint
id: get_actionlint
run: bash <(curl https://raw.githubusercontent.com/rhysd/actionlint/v1.7.4/scripts/download-actionlint.bash)
diff --git a/.github/workflows/changed-files.yaml b/.github/workflows/changed-files.yaml
index 75cec2a672a..84ea6f678fb 100644
--- a/.github/workflows/changed-files.yaml
+++ b/.github/workflows/changed-files.yaml
@@ -16,7 +16,7 @@ jobs:
steps:
- name: checkout repo
id: checkout
- uses: actions/checkout@v6.0.2
+ uses: actions/checkout@v6.0.3
with:
fetch-depth: 0
- name: get changed files
diff --git a/.github/workflows/checks.yaml b/.github/workflows/checks.yaml
index d13d9ff87f6..6ecff8a3894 100644
--- a/.github/workflows/checks.yaml
+++ b/.github/workflows/checks.yaml
@@ -22,7 +22,7 @@ jobs:
- ubuntu-latest
name: Generate and format
steps:
- - uses: actions/checkout@v6.0.2
+ - uses: actions/checkout@v6.0.3
- name: Import environment variables from file
run: cat ".github/env" >> "$GITHUB_ENV"
- uses: actions/setup-go@v6.4.0
@@ -37,7 +37,7 @@ jobs:
runs-on: ubuntu-latest
name: Check Documentation formatting and links
steps:
- - uses: actions/checkout@v6.0.2
+ - uses: actions/checkout@v6.0.3
- name: Import environment variables from file
run: cat ".github/env" >> "$GITHUB_ENV"
- uses: actions/setup-go@v6.4.0
@@ -52,7 +52,7 @@ jobs:
runs-on: ubuntu-latest
name: Golang linter
steps:
- - uses: actions/checkout@v6.0.2
+ - uses: actions/checkout@v6.0.3
- name: Import environment variables from file
run: cat ".github/env" >> "$GITHUB_ENV"
- uses: actions/setup-go@v6.4.0
@@ -70,7 +70,7 @@ jobs:
runs-on: ubuntu-latest
name: Check prometheus metrics
steps:
- - uses: actions/checkout@v6.0.2
+ - uses: actions/checkout@v6.0.3
- name: Import environment variables from file
run: cat ".github/env" >> "$GITHUB_ENV"
- uses: actions/setup-go@v6.4.0
@@ -88,7 +88,7 @@ jobs:
- ubuntu-latest
name: Build operator binary
steps:
- - uses: actions/checkout@v6.0.2
+ - uses: actions/checkout@v6.0.3
- name: Import environment variables from file
run: cat ".github/env" >> "$GITHUB_ENV"
- uses: actions/setup-go@v6.4.0
@@ -101,7 +101,7 @@ jobs:
runs-on: ubuntu-latest
name: Build Prometheus Operator rule config map to rule file CRDs CLI tool
steps:
- - uses: actions/checkout@v6.0.2
+ - uses: actions/checkout@v6.0.3
- name: Import environment variables from file
run: cat ".github/env" >> "$GITHUB_ENV"
- uses: actions/setup-go@v6.4.0
diff --git a/.github/workflows/e2e-feature-gated.yaml b/.github/workflows/e2e-feature-gated.yaml
index 6a690230753..fa8db884ed9 100644
--- a/.github/workflows/e2e-feature-gated.yaml
+++ b/.github/workflows/e2e-feature-gated.yaml
@@ -22,7 +22,7 @@ jobs:
if: ${{ needs.changed-files.outputs.non-markdown-files }}
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.2
+ - uses: actions/checkout@v6.0.3
- name: Setup E2E environment
uses: ./.github/actions/setup-e2e # composite action with your setup steps
diff --git a/.github/workflows/e2e-prometheus-v2.yaml b/.github/workflows/e2e-prometheus-v2.yaml
index 20014b5b9da..8d0262d8e43 100644
--- a/.github/workflows/e2e-prometheus-v2.yaml
+++ b/.github/workflows/e2e-prometheus-v2.yaml
@@ -27,7 +27,7 @@ jobs:
- suite: operatorUpgrade
target: test-e2e-operator-upgrade
steps:
- - uses: actions/checkout@v6.0.2
+ - uses: actions/checkout@v6.0.3
- name: Setup E2E environment
uses: ./.github/actions/setup-e2e # composite action with your setup steps
diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml
index e0161c88e73..1bd79f85844 100644
--- a/.github/workflows/e2e.yaml
+++ b/.github/workflows/e2e.yaml
@@ -37,7 +37,7 @@ jobs:
- suite: operatorUpgrade
target: test-e2e-operator-upgrade
steps:
- - uses: actions/checkout@v6.0.2
+ - uses: actions/checkout@v6.0.3
- name: Setup E2E environment
uses: ./.github/actions/setup-e2e # composite action with your setup steps
diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml
index 775658cb558..2ab527403d2 100644
--- a/.github/workflows/publish.yaml
+++ b/.github/workflows/publish.yaml
@@ -22,7 +22,7 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v6.0.2
+ uses: actions/checkout@v6.0.3
- name: Import environment variables from file
run: cat ".github/env" >> "$GITHUB_ENV"
- name: Reclaim disk space
diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml
index 4280d8a6e14..2680ccb0249 100644
--- a/.github/workflows/release.yaml
+++ b/.github/workflows/release.yaml
@@ -10,7 +10,7 @@ jobs:
name: Upload release assets
steps:
- name: Checkout
- uses: actions/checkout@v6.0.2
+ uses: actions/checkout@v6.0.3
- name: Import environment variables from file
run: cat ".github/env" >> "$GITHUB_ENV"
- name: Install Go
diff --git a/.github/workflows/spell-check.yaml b/.github/workflows/spell-check.yaml
index 146426dabc1..daf6b0ee104 100644
--- a/.github/workflows/spell-check.yaml
+++ b/.github/workflows/spell-check.yaml
@@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.2
+ - uses: actions/checkout@v6.0.3
- name: Run cSpell
uses: streetsidesoftware/cspell-action@de2a73e963e7443969755b648a1008f77033c5b2 # v8.4.0
with:
diff --git a/.github/workflows/test-prom-version-upgrade.yaml b/.github/workflows/test-prom-version-upgrade.yaml
index 8262fe884c6..ce78d3d127c 100644
--- a/.github/workflows/test-prom-version-upgrade.yaml
+++ b/.github/workflows/test-prom-version-upgrade.yaml
@@ -15,7 +15,7 @@ jobs:
docker image prune --force --all
sudo rm -rf /usr/share/dotnet
sudo rm -rf /usr/local/lib/android
- - uses: actions/checkout@v6.0.2
+ - uses: actions/checkout@v6.0.3
- name: Import environment variables from file
run: |
cat ".github/env" >> "$GITHUB_ENV"
diff --git a/.github/workflows/unit.yaml b/.github/workflows/unit.yaml
index a039f5341ff..0a87913abe6 100644
--- a/.github/workflows/unit.yaml
+++ b/.github/workflows/unit.yaml
@@ -21,7 +21,7 @@ jobs:
needs: changed-files
if: ${{ needs.changed-files.outputs.non-markdown-files }}
steps:
- - uses: actions/checkout@v6.0.2
+ - uses: actions/checkout@v6.0.3
- name: Import environment variables from file
run: cat ".github/env" >> "$GITHUB_ENV"
- uses: actions/setup-go@v6.4.0
@@ -35,7 +35,7 @@ jobs:
needs: changed-files
if: ${{ needs.changed-files.outputs.non-markdown-files }}
steps:
- - uses: actions/checkout@v6.0.2
+ - uses: actions/checkout@v6.0.3
- name: Import environment variables from file
run: cat ".github/env" >> "$GITHUB_ENV"
- uses: actions/setup-go@v6.4.0
From f7067ef4d7c92a0e1468ab32d258b6425bf381c8 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 4 Jun 2026 01:42:46 +0000
Subject: [PATCH 55/81] build(deps): bump github.com/prometheus/common from
0.68.0 to 0.68.1
Bumps [github.com/prometheus/common](https://github.com/prometheus/common) from 0.68.0 to 0.68.1.
- [Release notes](https://github.com/prometheus/common/releases)
- [Changelog](https://github.com/prometheus/common/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prometheus/common/compare/v0.68.0...v0.68.1)
---
updated-dependencies:
- dependency-name: github.com/prometheus/common
dependency-version: 0.68.1
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index 642a43a0d4c..6ca0f73e80c 100644
--- a/go.mod
+++ b/go.mod
@@ -23,7 +23,7 @@ require (
github.com/prometheus-operator/prometheus-operator/pkg/client v0.91.0
github.com/prometheus/alertmanager v0.32.1
github.com/prometheus/client_golang v1.23.2
- github.com/prometheus/common v0.68.0
+ github.com/prometheus/common v0.68.1
github.com/prometheus/exporter-toolkit v0.16.0
github.com/prometheus/prometheus v0.312.0
github.com/stretchr/testify v1.11.1
diff --git a/go.sum b/go.sum
index cb69d46c9d8..6808fa54be0 100644
--- a/go.sum
+++ b/go.sum
@@ -299,8 +299,8 @@ github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNw
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.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
-github.com/prometheus/common v0.68.0 h1:8rQJvQmYltsR2L7h8Zw0Iyj8WYNNmpwikoQTZXwfVeA=
-github.com/prometheus/common v0.68.0/go.mod h1:4soH+U8yJSROk7OJ//hmTiWKsxapv6zRGgTt3keN8gQ=
+github.com/prometheus/common v0.68.1 h1:omjRRl4QP4komogpXuhfeOiisQg7xdy8VM1UY+pStaY=
+github.com/prometheus/common v0.68.1/go.mod h1:ZzL3f6u94qUxh9p+tJTrF+FvBS1XXbbRAZCQkytAL0Y=
github.com/prometheus/exporter-toolkit v0.16.0 h1:xT/j7L2XKF+VJd6B4fpUw6xWabHrSmsUf6mYmFqyu0s=
github.com/prometheus/exporter-toolkit v0.16.0/go.mod h1:d1EL8Z9674xQe/iWhwP2wDyCEoBPbXVeqDbqAUsgJWY=
github.com/prometheus/otlptranslator v1.0.0 h1:s0LJW/iN9dkIH+EnhiD3BlkkP5QVIUVEoIwkU+A6qos=
From 585564929675687250091d2df4843cc75787a36d Mon Sep 17 00:00:00 2001
From: Lohit Kolluri
Date: Fri, 5 Jun 2026 19:57:24 +0530
Subject: [PATCH 56/81] docs: clarify ServiceMonitor port vs targetPort (#8587)
* docs: clarify ServiceMonitor port vs targetPort
Clarify ServiceMonitor endpoint port vs targetPort semantics in docs and API comments.
- port refers to the Service port name (.spec.ports[].name)
- targetPort refers to the selected Pod container port name/number
Signed-off-by: Lohit Kolluri
* docs: address review on ServiceMonitor port vs targetPort
- Condense Endpoint.Port godoc to a single `.spec.ports[].name` reference
- Document targetPort against `.spec.containers[].ports[].name` and
`.containerPort`; drop redundant Service port disclaimer
- Revert unrelated proposal typo fix (already on main)
- Regenerate CRDs, bundle, and applyconfiguration
Signed-off-by: Lohit Kolluri
* docs: revert user guide changes per review on #8587
Drop Documentation/user-guides/running-exporters.md updates; API godoc
and regenerated CRDs remain. Also drop unrelated cspell.json changes.
Signed-off-by: Lohit Kolluri
---------
Signed-off-by: Lohit Kolluri
---
bundle.yaml | 9 ++++++---
.../monitoring.coreos.com_servicemonitors.yaml | 9 ++++++---
.../monitoring.coreos.com_servicemonitors.yaml | 9 ++++++---
jsonnet/prometheus-operator/servicemonitors-crd.json | 4 ++--
pkg/apis/monitoring/v1/types.go | 9 ++++++---
pkg/client/applyconfiguration/monitoring/v1/endpoint.go | 9 ++++++---
6 files changed, 32 insertions(+), 17 deletions(-)
diff --git a/bundle.yaml b/bundle.yaml
index 0134763995d..0b6fc81a279 100644
--- a/bundle.yaml
+++ b/bundle.yaml
@@ -64535,7 +64535,8 @@ spec:
type: string
port:
description: |-
- port defines the name of the Service port which this endpoint refers to.
+ port defines the name of the Service port which this endpoint refers to
+ (e.g. `.spec.ports[].name`).
It takes precedence over `targetPort`.
type: string
@@ -64701,8 +64702,10 @@ spec:
- type: integer
- type: string
description: |-
- targetPort defines the name or number of the target port of the `Pod` object behind the
- Service. The port must be specified with the container's port property.
+ targetPort defines the name or number of a container port on Pods selected
+ by the Service.
+ If a name, it matches against `.spec.containers[].ports[].name` of the Pods.
+ If a number, it matches against `.spec.containers[].ports[].containerPort` of the Pods.
x-kubernetes-int-or-string: true
tlsConfig:
description: tlsConfig defines TLS configuration used by the
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml
index bd5e14a8e10..6f34bfd6ea4 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml
@@ -715,7 +715,8 @@ spec:
type: string
port:
description: |-
- port defines the name of the Service port which this endpoint refers to.
+ port defines the name of the Service port which this endpoint refers to
+ (e.g. `.spec.ports[].name`).
It takes precedence over `targetPort`.
type: string
@@ -881,8 +882,10 @@ spec:
- type: integer
- type: string
description: |-
- targetPort defines the name or number of the target port of the `Pod` object behind the
- Service. The port must be specified with the container's port property.
+ targetPort defines the name or number of a container port on Pods selected
+ by the Service.
+ If a name, it matches against `.spec.containers[].ports[].name` of the Pods.
+ If a number, it matches against `.spec.containers[].ports[].containerPort` of the Pods.
x-kubernetes-int-or-string: true
tlsConfig:
description: tlsConfig defines TLS configuration used by the
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml
index bd5e14a8e10..6f34bfd6ea4 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml
@@ -715,7 +715,8 @@ spec:
type: string
port:
description: |-
- port defines the name of the Service port which this endpoint refers to.
+ port defines the name of the Service port which this endpoint refers to
+ (e.g. `.spec.ports[].name`).
It takes precedence over `targetPort`.
type: string
@@ -881,8 +882,10 @@ spec:
- type: integer
- type: string
description: |-
- targetPort defines the name or number of the target port of the `Pod` object behind the
- Service. The port must be specified with the container's port property.
+ targetPort defines the name or number of a container port on Pods selected
+ by the Service.
+ If a name, it matches against `.spec.containers[].ports[].name` of the Pods.
+ If a number, it matches against `.spec.containers[].ports[].containerPort` of the Pods.
x-kubernetes-int-or-string: true
tlsConfig:
description: tlsConfig defines TLS configuration used by the
diff --git a/jsonnet/prometheus-operator/servicemonitors-crd.json b/jsonnet/prometheus-operator/servicemonitors-crd.json
index e9a6a770d68..2f4cbb2e1dc 100644
--- a/jsonnet/prometheus-operator/servicemonitors-crd.json
+++ b/jsonnet/prometheus-operator/servicemonitors-crd.json
@@ -602,7 +602,7 @@
"type": "string"
},
"port": {
- "description": "port defines the name of the Service port which this endpoint refers to.\n\nIt takes precedence over `targetPort`.",
+ "description": "port defines the name of the Service port which this endpoint refers to\n(e.g. `.spec.ports[].name`).\n\nIt takes precedence over `targetPort`.",
"type": "string"
},
"proxyConnectHeader": {
@@ -737,7 +737,7 @@
"type": "string"
}
],
- "description": "targetPort defines the name or number of the target port of the `Pod` object behind the\nService. The port must be specified with the container's port property.",
+ "description": "targetPort defines the name or number of a container port on Pods selected\nby the Service.\nIf a name, it matches against `.spec.containers[].ports[].name` of the Pods.\nIf a number, it matches against `.spec.containers[].ports[].containerPort` of the Pods.",
"x-kubernetes-int-or-string": true
},
"tlsConfig": {
diff --git a/pkg/apis/monitoring/v1/types.go b/pkg/apis/monitoring/v1/types.go
index 58d5cf9e945..2dd84abf847 100644
--- a/pkg/apis/monitoring/v1/types.go
+++ b/pkg/apis/monitoring/v1/types.go
@@ -547,14 +547,17 @@ type LabelName string
//
// +k8s:openapi-gen=true
type Endpoint struct {
- // port defines the name of the Service port which this endpoint refers to.
+ // port defines the name of the Service port which this endpoint refers to
+ // (e.g. `.spec.ports[].name`).
//
// It takes precedence over `targetPort`.
// +optional
Port string `json:"port,omitempty"`
- // targetPort defines the name or number of the target port of the `Pod` object behind the
- // Service. The port must be specified with the container's port property.
+ // targetPort defines the name or number of a container port on Pods selected
+ // by the Service.
+ // If a name, it matches against `.spec.containers[].ports[].name` of the Pods.
+ // If a number, it matches against `.spec.containers[].ports[].containerPort` of the Pods.
//
// +optional
TargetPort *intstr.IntOrString `json:"targetPort,omitempty"`
diff --git a/pkg/client/applyconfiguration/monitoring/v1/endpoint.go b/pkg/client/applyconfiguration/monitoring/v1/endpoint.go
index 013c91619cb..fdccf3e7ead 100644
--- a/pkg/client/applyconfiguration/monitoring/v1/endpoint.go
+++ b/pkg/client/applyconfiguration/monitoring/v1/endpoint.go
@@ -28,12 +28,15 @@ import (
// Endpoint defines an endpoint serving Prometheus metrics to be scraped by
// Prometheus.
type EndpointApplyConfiguration struct {
- // port defines the name of the Service port which this endpoint refers to.
+ // port defines the name of the Service port which this endpoint refers to
+ // (e.g. `.spec.ports[].name`).
//
// It takes precedence over `targetPort`.
Port *string `json:"port,omitempty"`
- // targetPort defines the name or number of the target port of the `Pod` object behind the
- // Service. The port must be specified with the container's port property.
+ // targetPort defines the name or number of a container port on Pods selected
+ // by the Service.
+ // If a name, it matches against `.spec.containers[].ports[].name` of the Pods.
+ // If a number, it matches against `.spec.containers[].ports[].containerPort` of the Pods.
TargetPort *intstr.IntOrString `json:"targetPort,omitempty"`
// path defines the HTTP path from which to scrape for metrics.
//
From ae4268f9863ecba537d4470e3873666173989633 Mon Sep 17 00:00:00 2001
From: Simon Pasquier
Date: Fri, 5 Jun 2026 17:05:11 +0200
Subject: [PATCH 57/81] docs: rewrite sharding documentation
Signed-off-by: Simon Pasquier
---
Documentation/platform/operator.md | 2 +-
Documentation/platform/sharding.md | 289 ++++++++++++++++++
Documentation/platform/storage.md | 2 +-
.../platform/strategic-merge-patch.md | 2 +-
Documentation/platform/troubleshooting.md | 2 +-
.../user-guides/shards-and-replicas.md | 155 ----------
bundle.yaml | 4 -
.../monitoring.coreos.com_prometheuses.yaml | 4 -
.../monitoring.coreos.com_prometheuses.yaml | 4 -
.../prometheus-operator/prometheuses-crd.json | 2 +-
pkg/apis/monitoring/v1/prometheus_types.go | 4 -
.../monitoring/v1/prometheusspec.go | 4 -
12 files changed, 294 insertions(+), 180 deletions(-)
create mode 100644 Documentation/platform/sharding.md
delete mode 100644 Documentation/user-guides/shards-and-replicas.md
diff --git a/Documentation/platform/operator.md b/Documentation/platform/operator.md
index 0a233ec4635..597f36f8995 100644
--- a/Documentation/platform/operator.md
+++ b/Documentation/platform/operator.md
@@ -1,5 +1,5 @@
---
-weight: 211
+weight: 212
toc: false
title: CLI reference
menu:
diff --git a/Documentation/platform/sharding.md b/Documentation/platform/sharding.md
new file mode 100644
index 00000000000..bcdee389de5
--- /dev/null
+++ b/Documentation/platform/sharding.md
@@ -0,0 +1,289 @@
+---
+weight: 209
+toc: true
+title: Sharding
+menu:
+ docs:
+ parent: operator
+lead: ""
+images: []
+draft: false
+description: Sharding Prometheus
+---
+
+When there are too much data to ingest and process, scaling Prometheus vertically may come to an end and it might become necessary to distribute scraped targets across multiple Prometheus shards.
+
+## Design
+
+The Prometheus operator will create `.spec.shards` StatefulSets multiplied by `.spec.replicas` pods.
+
+By default, shards use the Prometheus `modulus` configuration which takes the hash of the source label values in order to split scraped
+targets based on the number of shards. By default, Prometheus hashes the value of the
+* `__address__` label for `ServiceMonitor` and `PodMonitor` resources
+* `__param_target__` label for `Probe` resources
+
+To query globally, deploy the Thanos querier connecting to all Thanos sidecars (in the same way, use the Thanos ruler to evaluate rules across shards). Another option is to remote write the samples to a central location.
+
+**Limitations:**
+
+* Scaling down the number of shards doesn't reshard existing data onto remaining instances. It must be manually moved (see also Scaling below).
+* Scaling up the number of shards will not reshard existing data either. It will continue to be available from the same instances.
+
+## Configuration
+
+### Implementing a custom target distribution
+
+To implement a custom distribution, set the `__tmp_hash` label during target discovery using relabeling configuration. The operator uses this label's value instead of the default labels when computing the shard assignment.
+
+For example, to shard targets by pod namespace and name rather than by address:
+
+```yaml
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+ name: example-app
+ labels:
+ team: frontend
+spec:
+ selector:
+ matchLabels:
+ app: example-app
+ endpoints:
+ - port: web
+ relabelings:
+ - sourceLabels: [__meta_kubernetes_pod_namespace, __meta_kubernetes_pod_name]
+ separator: /
+ targetLabel: __tmp_hash
+```
+
+The relabeling can also be applied at the scrape class level to affect multiple monitoring resources at once.
+
+### Scraping a target from all the shards
+
+By default, each target is assigned to exactly one shard. To have all shards scrape the same target — useful for singleton services such as kube-state-metrics where every shard needs the full set of metrics — set the `__tmp_disable_sharding` label to a non-empty value using relabeling configuration.
+
+```yaml
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+ name: kube-state-metrics
+spec:
+ selector:
+ matchLabels:
+ app.kubernetes.io/name: kube-state-metrics
+ endpoints:
+ - port: http
+ relabelings:
+ - targetLabel: __tmp_disable_sharding
+ replacement: "true"
+```
+
+### Topology-aware sharding
+
+> **Alpha:** Topology-aware sharding requires the `PrometheusTopologySharding` feature gate to be enabled on the operator.
+
+In multi-zone clusters, the default address-based sharding distributes targets without regard for their zone, which can generate costly cross-zone traffic. Topology-aware sharding pins each Prometheus shard to a specific zone so that it only scrapes targets local to that zone.
+
+When `mode: Topology` is set, the operator:
+* Generates relabeling rules so each shard keeps only targets whose zone label matches its assigned zone.
+* Automatically adds a `nodeSelector` to schedule each shard's pods in the correct zone.
+* Adds a `zone` external label to each shard's Prometheus configuration (configurable via `externalLabelName`).
+
+The number of shards must be greater than or equal to the number of topology values. When `spec.shards` is a multiple of the number of zones, the shards are evenly distributed across zones. Otherwise, some zones receive more shards than others.
+
+```yaml
+apiVersion: monitoring.coreos.com/v1
+kind: Prometheus
+metadata:
+ name: prometheus
+spec:
+ shards: 4
+ replicas: 2
+ shardingStrategy:
+ mode: Topology
+ topology:
+ values:
+ - europe-west4-a
+ - europe-west4-b
+```
+
+With this configuration and 4 shards across 2 zones, shards 0 and 2 are scheduled in `europe-west4-a` and shards 1 and 3 in `europe-west4-b`. Each shard only scrapes targets in its zone.
+
+### Retaining shards
+
+> **Alpha:** Shard retention requires the `PrometheusShardRetentionPolicy` feature gate to be enabled on the operator.
+
+When scaling down the number of shards, the pods from the removed shards are deleted by default along with access to their historical data. To preserve scaled-down shards so their data remains queryable until the retention duration expires, set `.spec.shardRetentionPolicy.whenScaled` to `Retain`:
+
+```yaml
+apiVersion: monitoring.coreos.com/v1
+kind: Prometheus
+metadata:
+ name: prometheus
+spec:
+ shards: 2
+ shardRetentionPolicy:
+ whenScaled: Retain
+```
+
+Retained shards continue running and can be queried via the Thanos sidecar and querier alongside the active shards. By default, the operator deletes them once the Prometheus retention time has been reached. This can be overridden with the `retain.retentionPeriod` field:
+
+```yaml
+apiVersion: monitoring.coreos.com/v1
+kind: Prometheus
+metadata:
+ name: prometheus
+spec:
+ shards: 2
+ retentionSize: 100Gi
+ shardRetentionPolicy:
+ whenScaled: Retain
+ retain:
+ retentionPeriod: 7d
+```
+
+> **Note:** If the Prometheus resource uses size-based retention only (no retention time configured), retained shards are kept forever by default.
+
+## Example
+
+View the complete [Shards manifests](../../example/shards).
+
+The following manifest creates a Prometheus server with two replicas:
+
+```yaml
+apiVersion: monitoring.coreos.com/v1
+kind: Prometheus
+metadata:
+ labels:
+ prometheus: prometheus
+ name: prometheus
+ namespace: default
+spec:
+ serviceAccountName: prometheus
+ replicas: 2
+ serviceMonitorSelector:
+ matchLabels:
+ team: frontend
+```
+
+This can be verified with the following command:
+
+```bash
+> kubectl get pods -n
+```
+
+The output is similar to this:
+
+```bash
+prometheus-prometheus-0 2/2 Running 1 10s
+prometheus-prometheus-1 1/2 Running 1 10s
+```
+
+Deploy the example application and monitor it:
+
+```yaml mdox-exec="cat example/shards/example-app-deployment.yaml"
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: example-app
+spec:
+ replicas: 3
+ selector:
+ matchLabels:
+ app: example-app
+ template:
+ metadata:
+ labels:
+ app: example-app
+ spec:
+ containers:
+ - name: example-app
+ image: quay.io/brancz/prometheus-example-app:v0.5.0
+ ports:
+ - name: web
+ containerPort: 8080
+```
+
+```yaml mdox-exec="cat example/shards/example-app-service.yaml"
+kind: Service
+apiVersion: v1
+metadata:
+ name: example-app
+ labels:
+ app: example-app
+spec:
+ selector:
+ app: example-app
+ ports:
+ - name: web
+ port: 8080
+```
+
+```yaml mdox-exec="cat example/shards/example-app-service-monitor.yaml"
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+ name: example-app
+ labels:
+ team: frontend
+spec:
+ selector:
+ matchLabels:
+ app: example-app
+ endpoints:
+ - port: web
+```
+
+Explore one of the monitoring Prometheus instances:
+
+```bash
+> kubectl port-forward pod/prometheus-prometheus-0 9090:9090
+```
+
+We find the prometheus server scrapes three targets.
+
+### Reshard Targets and Expand Prometheus
+
+Expand prometheus to two shards as shown below:
+
+```yaml mdox-exec="cat example/shards/prometheus.yaml"
+apiVersion: monitoring.coreos.com/v1
+kind: Prometheus
+metadata:
+ labels:
+ prometheus: shards
+ name: prometheus
+ namespace: default
+spec:
+ serviceAccountName: prometheus
+ replicas: 2
+ shards: 2
+ serviceMonitorSelector:
+ matchLabels:
+ team: frontend
+```
+
+This can be verified with the following command:
+
+```bash
+> kubectl get pods -n
+```
+
+The output is similar to this:
+
+```bash
+prometheus-prometheus-0 2/2 Running 1 11m
+prometheus-prometheus-1 2/2 Running 1 11m
+prometheus-prometheus-shard-1-0 2/2 Running 1 12s
+prometheus-prometheus-shard-1-1 2/2 Running 1 12s
+```
+
+Explore one of the monitoring Prometheus instances added for sharding:
+
+```bash
+> kubectl port-forward prometheus-prometheus-shard-1-0 9091:9090
+```
+
+We find two targets are being scraped. The original Prometheus instance scrapes one target.
+
+//To query globally, we must use the Thanos sidecar, since the original data in Prometheus will not be rebalanced.
diff --git a/Documentation/platform/storage.md b/Documentation/platform/storage.md
index 2389b6b992a..c3a817935d3 100644
--- a/Documentation/platform/storage.md
+++ b/Documentation/platform/storage.md
@@ -1,5 +1,5 @@
---
-weight: 209
+weight: 210
toc: true
title: Storage
menu:
diff --git a/Documentation/platform/strategic-merge-patch.md b/Documentation/platform/strategic-merge-patch.md
index cac0f6b23b5..492a2a0836e 100644
--- a/Documentation/platform/strategic-merge-patch.md
+++ b/Documentation/platform/strategic-merge-patch.md
@@ -1,5 +1,5 @@
---
-weight: 210
+weight: 211
toc: true
title: Strategic Merge Patch
menu:
diff --git a/Documentation/platform/troubleshooting.md b/Documentation/platform/troubleshooting.md
index e19550b7d92..4bb2fc79fd7 100644
--- a/Documentation/platform/troubleshooting.md
+++ b/Documentation/platform/troubleshooting.md
@@ -1,5 +1,5 @@
---
-weight: 212
+weight: 213
toc: true
title: Troubleshooting
menu:
diff --git a/Documentation/user-guides/shards-and-replicas.md b/Documentation/user-guides/shards-and-replicas.md
deleted file mode 100644
index 32523e67bb6..00000000000
--- a/Documentation/user-guides/shards-and-replicas.md
+++ /dev/null
@@ -1,155 +0,0 @@
-# Shards and Replicas
-
-If a single Prometheus can't hold the current target's metrics, one can reshard targets onto multiple Prometheus servers.
-
-Shards use the Prometheus `modulus` configuration which takes the hash of the source label values in order to split scrape
-targets based on the number of shards. Prometheus operator will create number of `shards` multiplied by `replicas` pods.
-
-Note that scaling down shards will not reshard data onto remaining instances. It must be manually moved. Increasing
-shards will not reshard data either. It will continue to be available from the same instances.
-To query globally, use the Thanos sidecar and Thanos querier. Alternatively, remote
-write to a central location. Sharding is done on the contents of the `__address__` target meta-label.
-
-## Example
-
-View the complete [Shards manifests](../../example/shards).
-
-The following manifest creates a Prometheus server with two replicas:
-
-```yaml
-apiVersion: monitoring.coreos.com/v1
-kind: Prometheus
-metadata:
- labels:
- prometheus: prometheus
- name: prometheus
- namespace: default
-spec:
- serviceAccountName: prometheus
- replicas: 2
- serviceMonitorSelector:
- matchLabels:
- team: frontend
-```
-
-This can be verified with the following command:
-
-```bash
-> kubectl get pods -n
-```
-
-The output is similar to this:
-
-```bash
-prometheus-prometheus-0 2/2 Running 1 10s
-prometheus-prometheus-1 1/2 Running 1 10s
-```
-
-Deploy the example application and monitor it:
-
-```yaml mdox-exec="cat example/shards/example-app-deployment.yaml"
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: example-app
-spec:
- replicas: 3
- selector:
- matchLabels:
- app: example-app
- template:
- metadata:
- labels:
- app: example-app
- spec:
- containers:
- - name: example-app
- image: quay.io/brancz/prometheus-example-app:v0.5.0
- ports:
- - name: web
- containerPort: 8080
-```
-
-```yaml mdox-exec="cat example/shards/example-app-service.yaml"
-kind: Service
-apiVersion: v1
-metadata:
- name: example-app
- labels:
- app: example-app
-spec:
- selector:
- app: example-app
- ports:
- - name: web
- port: 8080
-```
-
-```yaml mdox-exec="cat example/shards/example-app-service-monitor.yaml"
-apiVersion: monitoring.coreos.com/v1
-kind: ServiceMonitor
-metadata:
- name: example-app
- labels:
- team: frontend
-spec:
- selector:
- matchLabels:
- app: example-app
- endpoints:
- - port: web
-```
-
-Explore one of the monitoring Prometheus instances:
-
-```bash
-> kubectl port-forward pod/prometheus-prometheus-0 9090:9090
-```
-
-We find the prometheus server scrapes three targets.
-
-### Reshard Targets and Expand Prometheus
-
-Expand prometheus to two shards as shown below:
-
-```yaml mdox-exec="cat example/shards/prometheus.yaml"
-apiVersion: monitoring.coreos.com/v1
-kind: Prometheus
-metadata:
- labels:
- prometheus: shards
- name: prometheus
- namespace: default
-spec:
- serviceAccountName: prometheus
- replicas: 2
- shards: 2
- serviceMonitorSelector:
- matchLabels:
- team: frontend
-```
-
-This can be verified with the following command:
-
-```bash
-> kubectl get pods -n
-```
-
-The output is similar to this:
-
-```bash
-prometheus-prometheus-0 2/2 Running 1 11m
-prometheus-prometheus-1 2/2 Running 1 11m
-prometheus-prometheus-shard-1-0 2/2 Running 1 12s
-prometheus-prometheus-shard-1-1 2/2 Running 1 12s
-```
-
-Explore one of the monitoring Prometheus instances added for sharding:
-
-```bash
-> kubectl port-forward prometheus-prometheus-shard-1-0 9091:9090
-```
-
-We find two targets are being scraped. The original Prometheus instance scrapes one target.
-
-To query globally, we must use the Thanos sidecar, since the original data in Prometheus will not be rebalanced.
diff --git a/bundle.yaml b/bundle.yaml
index 0134763995d..360c50cd443 100644
--- a/bundle.yaml
+++ b/bundle.yaml
@@ -46268,10 +46268,6 @@ spec:
description: |-
shardRetentionPolicy defines the retention policy for the Prometheus shards.
(Alpha) Using this field requires the 'PrometheusShardRetentionPolicy' feature gate to be enabled.
-
- The final goals for this feature can be seen at https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/proposals/202310-shard-autoscaling.md#graceful-scale-down-of-prometheus-servers,
- however, the feature is not yet fully implemented in this PR. The limitation being:
- * Retention duration is not settable, for now, shards are retained forever.
properties:
retain:
description: |-
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
index 4133a77e099..a230d13e775 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
@@ -9521,10 +9521,6 @@ spec:
description: |-
shardRetentionPolicy defines the retention policy for the Prometheus shards.
(Alpha) Using this field requires the 'PrometheusShardRetentionPolicy' feature gate to be enabled.
-
- The final goals for this feature can be seen at https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/proposals/202310-shard-autoscaling.md#graceful-scale-down-of-prometheus-servers,
- however, the feature is not yet fully implemented in this PR. The limitation being:
- * Retention duration is not settable, for now, shards are retained forever.
properties:
retain:
description: |-
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
index 4133a77e099..a230d13e775 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
@@ -9521,10 +9521,6 @@ spec:
description: |-
shardRetentionPolicy defines the retention policy for the Prometheus shards.
(Alpha) Using this field requires the 'PrometheusShardRetentionPolicy' feature gate to be enabled.
-
- The final goals for this feature can be seen at https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/proposals/202310-shard-autoscaling.md#graceful-scale-down-of-prometheus-servers,
- however, the feature is not yet fully implemented in this PR. The limitation being:
- * Retention duration is not settable, for now, shards are retained forever.
properties:
retain:
description: |-
diff --git a/jsonnet/prometheus-operator/prometheuses-crd.json b/jsonnet/prometheus-operator/prometheuses-crd.json
index c0d5f522e39..bf76a969012 100644
--- a/jsonnet/prometheus-operator/prometheuses-crd.json
+++ b/jsonnet/prometheus-operator/prometheuses-crd.json
@@ -8018,7 +8018,7 @@
"type": "string"
},
"shardRetentionPolicy": {
- "description": "shardRetentionPolicy defines the retention policy for the Prometheus shards.\n(Alpha) Using this field requires the 'PrometheusShardRetentionPolicy' feature gate to be enabled.\n\nThe final goals for this feature can be seen at https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/proposals/202310-shard-autoscaling.md#graceful-scale-down-of-prometheus-servers,\nhowever, the feature is not yet fully implemented in this PR. The limitation being:\n* Retention duration is not settable, for now, shards are retained forever.",
+ "description": "shardRetentionPolicy defines the retention policy for the Prometheus shards.\n(Alpha) Using this field requires the 'PrometheusShardRetentionPolicy' feature gate to be enabled.",
"properties": {
"retain": {
"description": "retain defines the config for retention when the retention policy is set\nto `Retain`.\n\nIf not defined, the operator will use the retention duration configured\nfor the Prometheus data. If the resource uses size-based retention, the\nshard(s) are kept forever (unless manually deleted).",
diff --git a/pkg/apis/monitoring/v1/prometheus_types.go b/pkg/apis/monitoring/v1/prometheus_types.go
index b1e4be71667..12dc7d16460 100644
--- a/pkg/apis/monitoring/v1/prometheus_types.go
+++ b/pkg/apis/monitoring/v1/prometheus_types.go
@@ -1217,10 +1217,6 @@ type PrometheusSpec struct {
// shardRetentionPolicy defines the retention policy for the Prometheus shards.
// (Alpha) Using this field requires the 'PrometheusShardRetentionPolicy' feature gate to be enabled.
//
- // The final goals for this feature can be seen at https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/proposals/202310-shard-autoscaling.md#graceful-scale-down-of-prometheus-servers,
- // however, the feature is not yet fully implemented in this PR. The limitation being:
- // * Retention duration is not settable, for now, shards are retained forever.
- //
// +optional
ShardRetentionPolicy *ShardRetentionPolicy `json:"shardRetentionPolicy,omitempty"`
diff --git a/pkg/client/applyconfiguration/monitoring/v1/prometheusspec.go b/pkg/client/applyconfiguration/monitoring/v1/prometheusspec.go
index 72d3b42f27e..97764fd89f7 100644
--- a/pkg/client/applyconfiguration/monitoring/v1/prometheusspec.go
+++ b/pkg/client/applyconfiguration/monitoring/v1/prometheusspec.go
@@ -44,10 +44,6 @@ type PrometheusSpecApplyConfiguration struct {
RetentionSize *monitoringv1.ByteSize `json:"retentionSize,omitempty"`
// shardRetentionPolicy defines the retention policy for the Prometheus shards.
// (Alpha) Using this field requires the 'PrometheusShardRetentionPolicy' feature gate to be enabled.
- //
- // The final goals for this feature can be seen at https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/proposals/202310-shard-autoscaling.md#graceful-scale-down-of-prometheus-servers,
- // however, the feature is not yet fully implemented in this PR. The limitation being:
- // * Retention duration is not settable, for now, shards are retained forever.
ShardRetentionPolicy *ShardRetentionPolicyApplyConfiguration `json:"shardRetentionPolicy,omitempty"`
// disableCompaction when true, the Prometheus compaction is disabled.
// When `spec.thanos.objectStorageConfig` or `spec.objectStorageConfigFile` are defined, the operator automatically
From 7454a6fca4499f9881b1d9b2964a828081498114 Mon Sep 17 00:00:00 2001
From: dongjiang
Date: Mon, 8 Jun 2026 17:22:34 +0800
Subject: [PATCH 58/81] validate ProxyConfig in OAuth2 validation (#8610)
Signed-off-by: dongjiang
---
pkg/apis/monitoring/v1/types.go | 4 +++
pkg/apis/monitoring/v1/types_test.go | 49 ++++++++++++++++++++++++++++
2 files changed, 53 insertions(+)
diff --git a/pkg/apis/monitoring/v1/types.go b/pkg/apis/monitoring/v1/types.go
index 2dd84abf847..bc53f5a6808 100644
--- a/pkg/apis/monitoring/v1/types.go
+++ b/pkg/apis/monitoring/v1/types.go
@@ -729,6 +729,10 @@ func (o *OAuth2) Validate() error {
return fmt.Errorf("invalid OAuth2 tlsConfig: %w", err)
}
+ if err := o.ProxyConfig.Validate(); err != nil {
+ return fmt.Errorf("invalid OAuth2 proxyConfig: %w", err)
+ }
+
return nil
}
diff --git a/pkg/apis/monitoring/v1/types_test.go b/pkg/apis/monitoring/v1/types_test.go
index 19e24404dba..5ba0b8510de 100644
--- a/pkg/apis/monitoring/v1/types_test.go
+++ b/pkg/apis/monitoring/v1/types_test.go
@@ -505,6 +505,55 @@ func TestValidateOAuth2(t *testing.T) {
},
err: false,
},
+ {
+ name: "valid ProxyConfig with proxyUrl",
+ config: &OAuth2{
+ ClientID: SecretOrConfigMap{Secret: &v1.SecretKeySelector{}},
+ ClientSecret: v1.SecretKeySelector{},
+ TokenURL: "http://tokenurl.org",
+ ProxyConfig: ProxyConfig{
+ ProxyURL: new("http://proxy.example.com:8080"),
+ },
+ },
+ err: false,
+ },
+ {
+ name: "valid ProxyConfig with proxyFromEnvironment",
+ config: &OAuth2{
+ ClientID: SecretOrConfigMap{Secret: &v1.SecretKeySelector{}},
+ ClientSecret: v1.SecretKeySelector{},
+ TokenURL: "http://tokenurl.org",
+ ProxyConfig: ProxyConfig{
+ ProxyFromEnvironment: new(true),
+ },
+ },
+ err: false,
+ },
+ {
+ name: "invalid ProxyConfig with proxyFromEnvironment and proxyUrl",
+ config: &OAuth2{
+ ClientID: SecretOrConfigMap{Secret: &v1.SecretKeySelector{}},
+ ClientSecret: v1.SecretKeySelector{},
+ TokenURL: "http://tokenurl.org",
+ ProxyConfig: ProxyConfig{
+ ProxyFromEnvironment: new(true),
+ ProxyURL: new("http://proxy.example.com:8080"),
+ },
+ },
+ err: true,
+ },
+ {
+ name: "invalid ProxyConfig with noProxy but no proxyUrl",
+ config: &OAuth2{
+ ClientID: SecretOrConfigMap{Secret: &v1.SecretKeySelector{}},
+ ClientSecret: v1.SecretKeySelector{},
+ TokenURL: "http://tokenurl.org",
+ ProxyConfig: ProxyConfig{
+ NoProxy: new("localhost"),
+ },
+ },
+ err: true,
+ },
} {
t.Run(tc.name, func(t *testing.T) {
err := tc.config.Validate()
From e593786e3bb983110f269c5924a95f406727f4cf Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 8 Jun 2026 12:42:38 +0000
Subject: [PATCH 59/81] build(deps): bump golang.org/x/sync from 0.20.0 to
0.21.0
Bumps [golang.org/x/sync](https://github.com/golang/sync) from 0.20.0 to 0.21.0.
- [Commits](https://github.com/golang/sync/compare/v0.20.0...v0.21.0)
---
updated-dependencies:
- dependency-name: golang.org/x/sync
dependency-version: 0.21.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index 6ca0f73e80c..b5496478ee0 100644
--- a/go.mod
+++ b/go.mod
@@ -29,7 +29,7 @@ require (
github.com/stretchr/testify v1.11.1
github.com/thanos-io/thanos v0.41.0
golang.org/x/net v0.55.0
- golang.org/x/sync v0.20.0
+ golang.org/x/sync v0.21.0
google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af
gopkg.in/yaml.v2 v2.4.0
k8s.io/api v0.36.1
diff --git a/go.sum b/go.sum
index 6808fa54be0..8bfbba7a570 100644
--- a/go.sum
+++ b/go.sum
@@ -411,8 +411,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-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.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
-golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
+golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM=
+golang.org/x/sync v0.21.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=
From 1432030d1353deca678d48c8a15f003c73ee8495 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 8 Jun 2026 12:42:49 +0000
Subject: [PATCH 60/81] build(deps): bump github.com/prometheus/alertmanager
Bumps [github.com/prometheus/alertmanager](https://github.com/prometheus/alertmanager) from 0.32.1 to 0.32.2.
- [Release notes](https://github.com/prometheus/alertmanager/releases)
- [Changelog](https://github.com/prometheus/alertmanager/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prometheus/alertmanager/compare/v0.32.1...v0.32.2)
---
updated-dependencies:
- dependency-name: github.com/prometheus/alertmanager
dependency-version: 0.32.2
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index 6ca0f73e80c..d9585a51669 100644
--- a/go.mod
+++ b/go.mod
@@ -21,7 +21,7 @@ require (
github.com/prometheus-community/prom-label-proxy v0.13.0
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.91.0
github.com/prometheus-operator/prometheus-operator/pkg/client v0.91.0
- github.com/prometheus/alertmanager v0.32.1
+ github.com/prometheus/alertmanager v0.32.2
github.com/prometheus/client_golang v1.23.2
github.com/prometheus/common v0.68.1
github.com/prometheus/exporter-toolkit v0.16.0
diff --git a/go.sum b/go.sum
index 6808fa54be0..e95a144fd1d 100644
--- a/go.sum
+++ b/go.sum
@@ -283,8 +283,8 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus-community/prom-label-proxy v0.13.0 h1:SD27XYzzLbw1TL9Jv/W2yAWJ9pCz2EsUTyhjya87Ndg=
github.com/prometheus-community/prom-label-proxy v0.13.0/go.mod h1:T5Z6OtsxvjFbbhvQ7wyrJu+CBdGBQeWcNkC8SSy4WUU=
-github.com/prometheus/alertmanager v0.32.1 h1:BQ3jHXNq2A7VSD9Kh0Qx+kXbifNbHSDuKVbMmdRHHJ0=
-github.com/prometheus/alertmanager v0.32.1/go.mod h1:0Dy9faTtMgpVYxJVxV0o65elTxHnSRCF/7gy5BKGZiE=
+github.com/prometheus/alertmanager v0.32.2 h1:R09NCbM6mN+gh7bz2kABop6cW9JSaikMcotaINmyvec=
+github.com/prometheus/alertmanager v0.32.2/go.mod h1:0Dy9faTtMgpVYxJVxV0o65elTxHnSRCF/7gy5BKGZiE=
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.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
From 849136e42e88f006cfb36e4b50cb6d5f87dfc862 Mon Sep 17 00:00:00 2001
From: Sebastien Tardif
Date: Mon, 8 Jun 2026 06:27:56 -0700
Subject: [PATCH 61/81] Merge pull request #8593 from
SebTardif/fix/poll-lister-watcher-goroutine-leak
pkg/listwatch: fix goroutine leak and data race in pollBasedListerWatcher
---
pkg/listwatch/listwatch.go | 57 +++++++++++++++++++++++++++++++++-----
1 file changed, 50 insertions(+), 7 deletions(-)
diff --git a/pkg/listwatch/listwatch.go b/pkg/listwatch/listwatch.go
index ecf4abb045f..7f507d2a47e 100644
--- a/pkg/listwatch/listwatch.go
+++ b/pkg/listwatch/listwatch.go
@@ -22,6 +22,7 @@ import (
"math/big"
"slices"
"strings"
+ "sync"
"time"
"github.com/blang/semver/v4"
@@ -251,6 +252,10 @@ type pollBasedListerWatcher struct {
ctx context.Context
l *slog.Logger
+ mtx sync.Mutex
+ cancelPoll context.CancelFunc
+ pollWg sync.WaitGroup
+
cache map[string]cacheEntry
}
@@ -319,19 +324,45 @@ func (pblw *pollBasedListerWatcher) Watch(_ metav1.ListOptions) (watch.Interface
return pblw, nil
}
-func (pblw *pollBasedListerWatcher) Stop() {}
+func (pblw *pollBasedListerWatcher) Stop() {
+ pblw.mtx.Lock()
+ if pblw.cancelPoll != nil {
+ pblw.cancelPoll()
+ pblw.cancelPoll = nil
+ }
+ pblw.mtx.Unlock()
+ pblw.pollWg.Wait()
+}
func (pblw *pollBasedListerWatcher) ResultChan() <-chan watch.Event {
- go func() {
+ // Cancel any previous polling goroutine to prevent goroutine leaks
+ // when the watch is re-established after a reconnection.
+ pblw.mtx.Lock()
+ if pblw.cancelPoll != nil {
+ pblw.cancelPoll()
+ }
+ pblw.mtx.Unlock()
+ pblw.pollWg.Wait()
+
+ pollCtx, cancel := context.WithCancel(pblw.ctx)
+ pblw.mtx.Lock()
+ pblw.cancelPoll = cancel
+ pblw.mtx.Unlock()
+
+ pblw.pollWg.Go(func() {
jitter, err := rand.Int(rand.Reader, big.NewInt(int64(pollInterval)))
if err == nil {
- time.Sleep(time.Duration(jitter.Int64()))
+ select {
+ case <-time.After(time.Duration(jitter.Int64())):
+ case <-pollCtx.Done():
+ return
+ }
} else {
pblw.l.Info("failed to generate random jitter", "err", err)
}
- _ = wait.PollUntilContextCancel(pblw.ctx, pollInterval, false, pblw.poll)
- }()
+ _ = wait.PollUntilContextCancel(pollCtx, pollInterval, false, pblw.poll)
+ })
return pblw.ch
}
@@ -343,6 +374,10 @@ func (pblw *pollBasedListerWatcher) poll(ctx context.Context) (bool, error) {
)
for ns, entry := range pblw.cache {
+ if ctx.Err() != nil {
+ return false, ctx.Err()
+ }
+
var resourceVersion string
if entry.ns != nil {
// The resource is in the cache.
@@ -370,9 +405,13 @@ func (pblw *pollBasedListerWatcher) poll(ctx context.Context) (bool, error) {
for _, ns := range deleted {
entry := pblw.cache[ns]
- pblw.ch <- watch.Event{
+ select {
+ case pblw.ch <- watch.Event{
Type: watch.Deleted,
Object: entry.ns,
+ }:
+ case <-ctx.Done():
+ return false, ctx.Err()
}
pblw.cache[ns] = cacheEntry{
@@ -393,9 +432,13 @@ func (pblw *pollBasedListerWatcher) poll(ctx context.Context) (bool, error) {
continue
}
- pblw.ch <- watch.Event{
+ select {
+ case pblw.ch <- watch.Event{
Type: eventType,
Object: ns,
+ }:
+ case <-ctx.Done():
+ return false, ctx.Err()
}
pblw.cache[ns.Name] = cacheEntry{
From c3c32a0b079bac64abc66238c0d942a88c7f3447 Mon Sep 17 00:00:00 2001
From: Nutmos
Date: Mon, 8 Jun 2026 22:43:06 +0700
Subject: [PATCH 62/81] Feat: Implement payload in Alertmanager Webhook Config
CR (#8507)
* alertmanager: update webhook receiver CR
add payload support
* alertmanager: add version check
to return error if using the unsupported version
* alertmanager: update conversion method
add payload conversion
* alertmanager: add test cases
to cover payload
* add alert info
* alertmanager: update type to any and CR type to string
for flexibility
Signed-off-by: Nattapong Ekudomsuk
* alertmanager: move check method
change to nil check instead
Signed-off-by: Nattapong Ekudomsuk
* trigger ci
* alertmanager: update payload conversion method
ensure no nil pointer dereference
* alertmanager: update test case
to match the new type
* alertmanager: update error message
remove the test message
* alertmanager: update lib name
to fix compile error
* alertmanager: add test case
to check error case for unsupported version
* trigger ci
---------
Signed-off-by: Nattapong Ekudomsuk
---
bundle.yaml | 8 ++
...toring.coreos.com_alertmanagerconfigs.yaml | 16 ++++
...toring.coreos.com_alertmanagerconfigs.yaml | 8 ++
.../alertmanagerconfigs-crd.json | 5 ++
.../alertmanagerconfigs-v1beta1-crd.libsonnet | 5 ++
pkg/alertmanager/amcfg.go | 6 +-
pkg/alertmanager/amcfg_test.go | 75 +++++++++++++++++++
pkg/alertmanager/operator.go | 4 +
pkg/alertmanager/operator_test.go | 61 ++++++++++++++-
.../CR_with_WebhookConfig_with_Payload.golden | 14 ++++
...ig_with_Payload_Unsupported_Version.golden | 13 ++++
pkg/alertmanager/types.go | 2 +-
.../v1alpha1/alertmanager_config_types.go | 7 ++
.../v1alpha1/zz_generated.deepcopy.go | 5 ++
.../v1beta1/alertmanager_config_types.go | 7 ++
.../monitoring/v1beta1/conversion_from.go | 1 +
pkg/apis/monitoring/v1beta1/conversion_to.go | 1 +
.../v1beta1/zz_generated.deepcopy.go | 5 ++
.../monitoring/v1alpha1/webhookconfig.go | 13 ++++
.../monitoring/v1beta1/webhookconfig.go | 13 ++++
20 files changed, 265 insertions(+), 4 deletions(-)
create mode 100644 pkg/alertmanager/testdata/CR_with_WebhookConfig_with_Payload.golden
create mode 100644 pkg/alertmanager/testdata/CR_with_WebhookConfig_with_Payload_Unsupported_Version.golden
diff --git a/bundle.yaml b/bundle.yaml
index 4d7e9150ca6..c8587f2d06e 100644
--- a/bundle.yaml
+++ b/bundle.yaml
@@ -11286,6 +11286,14 @@ spec:
format: int32
minimum: 0
type: integer
+ payload:
+ description: |-
+ payload define custom payload to be sent to the webhook endpoint.
+ This is an advanced configuration option that allows you
+ to define a custom payload using Go templates.
+ It requires Alertmanager >= v0.32.0.
+ minLength: 1
+ type: string
sendResolved:
description: sendResolved defines whether or not to notify
about resolved alerts.
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml
index 57d75b231c8..c3a4f27d742 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml
@@ -11286,6 +11286,14 @@ spec:
format: int32
minimum: 0
type: integer
+ payload:
+ description: |-
+ payload define custom payload to be sent to the webhook endpoint.
+ This is an advanced configuration option that allows you
+ to define a custom payload using Go templates.
+ It requires Alertmanager >= v0.32.0.
+ minLength: 1
+ type: string
sendResolved:
description: sendResolved defines whether or not to notify
about resolved alerts.
@@ -23338,6 +23346,14 @@ spec:
format: int32
minimum: 0
type: integer
+ payload:
+ description: |-
+ payload define custom payload to be sent to the webhook endpoint.
+ This is an advanced configuration option that allows you
+ to define a custom payload using Go templates.
+ It requires Alertmanager >= v0.32.0.
+ minLength: 1
+ type: string
sendResolved:
description: sendResolved defines whether or not to notify
about resolved alerts.
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml
index 23233a285a0..d097a15e508 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml
@@ -11286,6 +11286,14 @@ spec:
format: int32
minimum: 0
type: integer
+ payload:
+ description: |-
+ payload define custom payload to be sent to the webhook endpoint.
+ This is an advanced configuration option that allows you
+ to define a custom payload using Go templates.
+ It requires Alertmanager >= v0.32.0.
+ minLength: 1
+ type: string
sendResolved:
description: sendResolved defines whether or not to notify
about resolved alerts.
diff --git a/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json b/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json
index 03b860eb755..54f931f27ec 100644
--- a/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json
+++ b/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json
@@ -10270,6 +10270,11 @@
"minimum": 0,
"type": "integer"
},
+ "payload": {
+ "description": "payload define custom payload to be sent to the webhook endpoint.\nThis is an advanced configuration option that allows you\nto define a custom payload using Go templates.\nIt requires Alertmanager >= v0.32.0.",
+ "minLength": 1,
+ "type": "string"
+ },
"sendResolved": {
"description": "sendResolved defines whether or not to notify about resolved alerts.",
"type": "boolean"
diff --git a/jsonnet/prometheus-operator/alertmanagerconfigs-v1beta1-crd.libsonnet b/jsonnet/prometheus-operator/alertmanagerconfigs-v1beta1-crd.libsonnet
index 1e007f3e567..1de1d77cb19 100644
--- a/jsonnet/prometheus-operator/alertmanagerconfigs-v1beta1-crd.libsonnet
+++ b/jsonnet/prometheus-operator/alertmanagerconfigs-v1beta1-crd.libsonnet
@@ -10038,6 +10038,11 @@
minimum: 0,
type: 'integer',
},
+ payload: {
+ description: 'payload define custom payload to be sent to the webhook endpoint.\nThis is an advanced configuration option that allows you\nto define a custom payload using Go templates.\nIt requires Alertmanager >= v0.32.0.',
+ minLength: 1,
+ type: 'string',
+ },
sendResolved: {
description: 'sendResolved defines whether or not to notify about resolved alerts.',
type: 'boolean',
diff --git a/pkg/alertmanager/amcfg.go b/pkg/alertmanager/amcfg.go
index 9d0bf36da1a..6623df92593 100644
--- a/pkg/alertmanager/amcfg.go
+++ b/pkg/alertmanager/amcfg.go
@@ -919,6 +919,10 @@ func (cb *ConfigBuilder) convertWebhookConfig(ctx context.Context, in monitoring
}
}
+ if in.Payload != nil {
+ out.Payload = *in.Payload
+ }
+
return out, nil
}
@@ -2979,7 +2983,7 @@ func (whc *webhookConfig) sanitize(amVersion semver.Version, logger *slog.Logger
whc.Timeout = nil
}
- if len(whc.Payload) != 0 && amVersion.LT(semver.MustParse("0.32.0")) {
+ if whc.Payload != nil && amVersion.LT(semver.MustParse("0.32.0")) {
msg := "'payload' supported in Alertmanager >= 0.32.0 only - dropping field from provided config"
logger.Warn(msg, "current_version", amVersion.String())
whc.Payload = nil
diff --git a/pkg/alertmanager/amcfg_test.go b/pkg/alertmanager/amcfg_test.go
index 04cad8e5dc8..0c821237e1b 100644
--- a/pkg/alertmanager/amcfg_test.go
+++ b/pkg/alertmanager/amcfg_test.go
@@ -2298,6 +2298,9 @@ func TestGenerateConfig(t *testing.T) {
version31, err := semver.ParseTolerant("v0.31.0")
require.NoError(t, err)
+ version32, err := semver.ParseTolerant("v0.32.0")
+ require.NoError(t, err)
+
globalSlackAPIURL, err := url.Parse("http://slack.example.com")
require.NoError(t, err)
@@ -4416,6 +4419,78 @@ func TestGenerateConfig(t *testing.T) {
},
golden: "CR_with_WebhookConfig_with_Timeout_Setup_Older_Version.golden",
},
+ {
+ name: "CR with WebhookConfig with Payload",
+ amVersion: &version32,
+ kclient: fake.NewClientset(),
+ baseConfig: alertmanagerConfig{
+ Route: &route{
+ Receiver: "null",
+ },
+ Receivers: []*receiver{{Name: "null"}},
+ },
+ amConfigs: map[string]*monitoringv1alpha1.AlertmanagerConfig{
+ "mynamespace": {
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "myamc",
+ Namespace: "mynamespace",
+ },
+ Spec: monitoringv1alpha1.AlertmanagerConfigSpec{
+ Route: &monitoringv1alpha1.Route{
+ Receiver: "test",
+ },
+ Receivers: []monitoringv1alpha1.Receiver{
+ {
+ Name: "test",
+ WebhookConfigs: []monitoringv1alpha1.WebhookConfig{
+ {
+ URL: new("https://example.com/"),
+ Payload: new("{\"foo\": \"bar\"}"),
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ golden: "CR_with_WebhookConfig_with_Payload.golden",
+ },
+ {
+ name: "CR with WebhookConfig with Payload Unsupported Version",
+ amVersion: &version31,
+ kclient: fake.NewClientset(),
+ baseConfig: alertmanagerConfig{
+ Route: &route{
+ Receiver: "null",
+ },
+ Receivers: []*receiver{{Name: "null"}},
+ },
+ amConfigs: map[string]*monitoringv1alpha1.AlertmanagerConfig{
+ "mynamespace": {
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "myamc",
+ Namespace: "mynamespace",
+ },
+ Spec: monitoringv1alpha1.AlertmanagerConfigSpec{
+ Route: &monitoringv1alpha1.Route{
+ Receiver: "test",
+ },
+ Receivers: []monitoringv1alpha1.Receiver{
+ {
+ Name: "test",
+ WebhookConfigs: []monitoringv1alpha1.WebhookConfig{
+ {
+ URL: new("https://example.com/"),
+ Payload: new("{\"foo\": \"bar\"}"),
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ golden: "CR_with_WebhookConfig_with_Payload_Unsupported_Version.golden",
+ },
}
logger := newNopLogger(t)
diff --git a/pkg/alertmanager/operator.go b/pkg/alertmanager/operator.go
index 4e829f1b1ed..3b9432149a6 100644
--- a/pkg/alertmanager/operator.go
+++ b/pkg/alertmanager/operator.go
@@ -1451,6 +1451,10 @@ func checkWebhookConfigs(
}
}
+ if config.Payload != nil && amVersion.LT(semver.MustParse("0.32.0")) {
+ return fmt.Errorf(`payload' is available in Alertmanager >= 0.32.0 only - current %s`, amVersion)
+ }
+
if err := configureHTTPConfigInStore(ctx, config.HTTPConfig, namespace, store); err != nil {
return err
}
diff --git a/pkg/alertmanager/operator_test.go b/pkg/alertmanager/operator_test.go
index 68467513183..0c0db31232c 100644
--- a/pkg/alertmanager/operator_test.go
+++ b/pkg/alertmanager/operator_test.go
@@ -204,13 +204,16 @@ func TestCheckAlertmanagerConfig(t *testing.T) {
version26, err := semver.ParseTolerant("v0.26.0")
require.NoError(t, err)
- version31, err := semver.ParseTolerant("v0.31.0")
+ version29, err := semver.ParseTolerant("v0.29.0")
require.NoError(t, err)
version30, err := semver.ParseTolerant("v0.30.0")
require.NoError(t, err)
- version29, err := semver.ParseTolerant("v0.29.0")
+ version31, err := semver.ParseTolerant("v0.31.0")
+ require.NoError(t, err)
+
+ version32, err := semver.ParseTolerant("v0.31.0")
require.NoError(t, err)
c := fake.NewClientset(
@@ -663,6 +666,60 @@ func TestCheckAlertmanagerConfig(t *testing.T) {
},
ok: false,
},
+ {
+ amConfig: &monitoringv1alpha1.AlertmanagerConfig{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "webhook-with-payload-unsupported-version",
+ Namespace: "ns1",
+ },
+ Spec: monitoringv1alpha1.AlertmanagerConfigSpec{
+ Route: &monitoringv1alpha1.Route{
+ Receiver: "recv1",
+ },
+ Receivers: []monitoringv1alpha1.Receiver{{
+ Name: "recv1",
+ WebhookConfigs: []monitoringv1alpha1.WebhookConfig{
+ {
+ URLSecret: &corev1.SecretKeySelector{
+ LocalObjectReference: corev1.LocalObjectReference{Name: "secret"},
+ Key: "key1",
+ },
+ Payload: new(`{"foo":"bar}`),
+ },
+ },
+ }},
+ },
+ },
+ version: &version31,
+ ok: false,
+ },
+ {
+ amConfig: &monitoringv1alpha1.AlertmanagerConfig{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "webhook-with-payload",
+ Namespace: "ns1",
+ },
+ Spec: monitoringv1alpha1.AlertmanagerConfigSpec{
+ Route: &monitoringv1alpha1.Route{
+ Receiver: "recv1",
+ },
+ Receivers: []monitoringv1alpha1.Receiver{{
+ Name: "recv1",
+ WebhookConfigs: []monitoringv1alpha1.WebhookConfig{
+ {
+ URLSecret: &corev1.SecretKeySelector{
+ LocalObjectReference: corev1.LocalObjectReference{Name: "secret"},
+ Key: "key1",
+ },
+ Payload: new(`{"foo":"bar}`),
+ },
+ },
+ }},
+ },
+ },
+ version: &version32,
+ ok: false,
+ },
{
amConfig: &monitoringv1alpha1.AlertmanagerConfig{
ObjectMeta: metav1.ObjectMeta{
diff --git a/pkg/alertmanager/testdata/CR_with_WebhookConfig_with_Payload.golden b/pkg/alertmanager/testdata/CR_with_WebhookConfig_with_Payload.golden
new file mode 100644
index 00000000000..e243f42961f
--- /dev/null
+++ b/pkg/alertmanager/testdata/CR_with_WebhookConfig_with_Payload.golden
@@ -0,0 +1,14 @@
+route:
+ receiver: "null"
+ routes:
+ - receiver: mynamespace/myamc/test
+ matchers:
+ - namespace="mynamespace"
+ continue: true
+receivers:
+- name: "null"
+- name: mynamespace/myamc/test
+ webhook_configs:
+ - url: https://example.com/
+ payload: '{"foo": "bar"}'
+templates: []
diff --git a/pkg/alertmanager/testdata/CR_with_WebhookConfig_with_Payload_Unsupported_Version.golden b/pkg/alertmanager/testdata/CR_with_WebhookConfig_with_Payload_Unsupported_Version.golden
new file mode 100644
index 00000000000..20b6e3987bc
--- /dev/null
+++ b/pkg/alertmanager/testdata/CR_with_WebhookConfig_with_Payload_Unsupported_Version.golden
@@ -0,0 +1,13 @@
+route:
+ receiver: "null"
+ routes:
+ - receiver: mynamespace/myamc/test
+ matchers:
+ - namespace="mynamespace"
+ continue: true
+receivers:
+- name: "null"
+- name: mynamespace/myamc/test
+ webhook_configs:
+ - url: https://example.com/
+templates: []
diff --git a/pkg/alertmanager/types.go b/pkg/alertmanager/types.go
index df13a783d40..46a0c403cc5 100644
--- a/pkg/alertmanager/types.go
+++ b/pkg/alertmanager/types.go
@@ -141,7 +141,7 @@ type webhookConfig struct {
HTTPConfig *httpClientConfig `yaml:"http_config,omitempty"`
MaxAlerts int32 `yaml:"max_alerts,omitempty"`
Timeout *model.Duration `yaml:"timeout,omitempty"`
- Payload map[string]any `yaml:"payload,omitempty"`
+ Payload any `yaml:"payload,omitempty"`
}
type pagerdutyConfig struct {
diff --git a/pkg/apis/monitoring/v1alpha1/alertmanager_config_types.go b/pkg/apis/monitoring/v1alpha1/alertmanager_config_types.go
index b0921872784..4e388169c5b 100644
--- a/pkg/apis/monitoring/v1alpha1/alertmanager_config_types.go
+++ b/pkg/apis/monitoring/v1alpha1/alertmanager_config_types.go
@@ -607,6 +607,13 @@ type WebhookConfig struct {
// It requires Alertmanager >= v0.28.0.
// +optional
Timeout *monitoringv1.Duration `json:"timeout,omitempty"`
+ // payload define custom payload to be sent to the webhook endpoint.
+ // This is an advanced configuration option that allows you
+ // to define a custom payload using Go templates.
+ // It requires Alertmanager >= v0.32.0.
+ // +kubebuilder:validation:MinLength=1
+ // +optional
+ Payload *string `json:"payload,omitempty"`
}
// OpsGenieConfig configures notifications via OpsGenie.
diff --git a/pkg/apis/monitoring/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/monitoring/v1alpha1/zz_generated.deepcopy.go
index 06c47dc06b2..1efb0d86ae5 100644
--- a/pkg/apis/monitoring/v1alpha1/zz_generated.deepcopy.go
+++ b/pkg/apis/monitoring/v1alpha1/zz_generated.deepcopy.go
@@ -3725,6 +3725,11 @@ func (in *WebhookConfig) DeepCopyInto(out *WebhookConfig) {
*out = new(v1.Duration)
**out = **in
}
+ if in.Payload != nil {
+ in, out := &in.Payload, &out.Payload
+ *out = new(string)
+ **out = **in
+ }
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WebhookConfig.
diff --git a/pkg/apis/monitoring/v1beta1/alertmanager_config_types.go b/pkg/apis/monitoring/v1beta1/alertmanager_config_types.go
index 587a40e695b..ecd0ab52ea3 100644
--- a/pkg/apis/monitoring/v1beta1/alertmanager_config_types.go
+++ b/pkg/apis/monitoring/v1beta1/alertmanager_config_types.go
@@ -580,6 +580,13 @@ type WebhookConfig struct {
// It requires Alertmanager >= v0.28.0.
// +optional
Timeout *monitoringv1.Duration `json:"timeout,omitempty"`
+ // payload define custom payload to be sent to the webhook endpoint.
+ // This is an advanced configuration option that allows you
+ // to define a custom payload using Go templates.
+ // It requires Alertmanager >= v0.32.0.
+ // +kubebuilder:validation:MinLength=1
+ // +optional
+ Payload *string `json:"payload,omitempty"`
}
// OpsGenieConfig configures notifications via OpsGenie.
diff --git a/pkg/apis/monitoring/v1beta1/conversion_from.go b/pkg/apis/monitoring/v1beta1/conversion_from.go
index b99c64398ab..5e6f42458b8 100644
--- a/pkg/apis/monitoring/v1beta1/conversion_from.go
+++ b/pkg/apis/monitoring/v1beta1/conversion_from.go
@@ -414,6 +414,7 @@ func convertWebhookConfigFrom(in v1alpha1.WebhookConfig) WebhookConfig {
HTTPConfig: convertHTTPConfigFrom(in.HTTPConfig),
MaxAlerts: in.MaxAlerts,
Timeout: in.Timeout,
+ Payload: in.Payload,
}
}
diff --git a/pkg/apis/monitoring/v1beta1/conversion_to.go b/pkg/apis/monitoring/v1beta1/conversion_to.go
index 98019eb81a1..22912191c1a 100644
--- a/pkg/apis/monitoring/v1beta1/conversion_to.go
+++ b/pkg/apis/monitoring/v1beta1/conversion_to.go
@@ -410,6 +410,7 @@ func convertWebhookConfigTo(in WebhookConfig) v1alpha1.WebhookConfig {
HTTPConfig: convertHTTPConfigTo(in.HTTPConfig),
MaxAlerts: in.MaxAlerts,
Timeout: in.Timeout,
+ Payload: in.Payload,
}
}
diff --git a/pkg/apis/monitoring/v1beta1/zz_generated.deepcopy.go b/pkg/apis/monitoring/v1beta1/zz_generated.deepcopy.go
index 1301991c4cc..f0669cb5198 100644
--- a/pkg/apis/monitoring/v1beta1/zz_generated.deepcopy.go
+++ b/pkg/apis/monitoring/v1beta1/zz_generated.deepcopy.go
@@ -1801,6 +1801,11 @@ func (in *WebhookConfig) DeepCopyInto(out *WebhookConfig) {
*out = new(v1.Duration)
**out = **in
}
+ if in.Payload != nil {
+ in, out := &in.Payload, &out.Payload
+ *out = new(string)
+ **out = **in
+ }
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WebhookConfig.
diff --git a/pkg/client/applyconfiguration/monitoring/v1alpha1/webhookconfig.go b/pkg/client/applyconfiguration/monitoring/v1alpha1/webhookconfig.go
index a52bbef348d..e4349e710b4 100644
--- a/pkg/client/applyconfiguration/monitoring/v1alpha1/webhookconfig.go
+++ b/pkg/client/applyconfiguration/monitoring/v1alpha1/webhookconfig.go
@@ -46,6 +46,11 @@ type WebhookConfigApplyConfiguration struct {
// before failing the request and allowing it to be retried.
// It requires Alertmanager >= v0.28.0.
Timeout *monitoringv1.Duration `json:"timeout,omitempty"`
+ // payload define custom payload to be sent to the webhook endpoint.
+ // This is an advanced configuration option that allows you
+ // to define a custom payload using Go templates.
+ // It requires Alertmanager >= v0.32.0.
+ Payload *string `json:"payload,omitempty"`
}
// WebhookConfigApplyConfiguration constructs a declarative configuration of the WebhookConfig type for use with
@@ -101,3 +106,11 @@ func (b *WebhookConfigApplyConfiguration) WithTimeout(value monitoringv1.Duratio
b.Timeout = &value
return b
}
+
+// WithPayload sets the Payload field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Payload field is set to the value of the last call.
+func (b *WebhookConfigApplyConfiguration) WithPayload(value string) *WebhookConfigApplyConfiguration {
+ b.Payload = &value
+ return b
+}
diff --git a/pkg/client/applyconfiguration/monitoring/v1beta1/webhookconfig.go b/pkg/client/applyconfiguration/monitoring/v1beta1/webhookconfig.go
index 32fcfdf0f73..67026422ee4 100644
--- a/pkg/client/applyconfiguration/monitoring/v1beta1/webhookconfig.go
+++ b/pkg/client/applyconfiguration/monitoring/v1beta1/webhookconfig.go
@@ -45,6 +45,11 @@ type WebhookConfigApplyConfiguration struct {
// before failing the request and allowing it to be retried.
// It requires Alertmanager >= v0.28.0.
Timeout *v1.Duration `json:"timeout,omitempty"`
+ // payload define custom payload to be sent to the webhook endpoint.
+ // This is an advanced configuration option that allows you
+ // to define a custom payload using Go templates.
+ // It requires Alertmanager >= v0.32.0.
+ Payload *string `json:"payload,omitempty"`
}
// WebhookConfigApplyConfiguration constructs a declarative configuration of the WebhookConfig type for use with
@@ -100,3 +105,11 @@ func (b *WebhookConfigApplyConfiguration) WithTimeout(value v1.Duration) *Webhoo
b.Timeout = &value
return b
}
+
+// WithPayload sets the Payload field in the declarative configuration to the given value
+// and returns the receiver, so that objects can be built by chaining "With" function invocations.
+// If called multiple times, the Payload field is set to the value of the last call.
+func (b *WebhookConfigApplyConfiguration) WithPayload(value string) *WebhookConfigApplyConfiguration {
+ b.Payload = &value
+ return b
+}
From 5f00c37b1e066f99dfe1a8e343e6cf34aeb84c7d Mon Sep 17 00:00:00 2001
From: dongjiang
Date: Tue, 9 Jun 2026 11:38:51 +0800
Subject: [PATCH 63/81] update controller-tools version
Signed-off-by: dongjiang
---
bundle.yaml | 20 +--
.../alertmanager-crd-conversion/patch.json | 2 +-
...toring.coreos.com_alertmanagerconfigs.yaml | 2 +-
.../monitoring.coreos.com_alertmanagers.yaml | 2 +-
.../monitoring.coreos.com_podmonitors.yaml | 2 +-
.../monitoring.coreos.com_probes.yaml | 2 +-
...onitoring.coreos.com_prometheusagents.yaml | 2 +-
.../monitoring.coreos.com_prometheuses.yaml | 2 +-
...monitoring.coreos.com_prometheusrules.yaml | 2 +-
.../monitoring.coreos.com_scrapeconfigs.yaml | 2 +-
...monitoring.coreos.com_servicemonitors.yaml | 2 +-
.../monitoring.coreos.com_thanosrulers.yaml | 2 +-
...toring.coreos.com_alertmanagerconfigs.yaml | 2 +-
.../monitoring.coreos.com_alertmanagers.yaml | 2 +-
.../monitoring.coreos.com_podmonitors.yaml | 2 +-
.../monitoring.coreos.com_probes.yaml | 2 +-
...onitoring.coreos.com_prometheusagents.yaml | 2 +-
.../monitoring.coreos.com_prometheuses.yaml | 2 +-
...monitoring.coreos.com_prometheusrules.yaml | 2 +-
.../monitoring.coreos.com_scrapeconfigs.yaml | 2 +-
...monitoring.coreos.com_servicemonitors.yaml | 2 +-
.../monitoring.coreos.com_thanosrulers.yaml | 2 +-
.../alertmanagerconfigs-crd.json | 2 +-
.../alertmanagers-crd.json | 2 +-
.../prometheus-operator/podmonitors-crd.json | 2 +-
jsonnet/prometheus-operator/probes-crd.json | 2 +-
.../prometheusagents-crd.json | 2 +-
.../prometheus-operator/prometheuses-crd.json | 2 +-
.../prometheusrules-crd.json | 2 +-
.../scrapeconfigs-crd.json | 2 +-
.../servicemonitors-crd.json | 2 +-
.../prometheus-operator/thanosrulers-crd.json | 2 +-
.../informers/externalversions/factory.go | 110 ++++++++++++---
.../internalinterfaces/factory_interfaces.go | 19 +++
.../monitoring/v1/alertmanager.go | 48 ++++---
.../monitoring/v1/podmonitor.go | 48 ++++---
.../externalversions/monitoring/v1/probe.go | 48 ++++---
.../monitoring/v1/prometheus.go | 48 ++++---
.../monitoring/v1/prometheusrule.go | 48 ++++---
.../monitoring/v1/servicemonitor.go | 48 ++++---
.../monitoring/v1/thanosruler.go | 48 ++++---
.../monitoring/v1alpha1/alertmanagerconfig.go | 48 ++++---
.../monitoring/v1alpha1/prometheusagent.go | 48 ++++---
.../monitoring/v1alpha1/scrapeconfig.go | 48 ++++---
.../monitoring/v1beta1/alertmanagerconfig.go | 48 ++++---
.../versioned/fake/clientset_generated.go | 10 +-
scripts/go.mod | 52 +++----
scripts/go.sum | 128 +++++++++---------
48 files changed, 586 insertions(+), 343 deletions(-)
diff --git a/bundle.yaml b/bundle.yaml
index 1de3860d2bf..b1d3ca05950 100644
--- a/bundle.yaml
+++ b/bundle.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: alertmanagerconfigs.monitoring.coreos.com
spec:
@@ -12363,7 +12363,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: alertmanagers.monitoring.coreos.com
spec:
@@ -22374,7 +22374,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: podmonitors.monitoring.coreos.com
spec:
@@ -23773,7 +23773,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: probes.monitoring.coreos.com
spec:
@@ -25189,7 +25189,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: prometheusagents.monitoring.coreos.com
spec:
@@ -36702,7 +36702,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: prometheuses.monitoring.coreos.com
spec:
@@ -50531,7 +50531,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: prometheusrules.monitoring.coreos.com
spec:
@@ -50798,7 +50798,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: scrapeconfigs.monitoring.coreos.com
spec:
@@ -63727,7 +63727,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: servicemonitors.monitoring.coreos.com
spec:
@@ -65140,7 +65140,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: thanosrulers.monitoring.coreos.com
spec:
diff --git a/example/alertmanager-crd-conversion/patch.json b/example/alertmanager-crd-conversion/patch.json
index 863c3e502c3..5669524ee70 100644
--- a/example/alertmanager-crd-conversion/patch.json
+++ b/example/alertmanager-crd-conversion/patch.json
@@ -3,7 +3,7 @@
"kind": "CustomResourceDefinition",
"metadata": {
"annotations": {
- "controller-gen.kubebuilder.io/version": "v0.20.1",
+ "controller-gen.kubebuilder.io/version": "v0.21.0",
"operator.prometheus.io/version": "0.91.0"
},
"name": "alertmanagerconfigs.monitoring.coreos.com"
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml
index 55218bd631a..edbe358f0f1 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: alertmanagerconfigs.monitoring.coreos.com
spec:
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml
index ac618de6b1a..31d815cf892 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: alertmanagers.monitoring.coreos.com
spec:
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml
index f0ac5692b78..d9cf5c1080f 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: podmonitors.monitoring.coreos.com
spec:
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_probes.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_probes.yaml
index 0074f2bcd4d..57004979b8e 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_probes.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_probes.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: probes.monitoring.coreos.com
spec:
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml
index 2828c471d7f..d7d651043f9 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: prometheusagents.monitoring.coreos.com
spec:
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
index 5dc7986673b..9556e673311 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: prometheuses.monitoring.coreos.com
spec:
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusrules.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusrules.yaml
index 236cda0e3a7..aa3234bca10 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusrules.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusrules.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: prometheusrules.monitoring.coreos.com
spec:
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_scrapeconfigs.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_scrapeconfigs.yaml
index 73b24f01332..a7675212a3f 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_scrapeconfigs.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_scrapeconfigs.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: scrapeconfigs.monitoring.coreos.com
spec:
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml
index 5548f726251..ec5afec3d88 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: servicemonitors.monitoring.coreos.com
spec:
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml
index a749366291c..345c058f2ab 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: thanosrulers.monitoring.coreos.com
spec:
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml
index 47941d6f62a..85eb7af2a54 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: alertmanagerconfigs.monitoring.coreos.com
spec:
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml
index ac618de6b1a..31d815cf892 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: alertmanagers.monitoring.coreos.com
spec:
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml
index f0ac5692b78..d9cf5c1080f 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: podmonitors.monitoring.coreos.com
spec:
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml
index 0074f2bcd4d..57004979b8e 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: probes.monitoring.coreos.com
spec:
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml
index 2828c471d7f..d7d651043f9 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: prometheusagents.monitoring.coreos.com
spec:
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
index 5dc7986673b..9556e673311 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: prometheuses.monitoring.coreos.com
spec:
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml
index 236cda0e3a7..aa3234bca10 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: prometheusrules.monitoring.coreos.com
spec:
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml
index 73b24f01332..a7675212a3f 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: scrapeconfigs.monitoring.coreos.com
spec:
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml
index 5548f726251..ec5afec3d88 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: servicemonitors.monitoring.coreos.com
spec:
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml
index a749366291c..345c058f2ab 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.20.1
+ controller-gen.kubebuilder.io/version: v0.21.0
operator.prometheus.io/version: 0.91.0
name: thanosrulers.monitoring.coreos.com
spec:
diff --git a/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json b/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json
index 56fc8b77898..a37bc1d8d84 100644
--- a/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json
+++ b/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json
@@ -3,7 +3,7 @@
"kind": "CustomResourceDefinition",
"metadata": {
"annotations": {
- "controller-gen.kubebuilder.io/version": "v0.20.1",
+ "controller-gen.kubebuilder.io/version": "v0.21.0",
"operator.prometheus.io/version": "0.91.0"
},
"name": "alertmanagerconfigs.monitoring.coreos.com"
diff --git a/jsonnet/prometheus-operator/alertmanagers-crd.json b/jsonnet/prometheus-operator/alertmanagers-crd.json
index 6bc9f9c74a8..6bdeb8b2e69 100644
--- a/jsonnet/prometheus-operator/alertmanagers-crd.json
+++ b/jsonnet/prometheus-operator/alertmanagers-crd.json
@@ -3,7 +3,7 @@
"kind": "CustomResourceDefinition",
"metadata": {
"annotations": {
- "controller-gen.kubebuilder.io/version": "v0.20.1",
+ "controller-gen.kubebuilder.io/version": "v0.21.0",
"operator.prometheus.io/version": "0.91.0"
},
"name": "alertmanagers.monitoring.coreos.com"
diff --git a/jsonnet/prometheus-operator/podmonitors-crd.json b/jsonnet/prometheus-operator/podmonitors-crd.json
index f52e8ab0606..79fa7fff0fc 100644
--- a/jsonnet/prometheus-operator/podmonitors-crd.json
+++ b/jsonnet/prometheus-operator/podmonitors-crd.json
@@ -3,7 +3,7 @@
"kind": "CustomResourceDefinition",
"metadata": {
"annotations": {
- "controller-gen.kubebuilder.io/version": "v0.20.1",
+ "controller-gen.kubebuilder.io/version": "v0.21.0",
"operator.prometheus.io/version": "0.91.0"
},
"name": "podmonitors.monitoring.coreos.com"
diff --git a/jsonnet/prometheus-operator/probes-crd.json b/jsonnet/prometheus-operator/probes-crd.json
index 8290a1d292d..4409e38424d 100644
--- a/jsonnet/prometheus-operator/probes-crd.json
+++ b/jsonnet/prometheus-operator/probes-crd.json
@@ -3,7 +3,7 @@
"kind": "CustomResourceDefinition",
"metadata": {
"annotations": {
- "controller-gen.kubebuilder.io/version": "v0.20.1",
+ "controller-gen.kubebuilder.io/version": "v0.21.0",
"operator.prometheus.io/version": "0.91.0"
},
"name": "probes.monitoring.coreos.com"
diff --git a/jsonnet/prometheus-operator/prometheusagents-crd.json b/jsonnet/prometheus-operator/prometheusagents-crd.json
index 198a9ab2b15..65364df5ae0 100644
--- a/jsonnet/prometheus-operator/prometheusagents-crd.json
+++ b/jsonnet/prometheus-operator/prometheusagents-crd.json
@@ -3,7 +3,7 @@
"kind": "CustomResourceDefinition",
"metadata": {
"annotations": {
- "controller-gen.kubebuilder.io/version": "v0.20.1",
+ "controller-gen.kubebuilder.io/version": "v0.21.0",
"operator.prometheus.io/version": "0.91.0"
},
"name": "prometheusagents.monitoring.coreos.com"
diff --git a/jsonnet/prometheus-operator/prometheuses-crd.json b/jsonnet/prometheus-operator/prometheuses-crd.json
index 43e9383d649..4603df92b75 100644
--- a/jsonnet/prometheus-operator/prometheuses-crd.json
+++ b/jsonnet/prometheus-operator/prometheuses-crd.json
@@ -3,7 +3,7 @@
"kind": "CustomResourceDefinition",
"metadata": {
"annotations": {
- "controller-gen.kubebuilder.io/version": "v0.20.1",
+ "controller-gen.kubebuilder.io/version": "v0.21.0",
"operator.prometheus.io/version": "0.91.0"
},
"name": "prometheuses.monitoring.coreos.com"
diff --git a/jsonnet/prometheus-operator/prometheusrules-crd.json b/jsonnet/prometheus-operator/prometheusrules-crd.json
index 3e030089fa8..2318e8529e4 100644
--- a/jsonnet/prometheus-operator/prometheusrules-crd.json
+++ b/jsonnet/prometheus-operator/prometheusrules-crd.json
@@ -3,7 +3,7 @@
"kind": "CustomResourceDefinition",
"metadata": {
"annotations": {
- "controller-gen.kubebuilder.io/version": "v0.20.1",
+ "controller-gen.kubebuilder.io/version": "v0.21.0",
"operator.prometheus.io/version": "0.91.0"
},
"name": "prometheusrules.monitoring.coreos.com"
diff --git a/jsonnet/prometheus-operator/scrapeconfigs-crd.json b/jsonnet/prometheus-operator/scrapeconfigs-crd.json
index ffa25cf6764..ad117c78350 100644
--- a/jsonnet/prometheus-operator/scrapeconfigs-crd.json
+++ b/jsonnet/prometheus-operator/scrapeconfigs-crd.json
@@ -3,7 +3,7 @@
"kind": "CustomResourceDefinition",
"metadata": {
"annotations": {
- "controller-gen.kubebuilder.io/version": "v0.20.1",
+ "controller-gen.kubebuilder.io/version": "v0.21.0",
"operator.prometheus.io/version": "0.91.0"
},
"name": "scrapeconfigs.monitoring.coreos.com"
diff --git a/jsonnet/prometheus-operator/servicemonitors-crd.json b/jsonnet/prometheus-operator/servicemonitors-crd.json
index 60e7de8f285..b55bb352c37 100644
--- a/jsonnet/prometheus-operator/servicemonitors-crd.json
+++ b/jsonnet/prometheus-operator/servicemonitors-crd.json
@@ -3,7 +3,7 @@
"kind": "CustomResourceDefinition",
"metadata": {
"annotations": {
- "controller-gen.kubebuilder.io/version": "v0.20.1",
+ "controller-gen.kubebuilder.io/version": "v0.21.0",
"operator.prometheus.io/version": "0.91.0"
},
"name": "servicemonitors.monitoring.coreos.com"
diff --git a/jsonnet/prometheus-operator/thanosrulers-crd.json b/jsonnet/prometheus-operator/thanosrulers-crd.json
index 934673d950e..016cca4a48a 100644
--- a/jsonnet/prometheus-operator/thanosrulers-crd.json
+++ b/jsonnet/prometheus-operator/thanosrulers-crd.json
@@ -3,7 +3,7 @@
"kind": "CustomResourceDefinition",
"metadata": {
"annotations": {
- "controller-gen.kubebuilder.io/version": "v0.20.1",
+ "controller-gen.kubebuilder.io/version": "v0.21.0",
"operator.prometheus.io/version": "0.91.0"
},
"name": "thanosrulers.monitoring.coreos.com"
diff --git a/pkg/client/informers/externalversions/factory.go b/pkg/client/informers/externalversions/factory.go
index 2e5c3b9edf1..c1738e100ee 100644
--- a/pkg/client/informers/externalversions/factory.go
+++ b/pkg/client/informers/externalversions/factory.go
@@ -17,6 +17,7 @@
package externalversions
import (
+ context "context"
reflect "reflect"
sync "sync"
time "time"
@@ -27,6 +28,7 @@ import (
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
runtime "k8s.io/apimachinery/pkg/runtime"
schema "k8s.io/apimachinery/pkg/runtime/schema"
+ wait "k8s.io/apimachinery/pkg/util/wait"
cache "k8s.io/client-go/tools/cache"
)
@@ -41,6 +43,7 @@ type sharedInformerFactory struct {
defaultResync time.Duration
customResync map[reflect.Type]time.Duration
transform cache.TransformFunc
+ informerName *cache.InformerName
informers map[reflect.Type]cache.SharedIndexInformer
// startedInformers is used for tracking which informers have been started.
@@ -87,6 +90,21 @@ func WithTransform(transform cache.TransformFunc) SharedInformerOption {
}
}
+// WithInformerName sets the InformerName for informer identity used in metrics.
+// The InformerName must be created via cache.NewInformerName() at startup,
+// which validates global uniqueness. Each informer type will register its
+// GVR under this name.
+func WithInformerName(informerName *cache.InformerName) SharedInformerOption {
+ return func(factory *sharedInformerFactory) *sharedInformerFactory {
+ factory.informerName = informerName
+ return factory
+ }
+}
+
+func (f *sharedInformerFactory) InformerName() *cache.InformerName {
+ return f.informerName
+}
+
// NewSharedInformerFactory constructs a new instance of sharedInformerFactory for all namespaces.
func NewSharedInformerFactory(client versioned.Interface, defaultResync time.Duration) SharedInformerFactory {
return NewSharedInformerFactoryWithOptions(client, defaultResync)
@@ -121,6 +139,10 @@ func NewSharedInformerFactoryWithOptions(client versioned.Interface, defaultResy
}
func (f *sharedInformerFactory) Start(stopCh <-chan struct{}) {
+ f.StartWithContext(wait.ContextForChannel(stopCh))
+}
+
+func (f *sharedInformerFactory) StartWithContext(ctx context.Context) {
f.lock.Lock()
defer f.lock.Unlock()
@@ -130,15 +152,9 @@ func (f *sharedInformerFactory) Start(stopCh <-chan struct{}) {
for informerType, informer := range f.informers {
if !f.startedInformers[informerType] {
- f.wg.Add(1)
- // We need a new variable in each loop iteration,
- // otherwise the goroutine would use the loop variable
- // and that keeps changing.
- informer := informer
- go func() {
- defer f.wg.Done()
- informer.Run(stopCh)
- }()
+ f.wg.Go(func() {
+ informer.RunWithContext(ctx)
+ })
f.startedInformers[informerType] = true
}
}
@@ -151,9 +167,15 @@ func (f *sharedInformerFactory) Shutdown() {
// Will return immediately if there is nothing to wait for.
f.wg.Wait()
+ f.informerName.Release()
}
func (f *sharedInformerFactory) WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool {
+ result := f.WaitForCacheSyncWithContext(wait.ContextForChannel(stopCh))
+ return result.Synced
+}
+
+func (f *sharedInformerFactory) WaitForCacheSyncWithContext(ctx context.Context) cache.SyncResult {
informers := func() map[reflect.Type]cache.SharedIndexInformer {
f.lock.Lock()
defer f.lock.Unlock()
@@ -167,10 +189,31 @@ func (f *sharedInformerFactory) WaitForCacheSync(stopCh <-chan struct{}) map[ref
return informers
}()
- res := map[reflect.Type]bool{}
+ // Wait for informers to sync, without polling.
+ cacheSyncs := make([]cache.DoneChecker, 0, len(informers))
+ for _, informer := range informers {
+ cacheSyncs = append(cacheSyncs, informer.HasSyncedChecker())
+ }
+ cache.WaitFor(ctx, "" /* no logging */, cacheSyncs...)
+
+ res := cache.SyncResult{
+ Synced: make(map[reflect.Type]bool, len(informers)),
+ }
+ failed := false
for informType, informer := range informers {
- res[informType] = cache.WaitForCacheSync(stopCh, informer.HasSynced)
+ hasSynced := informer.HasSynced()
+ if !hasSynced {
+ failed = true
+ }
+ res.Synced[informType] = hasSynced
}
+ if failed {
+ // context.Cause is more informative than ctx.Err().
+ // This must be non-nil, otherwise WaitFor wouldn't have stopped
+ // prematurely.
+ res.Err = context.Cause(ctx)
+ }
+
return res
}
@@ -192,7 +235,9 @@ func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internal
}
informer = newFunc(f.client, resyncPeriod)
- informer.SetTransform(f.transform)
+ if f.transform != nil {
+ informer.SetTransform(f.transform)
+ }
f.informers[informerType] = informer
return informer
@@ -209,27 +254,46 @@ func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internal
// defer factory.WaitForStop() // Returns immediately if nothing was started.
// genericInformer := factory.ForResource(resource)
// typedInformer := factory.SomeAPIGroup().V1().SomeType()
-// factory.Start(ctx.Done()) // Start processing these informers.
-// synced := factory.WaitForCacheSync(ctx.Done())
-// for v, ok := range synced {
-// if !ok {
-// fmt.Fprintf(os.Stderr, "caches failed to sync: %v", v)
-// return
-// }
+// handle, err := typeInformer.Informer().AddEventHandler(...)
+// if err != nil {
+// return fmt.Errorf("register event handler: %v", err)
+// }
+// defer typeInformer.Informer().RemoveEventHandler(handle) // Avoids leaking goroutines.
+// factory.StartWithContext(ctx) // Start processing these informers.
+// synced := factory.WaitForCacheSyncWithContext(ctx)
+// if err := synced.AsError(); err != nil {
+// return err
+// }
+// for v := range synced {
+// // Only if desired log some information similar to this.
+// fmt.Fprintf(os.Stdout, "cache synced: %s", v)
+// }
+//
+// // Also make sure that all of the initial cache events have been delivered.
+// if !WaitFor(ctx, "event handler sync", handle.HasSyncedChecker()) {
+// // Must have failed because of context.
+// return fmt.Errorf("sync event handler: %w", context.Cause(ctx))
// }
//
// // Creating informers can also be created after Start, but then
// // Start must be called again:
// anotherGenericInformer := factory.ForResource(resource)
-// factory.Start(ctx.Done())
+// factory.StartWithContext(ctx)
type SharedInformerFactory interface {
internalinterfaces.SharedInformerFactory
// Start initializes all requested informers. They are handled in goroutines
// which run until the stop channel gets closed.
// Warning: Start does not block. When run in a go-routine, it will race with a later WaitForCacheSync.
+ //
+ // Contextual logging: StartWithContext should be used instead of Start in code which supports contextual logging.
Start(stopCh <-chan struct{})
+ // StartWithContext initializes all requested informers. They are handled in goroutines
+ // which run until the context gets canceled.
+ // Warning: StartWithContext does not block. When run in a go-routine, it will race with a later WaitForCacheSync.
+ StartWithContext(ctx context.Context)
+
// Shutdown marks a factory as shutting down. At that point no new
// informers can be started anymore and Start will return without
// doing anything.
@@ -244,8 +308,14 @@ type SharedInformerFactory interface {
// WaitForCacheSync blocks until all started informers' caches were synced
// or the stop channel gets closed.
+ //
+ // Contextual logging: WaitForCacheSync should be used instead of WaitForCacheSync in code which supports contextual logging. It also returns a more useful result.
WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool
+ // WaitForCacheSyncWithContext blocks until all started informers' caches were synced
+ // or the context gets canceled.
+ WaitForCacheSyncWithContext(ctx context.Context) cache.SyncResult
+
// ForResource gives generic access to a shared informer of the matching type.
ForResource(resource schema.GroupVersionResource) (GenericInformer, error)
diff --git a/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go b/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go
index 8b7e955df89..3f9d21897b1 100644
--- a/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go
+++ b/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go
@@ -32,7 +32,26 @@ type NewInformerFunc func(versioned.Interface, time.Duration) cache.SharedIndexI
type SharedInformerFactory interface {
Start(stopCh <-chan struct{})
InformerFor(obj runtime.Object, newFunc NewInformerFunc) cache.SharedIndexInformer
+ InformerName() *cache.InformerName
}
// TweakListOptionsFunc is a function that transforms a v1.ListOptions.
type TweakListOptionsFunc func(*v1.ListOptions)
+
+// InformerOptions holds the options for creating an informer.
+type InformerOptions struct {
+ // ResyncPeriod is the resync period for this informer.
+ // If not set, defaults to 0 (no resync).
+ ResyncPeriod time.Duration
+
+ // Indexers are the indexers for this informer.
+ Indexers cache.Indexers
+
+ // InformerName is used to uniquely identify this informer for metrics.
+ // If not set, metrics will not be published for this informer.
+ // Use cache.NewInformerName() to create an InformerName at startup.
+ InformerName *cache.InformerName
+
+ // TweakListOptions is an optional function to modify the list options.
+ TweakListOptions TweakListOptionsFunc
+}
diff --git a/pkg/client/informers/externalversions/monitoring/v1/alertmanager.go b/pkg/client/informers/externalversions/monitoring/v1/alertmanager.go
index 024fd904aa5..192918501ff 100644
--- a/pkg/client/informers/externalversions/monitoring/v1/alertmanager.go
+++ b/pkg/client/informers/externalversions/monitoring/v1/alertmanager.go
@@ -26,6 +26,7 @@ import (
versioned "github.com/prometheus-operator/prometheus-operator/pkg/client/versioned"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
runtime "k8s.io/apimachinery/pkg/runtime"
+ schema "k8s.io/apimachinery/pkg/runtime/schema"
watch "k8s.io/apimachinery/pkg/watch"
cache "k8s.io/client-go/tools/cache"
)
@@ -47,48 +48,61 @@ type alertmanagerInformer struct {
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
func NewAlertmanagerInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
- return NewFilteredAlertmanagerInformer(client, namespace, resyncPeriod, indexers, nil)
+ return NewAlertmanagerInformerWithOptions(client, namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: indexers})
}
// NewFilteredAlertmanagerInformer constructs a new informer for Alertmanager type.
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
func NewFilteredAlertmanagerInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
- return cache.NewSharedIndexInformer(
+ return NewAlertmanagerInformerWithOptions(client, namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: indexers, TweakListOptions: tweakListOptions})
+}
+
+// NewAlertmanagerInformerWithOptions constructs a new informer for Alertmanager type with additional options.
+// Always prefer using an informer factory to get a shared informer instead of getting an independent
+// one. This reduces memory footprint and number of connections to the server.
+func NewAlertmanagerInformerWithOptions(client versioned.Interface, namespace string, options internalinterfaces.InformerOptions) cache.SharedIndexInformer {
+ gvr := schema.GroupVersionResource{Group: "monitoring.coreos.com", Version: "v1", Resource: "alertmanagers"}
+ identifier := options.InformerName.WithResource(gvr)
+ tweakListOptions := options.TweakListOptions
+ return cache.NewSharedIndexInformerWithOptions(
cache.ToListWatcherWithWatchListSemantics(&cache.ListWatch{
- ListFunc: func(options metav1.ListOptions) (runtime.Object, error) {
+ ListFunc: func(opts metav1.ListOptions) (runtime.Object, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().Alertmanagers(namespace).List(context.Background(), options)
+ return client.MonitoringV1().Alertmanagers(namespace).List(context.Background(), opts)
},
- WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) {
+ WatchFunc: func(opts metav1.ListOptions) (watch.Interface, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().Alertmanagers(namespace).Watch(context.Background(), options)
+ return client.MonitoringV1().Alertmanagers(namespace).Watch(context.Background(), opts)
},
- ListWithContextFunc: func(ctx context.Context, options metav1.ListOptions) (runtime.Object, error) {
+ ListWithContextFunc: func(ctx context.Context, opts metav1.ListOptions) (runtime.Object, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().Alertmanagers(namespace).List(ctx, options)
+ return client.MonitoringV1().Alertmanagers(namespace).List(ctx, opts)
},
- WatchFuncWithContext: func(ctx context.Context, options metav1.ListOptions) (watch.Interface, error) {
+ WatchFuncWithContext: func(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().Alertmanagers(namespace).Watch(ctx, options)
+ return client.MonitoringV1().Alertmanagers(namespace).Watch(ctx, opts)
},
}, client),
&apismonitoringv1.Alertmanager{},
- resyncPeriod,
- indexers,
+ cache.SharedIndexInformerOptions{
+ ResyncPeriod: options.ResyncPeriod,
+ Indexers: options.Indexers,
+ Identifier: identifier,
+ },
)
}
func (f *alertmanagerInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
- return NewFilteredAlertmanagerInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
+ return NewAlertmanagerInformerWithOptions(client, f.namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, InformerName: f.factory.InformerName(), TweakListOptions: f.tweakListOptions})
}
func (f *alertmanagerInformer) Informer() cache.SharedIndexInformer {
diff --git a/pkg/client/informers/externalversions/monitoring/v1/podmonitor.go b/pkg/client/informers/externalversions/monitoring/v1/podmonitor.go
index 998db3477fd..223f6313ea3 100644
--- a/pkg/client/informers/externalversions/monitoring/v1/podmonitor.go
+++ b/pkg/client/informers/externalversions/monitoring/v1/podmonitor.go
@@ -26,6 +26,7 @@ import (
versioned "github.com/prometheus-operator/prometheus-operator/pkg/client/versioned"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
runtime "k8s.io/apimachinery/pkg/runtime"
+ schema "k8s.io/apimachinery/pkg/runtime/schema"
watch "k8s.io/apimachinery/pkg/watch"
cache "k8s.io/client-go/tools/cache"
)
@@ -47,48 +48,61 @@ type podMonitorInformer struct {
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
func NewPodMonitorInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
- return NewFilteredPodMonitorInformer(client, namespace, resyncPeriod, indexers, nil)
+ return NewPodMonitorInformerWithOptions(client, namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: indexers})
}
// NewFilteredPodMonitorInformer constructs a new informer for PodMonitor type.
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
func NewFilteredPodMonitorInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
- return cache.NewSharedIndexInformer(
+ return NewPodMonitorInformerWithOptions(client, namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: indexers, TweakListOptions: tweakListOptions})
+}
+
+// NewPodMonitorInformerWithOptions constructs a new informer for PodMonitor type with additional options.
+// Always prefer using an informer factory to get a shared informer instead of getting an independent
+// one. This reduces memory footprint and number of connections to the server.
+func NewPodMonitorInformerWithOptions(client versioned.Interface, namespace string, options internalinterfaces.InformerOptions) cache.SharedIndexInformer {
+ gvr := schema.GroupVersionResource{Group: "monitoring.coreos.com", Version: "v1", Resource: "podmonitors"}
+ identifier := options.InformerName.WithResource(gvr)
+ tweakListOptions := options.TweakListOptions
+ return cache.NewSharedIndexInformerWithOptions(
cache.ToListWatcherWithWatchListSemantics(&cache.ListWatch{
- ListFunc: func(options metav1.ListOptions) (runtime.Object, error) {
+ ListFunc: func(opts metav1.ListOptions) (runtime.Object, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().PodMonitors(namespace).List(context.Background(), options)
+ return client.MonitoringV1().PodMonitors(namespace).List(context.Background(), opts)
},
- WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) {
+ WatchFunc: func(opts metav1.ListOptions) (watch.Interface, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().PodMonitors(namespace).Watch(context.Background(), options)
+ return client.MonitoringV1().PodMonitors(namespace).Watch(context.Background(), opts)
},
- ListWithContextFunc: func(ctx context.Context, options metav1.ListOptions) (runtime.Object, error) {
+ ListWithContextFunc: func(ctx context.Context, opts metav1.ListOptions) (runtime.Object, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().PodMonitors(namespace).List(ctx, options)
+ return client.MonitoringV1().PodMonitors(namespace).List(ctx, opts)
},
- WatchFuncWithContext: func(ctx context.Context, options metav1.ListOptions) (watch.Interface, error) {
+ WatchFuncWithContext: func(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().PodMonitors(namespace).Watch(ctx, options)
+ return client.MonitoringV1().PodMonitors(namespace).Watch(ctx, opts)
},
}, client),
&apismonitoringv1.PodMonitor{},
- resyncPeriod,
- indexers,
+ cache.SharedIndexInformerOptions{
+ ResyncPeriod: options.ResyncPeriod,
+ Indexers: options.Indexers,
+ Identifier: identifier,
+ },
)
}
func (f *podMonitorInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
- return NewFilteredPodMonitorInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
+ return NewPodMonitorInformerWithOptions(client, f.namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, InformerName: f.factory.InformerName(), TweakListOptions: f.tweakListOptions})
}
func (f *podMonitorInformer) Informer() cache.SharedIndexInformer {
diff --git a/pkg/client/informers/externalversions/monitoring/v1/probe.go b/pkg/client/informers/externalversions/monitoring/v1/probe.go
index 8cf49089787..4c42e425b6d 100644
--- a/pkg/client/informers/externalversions/monitoring/v1/probe.go
+++ b/pkg/client/informers/externalversions/monitoring/v1/probe.go
@@ -26,6 +26,7 @@ import (
versioned "github.com/prometheus-operator/prometheus-operator/pkg/client/versioned"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
runtime "k8s.io/apimachinery/pkg/runtime"
+ schema "k8s.io/apimachinery/pkg/runtime/schema"
watch "k8s.io/apimachinery/pkg/watch"
cache "k8s.io/client-go/tools/cache"
)
@@ -47,48 +48,61 @@ type probeInformer struct {
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
func NewProbeInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
- return NewFilteredProbeInformer(client, namespace, resyncPeriod, indexers, nil)
+ return NewProbeInformerWithOptions(client, namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: indexers})
}
// NewFilteredProbeInformer constructs a new informer for Probe type.
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
func NewFilteredProbeInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
- return cache.NewSharedIndexInformer(
+ return NewProbeInformerWithOptions(client, namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: indexers, TweakListOptions: tweakListOptions})
+}
+
+// NewProbeInformerWithOptions constructs a new informer for Probe type with additional options.
+// Always prefer using an informer factory to get a shared informer instead of getting an independent
+// one. This reduces memory footprint and number of connections to the server.
+func NewProbeInformerWithOptions(client versioned.Interface, namespace string, options internalinterfaces.InformerOptions) cache.SharedIndexInformer {
+ gvr := schema.GroupVersionResource{Group: "monitoring.coreos.com", Version: "v1", Resource: "probes"}
+ identifier := options.InformerName.WithResource(gvr)
+ tweakListOptions := options.TweakListOptions
+ return cache.NewSharedIndexInformerWithOptions(
cache.ToListWatcherWithWatchListSemantics(&cache.ListWatch{
- ListFunc: func(options metav1.ListOptions) (runtime.Object, error) {
+ ListFunc: func(opts metav1.ListOptions) (runtime.Object, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().Probes(namespace).List(context.Background(), options)
+ return client.MonitoringV1().Probes(namespace).List(context.Background(), opts)
},
- WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) {
+ WatchFunc: func(opts metav1.ListOptions) (watch.Interface, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().Probes(namespace).Watch(context.Background(), options)
+ return client.MonitoringV1().Probes(namespace).Watch(context.Background(), opts)
},
- ListWithContextFunc: func(ctx context.Context, options metav1.ListOptions) (runtime.Object, error) {
+ ListWithContextFunc: func(ctx context.Context, opts metav1.ListOptions) (runtime.Object, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().Probes(namespace).List(ctx, options)
+ return client.MonitoringV1().Probes(namespace).List(ctx, opts)
},
- WatchFuncWithContext: func(ctx context.Context, options metav1.ListOptions) (watch.Interface, error) {
+ WatchFuncWithContext: func(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().Probes(namespace).Watch(ctx, options)
+ return client.MonitoringV1().Probes(namespace).Watch(ctx, opts)
},
}, client),
&apismonitoringv1.Probe{},
- resyncPeriod,
- indexers,
+ cache.SharedIndexInformerOptions{
+ ResyncPeriod: options.ResyncPeriod,
+ Indexers: options.Indexers,
+ Identifier: identifier,
+ },
)
}
func (f *probeInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
- return NewFilteredProbeInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
+ return NewProbeInformerWithOptions(client, f.namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, InformerName: f.factory.InformerName(), TweakListOptions: f.tweakListOptions})
}
func (f *probeInformer) Informer() cache.SharedIndexInformer {
diff --git a/pkg/client/informers/externalversions/monitoring/v1/prometheus.go b/pkg/client/informers/externalversions/monitoring/v1/prometheus.go
index c61eb3d49c3..0695dbb6ac0 100644
--- a/pkg/client/informers/externalversions/monitoring/v1/prometheus.go
+++ b/pkg/client/informers/externalversions/monitoring/v1/prometheus.go
@@ -26,6 +26,7 @@ import (
versioned "github.com/prometheus-operator/prometheus-operator/pkg/client/versioned"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
runtime "k8s.io/apimachinery/pkg/runtime"
+ schema "k8s.io/apimachinery/pkg/runtime/schema"
watch "k8s.io/apimachinery/pkg/watch"
cache "k8s.io/client-go/tools/cache"
)
@@ -47,48 +48,61 @@ type prometheusInformer struct {
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
func NewPrometheusInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
- return NewFilteredPrometheusInformer(client, namespace, resyncPeriod, indexers, nil)
+ return NewPrometheusInformerWithOptions(client, namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: indexers})
}
// NewFilteredPrometheusInformer constructs a new informer for Prometheus type.
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
func NewFilteredPrometheusInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
- return cache.NewSharedIndexInformer(
+ return NewPrometheusInformerWithOptions(client, namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: indexers, TweakListOptions: tweakListOptions})
+}
+
+// NewPrometheusInformerWithOptions constructs a new informer for Prometheus type with additional options.
+// Always prefer using an informer factory to get a shared informer instead of getting an independent
+// one. This reduces memory footprint and number of connections to the server.
+func NewPrometheusInformerWithOptions(client versioned.Interface, namespace string, options internalinterfaces.InformerOptions) cache.SharedIndexInformer {
+ gvr := schema.GroupVersionResource{Group: "monitoring.coreos.com", Version: "v1", Resource: "prometheuss"}
+ identifier := options.InformerName.WithResource(gvr)
+ tweakListOptions := options.TweakListOptions
+ return cache.NewSharedIndexInformerWithOptions(
cache.ToListWatcherWithWatchListSemantics(&cache.ListWatch{
- ListFunc: func(options metav1.ListOptions) (runtime.Object, error) {
+ ListFunc: func(opts metav1.ListOptions) (runtime.Object, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().Prometheuses(namespace).List(context.Background(), options)
+ return client.MonitoringV1().Prometheuses(namespace).List(context.Background(), opts)
},
- WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) {
+ WatchFunc: func(opts metav1.ListOptions) (watch.Interface, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().Prometheuses(namespace).Watch(context.Background(), options)
+ return client.MonitoringV1().Prometheuses(namespace).Watch(context.Background(), opts)
},
- ListWithContextFunc: func(ctx context.Context, options metav1.ListOptions) (runtime.Object, error) {
+ ListWithContextFunc: func(ctx context.Context, opts metav1.ListOptions) (runtime.Object, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().Prometheuses(namespace).List(ctx, options)
+ return client.MonitoringV1().Prometheuses(namespace).List(ctx, opts)
},
- WatchFuncWithContext: func(ctx context.Context, options metav1.ListOptions) (watch.Interface, error) {
+ WatchFuncWithContext: func(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().Prometheuses(namespace).Watch(ctx, options)
+ return client.MonitoringV1().Prometheuses(namespace).Watch(ctx, opts)
},
}, client),
&apismonitoringv1.Prometheus{},
- resyncPeriod,
- indexers,
+ cache.SharedIndexInformerOptions{
+ ResyncPeriod: options.ResyncPeriod,
+ Indexers: options.Indexers,
+ Identifier: identifier,
+ },
)
}
func (f *prometheusInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
- return NewFilteredPrometheusInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
+ return NewPrometheusInformerWithOptions(client, f.namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, InformerName: f.factory.InformerName(), TweakListOptions: f.tweakListOptions})
}
func (f *prometheusInformer) Informer() cache.SharedIndexInformer {
diff --git a/pkg/client/informers/externalversions/monitoring/v1/prometheusrule.go b/pkg/client/informers/externalversions/monitoring/v1/prometheusrule.go
index 59aceff1023..0cab9c4cdef 100644
--- a/pkg/client/informers/externalversions/monitoring/v1/prometheusrule.go
+++ b/pkg/client/informers/externalversions/monitoring/v1/prometheusrule.go
@@ -26,6 +26,7 @@ import (
versioned "github.com/prometheus-operator/prometheus-operator/pkg/client/versioned"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
runtime "k8s.io/apimachinery/pkg/runtime"
+ schema "k8s.io/apimachinery/pkg/runtime/schema"
watch "k8s.io/apimachinery/pkg/watch"
cache "k8s.io/client-go/tools/cache"
)
@@ -47,48 +48,61 @@ type prometheusRuleInformer struct {
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
func NewPrometheusRuleInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
- return NewFilteredPrometheusRuleInformer(client, namespace, resyncPeriod, indexers, nil)
+ return NewPrometheusRuleInformerWithOptions(client, namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: indexers})
}
// NewFilteredPrometheusRuleInformer constructs a new informer for PrometheusRule type.
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
func NewFilteredPrometheusRuleInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
- return cache.NewSharedIndexInformer(
+ return NewPrometheusRuleInformerWithOptions(client, namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: indexers, TweakListOptions: tweakListOptions})
+}
+
+// NewPrometheusRuleInformerWithOptions constructs a new informer for PrometheusRule type with additional options.
+// Always prefer using an informer factory to get a shared informer instead of getting an independent
+// one. This reduces memory footprint and number of connections to the server.
+func NewPrometheusRuleInformerWithOptions(client versioned.Interface, namespace string, options internalinterfaces.InformerOptions) cache.SharedIndexInformer {
+ gvr := schema.GroupVersionResource{Group: "monitoring.coreos.com", Version: "v1", Resource: "prometheusrules"}
+ identifier := options.InformerName.WithResource(gvr)
+ tweakListOptions := options.TweakListOptions
+ return cache.NewSharedIndexInformerWithOptions(
cache.ToListWatcherWithWatchListSemantics(&cache.ListWatch{
- ListFunc: func(options metav1.ListOptions) (runtime.Object, error) {
+ ListFunc: func(opts metav1.ListOptions) (runtime.Object, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().PrometheusRules(namespace).List(context.Background(), options)
+ return client.MonitoringV1().PrometheusRules(namespace).List(context.Background(), opts)
},
- WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) {
+ WatchFunc: func(opts metav1.ListOptions) (watch.Interface, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().PrometheusRules(namespace).Watch(context.Background(), options)
+ return client.MonitoringV1().PrometheusRules(namespace).Watch(context.Background(), opts)
},
- ListWithContextFunc: func(ctx context.Context, options metav1.ListOptions) (runtime.Object, error) {
+ ListWithContextFunc: func(ctx context.Context, opts metav1.ListOptions) (runtime.Object, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().PrometheusRules(namespace).List(ctx, options)
+ return client.MonitoringV1().PrometheusRules(namespace).List(ctx, opts)
},
- WatchFuncWithContext: func(ctx context.Context, options metav1.ListOptions) (watch.Interface, error) {
+ WatchFuncWithContext: func(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().PrometheusRules(namespace).Watch(ctx, options)
+ return client.MonitoringV1().PrometheusRules(namespace).Watch(ctx, opts)
},
}, client),
&apismonitoringv1.PrometheusRule{},
- resyncPeriod,
- indexers,
+ cache.SharedIndexInformerOptions{
+ ResyncPeriod: options.ResyncPeriod,
+ Indexers: options.Indexers,
+ Identifier: identifier,
+ },
)
}
func (f *prometheusRuleInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
- return NewFilteredPrometheusRuleInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
+ return NewPrometheusRuleInformerWithOptions(client, f.namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, InformerName: f.factory.InformerName(), TweakListOptions: f.tweakListOptions})
}
func (f *prometheusRuleInformer) Informer() cache.SharedIndexInformer {
diff --git a/pkg/client/informers/externalversions/monitoring/v1/servicemonitor.go b/pkg/client/informers/externalversions/monitoring/v1/servicemonitor.go
index c66ecbf1842..591b8e9fc2d 100644
--- a/pkg/client/informers/externalversions/monitoring/v1/servicemonitor.go
+++ b/pkg/client/informers/externalversions/monitoring/v1/servicemonitor.go
@@ -26,6 +26,7 @@ import (
versioned "github.com/prometheus-operator/prometheus-operator/pkg/client/versioned"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
runtime "k8s.io/apimachinery/pkg/runtime"
+ schema "k8s.io/apimachinery/pkg/runtime/schema"
watch "k8s.io/apimachinery/pkg/watch"
cache "k8s.io/client-go/tools/cache"
)
@@ -47,48 +48,61 @@ type serviceMonitorInformer struct {
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
func NewServiceMonitorInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
- return NewFilteredServiceMonitorInformer(client, namespace, resyncPeriod, indexers, nil)
+ return NewServiceMonitorInformerWithOptions(client, namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: indexers})
}
// NewFilteredServiceMonitorInformer constructs a new informer for ServiceMonitor type.
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
func NewFilteredServiceMonitorInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
- return cache.NewSharedIndexInformer(
+ return NewServiceMonitorInformerWithOptions(client, namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: indexers, TweakListOptions: tweakListOptions})
+}
+
+// NewServiceMonitorInformerWithOptions constructs a new informer for ServiceMonitor type with additional options.
+// Always prefer using an informer factory to get a shared informer instead of getting an independent
+// one. This reduces memory footprint and number of connections to the server.
+func NewServiceMonitorInformerWithOptions(client versioned.Interface, namespace string, options internalinterfaces.InformerOptions) cache.SharedIndexInformer {
+ gvr := schema.GroupVersionResource{Group: "monitoring.coreos.com", Version: "v1", Resource: "servicemonitors"}
+ identifier := options.InformerName.WithResource(gvr)
+ tweakListOptions := options.TweakListOptions
+ return cache.NewSharedIndexInformerWithOptions(
cache.ToListWatcherWithWatchListSemantics(&cache.ListWatch{
- ListFunc: func(options metav1.ListOptions) (runtime.Object, error) {
+ ListFunc: func(opts metav1.ListOptions) (runtime.Object, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().ServiceMonitors(namespace).List(context.Background(), options)
+ return client.MonitoringV1().ServiceMonitors(namespace).List(context.Background(), opts)
},
- WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) {
+ WatchFunc: func(opts metav1.ListOptions) (watch.Interface, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().ServiceMonitors(namespace).Watch(context.Background(), options)
+ return client.MonitoringV1().ServiceMonitors(namespace).Watch(context.Background(), opts)
},
- ListWithContextFunc: func(ctx context.Context, options metav1.ListOptions) (runtime.Object, error) {
+ ListWithContextFunc: func(ctx context.Context, opts metav1.ListOptions) (runtime.Object, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().ServiceMonitors(namespace).List(ctx, options)
+ return client.MonitoringV1().ServiceMonitors(namespace).List(ctx, opts)
},
- WatchFuncWithContext: func(ctx context.Context, options metav1.ListOptions) (watch.Interface, error) {
+ WatchFuncWithContext: func(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().ServiceMonitors(namespace).Watch(ctx, options)
+ return client.MonitoringV1().ServiceMonitors(namespace).Watch(ctx, opts)
},
}, client),
&apismonitoringv1.ServiceMonitor{},
- resyncPeriod,
- indexers,
+ cache.SharedIndexInformerOptions{
+ ResyncPeriod: options.ResyncPeriod,
+ Indexers: options.Indexers,
+ Identifier: identifier,
+ },
)
}
func (f *serviceMonitorInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
- return NewFilteredServiceMonitorInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
+ return NewServiceMonitorInformerWithOptions(client, f.namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, InformerName: f.factory.InformerName(), TweakListOptions: f.tweakListOptions})
}
func (f *serviceMonitorInformer) Informer() cache.SharedIndexInformer {
diff --git a/pkg/client/informers/externalversions/monitoring/v1/thanosruler.go b/pkg/client/informers/externalversions/monitoring/v1/thanosruler.go
index 8fdb5d028aa..5d1ca3a69a3 100644
--- a/pkg/client/informers/externalversions/monitoring/v1/thanosruler.go
+++ b/pkg/client/informers/externalversions/monitoring/v1/thanosruler.go
@@ -26,6 +26,7 @@ import (
versioned "github.com/prometheus-operator/prometheus-operator/pkg/client/versioned"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
runtime "k8s.io/apimachinery/pkg/runtime"
+ schema "k8s.io/apimachinery/pkg/runtime/schema"
watch "k8s.io/apimachinery/pkg/watch"
cache "k8s.io/client-go/tools/cache"
)
@@ -47,48 +48,61 @@ type thanosRulerInformer struct {
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
func NewThanosRulerInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
- return NewFilteredThanosRulerInformer(client, namespace, resyncPeriod, indexers, nil)
+ return NewThanosRulerInformerWithOptions(client, namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: indexers})
}
// NewFilteredThanosRulerInformer constructs a new informer for ThanosRuler type.
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
func NewFilteredThanosRulerInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
- return cache.NewSharedIndexInformer(
+ return NewThanosRulerInformerWithOptions(client, namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: indexers, TweakListOptions: tweakListOptions})
+}
+
+// NewThanosRulerInformerWithOptions constructs a new informer for ThanosRuler type with additional options.
+// Always prefer using an informer factory to get a shared informer instead of getting an independent
+// one. This reduces memory footprint and number of connections to the server.
+func NewThanosRulerInformerWithOptions(client versioned.Interface, namespace string, options internalinterfaces.InformerOptions) cache.SharedIndexInformer {
+ gvr := schema.GroupVersionResource{Group: "monitoring.coreos.com", Version: "v1", Resource: "thanosrulers"}
+ identifier := options.InformerName.WithResource(gvr)
+ tweakListOptions := options.TweakListOptions
+ return cache.NewSharedIndexInformerWithOptions(
cache.ToListWatcherWithWatchListSemantics(&cache.ListWatch{
- ListFunc: func(options metav1.ListOptions) (runtime.Object, error) {
+ ListFunc: func(opts metav1.ListOptions) (runtime.Object, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().ThanosRulers(namespace).List(context.Background(), options)
+ return client.MonitoringV1().ThanosRulers(namespace).List(context.Background(), opts)
},
- WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) {
+ WatchFunc: func(opts metav1.ListOptions) (watch.Interface, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().ThanosRulers(namespace).Watch(context.Background(), options)
+ return client.MonitoringV1().ThanosRulers(namespace).Watch(context.Background(), opts)
},
- ListWithContextFunc: func(ctx context.Context, options metav1.ListOptions) (runtime.Object, error) {
+ ListWithContextFunc: func(ctx context.Context, opts metav1.ListOptions) (runtime.Object, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().ThanosRulers(namespace).List(ctx, options)
+ return client.MonitoringV1().ThanosRulers(namespace).List(ctx, opts)
},
- WatchFuncWithContext: func(ctx context.Context, options metav1.ListOptions) (watch.Interface, error) {
+ WatchFuncWithContext: func(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1().ThanosRulers(namespace).Watch(ctx, options)
+ return client.MonitoringV1().ThanosRulers(namespace).Watch(ctx, opts)
},
}, client),
&apismonitoringv1.ThanosRuler{},
- resyncPeriod,
- indexers,
+ cache.SharedIndexInformerOptions{
+ ResyncPeriod: options.ResyncPeriod,
+ Indexers: options.Indexers,
+ Identifier: identifier,
+ },
)
}
func (f *thanosRulerInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
- return NewFilteredThanosRulerInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
+ return NewThanosRulerInformerWithOptions(client, f.namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, InformerName: f.factory.InformerName(), TweakListOptions: f.tweakListOptions})
}
func (f *thanosRulerInformer) Informer() cache.SharedIndexInformer {
diff --git a/pkg/client/informers/externalversions/monitoring/v1alpha1/alertmanagerconfig.go b/pkg/client/informers/externalversions/monitoring/v1alpha1/alertmanagerconfig.go
index d31a680d108..bdce2a45724 100644
--- a/pkg/client/informers/externalversions/monitoring/v1alpha1/alertmanagerconfig.go
+++ b/pkg/client/informers/externalversions/monitoring/v1alpha1/alertmanagerconfig.go
@@ -26,6 +26,7 @@ import (
versioned "github.com/prometheus-operator/prometheus-operator/pkg/client/versioned"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
runtime "k8s.io/apimachinery/pkg/runtime"
+ schema "k8s.io/apimachinery/pkg/runtime/schema"
watch "k8s.io/apimachinery/pkg/watch"
cache "k8s.io/client-go/tools/cache"
)
@@ -47,48 +48,61 @@ type alertmanagerConfigInformer struct {
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
func NewAlertmanagerConfigInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
- return NewFilteredAlertmanagerConfigInformer(client, namespace, resyncPeriod, indexers, nil)
+ return NewAlertmanagerConfigInformerWithOptions(client, namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: indexers})
}
// NewFilteredAlertmanagerConfigInformer constructs a new informer for AlertmanagerConfig type.
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
func NewFilteredAlertmanagerConfigInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
- return cache.NewSharedIndexInformer(
+ return NewAlertmanagerConfigInformerWithOptions(client, namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: indexers, TweakListOptions: tweakListOptions})
+}
+
+// NewAlertmanagerConfigInformerWithOptions constructs a new informer for AlertmanagerConfig type with additional options.
+// Always prefer using an informer factory to get a shared informer instead of getting an independent
+// one. This reduces memory footprint and number of connections to the server.
+func NewAlertmanagerConfigInformerWithOptions(client versioned.Interface, namespace string, options internalinterfaces.InformerOptions) cache.SharedIndexInformer {
+ gvr := schema.GroupVersionResource{Group: "monitoring.coreos.com", Version: "v1alpha1", Resource: "alertmanagerconfigs"}
+ identifier := options.InformerName.WithResource(gvr)
+ tweakListOptions := options.TweakListOptions
+ return cache.NewSharedIndexInformerWithOptions(
cache.ToListWatcherWithWatchListSemantics(&cache.ListWatch{
- ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
+ ListFunc: func(opts v1.ListOptions) (runtime.Object, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1alpha1().AlertmanagerConfigs(namespace).List(context.Background(), options)
+ return client.MonitoringV1alpha1().AlertmanagerConfigs(namespace).List(context.Background(), opts)
},
- WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
+ WatchFunc: func(opts v1.ListOptions) (watch.Interface, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1alpha1().AlertmanagerConfigs(namespace).Watch(context.Background(), options)
+ return client.MonitoringV1alpha1().AlertmanagerConfigs(namespace).Watch(context.Background(), opts)
},
- ListWithContextFunc: func(ctx context.Context, options v1.ListOptions) (runtime.Object, error) {
+ ListWithContextFunc: func(ctx context.Context, opts v1.ListOptions) (runtime.Object, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1alpha1().AlertmanagerConfigs(namespace).List(ctx, options)
+ return client.MonitoringV1alpha1().AlertmanagerConfigs(namespace).List(ctx, opts)
},
- WatchFuncWithContext: func(ctx context.Context, options v1.ListOptions) (watch.Interface, error) {
+ WatchFuncWithContext: func(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1alpha1().AlertmanagerConfigs(namespace).Watch(ctx, options)
+ return client.MonitoringV1alpha1().AlertmanagerConfigs(namespace).Watch(ctx, opts)
},
}, client),
&apismonitoringv1alpha1.AlertmanagerConfig{},
- resyncPeriod,
- indexers,
+ cache.SharedIndexInformerOptions{
+ ResyncPeriod: options.ResyncPeriod,
+ Indexers: options.Indexers,
+ Identifier: identifier,
+ },
)
}
func (f *alertmanagerConfigInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
- return NewFilteredAlertmanagerConfigInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
+ return NewAlertmanagerConfigInformerWithOptions(client, f.namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, InformerName: f.factory.InformerName(), TweakListOptions: f.tweakListOptions})
}
func (f *alertmanagerConfigInformer) Informer() cache.SharedIndexInformer {
diff --git a/pkg/client/informers/externalversions/monitoring/v1alpha1/prometheusagent.go b/pkg/client/informers/externalversions/monitoring/v1alpha1/prometheusagent.go
index ce2df0e968d..9e6bf696ae7 100644
--- a/pkg/client/informers/externalversions/monitoring/v1alpha1/prometheusagent.go
+++ b/pkg/client/informers/externalversions/monitoring/v1alpha1/prometheusagent.go
@@ -26,6 +26,7 @@ import (
versioned "github.com/prometheus-operator/prometheus-operator/pkg/client/versioned"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
runtime "k8s.io/apimachinery/pkg/runtime"
+ schema "k8s.io/apimachinery/pkg/runtime/schema"
watch "k8s.io/apimachinery/pkg/watch"
cache "k8s.io/client-go/tools/cache"
)
@@ -47,48 +48,61 @@ type prometheusAgentInformer struct {
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
func NewPrometheusAgentInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
- return NewFilteredPrometheusAgentInformer(client, namespace, resyncPeriod, indexers, nil)
+ return NewPrometheusAgentInformerWithOptions(client, namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: indexers})
}
// NewFilteredPrometheusAgentInformer constructs a new informer for PrometheusAgent type.
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
func NewFilteredPrometheusAgentInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
- return cache.NewSharedIndexInformer(
+ return NewPrometheusAgentInformerWithOptions(client, namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: indexers, TweakListOptions: tweakListOptions})
+}
+
+// NewPrometheusAgentInformerWithOptions constructs a new informer for PrometheusAgent type with additional options.
+// Always prefer using an informer factory to get a shared informer instead of getting an independent
+// one. This reduces memory footprint and number of connections to the server.
+func NewPrometheusAgentInformerWithOptions(client versioned.Interface, namespace string, options internalinterfaces.InformerOptions) cache.SharedIndexInformer {
+ gvr := schema.GroupVersionResource{Group: "monitoring.coreos.com", Version: "v1alpha1", Resource: "prometheusagents"}
+ identifier := options.InformerName.WithResource(gvr)
+ tweakListOptions := options.TweakListOptions
+ return cache.NewSharedIndexInformerWithOptions(
cache.ToListWatcherWithWatchListSemantics(&cache.ListWatch{
- ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
+ ListFunc: func(opts v1.ListOptions) (runtime.Object, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1alpha1().PrometheusAgents(namespace).List(context.Background(), options)
+ return client.MonitoringV1alpha1().PrometheusAgents(namespace).List(context.Background(), opts)
},
- WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
+ WatchFunc: func(opts v1.ListOptions) (watch.Interface, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1alpha1().PrometheusAgents(namespace).Watch(context.Background(), options)
+ return client.MonitoringV1alpha1().PrometheusAgents(namespace).Watch(context.Background(), opts)
},
- ListWithContextFunc: func(ctx context.Context, options v1.ListOptions) (runtime.Object, error) {
+ ListWithContextFunc: func(ctx context.Context, opts v1.ListOptions) (runtime.Object, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1alpha1().PrometheusAgents(namespace).List(ctx, options)
+ return client.MonitoringV1alpha1().PrometheusAgents(namespace).List(ctx, opts)
},
- WatchFuncWithContext: func(ctx context.Context, options v1.ListOptions) (watch.Interface, error) {
+ WatchFuncWithContext: func(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1alpha1().PrometheusAgents(namespace).Watch(ctx, options)
+ return client.MonitoringV1alpha1().PrometheusAgents(namespace).Watch(ctx, opts)
},
}, client),
&apismonitoringv1alpha1.PrometheusAgent{},
- resyncPeriod,
- indexers,
+ cache.SharedIndexInformerOptions{
+ ResyncPeriod: options.ResyncPeriod,
+ Indexers: options.Indexers,
+ Identifier: identifier,
+ },
)
}
func (f *prometheusAgentInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
- return NewFilteredPrometheusAgentInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
+ return NewPrometheusAgentInformerWithOptions(client, f.namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, InformerName: f.factory.InformerName(), TweakListOptions: f.tweakListOptions})
}
func (f *prometheusAgentInformer) Informer() cache.SharedIndexInformer {
diff --git a/pkg/client/informers/externalversions/monitoring/v1alpha1/scrapeconfig.go b/pkg/client/informers/externalversions/monitoring/v1alpha1/scrapeconfig.go
index 3bc9a78f076..34a3ae9cb5f 100644
--- a/pkg/client/informers/externalversions/monitoring/v1alpha1/scrapeconfig.go
+++ b/pkg/client/informers/externalversions/monitoring/v1alpha1/scrapeconfig.go
@@ -26,6 +26,7 @@ import (
versioned "github.com/prometheus-operator/prometheus-operator/pkg/client/versioned"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
runtime "k8s.io/apimachinery/pkg/runtime"
+ schema "k8s.io/apimachinery/pkg/runtime/schema"
watch "k8s.io/apimachinery/pkg/watch"
cache "k8s.io/client-go/tools/cache"
)
@@ -47,48 +48,61 @@ type scrapeConfigInformer struct {
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
func NewScrapeConfigInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
- return NewFilteredScrapeConfigInformer(client, namespace, resyncPeriod, indexers, nil)
+ return NewScrapeConfigInformerWithOptions(client, namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: indexers})
}
// NewFilteredScrapeConfigInformer constructs a new informer for ScrapeConfig type.
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
func NewFilteredScrapeConfigInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
- return cache.NewSharedIndexInformer(
+ return NewScrapeConfigInformerWithOptions(client, namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: indexers, TweakListOptions: tweakListOptions})
+}
+
+// NewScrapeConfigInformerWithOptions constructs a new informer for ScrapeConfig type with additional options.
+// Always prefer using an informer factory to get a shared informer instead of getting an independent
+// one. This reduces memory footprint and number of connections to the server.
+func NewScrapeConfigInformerWithOptions(client versioned.Interface, namespace string, options internalinterfaces.InformerOptions) cache.SharedIndexInformer {
+ gvr := schema.GroupVersionResource{Group: "monitoring.coreos.com", Version: "v1alpha1", Resource: "scrapeconfigs"}
+ identifier := options.InformerName.WithResource(gvr)
+ tweakListOptions := options.TweakListOptions
+ return cache.NewSharedIndexInformerWithOptions(
cache.ToListWatcherWithWatchListSemantics(&cache.ListWatch{
- ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
+ ListFunc: func(opts v1.ListOptions) (runtime.Object, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1alpha1().ScrapeConfigs(namespace).List(context.Background(), options)
+ return client.MonitoringV1alpha1().ScrapeConfigs(namespace).List(context.Background(), opts)
},
- WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
+ WatchFunc: func(opts v1.ListOptions) (watch.Interface, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1alpha1().ScrapeConfigs(namespace).Watch(context.Background(), options)
+ return client.MonitoringV1alpha1().ScrapeConfigs(namespace).Watch(context.Background(), opts)
},
- ListWithContextFunc: func(ctx context.Context, options v1.ListOptions) (runtime.Object, error) {
+ ListWithContextFunc: func(ctx context.Context, opts v1.ListOptions) (runtime.Object, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1alpha1().ScrapeConfigs(namespace).List(ctx, options)
+ return client.MonitoringV1alpha1().ScrapeConfigs(namespace).List(ctx, opts)
},
- WatchFuncWithContext: func(ctx context.Context, options v1.ListOptions) (watch.Interface, error) {
+ WatchFuncWithContext: func(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1alpha1().ScrapeConfigs(namespace).Watch(ctx, options)
+ return client.MonitoringV1alpha1().ScrapeConfigs(namespace).Watch(ctx, opts)
},
}, client),
&apismonitoringv1alpha1.ScrapeConfig{},
- resyncPeriod,
- indexers,
+ cache.SharedIndexInformerOptions{
+ ResyncPeriod: options.ResyncPeriod,
+ Indexers: options.Indexers,
+ Identifier: identifier,
+ },
)
}
func (f *scrapeConfigInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
- return NewFilteredScrapeConfigInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
+ return NewScrapeConfigInformerWithOptions(client, f.namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, InformerName: f.factory.InformerName(), TweakListOptions: f.tweakListOptions})
}
func (f *scrapeConfigInformer) Informer() cache.SharedIndexInformer {
diff --git a/pkg/client/informers/externalversions/monitoring/v1beta1/alertmanagerconfig.go b/pkg/client/informers/externalversions/monitoring/v1beta1/alertmanagerconfig.go
index 7930f670c6f..ee4cddf4e38 100644
--- a/pkg/client/informers/externalversions/monitoring/v1beta1/alertmanagerconfig.go
+++ b/pkg/client/informers/externalversions/monitoring/v1beta1/alertmanagerconfig.go
@@ -26,6 +26,7 @@ import (
versioned "github.com/prometheus-operator/prometheus-operator/pkg/client/versioned"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
runtime "k8s.io/apimachinery/pkg/runtime"
+ schema "k8s.io/apimachinery/pkg/runtime/schema"
watch "k8s.io/apimachinery/pkg/watch"
cache "k8s.io/client-go/tools/cache"
)
@@ -47,48 +48,61 @@ type alertmanagerConfigInformer struct {
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
func NewAlertmanagerConfigInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
- return NewFilteredAlertmanagerConfigInformer(client, namespace, resyncPeriod, indexers, nil)
+ return NewAlertmanagerConfigInformerWithOptions(client, namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: indexers})
}
// NewFilteredAlertmanagerConfigInformer constructs a new informer for AlertmanagerConfig type.
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
func NewFilteredAlertmanagerConfigInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
- return cache.NewSharedIndexInformer(
+ return NewAlertmanagerConfigInformerWithOptions(client, namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: indexers, TweakListOptions: tweakListOptions})
+}
+
+// NewAlertmanagerConfigInformerWithOptions constructs a new informer for AlertmanagerConfig type with additional options.
+// Always prefer using an informer factory to get a shared informer instead of getting an independent
+// one. This reduces memory footprint and number of connections to the server.
+func NewAlertmanagerConfigInformerWithOptions(client versioned.Interface, namespace string, options internalinterfaces.InformerOptions) cache.SharedIndexInformer {
+ gvr := schema.GroupVersionResource{Group: "monitoring.coreos.com", Version: "v1beta1", Resource: "alertmanagerconfigs"}
+ identifier := options.InformerName.WithResource(gvr)
+ tweakListOptions := options.TweakListOptions
+ return cache.NewSharedIndexInformerWithOptions(
cache.ToListWatcherWithWatchListSemantics(&cache.ListWatch{
- ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
+ ListFunc: func(opts v1.ListOptions) (runtime.Object, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1beta1().AlertmanagerConfigs(namespace).List(context.Background(), options)
+ return client.MonitoringV1beta1().AlertmanagerConfigs(namespace).List(context.Background(), opts)
},
- WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
+ WatchFunc: func(opts v1.ListOptions) (watch.Interface, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1beta1().AlertmanagerConfigs(namespace).Watch(context.Background(), options)
+ return client.MonitoringV1beta1().AlertmanagerConfigs(namespace).Watch(context.Background(), opts)
},
- ListWithContextFunc: func(ctx context.Context, options v1.ListOptions) (runtime.Object, error) {
+ ListWithContextFunc: func(ctx context.Context, opts v1.ListOptions) (runtime.Object, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1beta1().AlertmanagerConfigs(namespace).List(ctx, options)
+ return client.MonitoringV1beta1().AlertmanagerConfigs(namespace).List(ctx, opts)
},
- WatchFuncWithContext: func(ctx context.Context, options v1.ListOptions) (watch.Interface, error) {
+ WatchFuncWithContext: func(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
if tweakListOptions != nil {
- tweakListOptions(&options)
+ tweakListOptions(&opts)
}
- return client.MonitoringV1beta1().AlertmanagerConfigs(namespace).Watch(ctx, options)
+ return client.MonitoringV1beta1().AlertmanagerConfigs(namespace).Watch(ctx, opts)
},
}, client),
&apismonitoringv1beta1.AlertmanagerConfig{},
- resyncPeriod,
- indexers,
+ cache.SharedIndexInformerOptions{
+ ResyncPeriod: options.ResyncPeriod,
+ Indexers: options.Indexers,
+ Identifier: identifier,
+ },
)
}
func (f *alertmanagerConfigInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
- return NewFilteredAlertmanagerConfigInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
+ return NewAlertmanagerConfigInformerWithOptions(client, f.namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, InformerName: f.factory.InformerName(), TweakListOptions: f.tweakListOptions})
}
func (f *alertmanagerConfigInformer) Informer() cache.SharedIndexInformer {
diff --git a/pkg/client/versioned/fake/clientset_generated.go b/pkg/client/versioned/fake/clientset_generated.go
index d4fc60b4439..e59ce2a851d 100644
--- a/pkg/client/versioned/fake/clientset_generated.go
+++ b/pkg/client/versioned/fake/clientset_generated.go
@@ -37,10 +37,6 @@ import (
// It's backed by a very simple object tracker that processes creates, updates and deletions as-is,
// without applying any field management, validations and/or defaults. It shouldn't be considered a replacement
// for a real clientset and is mostly useful in simple unit tests.
-//
-// Deprecated: NewClientset replaces this with support for field management, which significantly improves
-// server side apply testing. NewClientset is only available when apply configurations are generated (e.g.
-// via --with-applyconfig).
func NewSimpleClientset(objects ...runtime.Object) *Clientset {
o := testing.NewObjectTracker(scheme, codecs.UniversalDecoder())
for _, obj := range objects {
@@ -86,7 +82,7 @@ func (c *Clientset) Tracker() testing.ObjectTracker {
return c.tracker
}
-// IsWatchListSemanticsSupported informs the reflector that this client
+// IsWatchListSemanticsUnSupported informs the reflector that this client
// doesn't support WatchList semantics.
//
// This is a synthetic method whose sole purpose is to satisfy the optional
@@ -101,6 +97,10 @@ func (c *Clientset) IsWatchListSemanticsUnSupported() bool {
// It's backed by a very simple object tracker that processes creates, updates and deletions as-is,
// without applying any validations and/or defaults. It shouldn't be considered a replacement
// for a real clientset and is mostly useful in simple unit tests.
+//
+// Compared to NewSimpleClientset, the Clientset returned here supports field tracking and thus
+// server-side apply. Beware though that support in that for CRDs is missing
+// (https://github.com/kubernetes/kubernetes/issues/126850).
func NewClientset(objects ...runtime.Object) *Clientset {
o := testing.NewFieldManagedObjectTracker(
scheme,
diff --git a/scripts/go.mod b/scripts/go.mod
index 5d1e5ac1d15..b97751d40f0 100644
--- a/scripts/go.mod
+++ b/scripts/go.mod
@@ -1,6 +1,6 @@
module github.com/prometheus-operator/prometheus-operator/tooling
-go 1.25.0
+go 1.26.0
require (
github.com/ahmetb/gen-crd-api-reference-docs v0.3.1-0.20241111191808-71fefeed8910
@@ -11,8 +11,8 @@ require (
github.com/jsonnet-bundler/jsonnet-bundler v0.6.0
github.com/prometheus/prometheus v0.311.2
github.com/yeya24/promlinter v0.3.0
- k8s.io/code-generator v0.35.2
- sigs.k8s.io/controller-tools v0.20.1
+ k8s.io/code-generator v0.36.0
+ sigs.k8s.io/controller-tools v0.21.0
)
require (
@@ -149,8 +149,8 @@ require (
github.com/felixge/fgprof v0.9.5 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/firefart/nonamedreturns v1.0.6 // indirect
- github.com/fsnotify/fsnotify v1.9.0 // indirect
- github.com/fxamacker/cbor/v2 v2.9.0 // indirect
+ github.com/fsnotify/fsnotify v1.10.0 // indirect
+ github.com/fxamacker/cbor/v2 v2.9.1 // indirect
github.com/fzipp/gocyclo v0.6.0 // indirect
github.com/ghodss/yaml v1.0.0 // indirect
github.com/ghostiam/protogetter v0.3.20 // indirect
@@ -161,23 +161,23 @@ require (
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-openapi/analysis v0.25.0 // indirect
github.com/go-openapi/errors v0.22.7 // indirect
- github.com/go-openapi/jsonpointer v0.22.5 // indirect
+ github.com/go-openapi/jsonpointer v0.23.1 // indirect
github.com/go-openapi/jsonreference v0.21.5 // indirect
github.com/go-openapi/loads v0.23.3 // indirect
github.com/go-openapi/spec v0.22.4 // indirect
github.com/go-openapi/strfmt v0.26.1 // indirect
- github.com/go-openapi/swag v0.25.5 // indirect
- github.com/go-openapi/swag/cmdutils v0.25.5 // indirect
- github.com/go-openapi/swag/conv v0.25.5 // indirect
- github.com/go-openapi/swag/fileutils v0.25.5 // indirect
- github.com/go-openapi/swag/jsonname v0.25.5 // indirect
- github.com/go-openapi/swag/jsonutils v0.25.5 // indirect
- github.com/go-openapi/swag/loading v0.25.5 // indirect
- github.com/go-openapi/swag/mangling v0.25.5 // indirect
- github.com/go-openapi/swag/netutils v0.25.5 // indirect
- github.com/go-openapi/swag/stringutils v0.25.5 // indirect
- github.com/go-openapi/swag/typeutils v0.25.5 // indirect
- github.com/go-openapi/swag/yamlutils v0.25.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-openapi/validate v0.25.2 // indirect
github.com/go-resty/resty/v2 v2.17.2 // indirect
github.com/go-toolsmith/astcast v1.1.0 // indirect
@@ -420,7 +420,7 @@ require (
google.golang.org/genproto/googleapis/api v0.0.0-20260319201613-d00831a3d3e7 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5 // indirect
google.golang.org/grpc v1.80.0 // indirect
- google.golang.org/protobuf v1.36.11 // indirect
+ google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af // indirect
gopkg.in/alecthomas/kingpin.v2 v2.2.6 // indirect
gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
@@ -429,19 +429,19 @@ require (
gopkg.in/yaml.v3 v3.0.1 // indirect
gotest.tools/v3 v3.5.2 // indirect
honnef.co/go/tools v0.7.0 // indirect
- k8s.io/api v0.35.3 // indirect
- k8s.io/apiextensions-apiserver v0.35.2 // indirect
- k8s.io/apimachinery v0.35.3 // indirect
- k8s.io/client-go v0.35.3 // indirect
+ k8s.io/api v0.36.0 // indirect
+ k8s.io/apiextensions-apiserver v0.36.0 // indirect
+ k8s.io/apimachinery v0.36.0 // indirect
+ k8s.io/client-go v0.36.0 // indirect
k8s.io/gengo/v2 v2.0.0-20250922181213-ec3ebc5fd46b // indirect
k8s.io/klog/v2 v2.140.0 // indirect
- k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a // indirect
- k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 // indirect
+ k8s.io/kube-openapi v0.0.0-20260427204847-8949caaa1199 // indirect
+ k8s.io/utils v0.0.0-20260319190234-28399d86e0b5 // indirect
mvdan.cc/gofumpt v0.9.2 // indirect
mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15 // indirect
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect
sigs.k8s.io/randfill v1.0.0 // indirect
- sigs.k8s.io/structured-merge-diff/v6 v6.3.2 // indirect
+ sigs.k8s.io/structured-merge-diff/v6 v6.4.0 // indirect
sigs.k8s.io/yaml v1.6.0 // indirect
)
diff --git a/scripts/go.sum b/scripts/go.sum
index 2291d22d4e4..a48f9cb7a02 100644
--- a/scripts/go.sum
+++ b/scripts/go.sum
@@ -788,10 +788,10 @@ github.com/frankban/quicktest v1.7.2/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03D
github.com/frankban/quicktest v1.14.2/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps=
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.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.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM=
-github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
+github.com/fsnotify/fsnotify v1.10.0 h1:Xx/5Ydg9CeBDX/wi4VJqStNtohYjitZhhlHt4h3St1M=
+github.com/fsnotify/fsnotify v1.10.0/go.mod h1:TLheqan6HD6GBK6PrDWyDPBaEV8LspOxvPSjC+bVfgo=
+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/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo=
github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA=
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
@@ -831,8 +831,8 @@ github.com/go-openapi/analysis v0.25.0 h1:EnjAq1yO8wEO9HbPmY8vLPEIkdZuuFhCAKBPvC
github.com/go-openapi/analysis v0.25.0/go.mod h1:5WFTRE43WLkPG9r9OtlMfqkkvUTYLVVCIxLlEpyF8kE=
github.com/go-openapi/errors v0.22.7 h1:JLFBGC0Apwdzw3484MmBqspjPbwa2SHvpDm0u5aGhUA=
github.com/go-openapi/errors v0.22.7/go.mod h1://QW6SD9OsWtH6gHllUCddOXDL0tk0ZGNYHwsw4sW3w=
-github.com/go-openapi/jsonpointer v0.22.5 h1:8on/0Yp4uTb9f4XvTrM2+1CPrV05QPZXu+rvu2o9jcA=
-github.com/go-openapi/jsonpointer v0.22.5/go.mod h1:gyUR3sCvGSWchA2sUBJGluYMbe1zazrYWIkWPjjMUY0=
+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/loads v0.23.3 h1:g5Xap1JfwKkUnZdn+S0L3SzBDpcTIYzZ5Qaag0YDkKQ=
@@ -841,36 +841,36 @@ github.com/go-openapi/spec v0.22.4 h1:4pxGjipMKu0FzFiu/DPwN3CTBRlVM2yLf/YTWorYfD
github.com/go-openapi/spec v0.22.4/go.mod h1:WQ6Ai0VPWMZgMT4XySjlRIE6GP1bGQOtEThn3gcWLtQ=
github.com/go-openapi/strfmt v0.26.1 h1:7zGCHji7zSYDC2tCXIusoxYQz/48jAf2q+sF6wXTG+c=
github.com/go-openapi/strfmt v0.26.1/go.mod h1:Zslk5VZPOISLwmWTMBIS7oiVFem1o1EI6zULY8Uer7Y=
-github.com/go-openapi/swag v0.25.5 h1:pNkwbUEeGwMtcgxDr+2GBPAk4kT+kJ+AaB+TMKAg+TU=
-github.com/go-openapi/swag v0.25.5/go.mod h1:B3RT6l8q7X803JRxa2e59tHOiZlX1t8viplOcs9CwTA=
-github.com/go-openapi/swag/cmdutils v0.25.5 h1:yh5hHrpgsw4NwM9KAEtaDTXILYzdXh/I8Whhx9hKj7c=
-github.com/go-openapi/swag/cmdutils v0.25.5/go.mod h1:pdae/AFo6WxLl5L0rq87eRzVPm/XRHM3MoYgRMvG4A0=
-github.com/go-openapi/swag/conv v0.25.5 h1:wAXBYEXJjoKwE5+vc9YHhpQOFj2JYBMF2DUi+tGu97g=
-github.com/go-openapi/swag/conv v0.25.5/go.mod h1:CuJ1eWvh1c4ORKx7unQnFGyvBbNlRKbnRyAvDvzWA4k=
-github.com/go-openapi/swag/fileutils v0.25.5 h1:B6JTdOcs2c0dBIs9HnkyTW+5gC+8NIhVBUwERkFhMWk=
-github.com/go-openapi/swag/fileutils v0.25.5/go.mod h1:V3cT9UdMQIaH4WiTrUc9EPtVA4txS0TOmRURmhGF4kc=
-github.com/go-openapi/swag/jsonname v0.25.5 h1:8p150i44rv/Drip4vWI3kGi9+4W9TdI3US3uUYSFhSo=
-github.com/go-openapi/swag/jsonname v0.25.5/go.mod h1:jNqqikyiAK56uS7n8sLkdaNY/uq6+D2m2LANat09pKU=
-github.com/go-openapi/swag/jsonutils v0.25.5 h1:XUZF8awQr75MXeC+/iaw5usY/iM7nXPDwdG3Jbl9vYo=
-github.com/go-openapi/swag/jsonutils v0.25.5/go.mod h1:48FXUaz8YsDAA9s5AnaUvAmry1UcLcNVWUjY42XkrN4=
-github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.5 h1:SX6sE4FrGb4sEnnxbFL/25yZBb5Hcg1inLeErd86Y1U=
-github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.5/go.mod h1:/2KvOTrKWjVA5Xli3DZWdMCZDzz3uV/T7bXwrKWPquo=
-github.com/go-openapi/swag/loading v0.25.5 h1:odQ/umlIZ1ZVRteI6ckSrvP6e2w9UTF5qgNdemJHjuU=
-github.com/go-openapi/swag/loading v0.25.5/go.mod h1:I8A8RaaQ4DApxhPSWLNYWh9NvmX2YKMoB9nwvv6oW6g=
-github.com/go-openapi/swag/mangling v0.25.5 h1:hyrnvbQRS7vKePQPHHDso+k6CGn5ZBs5232UqWZmJZw=
-github.com/go-openapi/swag/mangling v0.25.5/go.mod h1:6hadXM/o312N/h98RwByLg088U61TPGiltQn71Iw0NY=
-github.com/go-openapi/swag/netutils v0.25.5 h1:LZq2Xc2QI8+7838elRAaPCeqJnHODfSyOa7ZGfxDKlU=
-github.com/go-openapi/swag/netutils v0.25.5/go.mod h1:lHbtmj4m57APG/8H7ZcMMSWzNqIQcu0RFiXrPUara14=
-github.com/go-openapi/swag/stringutils v0.25.5 h1:NVkoDOA8YBgtAR/zvCx5rhJKtZF3IzXcDdwOsYzrB6M=
-github.com/go-openapi/swag/stringutils v0.25.5/go.mod h1:PKK8EZdu4QJq8iezt17HM8RXnLAzY7gW0O1KKarrZII=
-github.com/go-openapi/swag/typeutils v0.25.5 h1:EFJ+PCga2HfHGdo8s8VJXEVbeXRCYwzzr9u4rJk7L7E=
-github.com/go-openapi/swag/typeutils v0.25.5/go.mod h1:itmFmScAYE1bSD8C4rS0W+0InZUBrB2xSPbWt6DLGuc=
-github.com/go-openapi/swag/yamlutils v0.25.5 h1:kASCIS+oIeoc55j28T4o8KwlV2S4ZLPT6G0iq2SSbVQ=
-github.com/go-openapi/swag/yamlutils v0.25.5/go.mod h1:Gek1/SjjfbYvM+Iq4QGwa/2lEXde9n2j4a3wI3pNuOQ=
-github.com/go-openapi/testify/enable/yaml/v2 v2.4.1 h1:NZOrZmIb6PTv5LTFxr5/mKV/FjbUzGE7E6gLz7vFoOQ=
-github.com/go-openapi/testify/enable/yaml/v2 v2.4.1/go.mod h1:r7dwsujEHawapMsxA69i+XMGZrQ5tRauhLAjV/sxg3Q=
-github.com/go-openapi/testify/v2 v2.4.1 h1:zB34HDKj4tHwyUQHrUkpV0Q0iXQ6dUCOQtIqn8hE6Iw=
-github.com/go-openapi/testify/v2 v2.4.1/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54=
+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-openapi/validate v0.25.2 h1:12NsfLAwGegqbGWr2CnvT65X/Q2USJipmJ9b7xDJZz0=
github.com/go-openapi/validate v0.25.2/go.mod h1:Pgl1LpPPGFnZ+ys4/hTlDiRYQdI1ocKypgE+8Q8BLfY=
github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=
@@ -1462,8 +1462,8 @@ github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
github.com/onsi/ginkgo/v2 v2.28.2 h1:DTrMfpqxiNUyQ3Y0zhn1n3cOO2euFgQPYIpkWwxVFps=
github.com/onsi/ginkgo/v2 v2.28.2/go.mod h1:CLtbVInNckU3/+gC8LzkGUb9oF+e8W8TdUsxPwvdOgE=
-github.com/onsi/gomega v1.39.1 h1:1IJLAad4zjPn2PsnhH70V4DKRFlrCzGBNrNaru+Vf28=
-github.com/onsi/gomega v1.39.1/go.mod h1:hL6yVALoTOxeWudERyfppUcZXjMwIMLnuSfruD2lcfg=
+github.com/onsi/gomega v1.40.0 h1:Vtol0e1MghCD2ZVIilPDIg44XSL9l2QAn8ZNaljWcJc=
+github.com/onsi/gomega v1.40.0/go.mod h1:M/Uqpu/8qTjtzCLUA2zJHX9Iilrau25x1PdoSRbWh5A=
github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.148.0 h1:CiTjQE/Hh5xK2t56ogrDK4nl0+tJPNmASCs4zEYZ/xU=
github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.148.0/go.mod h1:WUFkzTiOpt7EYyL67gv1GOf3RD8qKWGtin3lY9LYzW4=
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.148.0 h1:1TLg6YrS3Au6F7xw3ws2Njbwj13IMqPplvGFi+18fWs=
@@ -2933,8 +2933,8 @@ google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojt
google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
-google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
-google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
+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 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=
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=
@@ -2976,28 +2976,28 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9
honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=
honnef.co/go/tools v0.7.0 h1:w6WUp1VbkqPEgLz4rkBzH/CSU6HkoqNLp6GstyTx3lU=
honnef.co/go/tools v0.7.0/go.mod h1:pm29oPxeP3P82ISxZDgIYeOaf9ta6Pi0EWvCFoLG2vc=
-k8s.io/api v0.35.3 h1:pA2fiBc6+N9PDf7SAiluKGEBuScsTzd2uYBkA5RzNWQ=
-k8s.io/api v0.35.3/go.mod h1:9Y9tkBcFwKNq2sxwZTQh1Njh9qHl81D0As56tu42GA4=
-k8s.io/apiextensions-apiserver v0.35.2 h1:iyStXHoJZsUXPh/nFAsjC29rjJWdSgUmG1XpApE29c0=
-k8s.io/apiextensions-apiserver v0.35.2/go.mod h1:OdyGvcO1FtMDWQ+rRh/Ei3b6X3g2+ZDHd0MSRGeS8rU=
-k8s.io/apimachinery v0.35.3 h1:MeaUwQCV3tjKP4bcwWGgZ/cp/vpsRnQzqO6J6tJyoF8=
-k8s.io/apimachinery v0.35.3/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns=
-k8s.io/apiserver v0.35.2 h1:rb52v0CZGEL0FkhjS+I6jHflAp7fZ4MIaKcEHX7wmDk=
-k8s.io/apiserver v0.35.2/go.mod h1:CROJUAu0tfjZLyYgSeBsBan2T7LUJGh0ucWwTCSSk7g=
-k8s.io/client-go v0.35.3 h1:s1lZbpN4uI6IxeTM2cpdtrwHcSOBML1ODNTCCfsP1pg=
-k8s.io/client-go v0.35.3/go.mod h1:RzoXkc0mzpWIDvBrRnD+VlfXP+lRzqQjCmKtiwZ8Q9c=
-k8s.io/code-generator v0.35.2 h1:3874swbO2c26VWTf6lKD4NWGyHIfyBeTCk7caCG3TuU=
-k8s.io/code-generator v0.35.2/go.mod h1:id4XLCm0yAQq5nlvyfAKibMOKnMjzlesAwGw6kM3Adc=
-k8s.io/component-base v0.35.2 h1:btgR+qNrpWuRSuvWSnQYsZy88yf5gVwemvz0yw79pGc=
-k8s.io/component-base v0.35.2/go.mod h1:B1iBJjooe6xIJYUucAxb26RwhAjzx0gHnqO9htWIX+0=
+k8s.io/api v0.36.0 h1:SgqDhZzHdOtMk40xVSvCXkP9ME0H05hPM3p9AB1kL80=
+k8s.io/api v0.36.0/go.mod h1:m1LVrGPNYax5NBHdO+QuAedXyuzTt4RryI/qnmNvs34=
+k8s.io/apiextensions-apiserver v0.36.0 h1:Wt7E8J+VBCbj4FjiBfDTK/neXDDjyJVJc7xfuOHImZ0=
+k8s.io/apiextensions-apiserver v0.36.0/go.mod h1:kGDjH0msuiIB3tgsYRV0kS9GqpMYMUsQ3GHv7TApyug=
+k8s.io/apimachinery v0.36.0 h1:jZyPzhd5Z+3h9vJLt0z9XdzW9VzNzWAUw+P1xZ9PXtQ=
+k8s.io/apimachinery v0.36.0/go.mod h1:FklypaRJt6n5wUIwWXIP6GJlIpUizTgfo1T/As+Tyxc=
+k8s.io/apiserver v0.36.0 h1:Jg5OFAENUACByUCg15CmhZAYrr5ZyJ+jodyA1mHl3YE=
+k8s.io/apiserver v0.36.0/go.mod h1:mHvwdHf+qKEm+1/hYm756SV+oREOKSPnsjagOpx6Vho=
+k8s.io/client-go v0.36.0 h1:pOYi7C4RHChYjMiHpZSpSbIM6ZxVbRXBy7CuiIwqA3c=
+k8s.io/client-go v0.36.0/go.mod h1:ZKKcpwF0aLYfkHFCjillCKaTK/yBkEDHTDXCFY6AS9Y=
+k8s.io/code-generator v0.36.0 h1:XWAkrhnArm0VWMmSFO7kyB+wE2LROwep7hEH0GPGkqA=
+k8s.io/code-generator v0.36.0/go.mod h1:Tr2UhfBRdlyRoadfob9aPCmmGe8PUs5XPK9MEJ2nx+w=
+k8s.io/component-base v0.36.0 h1:hFjEktssxiJhrK1zfybkH4kJOi8iZuF+mIDCqS5+jRo=
+k8s.io/component-base v0.36.0/go.mod h1:JZvIfcNHk+uck+8LhJzhSBtydWXaZNQwX2OdL+Mnwsk=
k8s.io/gengo/v2 v2.0.0-20250922181213-ec3ebc5fd46b h1:gMplByicHV/TJBizHd9aVEsTYoJBnnUAT5MHlTkbjhQ=
k8s.io/gengo/v2 v2.0.0-20250922181213-ec3ebc5fd46b/go.mod h1:CgujABENc3KuTrcsdpGmrrASjtQsWCT7R99mEV4U/fM=
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-20260317180543-43fb72c5454a h1:xCeOEAOoGYl2jnJoHkC3hkbPJgdATINPMAxaynU2Ovg=
-k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0=
-k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 h1:AZYQSJemyQB5eRxqcPky+/7EdBj0xi3g0ZcxxJ7vbWU=
-k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk=
+k8s.io/kube-openapi v0.0.0-20260427204847-8949caaa1199 h1:sWu4Td5mgJlwunsUydnhKEAfNUHM7hm1wfKEQmD7G5c=
+k8s.io/kube-openapi v0.0.0-20260427204847-8949caaa1199/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0=
+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=
lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
@@ -3037,15 +3037,15 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
-sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 h1:jpcvIRr3GLoUoEKRkHKSmGjxb6lWwrBlJsXc+eUYQHM=
-sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw=
-sigs.k8s.io/controller-tools v0.20.1 h1:gkfMt9YodI0K85oT8rVi80NTXO/kDmabKR5Ajn5GYxs=
-sigs.k8s.io/controller-tools v0.20.1/go.mod h1:b4qPmjGU3iZwqn34alUU5tILhNa9+VXK+J3QV0fT/uU=
+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-tools v0.21.0 h1:KXDQza3bgjlPY6xLR63tI/40gzjhyUAvkCrwzd2/6cs=
+sigs.k8s.io/controller-tools v0.21.0/go.mod h1:DLIypi3Q2+azVAP8jr/mHXJgveYYHFjhnNOUuBJ10JE=
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg=
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
-sigs.k8s.io/structured-merge-diff/v6 v6.3.2 h1:kwVWMx5yS1CrnFWA/2QHyRVJ8jM6dBA80uLmm0wJkk8=
-sigs.k8s.io/structured-merge-diff/v6 v6.3.2/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE=
+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=
From cd8e8fe6fbac602ec2d29e9ae2931e4d4e8773d9 Mon Sep 17 00:00:00 2001
From: Simon Pasquier
Date: Tue, 9 Jun 2026 15:07:42 +0200
Subject: [PATCH 64/81] chore: switch sharding features to beta
This commit enables the following feature gates to beta, meaning that
they are now enabled by default (it's still possible to disable them if
needed):
* `PrometheusTopologySharding`
* `PrometheusShardRetentionPolicy`
Signed-off-by: Simon Pasquier
---
Documentation/platform/operator.md | 8 +++++---
Documentation/platform/sharding.md | 4 ++--
bundle.yaml | 3 ++-
.../monitoring.coreos.com_prometheuses.yaml | 3 ++-
.../monitoring.coreos.com_prometheuses.yaml | 3 ++-
jsonnet/prometheus-operator/prometheuses-crd.json | 2 +-
pkg/apis/monitoring/v1/prometheus_types.go | 6 ++++--
.../applyconfiguration/monitoring/v1/prometheusspec.go | 3 ++-
pkg/operator/config.go | 4 ++--
test/e2e/prometheus_test.go | 6 +++---
10 files changed, 25 insertions(+), 17 deletions(-)
diff --git a/Documentation/platform/operator.md b/Documentation/platform/operator.md
index 597f36f8995..8df0e48e344 100644
--- a/Documentation/platform/operator.md
+++ b/Documentation/platform/operator.md
@@ -70,8 +70,8 @@ Arguments:
Feature gates are a set of key=value pairs that describe Prometheus-Operator features.
Available feature gates:
PrometheusAgentDaemonSet: Enables the DaemonSet mode for PrometheusAgent (enabled: false)
- PrometheusShardRetentionPolicy: Enables shard retention policy for Prometheus (enabled: false)
- PrometheusTopologySharding: Enables the zone aware sharding for Prometheus (enabled: false)
+ PrometheusShardRetentionPolicy: Enables shard retention policy for Prometheus (enabled: true)
+ PrometheusTopologySharding: Enables the zone aware sharding for Prometheus (enabled: true)
RemoteWriteCustomResourceDefinition: Enables the RemoteWrite CRD support (enabled: false)
StatusForConfigurationResources: Updates the status subresource for configuration resources (enabled: false)
-key-file string
@@ -101,13 +101,15 @@ Arguments:
-namespaces value
Namespaces to scope the interaction of the Prometheus Operator and the apiserver (allow list). This is mutually exclusive with --deny-namespaces.
-prometheus-config-reloader string
- Prometheus config reloader image (default "quay.io/prometheus-operator/prometheus-config-reloader:v0.89.0")
+ Prometheus config reloader image (default "quay.io/prometheus-operator/prometheus-config-reloader:v0.91.0")
-prometheus-default-base-image string
Prometheus default base image (path without tag/version) (default "quay.io/prometheus/prometheus")
-prometheus-instance-namespaces value
Namespaces where Prometheus and PrometheusAgent custom resources and corresponding Secrets, Configmaps and StatefulSets are watched/created. If set this takes precedence over --namespaces or --deny-namespaces for Prometheus custom resources.
-prometheus-instance-selector value
Label selector to filter Prometheus and PrometheusAgent Custom Resources to watch.
+ -repair-policy-for-statefulsets value
+ Policy to use when a StatefulSet rollout is stuck. Possible values: 'none' (default), 'evict' or 'delete'. (default none)
-secret-field-selector value
Field selector to filter Secrets to watch
-secret-label-selector value
diff --git a/Documentation/platform/sharding.md b/Documentation/platform/sharding.md
index bcdee389de5..17d39af04c2 100644
--- a/Documentation/platform/sharding.md
+++ b/Documentation/platform/sharding.md
@@ -80,7 +80,7 @@ spec:
### Topology-aware sharding
-> **Alpha:** Topology-aware sharding requires the `PrometheusTopologySharding` feature gate to be enabled on the operator.
+> **Beta:** Topology-aware sharding requires the `PrometheusTopologySharding` feature gate to be enabled on the operator.
In multi-zone clusters, the default address-based sharding distributes targets without regard for their zone, which can generate costly cross-zone traffic. Topology-aware sharding pins each Prometheus shard to a specific zone so that it only scrapes targets local to that zone.
@@ -111,7 +111,7 @@ With this configuration and 4 shards across 2 zones, shards 0 and 2 are schedule
### Retaining shards
-> **Alpha:** Shard retention requires the `PrometheusShardRetentionPolicy` feature gate to be enabled on the operator.
+> **Beta:** Shard retention requires the `PrometheusShardRetentionPolicy` feature gate to be enabled on the operator.
When scaling down the number of shards, the pods from the removed shards are deleted by default along with access to their historical data. To preserve scaled-down shards so their data remains queryable until the retention duration expires, set `.spec.shardRetentionPolicy.whenScaled` to `Retain`:
diff --git a/bundle.yaml b/bundle.yaml
index b00ab2faebd..ee583b0232e 100644
--- a/bundle.yaml
+++ b/bundle.yaml
@@ -46275,7 +46275,8 @@ spec:
shardRetentionPolicy:
description: |-
shardRetentionPolicy defines the retention policy for the Prometheus shards.
- (Alpha) Using this field requires the 'PrometheusShardRetentionPolicy' feature gate to be enabled.
+
+ (Beta) Using this mode requires the `PrometheusShardRetentionPolicy` feature gate (enabled by default).
properties:
retain:
description: |-
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
index 6549e77a652..a901bd7393b 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
@@ -9520,7 +9520,8 @@ spec:
shardRetentionPolicy:
description: |-
shardRetentionPolicy defines the retention policy for the Prometheus shards.
- (Alpha) Using this field requires the 'PrometheusShardRetentionPolicy' feature gate to be enabled.
+
+ (Beta) Using this mode requires the `PrometheusShardRetentionPolicy` feature gate (enabled by default).
properties:
retain:
description: |-
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
index 6549e77a652..a901bd7393b 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
@@ -9520,7 +9520,8 @@ spec:
shardRetentionPolicy:
description: |-
shardRetentionPolicy defines the retention policy for the Prometheus shards.
- (Alpha) Using this field requires the 'PrometheusShardRetentionPolicy' feature gate to be enabled.
+
+ (Beta) Using this mode requires the `PrometheusShardRetentionPolicy` feature gate (enabled by default).
properties:
retain:
description: |-
diff --git a/jsonnet/prometheus-operator/prometheuses-crd.json b/jsonnet/prometheus-operator/prometheuses-crd.json
index 106a215200c..4b7b1d7daaa 100644
--- a/jsonnet/prometheus-operator/prometheuses-crd.json
+++ b/jsonnet/prometheus-operator/prometheuses-crd.json
@@ -8018,7 +8018,7 @@
"type": "string"
},
"shardRetentionPolicy": {
- "description": "shardRetentionPolicy defines the retention policy for the Prometheus shards.\n(Alpha) Using this field requires the 'PrometheusShardRetentionPolicy' feature gate to be enabled.",
+ "description": "shardRetentionPolicy defines the retention policy for the Prometheus shards.\n\n(Beta) Using this mode requires the `PrometheusShardRetentionPolicy` feature gate (enabled by default).",
"properties": {
"retain": {
"description": "retain defines the config for retention when the retention policy is set\nto `Retain`.\n\nIf not defined, the operator will use the retention duration configured\nfor the Prometheus data. If the resource uses size-based retention, the\nshard(s) are kept forever (unless manually deleted).",
diff --git a/pkg/apis/monitoring/v1/prometheus_types.go b/pkg/apis/monitoring/v1/prometheus_types.go
index 12dc7d16460..a9b64801276 100644
--- a/pkg/apis/monitoring/v1/prometheus_types.go
+++ b/pkg/apis/monitoring/v1/prometheus_types.go
@@ -1215,7 +1215,8 @@ type PrometheusSpec struct {
RetentionSize ByteSize `json:"retentionSize,omitempty"`
// shardRetentionPolicy defines the retention policy for the Prometheus shards.
- // (Alpha) Using this field requires the 'PrometheusShardRetentionPolicy' feature gate to be enabled.
+ //
+ // (Beta) Using this mode requires the `PrometheusShardRetentionPolicy` feature gate (enabled by default).
//
// +optional
ShardRetentionPolicy *ShardRetentionPolicy `json:"shardRetentionPolicy,omitempty"`
@@ -1392,7 +1393,8 @@ const (
// TopologyShardingStrategyMode enables zone-aware sharding.
// Each shard is assigned to a specific topology zone and only scrapes targets in that zone.
- // (Alpha) Using this mode requires the `PrometheusTopologySharding` feature gate to be enabled.
+ //
+ // (Beta) Using this mode requires the `PrometheusTopologySharding` feature gate (enabled by default).
TopologyShardingStrategyMode ShardingStrategyMode = "Topology"
)
diff --git a/pkg/client/applyconfiguration/monitoring/v1/prometheusspec.go b/pkg/client/applyconfiguration/monitoring/v1/prometheusspec.go
index 97764fd89f7..df0277e2fa5 100644
--- a/pkg/client/applyconfiguration/monitoring/v1/prometheusspec.go
+++ b/pkg/client/applyconfiguration/monitoring/v1/prometheusspec.go
@@ -43,7 +43,8 @@ type PrometheusSpecApplyConfiguration struct {
// retentionSize defines the maximum number of bytes used by the Prometheus data.
RetentionSize *monitoringv1.ByteSize `json:"retentionSize,omitempty"`
// shardRetentionPolicy defines the retention policy for the Prometheus shards.
- // (Alpha) Using this field requires the 'PrometheusShardRetentionPolicy' feature gate to be enabled.
+ //
+ // (Beta) Using this mode requires the `PrometheusShardRetentionPolicy` feature gate (enabled by default).
ShardRetentionPolicy *ShardRetentionPolicyApplyConfiguration `json:"shardRetentionPolicy,omitempty"`
// disableCompaction when true, the Prometheus compaction is disabled.
// When `spec.thanos.objectStorageConfig` or `spec.objectStorageConfigFile` are defined, the operator automatically
diff --git a/pkg/operator/config.go b/pkg/operator/config.go
index 37a7ab71c23..679e50643d0 100644
--- a/pkg/operator/config.go
+++ b/pkg/operator/config.go
@@ -104,11 +104,11 @@ func DefaultConfig(cpu, memory string) Config {
},
PrometheusTopologyShardingFeature: FeatureGate{
description: "Enables the zone aware sharding for Prometheus",
- enabled: false,
+ enabled: true,
},
PrometheusShardRetentionPolicyFeature: FeatureGate{
description: "Enables shard retention policy for Prometheus",
- enabled: false,
+ enabled: true,
},
StatusForConfigurationResourcesFeature: FeatureGate{
description: "Updates the status subresource for configuration resources",
diff --git a/test/e2e/prometheus_test.go b/test/e2e/prometheus_test.go
index b2d0f389446..ce228ce641e 100644
--- a/test/e2e/prometheus_test.go
+++ b/test/e2e/prometheus_test.go
@@ -6127,7 +6127,7 @@ func testPrometheusShardingStrategyCELValidations(t *testing.T) {
p.Spec.ShardingStrategy = &monitoringv1.ShardingStrategy{
Mode: ptr.To(monitoringv1.TopologyShardingStrategyMode),
Topology: &monitoringv1.TopologyShardingStrategy{
- Values: []string{"zone1", "zone2"},
+ Values: []string{"zone-a", "zone-b"},
},
}
},
@@ -6140,7 +6140,7 @@ func testPrometheusShardingStrategyCELValidations(t *testing.T) {
p.Spec.ShardingStrategy = &monitoringv1.ShardingStrategy{
Mode: ptr.To(monitoringv1.TopologyShardingStrategyMode),
Topology: &monitoringv1.TopologyShardingStrategy{
- Values: []string{"zone1", "zone2", "zone3"},
+ Values: []string{"zone-a", "zone-b", "zone-c"},
},
}
},
@@ -6153,7 +6153,7 @@ func testPrometheusShardingStrategyCELValidations(t *testing.T) {
p.Spec.ShardingStrategy = &monitoringv1.ShardingStrategy{
Mode: ptr.To(monitoringv1.TopologyShardingStrategyMode),
Topology: &monitoringv1.TopologyShardingStrategy{
- Values: []string{"zone1", "zone2"},
+ Values: []string{"zone-a", "zone-b"},
},
}
},
From 1ac31b04a9d9fe037aff5be047a10af0c2640115 Mon Sep 17 00:00:00 2001
From: Nutmos
Date: Wed, 10 Jun 2026 15:41:29 +0700
Subject: [PATCH 65/81] Merge pull request #8556 from
nutmos/feat/slack-update-message-validation-am-config
Feat: Add validation for Slack update_message in AM Secret Config
---
pkg/alertmanager/amcfg.go | 14 ++++++++++----
pkg/alertmanager/amcfg_test.go | 17 +++++++++++++++++
2 files changed, 27 insertions(+), 4 deletions(-)
diff --git a/pkg/alertmanager/amcfg.go b/pkg/alertmanager/amcfg.go
index 6623df92593..3b84ae5e272 100644
--- a/pkg/alertmanager/amcfg.go
+++ b/pkg/alertmanager/amcfg.go
@@ -2897,10 +2897,16 @@ func (sc *slackConfig) sanitize(amVersion semver.Version, logger *slog.Logger) e
sc.MessageText = ""
}
- if sc.UpdateMessage != nil && lessThanV0_32 {
- msg := "'update_message' supported in Alertmanager >= 0.32.0 only - dropping field from provided config"
- logger.Warn(msg)
- sc.UpdateMessage = nil
+ if sc.UpdateMessage != nil {
+ if lessThanV0_32 {
+ msg := "'update_message' supported in Alertmanager >= 0.32.0 only - dropping field from provided config"
+ logger.Warn(msg)
+ sc.UpdateMessage = nil
+ } else if *sc.UpdateMessage && sc.APIURL != "" {
+ if sc.APIURL != "https://slack.com/api/chat.postMessage" {
+ return fmt.Errorf(`update_message' can only be used with bot tokens. api_url must be set to https://slack.com/api/chat.postMessage`)
+ }
+ }
}
if sc.AppToken != "" && sc.AppTokenFile != "" {
diff --git a/pkg/alertmanager/amcfg_test.go b/pkg/alertmanager/amcfg_test.go
index 0c821237e1b..aad763b923e 100644
--- a/pkg/alertmanager/amcfg_test.go
+++ b/pkg/alertmanager/amcfg_test.go
@@ -9305,6 +9305,23 @@ func TestSanitizeSlackConfig(t *testing.T) {
},
golden: "test_slack_update_message_supported_version.golden",
},
+ {
+ name: "Test slack update_message custom api url",
+ againstVersion: versionSlackUpdateMessageAllowed,
+ in: &alertmanagerConfig{
+ Receivers: []*receiver{
+ {
+ SlackConfigs: []*slackConfig{
+ {
+ APIURL: "https://api.url",
+ UpdateMessage: new(true),
+ },
+ },
+ },
+ },
+ },
+ expectErr: true,
+ },
} {
t.Run(tc.name, func(t *testing.T) {
err := tc.in.sanitize(tc.againstVersion, logger)
From 931c6e363ebbc765695859e4293fc9879605b22a Mon Sep 17 00:00:00 2001
From: Simon Pasquier
Date: Wed, 10 Jun 2026 11:17:53 +0200
Subject: [PATCH 66/81] docs: update sharding example
Signed-off-by: Simon Pasquier
---
Documentation/platform/sharding.md | 23 ++++++++-----------
example/shards/example-app-deployment.yaml | 1 +
.../shards/example-app-service-monitor.yaml | 1 +
example/shards/example-app-service.yaml | 1 +
4 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/Documentation/platform/sharding.md b/Documentation/platform/sharding.md
index bcdee389de5..1dce4260b20 100644
--- a/Documentation/platform/sharding.md
+++ b/Documentation/platform/sharding.md
@@ -146,8 +146,6 @@ spec:
## Example
-View the complete [Shards manifests](../../example/shards).
-
The following manifest creates a Prometheus server with two replicas:
```yaml
@@ -169,14 +167,14 @@ spec:
This can be verified with the following command:
```bash
-> kubectl get pods -n
+kubectl get pods -n default
```
The output is similar to this:
```bash
prometheus-prometheus-0 2/2 Running 1 10s
-prometheus-prometheus-1 1/2 Running 1 10s
+prometheus-prometheus-1 2/2 Running 1 10s
```
Deploy the example application and monitor it:
@@ -186,6 +184,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
name: example-app
+ namespace: default
spec:
replicas: 3
selector:
@@ -209,6 +208,7 @@ kind: Service
apiVersion: v1
metadata:
name: example-app
+ namespace: default
labels:
app: example-app
spec:
@@ -224,6 +224,7 @@ apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: example-app
+ namespace: default
labels:
team: frontend
spec:
@@ -237,14 +238,12 @@ spec:
Explore one of the monitoring Prometheus instances:
```bash
-> kubectl port-forward pod/prometheus-prometheus-0 9090:9090
+kubectl port-forward pod/prometheus-prometheus-0 9090:9090
```
We find the prometheus server scrapes three targets.
-### Reshard Targets and Expand Prometheus
-
-Expand prometheus to two shards as shown below:
+Now let's expand the Prometheus resource to two shards as shown below:
```yaml mdox-exec="cat example/shards/prometheus.yaml"
apiVersion: monitoring.coreos.com/v1
@@ -266,7 +265,7 @@ spec:
This can be verified with the following command:
```bash
-> kubectl get pods -n
+kubectl get pods -n
```
The output is similar to this:
@@ -281,9 +280,7 @@ prometheus-prometheus-shard-1-1 2/2 Running 1 12s
Explore one of the monitoring Prometheus instances added for sharding:
```bash
-> kubectl port-forward prometheus-prometheus-shard-1-0 9091:9090
+kubectl port-forward prometheus-prometheus-shard-1-0 9091:9090
```
-We find two targets are being scraped. The original Prometheus instance scrapes one target.
-
-//To query globally, we must use the Thanos sidecar, since the original data in Prometheus will not be rebalanced.
+We should find that one or two targets are being scraped by this instance while the original Prometheus shard scrapes the remaining target(s).
diff --git a/example/shards/example-app-deployment.yaml b/example/shards/example-app-deployment.yaml
index 4bca530185f..c8682871109 100644
--- a/example/shards/example-app-deployment.yaml
+++ b/example/shards/example-app-deployment.yaml
@@ -2,6 +2,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
name: example-app
+ namespace: default
spec:
replicas: 3
selector:
diff --git a/example/shards/example-app-service-monitor.yaml b/example/shards/example-app-service-monitor.yaml
index d2a68fc9548..32f6ae00de6 100644
--- a/example/shards/example-app-service-monitor.yaml
+++ b/example/shards/example-app-service-monitor.yaml
@@ -2,6 +2,7 @@ apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: example-app
+ namespace: default
labels:
team: frontend
spec:
diff --git a/example/shards/example-app-service.yaml b/example/shards/example-app-service.yaml
index 9f5048ca63a..4afb84959d9 100644
--- a/example/shards/example-app-service.yaml
+++ b/example/shards/example-app-service.yaml
@@ -2,6 +2,7 @@ kind: Service
apiVersion: v1
metadata:
name: example-app
+ namespace: default
labels:
app: example-app
spec:
From 97e5da96aff3f5c2a09e40e9d85cc4906b767c40 Mon Sep 17 00:00:00 2001
From: Nattapong Ekudomsuk
Date: Thu, 11 Jun 2026 19:48:01 +0700
Subject: [PATCH 67/81] prometheus: update test files
add tsdb config
---
...harding_PodTopologyLabels_PodMonitor_4shards_2zones.golden | 4 ++++
...ing_PodTopologyLabels_ServiceMonitor_4shards_2zones.golden | 4 ++++
...ing_PodTopologyLabels_ServiceMonitor_6shards_3zones.golden | 4 ++++
...TopologyLabels_ServiceMonitor_attach_metadata_false.golden | 4 ++++
4 files changed, 16 insertions(+)
diff --git a/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_PodMonitor_4shards_2zones.golden b/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_PodMonitor_4shards_2zones.golden
index 0629593189d..20aea46d325 100644
--- a/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_PodMonitor_4shards_2zones.golden
+++ b/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_PodMonitor_4shards_2zones.golden
@@ -81,3 +81,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(INZONE_SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_4shards_2zones.golden b/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_4shards_2zones.golden
index ce82933b566..cc81bdf7bc6 100644
--- a/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_4shards_2zones.golden
+++ b/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_4shards_2zones.golden
@@ -100,3 +100,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(INZONE_SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_6shards_3zones.golden b/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_6shards_3zones.golden
index ce82933b566..cc81bdf7bc6 100644
--- a/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_6shards_3zones.golden
+++ b/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_6shards_3zones.golden
@@ -100,3 +100,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(INZONE_SHARD);|.+;.+
action: keep
+storage:
+ tsdb:
+ retention:
+ time: 24h
diff --git a/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_attach_metadata_false.golden b/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_attach_metadata_false.golden
index c8564457319..728d0b8cd03 100644
--- a/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_attach_metadata_false.golden
+++ b/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_attach_metadata_false.golden
@@ -102,3 +102,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(INZONE_SHARD);|.+;.+
action: keep
+ storage:
+ tsdb:
+ retention:
+ time: 24h
From 8d62fea9f24f0c74ba7253ece0db12b3865344f4 Mon Sep 17 00:00:00 2001
From: Nattapong Ekudomsuk
Date: Thu, 11 Jun 2026 20:06:44 +0700
Subject: [PATCH 68/81] alertmanager: update test file
update indent
---
...logyLabels_ServiceMonitor_attach_metadata_false.golden | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_attach_metadata_false.golden b/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_attach_metadata_false.golden
index 728d0b8cd03..d025d58c254 100644
--- a/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_attach_metadata_false.golden
+++ b/pkg/prometheus/testdata/TopologySharding_PodTopologyLabels_ServiceMonitor_attach_metadata_false.golden
@@ -102,7 +102,7 @@ scrape_configs:
- __tmp_disable_sharding
regex: $(INZONE_SHARD);|.+;.+
action: keep
- storage:
- tsdb:
- retention:
- time: 24h
+storage:
+ tsdb:
+ retention:
+ time: 24h
From d39f4db03f6449af4249a4d1c6712e53a6d721dc Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 11 Jun 2026 14:34:22 +0000
Subject: [PATCH 69/81] build(deps): bump golang.org/x/net from 0.55.0 to
0.56.0
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.55.0 to 0.56.0.
- [Commits](https://github.com/golang/net/compare/v0.55.0...v0.56.0)
---
updated-dependencies:
- dependency-name: golang.org/x/net
dependency-version: 0.56.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
---
go.mod | 10 +++++-----
go.sum | 20 ++++++++++----------
2 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/go.mod b/go.mod
index 4c249c2d4ff..77e903dbffd 100644
--- a/go.mod
+++ b/go.mod
@@ -28,7 +28,7 @@ require (
github.com/prometheus/prometheus v0.312.0
github.com/stretchr/testify v1.11.1
github.com/thanos-io/thanos v0.41.0
- golang.org/x/net v0.55.0
+ golang.org/x/net v0.56.0
golang.org/x/sync v0.21.0
google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af
gopkg.in/yaml.v2 v2.4.0
@@ -153,11 +153,11 @@ require (
go.opentelemetry.io/otel/metric v1.44.0 // indirect
go.opentelemetry.io/otel/trace v1.44.0 // indirect
go.uber.org/atomic v1.11.0 // indirect
- golang.org/x/crypto v0.51.0 // indirect
+ golang.org/x/crypto v0.53.0 // indirect
golang.org/x/oauth2 v0.36.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/sys v0.46.0 // indirect
+ golang.org/x/term v0.44.0 // indirect
+ golang.org/x/text v0.38.0 // indirect
golang.org/x/time v0.15.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
diff --git a/go.sum b/go.sum
index 2ba7b9644c2..e7155fefed2 100644
--- a/go.sum
+++ b/go.sum
@@ -388,8 +388,8 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-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.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto=
+golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio=
golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 h1:jiDhWWeC7jfWqR9c/uplMOqJ0sbNlNWv0UkzE0vX1MA=
golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90/go.mod h1:xE1HEv6b+1SCZ5/uscMRjUBKtIxworgEcEi+/n9NQDQ=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
@@ -402,8 +402,8 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL
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.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=
@@ -420,14 +420,14 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-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.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4=
-golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk=
+golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw=
+golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
+golang.org/x/term v0.44.0 h1:0rLvDRCtNj0gZkyIXhCyOb2OAzEhLVqc4B+hrsBhrmc=
+golang.org/x/term v0.44.0/go.mod h1:7ze4MdzUzLXpSAoFP1H0bOI9aXDqveSvatT5vKcFh2Y=
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.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc=
-golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38=
+golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE=
+golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4=
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=
From 7ebfba1c8e8f1d22a59bdec240b03f3384dd1a43 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 12 Jun 2026 12:42:44 +0000
Subject: [PATCH 70/81] build(deps): bump github.com/prometheus/alertmanager
Bumps [github.com/prometheus/alertmanager](https://github.com/prometheus/alertmanager) from 0.32.2 to 0.33.0.
- [Release notes](https://github.com/prometheus/alertmanager/releases)
- [Changelog](https://github.com/prometheus/alertmanager/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prometheus/alertmanager/commits)
---
updated-dependencies:
- dependency-name: github.com/prometheus/alertmanager
dependency-version: 0.33.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
---
go.mod | 48 ++++++++++++-----
go.sum | 160 ++++++++++++++++++++++++++++++++++++++++++++++-----------
2 files changed, 165 insertions(+), 43 deletions(-)
diff --git a/go.mod b/go.mod
index 77e903dbffd..63ee9807910 100644
--- a/go.mod
+++ b/go.mod
@@ -21,7 +21,7 @@ require (
github.com/prometheus-community/prom-label-proxy v0.13.0
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.91.0
github.com/prometheus-operator/prometheus-operator/pkg/client v0.91.0
- github.com/prometheus/alertmanager v0.32.2
+ github.com/prometheus/alertmanager v0.33.0
github.com/prometheus/client_golang v1.23.2
github.com/prometheus/common v0.68.1
github.com/prometheus/exporter-toolkit v0.16.0
@@ -45,6 +45,7 @@ require (
)
require (
+ github.com/armon/go-metrics v0.4.1 // indirect
github.com/aws/aws-sdk-go-v2 v1.41.7 // indirect
github.com/aws/aws-sdk-go-v2/config v1.32.18 // indirect
github.com/aws/aws-sdk-go-v2/credentials v1.19.17 // indirect
@@ -59,35 +60,54 @@ require (
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.0 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.42.1 // indirect
github.com/aws/smithy-go v1.26.0 // indirect
+ github.com/cenkalti/backoff/v4 v4.3.0 // indirect
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
+ github.com/coder/quartz v0.3.1 // indirect
github.com/coreos/go-systemd/v22 v22.7.0 // indirect
github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/fxamacker/cbor/v2 v2.9.0 // indirect
- github.com/go-openapi/swag v0.25.5 // indirect
- github.com/go-openapi/swag/cmdutils v0.25.5 // indirect
- github.com/go-openapi/swag/conv v0.25.5 // indirect
- github.com/go-openapi/swag/fileutils v0.25.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.25.5 // indirect
- github.com/go-openapi/swag/loading v0.25.5 // indirect
- github.com/go-openapi/swag/mangling v0.25.5 // indirect
- github.com/go-openapi/swag/netutils v0.25.5 // indirect
- github.com/go-openapi/swag/stringutils v0.25.5 // indirect
- github.com/go-openapi/swag/typeutils v0.25.5 // indirect
- github.com/go-openapi/swag/yamlutils v0.25.5 // 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-viper/mapstructure/v2 v2.5.0 // indirect
github.com/golang-jwt/jwt/v5 v5.3.1 // indirect
+ github.com/google/btree v1.1.3 // indirect
github.com/google/gnostic-models v0.7.1 // indirect
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect
+ github.com/hashicorp/errwrap v1.1.0 // indirect
+ github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
+ github.com/hashicorp/go-metrics v0.5.4 // indirect
+ github.com/hashicorp/go-msgpack/v2 v2.1.5 // indirect
+ github.com/hashicorp/go-multierror v1.1.1 // indirect
+ github.com/hashicorp/go-sockaddr v1.0.7 // indirect
+ github.com/hashicorp/golang-lru v0.6.0 // indirect
+ github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
+ github.com/hashicorp/memberlist v0.5.4 // indirect
+ github.com/klauspost/compress v1.18.6 // indirect
github.com/mdlayher/socket v0.5.1 // indirect
github.com/mdlayher/vsock v1.2.1 // indirect
+ github.com/miekg/dns v1.1.72 // indirect
github.com/mitchellh/go-ps v1.0.0 // indirect
github.com/oklog/ulid/v2 v2.1.1 // indirect
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
+ github.com/pierrec/lz4/v4 v4.1.26 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/prometheus/sigv4 v0.4.1 // indirect
+ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect
+ github.com/twmb/franz-go v1.21.2 // indirect
+ github.com/twmb/franz-go/pkg/kmsg v1.13.1 // indirect
+ github.com/twmb/franz-go/plugin/kslog v1.0.0 // indirect
github.com/x448/float16 v0.8.4 // indirect
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.69.0 // indirect
@@ -100,6 +120,8 @@ require (
go.yaml.in/yaml/v2 v2.4.4 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 // indirect
+ golang.org/x/mod v0.36.0 // indirect
+ golang.org/x/tools v0.45.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa // indirect
google.golang.org/grpc v1.81.1 // indirect
@@ -125,7 +147,7 @@ require (
github.com/go-openapi/jsonpointer v0.23.1 // indirect
github.com/go-openapi/jsonreference v0.21.5 // indirect
github.com/go-openapi/loads v0.23.3 // indirect
- github.com/go-openapi/runtime v0.29.3 // indirect
+ github.com/go-openapi/runtime v0.29.4 // indirect
github.com/go-openapi/spec v0.22.4 // indirect
github.com/go-openapi/strfmt v0.26.2 // indirect
github.com/go-openapi/validate v0.25.2 // indirect
diff --git a/go.sum b/go.sum
index e7155fefed2..9fb1f609050 100644
--- a/go.sum
+++ b/go.sum
@@ -1,3 +1,4 @@
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.120.0 h1:wc6bgG9DHyKqF5/vQvX1CiZrtHnxJjBlKUyF9nP6meA=
cloud.google.com/go/auth v0.20.0 h1:kXTssoVb4azsVDoUiF8KvxAqrsQcQtB53DcSgta74CA=
cloud.google.com/go/auth v0.20.0/go.mod h1:942/yi/itH1SsmpyrbnTMDgGfdy2BUqIKyd0cyYLc5Q=
@@ -14,6 +15,7 @@ github.com/Azure/azure-sdk-for-go/sdk/internal v1.12.0/go.mod h1:7dCRMLwisfRH3dB
github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 h1:XRzhVemXdgvJqCH0sFfrBUTnUJSBrBf7++ypk+twtRs=
github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk=
github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
+github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
github.com/KimMachineGun/automemlimit v0.7.5 h1:RkbaC0MwhjL1ZuBKunGDjE/ggwAX43DwZrJqVwyveTk=
github.com/KimMachineGun/automemlimit v0.7.5/go.mod h1:QZxpHaGOQoYvFhv/r4u3U0JTC2ZcOwbSr11UZF46UBM=
github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=
@@ -24,8 +26,11 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vSQ6PWWSL9lK8qwHozUj03+zLoEB8O0=
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs=
+github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=
+github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
@@ -66,11 +71,17 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
+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/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.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
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/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
+github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
+github.com/coder/quartz v0.3.1 h1:JMJLj4Xj4NLSrUC1R/g/Hn0y9fkyOvb8tf6P0j+kPn0=
+github.com/coder/quartz v0.3.1/go.mod h1:BgE7DOj/8NfvRgvKw0jPLDQH/2Lya2kxcTaNJ8X0rZk=
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.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
@@ -100,10 +111,12 @@ github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sa
github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU=
github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
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-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
github.com/go-logfmt/logfmt v0.6.1 h1:4hvbpePJKnIzH1B+8OR/JPbTx37NktoI9LE2QZBBkvE=
github.com/go-logfmt/logfmt v0.6.1/go.mod h1:EV2pOAQoZaT1ZXZbqDl5hrymndi4SY9ED9/z6CO0XAk=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
@@ -123,40 +136,40 @@ github.com/go-openapi/jsonreference v0.21.5 h1:6uCGVXU/aNF13AQNggxfysJ+5ZcU4nEAe
github.com/go-openapi/jsonreference v0.21.5/go.mod h1:u25Bw85sX4E2jzFodh1FOKMTZLcfifd1Q+iKKOUxExw=
github.com/go-openapi/loads v0.23.3 h1:g5Xap1JfwKkUnZdn+S0L3SzBDpcTIYzZ5Qaag0YDkKQ=
github.com/go-openapi/loads v0.23.3/go.mod h1:NOH07zLajXo8y55hom0omlHWDVVvCwBM/S+csCK8LqA=
-github.com/go-openapi/runtime v0.29.3 h1:h5twGaEqxtQg40ePiYm9vFFH1q06Czd7Ot6ufdK0w/Y=
-github.com/go-openapi/runtime v0.29.3/go.mod h1:8A1W0/L5eyNJvKciqZtvIVQvYO66NlB7INMSZ9bw/oI=
+github.com/go-openapi/runtime v0.29.4 h1:k2lDxrGoSAJRdhFG2tONKMpkizY/4X1cciSdtzk4Jjo=
+github.com/go-openapi/runtime v0.29.4/go.mod h1:K0k/2raY6oqXJnZAgWJB2i/12QKrhUKpZcH4PfV9P18=
github.com/go-openapi/spec v0.22.4 h1:4pxGjipMKu0FzFiu/DPwN3CTBRlVM2yLf/YTWorYfDQ=
github.com/go-openapi/spec v0.22.4/go.mod h1:WQ6Ai0VPWMZgMT4XySjlRIE6GP1bGQOtEThn3gcWLtQ=
github.com/go-openapi/strfmt v0.26.2 h1:ysjheCh4i1rmFEo2LanhELDNucNzfWTZhUDKgWWPaFM=
github.com/go-openapi/strfmt v0.26.2/go.mod h1:fXh1e449cyUn2NYuz+wb3wARBUdMl7qPEZwX00nqivY=
-github.com/go-openapi/swag v0.25.5 h1:pNkwbUEeGwMtcgxDr+2GBPAk4kT+kJ+AaB+TMKAg+TU=
-github.com/go-openapi/swag v0.25.5/go.mod h1:B3RT6l8q7X803JRxa2e59tHOiZlX1t8viplOcs9CwTA=
-github.com/go-openapi/swag/cmdutils v0.25.5 h1:yh5hHrpgsw4NwM9KAEtaDTXILYzdXh/I8Whhx9hKj7c=
-github.com/go-openapi/swag/cmdutils v0.25.5/go.mod h1:pdae/AFo6WxLl5L0rq87eRzVPm/XRHM3MoYgRMvG4A0=
-github.com/go-openapi/swag/conv v0.25.5 h1:wAXBYEXJjoKwE5+vc9YHhpQOFj2JYBMF2DUi+tGu97g=
-github.com/go-openapi/swag/conv v0.25.5/go.mod h1:CuJ1eWvh1c4ORKx7unQnFGyvBbNlRKbnRyAvDvzWA4k=
-github.com/go-openapi/swag/fileutils v0.25.5 h1:B6JTdOcs2c0dBIs9HnkyTW+5gC+8NIhVBUwERkFhMWk=
-github.com/go-openapi/swag/fileutils v0.25.5/go.mod h1:V3cT9UdMQIaH4WiTrUc9EPtVA4txS0TOmRURmhGF4kc=
+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.25.5 h1:XUZF8awQr75MXeC+/iaw5usY/iM7nXPDwdG3Jbl9vYo=
-github.com/go-openapi/swag/jsonutils v0.25.5/go.mod h1:48FXUaz8YsDAA9s5AnaUvAmry1UcLcNVWUjY42XkrN4=
-github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.5 h1:SX6sE4FrGb4sEnnxbFL/25yZBb5Hcg1inLeErd86Y1U=
-github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.5/go.mod h1:/2KvOTrKWjVA5Xli3DZWdMCZDzz3uV/T7bXwrKWPquo=
-github.com/go-openapi/swag/loading v0.25.5 h1:odQ/umlIZ1ZVRteI6ckSrvP6e2w9UTF5qgNdemJHjuU=
-github.com/go-openapi/swag/loading v0.25.5/go.mod h1:I8A8RaaQ4DApxhPSWLNYWh9NvmX2YKMoB9nwvv6oW6g=
-github.com/go-openapi/swag/mangling v0.25.5 h1:hyrnvbQRS7vKePQPHHDso+k6CGn5ZBs5232UqWZmJZw=
-github.com/go-openapi/swag/mangling v0.25.5/go.mod h1:6hadXM/o312N/h98RwByLg088U61TPGiltQn71Iw0NY=
-github.com/go-openapi/swag/netutils v0.25.5 h1:LZq2Xc2QI8+7838elRAaPCeqJnHODfSyOa7ZGfxDKlU=
-github.com/go-openapi/swag/netutils v0.25.5/go.mod h1:lHbtmj4m57APG/8H7ZcMMSWzNqIQcu0RFiXrPUara14=
-github.com/go-openapi/swag/stringutils v0.25.5 h1:NVkoDOA8YBgtAR/zvCx5rhJKtZF3IzXcDdwOsYzrB6M=
-github.com/go-openapi/swag/stringutils v0.25.5/go.mod h1:PKK8EZdu4QJq8iezt17HM8RXnLAzY7gW0O1KKarrZII=
-github.com/go-openapi/swag/typeutils v0.25.5 h1:EFJ+PCga2HfHGdo8s8VJXEVbeXRCYwzzr9u4rJk7L7E=
-github.com/go-openapi/swag/typeutils v0.25.5/go.mod h1:itmFmScAYE1bSD8C4rS0W+0InZUBrB2xSPbWt6DLGuc=
-github.com/go-openapi/swag/yamlutils v0.25.5 h1:kASCIS+oIeoc55j28T4o8KwlV2S4ZLPT6G0iq2SSbVQ=
-github.com/go-openapi/swag/yamlutils v0.25.5/go.mod h1:Gek1/SjjfbYvM+Iq4QGwa/2lEXde9n2j4a3wI3pNuOQ=
-github.com/go-openapi/testify/enable/yaml/v2 v2.4.1 h1:NZOrZmIb6PTv5LTFxr5/mKV/FjbUzGE7E6gLz7vFoOQ=
-github.com/go-openapi/testify/enable/yaml/v2 v2.4.1/go.mod h1:r7dwsujEHawapMsxA69i+XMGZrQ5tRauhLAjV/sxg3Q=
+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-openapi/validate v0.25.2 h1:12NsfLAwGegqbGWr2CnvT65X/Q2USJipmJ9b7xDJZz0=
@@ -176,14 +189,26 @@ github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArs
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.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs=
github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg=
+github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
github.com/google/gnostic-models v0.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.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
@@ -204,15 +229,43 @@ github.com/grafana/regexp v0.0.0-20250905093917-f7b3be9d1853 h1:cLN4IBkmkYZNnk7E
github.com/grafana/regexp v0.0.0-20250905093917-f7b3be9d1853/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 h1:5VipnvEpbqr2gA2VbM+nYVbkIF28c5ZQfqCBQ5g2xfk=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0/go.mod h1:Hyl3n6Twe1hvtd9XUXDec4pTvgMSEixRuQKPTMH2bNs=
+github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
+github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
+github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
+github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=
+github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
+github.com/hashicorp/go-metrics v0.5.4 h1:8mmPiIJkTPPEbAiV97IxdAGNdRdaWwVap1BU6elejKY=
+github.com/hashicorp/go-metrics v0.5.4/go.mod h1:CG5yz4NZ/AI/aQt9Ucm/vdBnbh7fvmv4lxZ350i+QQI=
+github.com/hashicorp/go-msgpack/v2 v2.1.5 h1:Ue879bPnutj/hXfmUk6s/jtIK90XxgiUIcXRl656T44=
+github.com/hashicorp/go-msgpack/v2 v2.1.5/go.mod h1:bjCsRXpZ7NsJdk45PoCQnzRGDaK8TKm5ZnDI/9y3J4M=
+github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
+github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
+github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
+github.com/hashicorp/go-sockaddr v1.0.7 h1:G+pTkSO01HpR5qCxg7lxfsFEZaG+C0VssTy/9dbT+Fw=
+github.com/hashicorp/go-sockaddr v1.0.7/go.mod h1:FZQbEYa1pxkQ7WLpyXJ6cbjpT8q0YgQaK/JakXqGyWw=
+github.com/hashicorp/go-uuid v1.0.0 h1:RS8zrF7PhGwyNPOtxSClXXj9HA8feRnJzgnI1RJCSnM=
+github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4=
+github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
+github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
+github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
+github.com/hashicorp/memberlist v0.5.4 h1:40YY+3qq2tAUhZIMEK8kqusKZBBjdwJ3NUjvYkcxh74=
+github.com/hashicorp/memberlist v0.5.4/go.mod h1:OgN6xiIo6RlHUWk+ALjP9e32xWCoQrsOCmHrWCm2MWA=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
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.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao=
@@ -220,6 +273,7 @@ github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl
github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE=
github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3/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=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
@@ -237,6 +291,8 @@ github.com/mdlayher/vsock v1.2.1 h1:pC1mTJTvjo1r9n9fbm7S1j04rCgCzhCOS5DY0zqHlnQ=
github.com/mdlayher/vsock v1.2.1/go.mod h1:NRfCibel++DgeMD8z/hP+PPTjlNJsdPOmxcnENvE+SE=
github.com/metalmatze/signal v0.0.0-20210307161603-1c9aa721a97a h1:0usWxe5SGXKQovz3p+BiQ81Jy845xSMu2CWKuXsXuUM=
github.com/metalmatze/signal v0.0.0-20210307161603-1c9aa721a97a/go.mod h1:3OETvrxfELvGsU2RoGGWercfeZ4bCL3+SOwzIWtJH/Q=
+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/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM=
github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8=
github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc=
@@ -269,9 +325,13 @@ github.com/onsi/gomega v1.39.0 h1:y2ROC3hKFmQZJNFeGAMeHZKkjBL65mIZcvrLQBF9k6Q=
github.com/onsi/gomega v1.39.0/go.mod h1:ZCU1pkQcXDO5Sl9/VVEGlDyp+zm0m1cmeG5TOzLgdh4=
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/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=
+github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0=
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y=
github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o=
+github.com/pierrec/lz4/v4 v4.1.26 h1:GrpZw1gZttORinvzBdXPUXATeqlJjqUG/D87TKMnhjY=
+github.com/pierrec/lz4/v4 v4.1.26/go.mod h1:EoQMVJgeeEOMsCqCzqFm2O0cJvljX2nGZjcRIPL34O4=
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -283,11 +343,14 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus-community/prom-label-proxy v0.13.0 h1:SD27XYzzLbw1TL9Jv/W2yAWJ9pCz2EsUTyhjya87Ndg=
github.com/prometheus-community/prom-label-proxy v0.13.0/go.mod h1:T5Z6OtsxvjFbbhvQ7wyrJu+CBdGBQeWcNkC8SSy4WUU=
-github.com/prometheus/alertmanager v0.32.2 h1:R09NCbM6mN+gh7bz2kABop6cW9JSaikMcotaINmyvec=
-github.com/prometheus/alertmanager v0.32.2/go.mod h1:0Dy9faTtMgpVYxJVxV0o65elTxHnSRCF/7gy5BKGZiE=
+github.com/prometheus/alertmanager v0.33.0 h1:AAVa3wpCsaDxisTUUPXx+1qhnA2mx0f8Cc+smpAtN7w=
+github.com/prometheus/alertmanager v0.33.0/go.mod h1:V06Uc8EZ5X5wLOJRGhtXx+EE2LgrinFIADbKWMVm1RY=
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.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
+github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
+github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o=
github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg=
github.com/prometheus/client_golang/exp v0.0.0-20260518105423-c9d5bc4c50a9 h1:e33IfrrwrJkylWwAGcQ2jMvbWVv13lv0suTXjGNeiqY=
@@ -299,6 +362,8 @@ github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNw
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.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
+github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
github.com/prometheus/common v0.68.1 h1:omjRRl4QP4komogpXuhfeOiisQg7xdy8VM1UY+pStaY=
github.com/prometheus/common v0.68.1/go.mod h1:ZzL3f6u94qUxh9p+tJTrF+FvBS1XXbbRAZCQkytAL0Y=
github.com/prometheus/exporter-toolkit v0.16.0 h1:xT/j7L2XKF+VJd6B4fpUw6xWabHrSmsUf6mYmFqyu0s=
@@ -308,6 +373,8 @@ github.com/prometheus/otlptranslator v1.0.0/go.mod h1:vRYWnXvI6aWGpsdY/mOT/cbeVR
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.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
+github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc=
github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo=
github.com/prometheus/prometheus v0.312.0 h1:f9jdv2fQhQ1fks9a9YwlGZrKr4hih0rRP/rh0mu3Q18=
@@ -317,8 +384,11 @@ github.com/prometheus/sigv4 v0.4.1/go.mod h1:eu+ZbRvsc5TPiHwqh77OWuCnWK73IdkETYY
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/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=
+github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
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=
@@ -342,6 +412,15 @@ github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
github.com/thanos-io/thanos v0.41.0 h1:GDPGynjHBa8ORAX7DfluBFjHbMeY1BzjLTGdviFvo7Q=
github.com/thanos-io/thanos v0.41.0/go.mod h1:ppdHafpAT8WAbcwgLiNU4jNtNe17Ct3xX9dXq+h6g2k=
+github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
+github.com/twmb/franz-go v1.21.2 h1:WrvV/spF48JzcRylqDQy02Vm6V6W4lhtD9Y4BOYNMu4=
+github.com/twmb/franz-go v1.21.2/go.mod h1:rfoMTnVk7107fhTGxfEKIHP/e7tPe6oyij/ywzO0czk=
+github.com/twmb/franz-go/pkg/kfake v0.0.0-20260515175617-8268a5d078c0 h1:YWmvjmcidrKLLgObwU1k7K9KuesdYTV33OTIS0Ltj8o=
+github.com/twmb/franz-go/pkg/kfake v0.0.0-20260515175617-8268a5d078c0/go.mod h1:9j4VxU2ng6tHgD4lIkNJ5OJ3D6vgPhhIp3tBa7dJgLA=
+github.com/twmb/franz-go/pkg/kmsg v1.13.1 h1:fG5kItwysTk5UXqVwb64EpQEy3TydF3vYYK21nUQ+bI=
+github.com/twmb/franz-go/pkg/kmsg v1.13.1/go.mod h1:+DPt4NC8RmI6hqb8G09+3giKObE6uD2Eya6CfqBpeJY=
+github.com/twmb/franz-go/plugin/kslog v1.0.0 h1:I64oEmF+0PDvmyLgwrlOtg4mfpSE9GwlcLxM4af2t60=
+github.com/twmb/franz-go/plugin/kslog v1.0.0/go.mod h1:8pMjK3OJJJNNYddBSbnXZkIK5dCKFIk9GcVVCDgvnQc=
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc=
@@ -396,14 +475,18 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.36.0 h1:JJjpVx6myfUsUdAzZuOSTTmRE0PfZeNWzzvKrP7amb4=
golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
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-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
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.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
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=
@@ -411,6 +494,7 @@ 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-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-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM=
golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -418,13 +502,20 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw=
golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
golang.org/x/term v0.44.0 h1:0rLvDRCtNj0gZkyIXhCyOb2OAzEhLVqc4B+hrsBhrmc=
golang.org/x/term v0.44.0/go.mod h1:7ze4MdzUzLXpSAoFP1H0bOI9aXDqveSvatT5vKcFh2Y=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE=
golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4=
@@ -444,12 +535,20 @@ gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=
gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E=
google.golang.org/api v0.278.0 h1:W7jiRvRi53VYFfZ/HoZjQBtJk7gOFbHD8ot1RzVZU6E=
google.golang.org/api v0.278.0/go.mod h1:B9TqLBwJqVjp1mtt7WeoQwWRwvu/400y5lETOql+giQ=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa h1:Kjn0N0tCrDgiAFW+lGO4JZ3ck44CehvJQMAwj9QF0G8=
google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:q4lMZS6kskjT5HvCPrnnypcDPVJqT/f4nfxmkE7gryY=
google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa h1:mZHHdPZl0dbGHCflZgAq/Q468DWVFcU2whhB2KAo8fk=
google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa/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 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.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
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=
@@ -465,6 +564,7 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
From 8d7565178dd87790bfc563b7865278c0bfee53ab Mon Sep 17 00:00:00 2001
From: Nutmos
Date: Fri, 12 Jun 2026 20:06:55 +0700
Subject: [PATCH 71/81] Merge pull request #8269 from
nutmos/feat/refactor-error-logs-for-validations
Feat: Refactor Error Messages for Alertmanager Receiver Validations
---
pkg/alertmanager/validation/v1/validation.go | 16 +-
.../validation/v1alpha1/validation.go | 387 +++++++++++------
.../validation/v1beta1/validation.go | 388 ++++++++++++------
pkg/apis/monitoring/v1/prometheus_types.go | 4 +-
pkg/apis/monitoring/v1/types.go | 6 +-
pkg/apis/monitoring/v1alpha1/validation.go | 20 +-
pkg/apis/monitoring/v1beta1/validation.go | 20 +-
7 files changed, 549 insertions(+), 292 deletions(-)
diff --git a/pkg/alertmanager/validation/v1/validation.go b/pkg/alertmanager/validation/v1/validation.go
index 78ddf1d7986..42a891bc0aa 100644
--- a/pkg/alertmanager/validation/v1/validation.go
+++ b/pkg/alertmanager/validation/v1/validation.go
@@ -27,7 +27,7 @@ func ValidateAlertmanagerGlobalConfig(gc *monitoringv1.AlertmanagerGlobalConfig)
}
if err := gc.HTTPConfigWithProxy.Validate(); err != nil {
- return fmt.Errorf("httpConfig: %w", err)
+ return fmt.Errorf("'httpConfig': %w", err)
}
if err := validatingTelegramConfig(gc.TelegramConfig); err != nil {
@@ -51,7 +51,7 @@ func ValidateAlertmanagerGlobalConfig(gc *monitoringv1.AlertmanagerGlobalConfig)
}
if err := validateGlobalWeChatConfig(gc.WeChatConfig); err != nil {
- return fmt.Errorf("wechatConfig: %w", err)
+ return fmt.Errorf("'wechat': %w", err)
}
return nil
@@ -63,7 +63,7 @@ func validatingTelegramConfig(tc *monitoringv1.GlobalTelegramConfig) error {
}
if err := validation.ValidateURLPtr((*string)(tc.APIURL)); err != nil {
- return fmt.Errorf("invalid apiURL: %w", err)
+ return fmt.Errorf("invalid 'apiURL': %w", err)
}
return nil
@@ -75,7 +75,7 @@ func validateGlobalJiraConfig(jc *monitoringv1.GlobalJiraConfig) error {
}
if err := validation.ValidateURLPtr((*string)(jc.APIURL)); err != nil {
- return fmt.Errorf("invalid apiURL: %w", err)
+ return fmt.Errorf("invalid 'apiURL': %w", err)
}
return nil
@@ -87,7 +87,7 @@ func validateGlobalVictorOpsConfig(vc *monitoringv1.GlobalVictorOpsConfig) error
}
if err := validation.ValidateURLPtr((*string)(vc.APIURL)); err != nil {
- return fmt.Errorf("invalid apiURL: %w", err)
+ return fmt.Errorf("invalid 'apiURL': %w", err)
}
return nil
@@ -99,7 +99,7 @@ func validateGlobalRocketChatConfig(rc *monitoringv1.GlobalRocketChatConfig) err
}
if err := validation.ValidateURLPtr((*string)(rc.APIURL)); err != nil {
- return fmt.Errorf("invalid apiURL: %w", err)
+ return fmt.Errorf("invalid 'apiURL': %w", err)
}
return nil
@@ -111,7 +111,7 @@ func validateGlobalWebexConfig(wc *monitoringv1.GlobalWebexConfig) error {
}
if err := validation.ValidateURLPtr((*string)(wc.APIURL)); err != nil {
- return fmt.Errorf("invalid apiURL: %w", err)
+ return fmt.Errorf("invalid 'apiURL': %w", err)
}
return nil
@@ -123,7 +123,7 @@ func validateGlobalWeChatConfig(wc *monitoringv1.GlobalWeChatConfig) error {
}
if err := validation.ValidateURLPtr((*string)(wc.APIURL)); err != nil {
- return fmt.Errorf("invalid apiURL: %w", err)
+ return fmt.Errorf("invalid 'apiURL': %w", err)
}
return nil
diff --git a/pkg/alertmanager/validation/v1alpha1/validation.go b/pkg/alertmanager/validation/v1alpha1/validation.go
index a031b0d0178..676827f18f6 100644
--- a/pkg/alertmanager/validation/v1alpha1/validation.go
+++ b/pkg/alertmanager/validation/v1alpha1/validation.go
@@ -54,64 +54,68 @@ func validateReceivers(receivers []monitoringv1alpha1.Receiver) (map[string]stru
}
receiverNames[receiver.Name] = struct{}{}
- if err = validatePagerDutyConfigs(receiver.PagerDutyConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'pagerDutyConfig' - receiver %s: %w", receiver.Name, err)
+ receiverValidationFailedFormat := func(err error) (map[string]struct{}, error) {
+ return nil, fmt.Errorf("failed to validate receiver %q: %w", receiver.Name, err)
}
if err := validateOpsGenieConfigs(receiver.OpsGenieConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'opsGenieConfig' - receiver %s: %w", receiver.Name, err)
+ return receiverValidationFailedFormat(err)
+ }
+
+ if err = validatePagerDutyConfigs(receiver.PagerDutyConfigs); err != nil {
+ return receiverValidationFailedFormat(err)
+ }
+
+ if err := validateDiscordConfigs(receiver.DiscordConfigs); err != nil {
+ return receiverValidationFailedFormat(err)
}
if err := validateSlackConfigs(receiver.SlackConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'slackConfig' - receiver %s: %w", receiver.Name, err)
+ return receiverValidationFailedFormat(err)
}
if err := validateWebhookConfigs(receiver.WebhookConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'webhookConfig' - receiver %s: %w", receiver.Name, err)
+ return receiverValidationFailedFormat(err)
}
if err := validateWechatConfigs(receiver.WeChatConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'weChatConfig' - receiver %s: %w", receiver.Name, err)
+ return receiverValidationFailedFormat(err)
}
if err := validateEmailConfig(receiver.EmailConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'emailConfig' - receiver %s: %w", receiver.Name, err)
+ return receiverValidationFailedFormat(err)
}
if err := validateVictorOpsConfigs(receiver.VictorOpsConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'victorOpsConfig' - receiver %s: %w", receiver.Name, err)
+ return receiverValidationFailedFormat(err)
}
if err := validatePushoverConfigs(receiver.PushoverConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'pushOverConfig' - receiver %s: %w", receiver.Name, err)
+ return receiverValidationFailedFormat(err)
}
- if err := validateSnsConfigs(receiver.SNSConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'snsConfig' - receiver %s: %w", receiver.Name, err)
+ if err := validateSNSConfigs(receiver.SNSConfigs); err != nil {
+ return receiverValidationFailedFormat(err)
}
if err := validateTelegramConfigs(receiver.TelegramConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'telegramConfig' - receiver %s: %w", receiver.Name, err)
+ return receiverValidationFailedFormat(err)
}
if err := validateWebexConfigs(receiver.WebexConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'webexConfig' - receiver %s: %w", receiver.Name, err)
- }
-
- if err := validateDiscordConfigs(receiver.DiscordConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'discordConfig' - receiver %s: %w", receiver.Name, err)
+ return receiverValidationFailedFormat(err)
}
if err := validateMSTeamsConfigs(receiver.MSTeamsConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'msteamsConfig' - receiver %s: %w", receiver.Name, err)
+ return receiverValidationFailedFormat(err)
}
- if err := validateRocketchatConfigs(receiver.RocketChatConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'rocketchatConfig' - receiver %s: %w", receiver.Name, err)
+ if err := validateMSTeamsV2Configs(receiver.MSTeamsV2Configs); err != nil {
+ return receiverValidationFailedFormat(err)
}
- if err := validateMSTeamsV2Configs(receiver.MSTeamsV2Configs); err != nil {
- return nil, fmt.Errorf("failed to validate 'msteamsv2Config' - receiver %s: %w", receiver.Name, err)
+ if err := validateRocketchatConfigs(receiver.RocketChatConfigs); err != nil {
+ return receiverValidationFailedFormat(err)
}
}
@@ -119,14 +123,14 @@ func validateReceivers(receivers []monitoringv1alpha1.Receiver) (map[string]stru
}
func validatePagerDutyConfigs(configs []monitoringv1alpha1.PagerDutyConfig) error {
- for i, conf := range configs {
+ v := func(conf monitoringv1alpha1.PagerDutyConfig) error {
if err := validation.ValidateURLPtr((*string)(conf.URL)); err != nil {
- return fmt.Errorf("[%d]: url: %w", i, err)
+ return fmt.Errorf("invalid 'url': %w", err)
}
if conf.ClientURL != nil && *conf.ClientURL != "" {
if err := validation.ValidateTemplateURL(*conf.ClientURL); err != nil {
- return fmt.Errorf("[%d]: clientURL: %w", i, err)
+ return fmt.Errorf("invalid 'clientURL': %w", err)
}
}
@@ -137,7 +141,7 @@ func validatePagerDutyConfigs(configs []monitoringv1alpha1.PagerDutyConfig) erro
for j, lc := range conf.PagerDutyLinkConfigs {
if lc.Href != nil && *lc.Href != "" {
if err := validation.ValidateTemplateURL(*lc.Href); err != nil {
- return fmt.Errorf("[%d]: pagerDutyLinkConfigs[%d]: href: %w", i, j, err)
+ return fmt.Errorf("'pagerDutyLinkConfigs'[%d]: invalid 'href': %w", j, err)
}
}
}
@@ -145,30 +149,47 @@ func validatePagerDutyConfigs(configs []monitoringv1alpha1.PagerDutyConfig) erro
for j, ic := range conf.PagerDutyImageConfigs {
if ic.Href != nil && *ic.Href != "" {
if err := validation.ValidateTemplateURL(*ic.Href); err != nil {
- return fmt.Errorf("[%d]: pagerDutyImageConfigs[%d]: href: %w", i, j, err)
+ return fmt.Errorf("'pagerDutyImageConfigs'[%d]: invalid 'href': %w", j, err)
}
}
}
if err := conf.HTTPConfig.Validate(); err != nil {
- return err
+ return fmt.Errorf("'httpConfig': %w", err)
+ }
+
+ return nil
+ }
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'pagerdutyConfigs'[%d]: %w", i, err)
}
}
+
return nil
}
func validateOpsGenieConfigs(configs []monitoringv1alpha1.OpsGenieConfig) error {
- for i, config := range configs {
- if err := config.Validate(); err != nil {
- return fmt.Errorf("[%d]: %w", i, err)
+ v := func(conf monitoringv1alpha1.OpsGenieConfig) error {
+ if err := conf.Validate(); err != nil {
+ return err
}
- if err := validation.ValidateURLPtr((*string)(config.APIURL)); err != nil {
- return fmt.Errorf("[%d]: apiURL: %w", i, err)
+ if err := validation.ValidateURLPtr((*string)(conf.APIURL)); err != nil {
+ return fmt.Errorf("invalid 'apiURL': %w", err)
}
- if err := config.HTTPConfig.Validate(); err != nil {
- return fmt.Errorf("[%d]: %w", i, err)
+ if err := conf.HTTPConfig.Validate(); err != nil {
+ return fmt.Errorf("'httpConfig': %w", err)
+ }
+
+ return nil
+ }
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'opsgenieConfigs'[%d]: %w", i, err)
}
}
@@ -176,40 +197,57 @@ func validateOpsGenieConfigs(configs []monitoringv1alpha1.OpsGenieConfig) error
}
func validateDiscordConfigs(configs []monitoringv1alpha1.DiscordConfig) error {
- for _, config := range configs {
- if err := config.HTTPConfig.Validate(); err != nil {
- return err
+ v := func(conf monitoringv1alpha1.DiscordConfig) error {
+ if err := conf.HTTPConfig.Validate(); err != nil {
+ return fmt.Errorf("'httpConfig': %w", err)
+ }
+
+ return nil
+ }
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'discordConfigs'[%d]: %w", i, err)
}
}
+
return nil
}
func validateRocketchatConfigs(configs []monitoringv1alpha1.RocketChatConfig) error {
- for i, config := range configs {
- if err := validation.ValidateURLPtr((*string)(config.APIURL)); err != nil {
- return fmt.Errorf("[%d]: apiURL: %w", i, err)
+ v := func(conf monitoringv1alpha1.RocketChatConfig) error {
+ if err := validation.ValidateURLPtr((*string)(conf.APIURL)); err != nil {
+ return fmt.Errorf("invalid 'apiURL': %w", err)
}
- if err := validation.ValidateTemplateURLPtr(config.IconURL); err != nil {
- return fmt.Errorf("[%d]: invalid 'iconURL': %w", i, err)
+ if err := validation.ValidateTemplateURLPtr(conf.IconURL); err != nil {
+ return fmt.Errorf("invalid 'iconURL': %w", err)
}
- if err := validation.ValidateTemplateURLPtr(config.ImageURL); err != nil {
- return fmt.Errorf("[%d]: invalid 'imageURL': %w", i, err)
+ if err := validation.ValidateTemplateURLPtr(conf.ImageURL); err != nil {
+ return fmt.Errorf("invalid 'imageURL': %w", err)
}
- if err := validation.ValidateTemplateURLPtr(config.ThumbURL); err != nil {
- return fmt.Errorf("[%d]: invalid 'thumbURL': %w", i, err)
+ if err := validation.ValidateTemplateURLPtr(conf.ThumbURL); err != nil {
+ return fmt.Errorf("invalid 'thumbURL': %w", err)
}
- for j, a := range config.Actions {
+ for j, a := range conf.Actions {
if err := validation.ValidateTemplateURLPtr(a.URL); err != nil {
- return fmt.Errorf("[%d]: actions[%d]: invalid 'url': %w", i, j, err)
+ return fmt.Errorf("'actions'[%d]: invalid 'url': %w", j, err)
}
}
- if err := config.HTTPConfig.Validate(); err != nil {
- return fmt.Errorf("[%d]: %w", i, err)
+ if err := conf.HTTPConfig.Validate(); err != nil {
+ return fmt.Errorf("'httpConfig': %w", err)
+ }
+
+ return nil
+ }
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'rocketchatConfigs'[%d]: %w", i, err)
}
}
@@ -217,30 +255,47 @@ func validateRocketchatConfigs(configs []monitoringv1alpha1.RocketChatConfig) er
}
func validateSlackConfigs(configs []monitoringv1alpha1.SlackConfig) error {
- for _, config := range configs {
- if err := config.Validate(); err != nil {
+ v := func(conf monitoringv1alpha1.SlackConfig) error {
+ if err := conf.Validate(); err != nil {
return err
}
- if err := config.HTTPConfig.Validate(); err != nil {
- return err
+ if err := conf.HTTPConfig.Validate(); err != nil {
+ return fmt.Errorf("'httpConfig': %w", err)
}
+
+ return nil
}
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'slackConfigs'[%d]: %w", i, err)
+ }
+ }
+
return nil
}
func validateWebhookConfigs(configs []monitoringv1alpha1.WebhookConfig) error {
- for i, config := range configs {
- if config.URL == nil && config.URLSecret == nil {
- return fmt.Errorf("[%d]: one of 'url' or 'urlSecret' must be specified", i)
+ v := func(conf monitoringv1alpha1.WebhookConfig) error {
+ if conf.URL == nil && conf.URLSecret == nil {
+ return errors.New("one of 'url' or 'urlSecret' must be specified")
+ }
+
+ if err := validation.ValidateTemplateURLPtr(conf.URL); err != nil {
+ return fmt.Errorf("invalid 'url': %w", err)
}
- if err := validation.ValidateTemplateURLPtr(config.URL); err != nil {
- return fmt.Errorf("[%d]: url: %w", i, err)
+ if err := conf.HTTPConfig.Validate(); err != nil {
+ return fmt.Errorf("'httpConfig': %w", err)
}
- if err := config.HTTPConfig.Validate(); err != nil {
- return fmt.Errorf("[%d]: %w", i, err)
+ return nil
+ }
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'webhookConfigs'[%d]: %w", i, err)
}
}
@@ -248,13 +303,21 @@ func validateWebhookConfigs(configs []monitoringv1alpha1.WebhookConfig) error {
}
func validateWechatConfigs(configs []monitoringv1alpha1.WeChatConfig) error {
- for i, config := range configs {
- if err := validation.ValidateURLPtr((*string)(config.APIURL)); err != nil {
- return fmt.Errorf("[%d]: apiURL: %w", i, err)
+ v := func(conf monitoringv1alpha1.WeChatConfig) error {
+ if err := validation.ValidateURLPtr((*string)(conf.APIURL)); err != nil {
+ return fmt.Errorf("invalid 'apiURL': %w", err)
}
- if err := config.HTTPConfig.Validate(); err != nil {
- return fmt.Errorf("[%d]: %w", i, err)
+ if err := conf.HTTPConfig.Validate(); err != nil {
+ return fmt.Errorf("'httpConfig': %w", err)
+ }
+
+ return nil
+ }
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'wechatConfigs'[%d]: %w", i, err)
}
}
@@ -262,36 +325,44 @@ func validateWechatConfigs(configs []monitoringv1alpha1.WeChatConfig) error {
}
func validateEmailConfig(configs []monitoringv1alpha1.EmailConfig) error {
- for _, config := range configs {
- if ptr.Deref(config.To, "") == "" {
+ v := func(conf monitoringv1alpha1.EmailConfig) error {
+ if ptr.Deref(conf.To, "") == "" {
return errors.New("missing 'to' address")
}
- if ptr.Deref(config.Smarthost, "") != "" {
- _, _, err := net.SplitHostPort(*config.Smarthost)
+ if ptr.Deref(conf.Smarthost, "") != "" {
+ _, _, err := net.SplitHostPort(*conf.Smarthost)
if err != nil {
- return fmt.Errorf("invalid 'smarthost' %s: %w", *config.Smarthost, err)
+ return fmt.Errorf("invalid 'smarthost' %q: %w", *conf.Smarthost, err)
}
}
- if config.Headers != nil {
+ if conf.Headers != nil {
// Header names are case-insensitive, check for collisions.
normalizedHeaders := map[string]struct{}{}
- for _, v := range config.Headers {
- normalized := strings.ToLower(v.Key)
+ for _, h := range conf.Headers {
+ normalized := strings.ToLower(h.Key)
if _, ok := normalizedHeaders[normalized]; ok {
return fmt.Errorf("duplicate header %q", normalized)
}
normalizedHeaders[normalized] = struct{}{}
}
}
+
+ return nil
+ }
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'emailConfigs'[%d]: %w", i, err)
+ }
}
+
return nil
}
func validateVictorOpsConfigs(configs []monitoringv1alpha1.VictorOpsConfig) error {
- for i, config := range configs {
-
+ v := func(conf monitoringv1alpha1.VictorOpsConfig) error {
// from https://github.com/prometheus/alertmanager/blob/a7f9fdadbecbb7e692d2cd8d3334e3d6de1602e1/config/notifiers.go#L497
reservedFields := map[string]struct{}{
"routing_key": {},
@@ -303,96 +374,130 @@ func validateVictorOpsConfigs(configs []monitoringv1alpha1.VictorOpsConfig) erro
"entity_state": {},
}
- if len(config.CustomFields) > 0 {
- for _, v := range config.CustomFields {
- if _, ok := reservedFields[v.Key]; ok {
- return fmt.Errorf("usage of reserved word %q is not allowed in custom fields", v.Key)
+ if len(conf.CustomFields) > 0 {
+ for _, f := range conf.CustomFields {
+ if _, ok := reservedFields[f.Key]; ok {
+ return fmt.Errorf("usage of reserved word %q is not allowed in custom fields", f.Key)
}
}
}
- if config.RoutingKey == "" {
+ if conf.RoutingKey == "" {
return errors.New("missing 'routingKey' key")
}
- if err := validation.ValidateURLPtr((*string)(config.APIURL)); err != nil {
- return fmt.Errorf("[%d]: apiURL: %w", i, err)
+ if err := validation.ValidateURLPtr((*string)(conf.APIURL)); err != nil {
+ return fmt.Errorf("invalid 'apiURL': %w", err)
}
- if err := config.HTTPConfig.Validate(); err != nil {
- return err
+ if err := conf.HTTPConfig.Validate(); err != nil {
+ return fmt.Errorf("'httpConfig': %w", err)
+ }
+
+ return nil
+ }
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'victoropsConfigs'[%d]: %w", i, err)
}
}
+
return nil
}
func validatePushoverConfigs(configs []monitoringv1alpha1.PushoverConfig) error {
- for i, config := range configs {
- if config.UserKey == nil && config.UserKeyFile == nil {
- return fmt.Errorf("one of userKey or userKeyFile must be configured")
+ v := func(conf monitoringv1alpha1.PushoverConfig) error {
+ if conf.UserKey == nil && conf.UserKeyFile == nil {
+ return errors.New("one of 'userKey' or 'userKeyFile' must be configured")
}
- if config.Token == nil && config.TokenFile == nil {
- return fmt.Errorf("one of token or tokenFile must be configured")
+ if conf.Token == nil && conf.TokenFile == nil {
+ return errors.New("one of 'token' or 'tokenFile' must be configured")
}
- if config.HTML != nil && *config.HTML && config.Monospace != nil && *config.Monospace {
- return fmt.Errorf("html and monospace options are mutually exclusive")
+ if conf.HTML != nil && *conf.HTML && conf.Monospace != nil && *conf.Monospace {
+ return errors.New("'html' and 'monospace' options are mutually exclusive")
}
- if config.URL != "" {
- if err := validation.ValidateTemplateURL(config.URL); err != nil {
- return fmt.Errorf("[%d]: url: %w", i, err)
+ if conf.URL != "" {
+ if err := validation.ValidateTemplateURL(conf.URL); err != nil {
+ return fmt.Errorf("invalid 'url': %w", err)
}
}
- if err := config.HTTPConfig.Validate(); err != nil {
- return err
+ if err := conf.HTTPConfig.Validate(); err != nil {
+ return fmt.Errorf("'httpConfig': %w", err)
+ }
+
+ return nil
+ }
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'pushoverConfigs'[%d]: %w", i, err)
}
}
return nil
}
-func validateSnsConfigs(configs []monitoringv1alpha1.SNSConfig) error {
- for i, config := range configs {
- if (ptr.Deref(config.TargetARN, "") == "") != (ptr.Deref(config.TopicARN, "") == "") != (ptr.Deref(config.PhoneNumber, "") == "") {
- return fmt.Errorf("[%d]: must provide either a targetARN, topicARN, or phoneNumber for SNS config", i)
+func validateSNSConfigs(configs []monitoringv1alpha1.SNSConfig) error {
+ v := func(conf monitoringv1alpha1.SNSConfig) error {
+ if (ptr.Deref(conf.TargetARN, "") == "") != (ptr.Deref(conf.TopicARN, "") == "") != (ptr.Deref(conf.PhoneNumber, "") == "") {
+ return errors.New("must provide one of 'targetARN', 'topicARN', or 'phoneNumber'")
}
- if config.ApiURL != nil {
- if err := validation.ValidateTemplateURL(*config.ApiURL); err != nil {
- return fmt.Errorf("[%d]: apiURL: %w", i, err)
+ if conf.ApiURL != nil {
+ if err := validation.ValidateTemplateURL(*conf.ApiURL); err != nil {
+ return fmt.Errorf("invalid 'apiURL': %w", err)
}
}
- if err := config.HTTPConfig.Validate(); err != nil {
- return err
+ if err := conf.HTTPConfig.Validate(); err != nil {
+ return fmt.Errorf("'httpConfig': %w", err)
}
+
+ return nil
}
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'snsConfigs'[%d]: %w", i, err)
+ }
+ }
+
return nil
}
func validateTelegramConfigs(configs []monitoringv1alpha1.TelegramConfig) error {
- for i, config := range configs {
- if config.BotToken == nil && config.BotTokenFile == nil {
- return fmt.Errorf("[%d]: mandatory field 'botToken' or 'botTokenfile' is empty", i)
+ v := func(conf monitoringv1alpha1.TelegramConfig) error {
+ if conf.BotToken == nil && conf.BotTokenFile == nil {
+ return errors.New("mandatory field botToken or botTokenfile is empty")
}
- if config.BotToken != nil && config.BotTokenFile != nil {
- return fmt.Errorf("[%d]: only one of 'botToken' or 'botTokenfile' must be configured", i)
+ if conf.BotToken != nil && conf.BotTokenFile != nil {
+ return errors.New("only one of 'botToken' or 'botTokenfile' must be configured")
}
- if config.ChatID == 0 {
- return fmt.Errorf("[%d]: mandatory field %q is empty", i, "chatID")
+ if conf.ChatID == 0 {
+ return errors.New("mandatory field 'chatID' is empty")
}
- if err := validation.ValidateURLPtr((*string)(config.APIURL)); err != nil {
- return fmt.Errorf("[%d]: apiURL: %w", i, err)
+ if err := validation.ValidateURLPtr((*string)(conf.APIURL)); err != nil {
+ return fmt.Errorf("invalid 'apiURL': %w", err)
}
- if err := config.HTTPConfig.Validate(); err != nil {
- return fmt.Errorf("[%d]: %w", i, err)
+ if err := conf.HTTPConfig.Validate(); err != nil {
+ return fmt.Errorf("'httpConfig': %w", err)
+ }
+
+ return nil
+ }
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'telegramConfigs'[%d]: %w", i, err)
}
}
@@ -400,13 +505,21 @@ func validateTelegramConfigs(configs []monitoringv1alpha1.TelegramConfig) error
}
func validateWebexConfigs(configs []monitoringv1alpha1.WebexConfig) error {
- for i, config := range configs {
- if err := validation.ValidateURLPtr((*string)(config.APIURL)); err != nil {
- return fmt.Errorf("[%d]: apiURL: %w", i, err)
+ v := func(conf monitoringv1alpha1.WebexConfig) error {
+ if err := validation.ValidateURLPtr((*string)(conf.APIURL)); err != nil {
+ return fmt.Errorf("invalid 'apiURL': %w", err)
+ }
+
+ if err := conf.HTTPConfig.Validate(); err != nil {
+ return fmt.Errorf("'httpConfig': %w", err)
}
- if err := config.HTTPConfig.Validate(); err != nil {
- return fmt.Errorf("[%d]: %w", i, err)
+ return nil
+ }
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'webexConfigs'[%d]: %w", i, err)
}
}
@@ -414,9 +527,17 @@ func validateWebexConfigs(configs []monitoringv1alpha1.WebexConfig) error {
}
func validateMSTeamsConfigs(configs []monitoringv1alpha1.MSTeamsConfig) error {
- for _, config := range configs {
- if err := config.HTTPConfig.Validate(); err != nil {
- return err
+ v := func(conf monitoringv1alpha1.MSTeamsConfig) error {
+ if err := conf.HTTPConfig.Validate(); err != nil {
+ return fmt.Errorf("'httpConfig': %w", err)
+ }
+
+ return nil
+ }
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'msteamsConfigs'[%d]: %w", i, err)
}
}
@@ -424,9 +545,17 @@ func validateMSTeamsConfigs(configs []monitoringv1alpha1.MSTeamsConfig) error {
}
func validateMSTeamsV2Configs(configs []monitoringv1alpha1.MSTeamsV2Config) error {
- for _, config := range configs {
- if err := config.HTTPConfig.Validate(); err != nil {
- return err
+ v := func(conf monitoringv1alpha1.MSTeamsV2Config) error {
+ if err := conf.HTTPConfig.Validate(); err != nil {
+ return fmt.Errorf("'httpConfig': %w", err)
+ }
+
+ return nil
+ }
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'msteamsv2Configs'[%d]: %w", i, err)
}
}
diff --git a/pkg/alertmanager/validation/v1beta1/validation.go b/pkg/alertmanager/validation/v1beta1/validation.go
index b4e297a8ea8..e8e08db436e 100644
--- a/pkg/alertmanager/validation/v1beta1/validation.go
+++ b/pkg/alertmanager/validation/v1beta1/validation.go
@@ -54,64 +54,68 @@ func validateReceivers(receivers []monitoringv1beta1.Receiver) (map[string]struc
}
receiverNames[receiver.Name] = struct{}{}
- if err = validatePagerDutyConfigs(receiver.PagerDutyConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'pagerDutyConfig' - receiver %s: %w", receiver.Name, err)
+ receiverValidationFailedFormat := func(err error) (map[string]struct{}, error) {
+ return nil, fmt.Errorf("failed to validate receiver %q: %w", receiver.Name, err)
}
if err := validateOpsGenieConfigs(receiver.OpsGenieConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'opsGenieConfig' - receiver %s: %w", receiver.Name, err)
+ return receiverValidationFailedFormat(err)
+ }
+
+ if err = validatePagerDutyConfigs(receiver.PagerDutyConfigs); err != nil {
+ return receiverValidationFailedFormat(err)
+ }
+
+ if err := validateDiscordConfigs(receiver.DiscordConfigs); err != nil {
+ return receiverValidationFailedFormat(err)
}
if err := validateSlackConfigs(receiver.SlackConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'slackConfig' - receiver %s: %w", receiver.Name, err)
+ return receiverValidationFailedFormat(err)
}
if err := validateWebhookConfigs(receiver.WebhookConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'webhookConfig' - receiver %s: %w", receiver.Name, err)
+ return receiverValidationFailedFormat(err)
}
if err := validateWechatConfigs(receiver.WeChatConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'weChatConfig' - receiver %s: %w", receiver.Name, err)
+ return receiverValidationFailedFormat(err)
}
if err := validateEmailConfig(receiver.EmailConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'emailConfig' - receiver %s: %w", receiver.Name, err)
+ return receiverValidationFailedFormat(err)
}
if err := validateVictorOpsConfigs(receiver.VictorOpsConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'victorOpsConfig' - receiver %s: %w", receiver.Name, err)
+ return receiverValidationFailedFormat(err)
}
if err := validatePushoverConfigs(receiver.PushoverConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'pushOverConfig' - receiver %s: %w", receiver.Name, err)
+ return receiverValidationFailedFormat(err)
}
- if err := validateSnsConfigs(receiver.SNSConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'snsConfig' - receiver %s: %w", receiver.Name, err)
+ if err := validateSNSConfigs(receiver.SNSConfigs); err != nil {
+ return receiverValidationFailedFormat(err)
}
if err := validateTelegramConfigs(receiver.TelegramConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'telegramConfig' - receiver %s: %w", receiver.Name, err)
- }
-
- if err := validateDiscordConfigs(receiver.DiscordConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'discordConfig' - receiver %s: %w", receiver.Name, err)
+ return receiverValidationFailedFormat(err)
}
if err := validateWebexConfigs(receiver.WebexConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'webexConfig' - receiver %s: %w", receiver.Name, err)
+ return receiverValidationFailedFormat(err)
}
if err := validateMSTeamsConfigs(receiver.MSTeamsConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'msteamsConfig' - receiver %s: %w", receiver.Name, err)
+ return receiverValidationFailedFormat(err)
}
- if err := validateRocketchatConfigs(receiver.RocketChatConfigs); err != nil {
- return nil, fmt.Errorf("failed to validate 'rocketchatConfig' - receiver %s: %w", receiver.Name, err)
+ if err := validateMSTeamsV2Configs(receiver.MSTeamsV2Configs); err != nil {
+ return receiverValidationFailedFormat(err)
}
- if err := validateMSTeamsV2Configs(receiver.MSTeamsV2Configs); err != nil {
- return nil, fmt.Errorf("failed to validate 'msteamsv2Config' - receiver %s: %w", receiver.Name, err)
+ if err := validateRocketchatConfigs(receiver.RocketChatConfigs); err != nil {
+ return receiverValidationFailedFormat(err)
}
}
@@ -119,14 +123,14 @@ func validateReceivers(receivers []monitoringv1beta1.Receiver) (map[string]struc
}
func validatePagerDutyConfigs(configs []monitoringv1beta1.PagerDutyConfig) error {
- for i, conf := range configs {
+ v := func(conf monitoringv1beta1.PagerDutyConfig) error {
if err := validation.ValidateURLPtr((*string)(conf.URL)); err != nil {
- return fmt.Errorf("[%d]: url: %w", i, err)
+ return fmt.Errorf("invalid 'url': %w", err)
}
if conf.ClientURL != nil && *conf.ClientURL != "" {
if err := validation.ValidateTemplateURL(*conf.ClientURL); err != nil {
- return fmt.Errorf("[%d]: clientURL: %w", i, err)
+ return fmt.Errorf("invalid 'clientURL': %w", err)
}
}
@@ -137,7 +141,7 @@ func validatePagerDutyConfigs(configs []monitoringv1beta1.PagerDutyConfig) error
for j, lc := range conf.PagerDutyLinkConfigs {
if lc.Href != nil && *lc.Href != "" {
if err := validation.ValidateTemplateURL(*lc.Href); err != nil {
- return fmt.Errorf("[%d]: pagerDutyLinkConfigs[%d]: href: %w", i, j, err)
+ return fmt.Errorf("'pagerDutyLinkConfigs'[%d]: invalid 'href': %w", j, err)
}
}
}
@@ -145,30 +149,47 @@ func validatePagerDutyConfigs(configs []monitoringv1beta1.PagerDutyConfig) error
for j, ic := range conf.PagerDutyImageConfigs {
if ic.Href != nil && *ic.Href != "" {
if err := validation.ValidateTemplateURL(*ic.Href); err != nil {
- return fmt.Errorf("[%d]: pagerDutyImageConfigs[%d]: href: %w", i, j, err)
+ return fmt.Errorf("'pagerDutyImageConfigs'[%d]: invalid 'href': %w", j, err)
}
}
}
if err := conf.HTTPConfig.Validate(); err != nil {
- return err
+ return fmt.Errorf("'httpConfig': %w", err)
+ }
+
+ return nil
+ }
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'pagerdutyConfigs'[%d]: %w", i, err)
}
}
+
return nil
}
func validateOpsGenieConfigs(configs []monitoringv1beta1.OpsGenieConfig) error {
- for i, config := range configs {
- if err := config.Validate(); err != nil {
- return fmt.Errorf("[%d]: %w", i, err)
+ v := func(conf monitoringv1beta1.OpsGenieConfig) error {
+ if err := conf.Validate(); err != nil {
+ return err
}
- if err := validation.ValidateURLPtr((*string)(config.APIURL)); err != nil {
- return fmt.Errorf("[%d]: apiURL: %w", i, err)
+ if err := validation.ValidateURLPtr((*string)(conf.APIURL)); err != nil {
+ return fmt.Errorf("invalid 'apiURL': %w", err)
}
- if err := config.HTTPConfig.Validate(); err != nil {
- return fmt.Errorf("[%d]: %w", i, err)
+ if err := conf.HTTPConfig.Validate(); err != nil {
+ return fmt.Errorf("'httpConfig': %w", err)
+ }
+
+ return nil
+ }
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'opsgenieConfigs'[%d]: %w", i, err)
}
}
@@ -176,30 +197,47 @@ func validateOpsGenieConfigs(configs []monitoringv1beta1.OpsGenieConfig) error {
}
func validateSlackConfigs(configs []monitoringv1beta1.SlackConfig) error {
- for _, config := range configs {
- if err := config.Validate(); err != nil {
+ v := func(conf monitoringv1beta1.SlackConfig) error {
+ if err := conf.Validate(); err != nil {
return err
}
- if err := config.HTTPConfig.Validate(); err != nil {
- return err
+ if err := conf.HTTPConfig.Validate(); err != nil {
+ return fmt.Errorf("'httpConfig': %w", err)
+ }
+
+ return nil
+ }
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'slackConfigs'[%d]: %w", i, err)
}
}
+
return nil
}
func validateWebhookConfigs(configs []monitoringv1beta1.WebhookConfig) error {
- for i, config := range configs {
- if config.URL == nil && config.URLSecret == nil {
- return fmt.Errorf("[%d]: one of 'url' or 'urlSecret' must be specified", i)
+ v := func(conf monitoringv1beta1.WebhookConfig) error {
+ if conf.URL == nil && conf.URLSecret == nil {
+ return errors.New("one of 'url' or 'urlSecret' must be specified")
}
- if err := validation.ValidateTemplateURLPtr(config.URL); err != nil {
- return fmt.Errorf("[%d]: url: %w", i, err)
+ if err := validation.ValidateTemplateURLPtr(conf.URL); err != nil {
+ return fmt.Errorf("invalid 'url': %w", err)
}
- if err := config.HTTPConfig.Validate(); err != nil {
- return fmt.Errorf("[%d]: %w", i, err)
+ if err := conf.HTTPConfig.Validate(); err != nil {
+ return fmt.Errorf("'httpConfig': %w", err)
+ }
+
+ return nil
+ }
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'webhookConfigs'[%d]: %w", i, err)
}
}
@@ -207,13 +245,21 @@ func validateWebhookConfigs(configs []monitoringv1beta1.WebhookConfig) error {
}
func validateWechatConfigs(configs []monitoringv1beta1.WeChatConfig) error {
- for i, config := range configs {
- if err := validation.ValidateURLPtr((*string)(config.APIURL)); err != nil {
- return fmt.Errorf("[%d]: apiURL: %w", i, err)
+ v := func(conf monitoringv1beta1.WeChatConfig) error {
+ if err := validation.ValidateURLPtr((*string)(conf.APIURL)); err != nil {
+ return fmt.Errorf("invalid 'apiURL': %w", err)
}
- if err := config.HTTPConfig.Validate(); err != nil {
- return fmt.Errorf("[%d]: %w", i, err)
+ if err := conf.HTTPConfig.Validate(); err != nil {
+ return fmt.Errorf("'httpConfig': %w", err)
+ }
+
+ return nil
+ }
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'wechatConfigs'[%d]: %w", i, err)
}
}
@@ -221,36 +267,44 @@ func validateWechatConfigs(configs []monitoringv1beta1.WeChatConfig) error {
}
func validateEmailConfig(configs []monitoringv1beta1.EmailConfig) error {
- for _, config := range configs {
- if ptr.Deref(config.To, "") == "" {
+ v := func(conf monitoringv1beta1.EmailConfig) error {
+ if ptr.Deref(conf.To, "") == "" {
return errors.New("missing 'to' address")
}
- if ptr.Deref(config.Smarthost, "") != "" {
- _, _, err := net.SplitHostPort(*config.Smarthost)
+ if ptr.Deref(conf.Smarthost, "") != "" {
+ _, _, err := net.SplitHostPort(*conf.Smarthost)
if err != nil {
- return fmt.Errorf("invalid 'smarthost' %s: %w", *config.Smarthost, err)
+ return fmt.Errorf("invalid 'smarthost' %q: %w", *conf.Smarthost, err)
}
}
- if config.Headers != nil {
+ if conf.Headers != nil {
// Header names are case-insensitive, check for collisions.
normalizedHeaders := map[string]struct{}{}
- for _, v := range config.Headers {
- normalized := strings.ToLower(v.Key)
+ for _, h := range conf.Headers {
+ normalized := strings.ToLower(h.Key)
if _, ok := normalizedHeaders[normalized]; ok {
return fmt.Errorf("duplicate header %q", normalized)
}
normalizedHeaders[normalized] = struct{}{}
}
}
+
+ return nil
+ }
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'emailConfigs'[%d]: %w", i, err)
+ }
}
+
return nil
}
func validateVictorOpsConfigs(configs []monitoringv1beta1.VictorOpsConfig) error {
- for i, config := range configs {
-
+ v := func(conf monitoringv1beta1.VictorOpsConfig) error {
// from https://github.com/prometheus/alertmanager/blob/a7f9fdadbecbb7e692d2cd8d3334e3d6de1602e1/config/notifiers.go#L497
reservedFields := map[string]struct{}{
"routing_key": {},
@@ -262,96 +316,130 @@ func validateVictorOpsConfigs(configs []monitoringv1beta1.VictorOpsConfig) error
"entity_state": {},
}
- if len(config.CustomFields) > 0 {
- for _, v := range config.CustomFields {
- if _, ok := reservedFields[v.Key]; ok {
- return fmt.Errorf("usage of reserved word %q is not allowed in custom fields", v.Key)
+ if len(conf.CustomFields) > 0 {
+ for _, f := range conf.CustomFields {
+ if _, ok := reservedFields[f.Key]; ok {
+ return fmt.Errorf("usage of reserved word %q is not allowed in custom fields", f.Key)
}
}
}
- if config.RoutingKey == "" {
+ if conf.RoutingKey == "" {
return errors.New("missing 'routingKey' key")
}
- if err := validation.ValidateURLPtr((*string)(config.APIURL)); err != nil {
- return fmt.Errorf("[%d]: apiURL: %w", i, err)
+ if err := validation.ValidateURLPtr((*string)(conf.APIURL)); err != nil {
+ return fmt.Errorf("invalid 'apiURL': %w", err)
}
- if err := config.HTTPConfig.Validate(); err != nil {
- return err
+ if err := conf.HTTPConfig.Validate(); err != nil {
+ return fmt.Errorf("'httpConfig': %w", err)
}
+
+ return nil
}
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'victoropsConfigs'[%d]: %w", i, err)
+ }
+ }
+
return nil
}
func validatePushoverConfigs(configs []monitoringv1beta1.PushoverConfig) error {
- for i, config := range configs {
- if config.UserKey == nil && config.UserKeyFile == nil {
- return fmt.Errorf("one of userKey or userKeyFile must be configured")
+ v := func(conf monitoringv1beta1.PushoverConfig) error {
+ if conf.UserKey == nil && conf.UserKeyFile == nil {
+ return errors.New("one of 'userKey' or 'userKeyFile' must be configured")
}
- if config.Token == nil && config.TokenFile == nil {
- return fmt.Errorf("one of token or tokenFile must be configured")
+ if conf.Token == nil && conf.TokenFile == nil {
+ return errors.New("one of 'token' or 'tokenFile' must be configured")
}
- if config.HTML != nil && *config.HTML && config.Monospace != nil && *config.Monospace {
- return fmt.Errorf("html and monospace options are mutually exclusive")
+ if conf.HTML != nil && *conf.HTML && conf.Monospace != nil && *conf.Monospace {
+ return errors.New("'html' and 'monospace' options are mutually exclusive")
}
- if config.URL != "" {
- if err := validation.ValidateTemplateURL(config.URL); err != nil {
- return fmt.Errorf("[%d]: url: %w", i, err)
+ if conf.URL != "" {
+ if err := validation.ValidateTemplateURL(conf.URL); err != nil {
+ return fmt.Errorf("invalid 'url': %w", err)
}
}
- if err := config.HTTPConfig.Validate(); err != nil {
- return err
+ if err := conf.HTTPConfig.Validate(); err != nil {
+ return fmt.Errorf("'httpConfig': %w", err)
+ }
+
+ return nil
+ }
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'pushoverConfigs'[%d]: %w", i, err)
}
}
return nil
}
-func validateSnsConfigs(configs []monitoringv1beta1.SNSConfig) error {
- for i, config := range configs {
- if (ptr.Deref(config.TargetARN, "") == "") != (ptr.Deref(config.TopicARN, "") == "") != (ptr.Deref(config.PhoneNumber, "") == "") {
- return fmt.Errorf("[%d]: must provide either a targetARN, topicARN, or phoneNumber for SNS config", i)
+func validateSNSConfigs(configs []monitoringv1beta1.SNSConfig) error {
+ v := func(conf monitoringv1beta1.SNSConfig) error {
+ if (ptr.Deref(conf.TargetARN, "") == "") != (ptr.Deref(conf.TopicARN, "") == "") != (ptr.Deref(conf.PhoneNumber, "") == "") {
+ return errors.New("must provide one of 'targetARN', 'topicARN', or 'phoneNumber'")
}
- if config.ApiURL != nil {
- if err := validation.ValidateTemplateURL(*config.ApiURL); err != nil {
- return fmt.Errorf("[%d]: apiURL: %w", i, err)
+ if conf.ApiURL != nil {
+ if err := validation.ValidateTemplateURL(*conf.ApiURL); err != nil {
+ return fmt.Errorf("invalid 'apiURL': %w", err)
}
}
- if err := config.HTTPConfig.Validate(); err != nil {
- return err
+ if err := conf.HTTPConfig.Validate(); err != nil {
+ return fmt.Errorf("'httpConfig': %w", err)
}
+
+ return nil
}
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'snsConfigs'[%d]: %w", i, err)
+ }
+ }
+
return nil
}
func validateTelegramConfigs(configs []monitoringv1beta1.TelegramConfig) error {
- for i, config := range configs {
- if config.BotToken == nil && config.BotTokenFile == nil {
- return fmt.Errorf("[%d]: mandatory field botToken or botTokenfile is empty", i)
+ v := func(conf monitoringv1beta1.TelegramConfig) error {
+ if conf.BotToken == nil && conf.BotTokenFile == nil {
+ return errors.New("mandatory field botToken or botTokenfile is empty")
}
- if config.BotToken != nil && config.BotTokenFile != nil {
- return fmt.Errorf("[%d]: only one of 'botToken' or 'botTokenfile' must be configured", i)
+ if conf.BotToken != nil && conf.BotTokenFile != nil {
+ return errors.New("only one of 'botToken' or 'botTokenfile' must be configured")
}
- if config.ChatID == 0 {
- return fmt.Errorf("[%d]: mandatory field %q is empty", i, "chatID")
+ if conf.ChatID == 0 {
+ return errors.New("mandatory field 'chatID' is empty")
}
- if err := validation.ValidateURLPtr((*string)(config.APIURL)); err != nil {
- return fmt.Errorf("[%d]: apiURL: %w", i, err)
+ if err := validation.ValidateURLPtr((*string)(conf.APIURL)); err != nil {
+ return fmt.Errorf("invalid 'apiURL': %w", err)
}
- if err := config.HTTPConfig.Validate(); err != nil {
- return fmt.Errorf("[%d]: %w", i, err)
+ if err := conf.HTTPConfig.Validate(); err != nil {
+ return fmt.Errorf("'httpConfig': %w", err)
+ }
+
+ return nil
+ }
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'telegramConfigs'[%d]: %w", i, err)
}
}
@@ -359,13 +447,21 @@ func validateTelegramConfigs(configs []monitoringv1beta1.TelegramConfig) error {
}
func validateWebexConfigs(configs []monitoringv1beta1.WebexConfig) error {
- for i, config := range configs {
- if err := validation.ValidateURLPtr((*string)(config.APIURL)); err != nil {
- return fmt.Errorf("[%d]: apiURL: %w", i, err)
+ v := func(conf monitoringv1beta1.WebexConfig) error {
+ if err := validation.ValidateURLPtr((*string)(conf.APIURL)); err != nil {
+ return fmt.Errorf("invalid 'apiURL': %w", err)
+ }
+
+ if err := conf.HTTPConfig.Validate(); err != nil {
+ return fmt.Errorf("'httpConfig': %w", err)
}
- if err := config.HTTPConfig.Validate(); err != nil {
- return fmt.Errorf("[%d]: %w", i, err)
+ return nil
+ }
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'webexConfigs'[%d]: %w", i, err)
}
}
@@ -373,9 +469,17 @@ func validateWebexConfigs(configs []monitoringv1beta1.WebexConfig) error {
}
func validateDiscordConfigs(configs []monitoringv1beta1.DiscordConfig) error {
- for _, config := range configs {
- if err := config.HTTPConfig.Validate(); err != nil {
- return err
+ v := func(conf monitoringv1beta1.DiscordConfig) error {
+ if err := conf.HTTPConfig.Validate(); err != nil {
+ return fmt.Errorf("'httpConfig': %w", err)
+ }
+
+ return nil
+ }
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'discordConfigs'[%d]: %w", i, err)
}
}
@@ -383,31 +487,39 @@ func validateDiscordConfigs(configs []monitoringv1beta1.DiscordConfig) error {
}
func validateRocketchatConfigs(configs []monitoringv1beta1.RocketChatConfig) error {
- for i, config := range configs {
- if err := validation.ValidateURLPtr((*string)(config.APIURL)); err != nil {
- return fmt.Errorf("[%d]: apiURL: %w", i, err)
+ v := func(conf monitoringv1beta1.RocketChatConfig) error {
+ if err := validation.ValidateURLPtr((*string)(conf.APIURL)); err != nil {
+ return fmt.Errorf("invalid 'apiURL': %w", err)
}
- if err := validation.ValidateTemplateURLPtr(config.IconURL); err != nil {
- return fmt.Errorf("[%d]: invalid 'iconURL': %w", i, err)
+ if err := validation.ValidateTemplateURLPtr(conf.IconURL); err != nil {
+ return fmt.Errorf("invalid 'iconURL': %w", err)
}
- if err := validation.ValidateTemplateURLPtr(config.ImageURL); err != nil {
- return fmt.Errorf("[%d]: invalid 'imageURL': %w", i, err)
+ if err := validation.ValidateTemplateURLPtr(conf.ImageURL); err != nil {
+ return fmt.Errorf("invalid 'imageURL': %w", err)
}
- if err := validation.ValidateTemplateURLPtr(config.ThumbURL); err != nil {
- return fmt.Errorf("[%d]: invalid 'thumbURL': %w", i, err)
+ if err := validation.ValidateTemplateURLPtr(conf.ThumbURL); err != nil {
+ return fmt.Errorf("invalid 'thumbURL': %w", err)
}
- for j, a := range config.Actions {
+ for j, a := range conf.Actions {
if err := validation.ValidateTemplateURLPtr(a.URL); err != nil {
- return fmt.Errorf("%d: actions[%d]: invalid 'url': %w", i, j, err)
+ return fmt.Errorf("'actions'[%d]: invalid 'url': %w", j, err)
}
}
- if err := config.HTTPConfig.Validate(); err != nil {
- return fmt.Errorf("[%d]: %w", i, err)
+ if err := conf.HTTPConfig.Validate(); err != nil {
+ return fmt.Errorf("'httpConfig': %w", err)
+ }
+
+ return nil
+ }
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'rocketchatConfigs'[%d]: %w", i, err)
}
}
@@ -415,9 +527,17 @@ func validateRocketchatConfigs(configs []monitoringv1beta1.RocketChatConfig) err
}
func validateMSTeamsConfigs(configs []monitoringv1beta1.MSTeamsConfig) error {
- for _, config := range configs {
- if err := config.HTTPConfig.Validate(); err != nil {
- return err
+ v := func(conf monitoringv1beta1.MSTeamsConfig) error {
+ if err := conf.HTTPConfig.Validate(); err != nil {
+ return fmt.Errorf("'httpConfig': %w", err)
+ }
+
+ return nil
+ }
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'msteamsConfigs'[%d]: %w", i, err)
}
}
@@ -425,9 +545,17 @@ func validateMSTeamsConfigs(configs []monitoringv1beta1.MSTeamsConfig) error {
}
func validateMSTeamsV2Configs(configs []monitoringv1beta1.MSTeamsV2Config) error {
- for _, config := range configs {
- if err := config.HTTPConfig.Validate(); err != nil {
- return err
+ v := func(conf monitoringv1beta1.MSTeamsV2Config) error {
+ if err := conf.HTTPConfig.Validate(); err != nil {
+ return fmt.Errorf("'httpConfig': %w", err)
+ }
+
+ return nil
+ }
+
+ for i, conf := range configs {
+ if err := v(conf); err != nil {
+ return fmt.Errorf("'msteamsv2Configs'[%d]: %w", i, err)
}
}
@@ -445,7 +573,7 @@ func validateRoute(r *monitoringv1beta1.Route, receivers, timeIntervals map[stri
if r.Receiver == "" {
if topLevelRoute {
- return fmt.Errorf("root route must define a receiver")
+ return errors.New("root route must define a receiver")
}
} else {
if _, found := receivers[r.Receiver]; !found {
diff --git a/pkg/apis/monitoring/v1/prometheus_types.go b/pkg/apis/monitoring/v1/prometheus_types.go
index 12dc7d16460..bf9cdaab004 100644
--- a/pkg/apis/monitoring/v1/prometheus_types.go
+++ b/pkg/apis/monitoring/v1/prometheus_types.go
@@ -2535,11 +2535,11 @@ func (c *SafeAuthorization) Validate() error {
}
if strings.ToLower(strings.TrimSpace(c.Type)) == "basic" {
- return errors.New("authorization type cannot be set to \"basic\", use \"basicAuth\" instead")
+ return errors.New("'authorization' type cannot be set to \"basic\", use \"basicAuth\" instead")
}
if c.Credentials == nil {
- return errors.New("authorization credentials are required")
+ return errors.New("'authorization' credentials are required")
}
return nil
diff --git a/pkg/apis/monitoring/v1/types.go b/pkg/apis/monitoring/v1/types.go
index bc53f5a6808..12a2799f175 100644
--- a/pkg/apis/monitoring/v1/types.go
+++ b/pkg/apis/monitoring/v1/types.go
@@ -718,15 +718,15 @@ func (o *OAuth2) Validate() error {
}
if o.ClientID == (SecretOrConfigMap{}) {
- return errors.New("OAuth2 clientID must be specified")
+ return errors.New("OAuth2 'clientID' must be specified")
}
if err := o.ClientID.Validate(); err != nil {
- return fmt.Errorf("invalid OAuth2 clientID: %w", err)
+ return fmt.Errorf("invalid OAuth2 'clientID': %w", err)
}
if err := o.TLSConfig.Validate(); err != nil {
- return fmt.Errorf("invalid OAuth2 tlsConfig: %w", err)
+ return fmt.Errorf("invalid OAuth2 'tlsConfig': %w", err)
}
if err := o.ProxyConfig.Validate(); err != nil {
diff --git a/pkg/apis/monitoring/v1alpha1/validation.go b/pkg/apis/monitoring/v1alpha1/validation.go
index c45f6548a86..2f24b43c656 100644
--- a/pkg/apis/monitoring/v1alpha1/validation.go
+++ b/pkg/apis/monitoring/v1alpha1/validation.go
@@ -31,16 +31,16 @@ func (hc *HTTPConfig) Validate() error {
}
if (hc.BasicAuth != nil || hc.OAuth2 != nil) && (hc.BearerTokenSecret != nil) {
- return fmt.Errorf("at most one of basicAuth, oauth2, bearerTokenSecret must be configured")
+ return fmt.Errorf("at most one of 'basicAuth', 'oauth2' and 'bearerTokenSecret' must be configured")
}
if hc.Authorization != nil {
if hc.BearerTokenSecret != nil {
- return fmt.Errorf("authorization is not compatible with bearerTokenSecret")
+ return fmt.Errorf("'authorization' is not compatible with 'bearerTokenSecret'")
}
if hc.BasicAuth != nil || hc.OAuth2 != nil {
- return fmt.Errorf("at most one of basicAuth, oauth2 & authorization must be configured")
+ return fmt.Errorf("at most one of 'basicAuth', 'oauth2' and 'authorization' must be configured")
}
if err := hc.Authorization.Validate(); err != nil {
@@ -50,7 +50,7 @@ func (hc *HTTPConfig) Validate() error {
if hc.OAuth2 != nil {
if hc.BasicAuth != nil {
- return fmt.Errorf("at most one of basicAuth, oauth2 & authorization must be configured")
+ return fmt.Errorf("at most one of 'basicAuth', 'oauth2' and 'authorization' must be configured")
}
if err := hc.OAuth2.Validate(); err != nil {
@@ -395,15 +395,15 @@ func (r *OpsGenieConfigResponder) Validate() error {
// Validate ensures SlackAction is valid.
func (sa *SlackAction) Validate() error {
if sa.Type == "" {
- return errors.New("missing type in Slack action configuration")
+ return errors.New("missing 'type' in Slack action configuration")
}
if sa.Text == "" {
- return errors.New("missing text in Slack action configuration")
+ return errors.New("missing 'text' in Slack action configuration")
}
if sa.URL == "" && ptr.Deref(sa.Name, "") == "" {
- return errors.New("missing name or url in Slack action configuration")
+ return errors.New("missing 'name' or 'url' in Slack action configuration")
}
if sa.ConfirmField != nil {
@@ -435,7 +435,7 @@ func (sc *SlackConfig) Validate() error {
// Validate ensures SlackConfirmationField is valid.
func (scf *SlackConfirmationField) Validate() error {
if scf.Text == "" {
- return errors.New("missing text in Slack confirmation configuration")
+ return errors.New("missing 'text' in Slack confirmation configuration")
}
return nil
}
@@ -443,11 +443,11 @@ func (scf *SlackConfirmationField) Validate() error {
// Validate ensures SlackField is valid
func (sf *SlackField) Validate() error {
if sf.Title == "" {
- return errors.New("missing title in Slack field configuration")
+ return errors.New("missing 'title' in Slack field configuration")
}
if sf.Value == "" {
- return errors.New("missing value in Slack field configuration")
+ return errors.New("missing 'value' in Slack field configuration")
}
return nil
diff --git a/pkg/apis/monitoring/v1beta1/validation.go b/pkg/apis/monitoring/v1beta1/validation.go
index e559e421613..f89403a273d 100644
--- a/pkg/apis/monitoring/v1beta1/validation.go
+++ b/pkg/apis/monitoring/v1beta1/validation.go
@@ -31,16 +31,16 @@ func (hc *HTTPConfig) Validate() error {
}
if (hc.BasicAuth != nil || hc.OAuth2 != nil) && (hc.BearerTokenSecret != nil) {
- return fmt.Errorf("at most one of basicAuth, oauth2, bearerTokenSecret must be configured")
+ return fmt.Errorf("at most one of 'basicAuth', 'oauth2' and 'bearerTokenSecret' must be configured")
}
if hc.Authorization != nil {
if hc.BearerTokenSecret != nil {
- return fmt.Errorf("authorization is not compatible with bearerTokenSecret")
+ return fmt.Errorf("'authorization' is not compatible with 'bearerTokenSecret'")
}
if hc.BasicAuth != nil || hc.OAuth2 != nil {
- return fmt.Errorf("at most one of basicAuth, oauth2 & authorization must be configured")
+ return fmt.Errorf("at most one of 'basicAuth', 'oauth2' and 'authorization' must be configured")
}
if err := hc.Authorization.Validate(); err != nil {
@@ -50,7 +50,7 @@ func (hc *HTTPConfig) Validate() error {
if hc.OAuth2 != nil {
if hc.BasicAuth != nil {
- return fmt.Errorf("at most one of basicAuth, oauth2 & authorization must be configured")
+ return fmt.Errorf("at most one of 'basicAuth', 'oauth2' and 'authorization' must be configured")
}
if err := hc.OAuth2.Validate(); err != nil {
@@ -392,15 +392,15 @@ func (r *OpsGenieConfigResponder) Validate() error {
// Validate ensures SlackAction is valid.
func (sa *SlackAction) Validate() error {
if sa.Type == "" {
- return errors.New("missing type in Slack action configuration")
+ return errors.New("missing 'type' in Slack action configuration")
}
if sa.Text == "" {
- return errors.New("missing text in Slack action configuration")
+ return errors.New("missing 'text' in Slack action configuration")
}
if sa.URL == "" && ptr.Deref(sa.Name, "") == "" {
- return errors.New("missing name or url in Slack action configuration")
+ return errors.New("missing 'name' or 'url' in Slack action configuration")
}
if sa.ConfirmField != nil {
@@ -432,7 +432,7 @@ func (sc *SlackConfig) Validate() error {
// Validate ensures SlackConfirmationField is valid.
func (scf *SlackConfirmationField) Validate() error {
if scf.Text == "" {
- return errors.New("missing text in Slack confirmation configuration")
+ return errors.New("missing 'text' in Slack confirmation configuration")
}
return nil
}
@@ -440,11 +440,11 @@ func (scf *SlackConfirmationField) Validate() error {
// Validate ensures SlackField is valid
func (sf *SlackField) Validate() error {
if sf.Title == "" {
- return errors.New("missing title in Slack field configuration")
+ return errors.New("missing 'title' in Slack field configuration")
}
if sf.Value == "" {
- return errors.New("missing value in Slack field configuration")
+ return errors.New("missing 'value' in Slack field configuration")
}
return nil
From e99a4f96f52ae58167e082d5270a77bfec311261 Mon Sep 17 00:00:00 2001
From: Simon Pasquier
Date: Fri, 12 Jun 2026 16:34:46 +0200
Subject: [PATCH 72/81] chore: update default Alertmanager version to v0.33.0
---
Documentation/getting-started/compatibility.md | 2 +-
pkg/operator/defaults.go | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/Documentation/getting-started/compatibility.md b/Documentation/getting-started/compatibility.md
index 1a125ff6d00..5de038fc07b 100644
--- a/Documentation/getting-started/compatibility.md
+++ b/Documentation/getting-started/compatibility.md
@@ -96,7 +96,7 @@ The Prometheus Operator is compatible with Alertmanager v0.15 and above.
The end-to-end tests are mostly tested against
```$ mdox-exec="go run ./cmd/po-docgen/. compatibility defaultAlertmanagerVersion"
-* v0.32.1
+* v0.33.0
```
## Thanos
diff --git a/pkg/operator/defaults.go b/pkg/operator/defaults.go
index 38b6752a35e..b4093e2ad13 100644
--- a/pkg/operator/defaults.go
+++ b/pkg/operator/defaults.go
@@ -22,7 +22,7 @@ import (
const (
// DefaultAlertmanagerVersion is a default image tag for the prometheus alertmanager.
- DefaultAlertmanagerVersion = "v0.32.1"
+ DefaultAlertmanagerVersion = "v0.33.0"
// DefaultAlertmanagerBaseImage is a base container registry address for the prometheus alertmanager.
DefaultAlertmanagerBaseImage = "quay.io/prometheus/alertmanager"
// DefaultAlertmanagerImage is a default image pulling address for the prometheus alertmanager.
From 26784e06ffd61b567d18945c8918613395ed9198 Mon Sep 17 00:00:00 2001
From: Jayapriya Pai
Date: Mon, 15 Jun 2026 10:26:53 +0530
Subject: [PATCH 73/81] chore: bump go dependencies before v0.92.0
Signed-off-by: Jayapriya Pai
---
go.mod | 73 ++++++++---------
go.sum | 158 +++++++++++++++++++------------------
pkg/apis/monitoring/go.mod | 18 ++---
pkg/apis/monitoring/go.sum | 40 +++++-----
pkg/client/go.mod | 50 ++++++------
pkg/client/go.sum | 116 +++++++++++++--------------
6 files changed, 229 insertions(+), 226 deletions(-)
diff --git a/go.mod b/go.mod
index 63ee9807910..236496be2b1 100644
--- a/go.mod
+++ b/go.mod
@@ -32,14 +32,14 @@ require (
golang.org/x/sync v0.21.0
google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af
gopkg.in/yaml.v2 v2.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/component-base v0.36.1
+ k8s.io/api v0.36.2
+ k8s.io/apiextensions-apiserver v0.36.2
+ k8s.io/apimachinery v0.36.2
+ k8s.io/apiserver v0.36.2
+ k8s.io/client-go v0.36.2
+ k8s.io/component-base v0.36.2
k8s.io/klog/v2 v2.140.0
- k8s.io/utils v0.0.0-20260319190234-28399d86e0b5
+ k8s.io/utils v0.0.0-20260507154919-ff6756f316d2
sigs.k8s.io/controller-runtime v0.24.1
sigs.k8s.io/yaml v1.6.0
)
@@ -65,20 +65,21 @@ require (
github.com/coder/quartz v0.3.1 // indirect
github.com/coreos/go-systemd/v22 v22.7.0 // indirect
github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb // indirect
- github.com/felixge/httpsnoop v1.0.4 // indirect
- github.com/fxamacker/cbor/v2 v2.9.0 // 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/felixge/httpsnoop v1.1.0 // indirect
+ github.com/fxamacker/cbor/v2 v2.9.2 // indirect
+ github.com/go-openapi/runtime/server-middleware v0.32.3 // indirect
+ github.com/go-openapi/swag v0.26.1 // indirect
+ github.com/go-openapi/swag/cmdutils v0.26.1 // indirect
+ github.com/go-openapi/swag/conv v0.26.1 // indirect
+ github.com/go-openapi/swag/fileutils v0.26.1 // indirect
+ github.com/go-openapi/swag/jsonname v0.26.1 // indirect
+ github.com/go-openapi/swag/jsonutils v0.26.1 // indirect
+ github.com/go-openapi/swag/loading v0.26.1 // indirect
+ github.com/go-openapi/swag/mangling v0.26.1 // indirect
+ github.com/go-openapi/swag/netutils v0.26.1 // indirect
+ github.com/go-openapi/swag/stringutils v0.26.1 // indirect
+ github.com/go-openapi/swag/typeutils v0.26.1 // indirect
+ github.com/go-openapi/swag/yamlutils v0.26.1 // indirect
github.com/go-viper/mapstructure/v2 v2.5.0 // indirect
github.com/golang-jwt/jwt/v5 v5.3.1 // indirect
github.com/google/btree v1.1.3 // indirect
@@ -119,14 +120,14 @@ require (
go.opentelemetry.io/proto/otlp v1.10.0 // indirect
go.yaml.in/yaml/v2 v2.4.4 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
- golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 // indirect
- golang.org/x/mod v0.36.0 // indirect
- golang.org/x/tools v0.45.0 // indirect
- google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa // indirect
- google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa // indirect
+ golang.org/x/exp v0.0.0-20260611194520-c48552f49976 // indirect
+ golang.org/x/mod v0.37.0 // indirect
+ golang.org/x/tools v0.46.0 // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20260610212136-7ab31c22f7ad // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad // indirect
google.golang.org/grpc v1.81.1 // indirect
gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect
- k8s.io/streaming v0.36.1 // indirect
+ k8s.io/streaming v0.36.2 // indirect
sigs.k8s.io/randfill v1.0.0 // indirect
sigs.k8s.io/structured-merge-diff/v6 v6.4.0 // indirect
)
@@ -142,15 +143,15 @@ require (
github.com/go-logfmt/logfmt v0.6.1 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
- github.com/go-openapi/analysis v0.25.0 // indirect
- github.com/go-openapi/errors v0.22.7 // indirect
+ github.com/go-openapi/analysis v0.25.2 // indirect
+ github.com/go-openapi/errors v0.22.8 // indirect
github.com/go-openapi/jsonpointer v0.23.1 // indirect
- github.com/go-openapi/jsonreference v0.21.5 // indirect
- github.com/go-openapi/loads v0.23.3 // indirect
- github.com/go-openapi/runtime v0.29.4 // indirect
- github.com/go-openapi/spec v0.22.4 // indirect
- github.com/go-openapi/strfmt v0.26.2 // indirect
- github.com/go-openapi/validate v0.25.2 // indirect
+ github.com/go-openapi/jsonreference v0.21.6 // indirect
+ github.com/go-openapi/loads v0.24.0 // indirect
+ github.com/go-openapi/runtime v0.32.3 // indirect
+ github.com/go-openapi/spec v0.22.6 // indirect
+ github.com/go-openapi/strfmt v0.26.3 // indirect
+ github.com/go-openapi/validate v0.26.0 // indirect
github.com/google/uuid v1.6.0
github.com/grafana/regexp v0.0.0-20250905093917-f7b3be9d1853 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
@@ -184,7 +185,7 @@ require (
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
gotest.tools/v3 v3.5.2
- k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a // indirect
+ k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25 // indirect
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect
)
diff --git a/go.sum b/go.sum
index 9fb1f609050..c20b0bb64da 100644
--- a/go.sum
+++ b/go.sum
@@ -103,12 +103,12 @@ github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjT
github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM=
github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb h1:IT4JYU7k4ikYg1SCxNI1/Tieq/NFvh6dzLdgi7eu0tM=
github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb/go.mod h1:bH6Xx7IW64qjjJq8M2u4dxNaBiDfKK+z/3eGDpXEQhc=
-github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
-github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
+github.com/felixge/httpsnoop v1.1.0 h1:3YtUj32ZZkqZtt3sZZsClsymw/QDuVfpNhoA31zeORc=
+github.com/felixge/httpsnoop v1.1.0/go.mod h1:Zqxgdd+1Rkcz8euOqdr7lqgCRJztwr5hp9vDSi5UZCE=
github.com/fsnotify/fsnotify v1.10.1 h1:b0/UzAf9yR5rhf3RPm9gf3ehBPpf0oZKIjtpKrx59Ho=
github.com/fsnotify/fsnotify v1.10.1/go.mod h1:TLheqan6HD6GBK6PrDWyDPBaEV8LspOxvPSjC+bVfgo=
-github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM=
-github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
+github.com/fxamacker/cbor/v2 v2.9.2 h1:X4Ksno9+x3cz0TZv69ec1hxP/+tymuR8PXQJyDwfh78=
+github.com/fxamacker/cbor/v2 v2.9.2/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
@@ -126,54 +126,56 @@ 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/analysis v0.25.0 h1:EnjAq1yO8wEO9HbPmY8vLPEIkdZuuFhCAKBPvCB7bCs=
-github.com/go-openapi/analysis v0.25.0/go.mod h1:5WFTRE43WLkPG9r9OtlMfqkkvUTYLVVCIxLlEpyF8kE=
-github.com/go-openapi/errors v0.22.7 h1:JLFBGC0Apwdzw3484MmBqspjPbwa2SHvpDm0u5aGhUA=
-github.com/go-openapi/errors v0.22.7/go.mod h1://QW6SD9OsWtH6gHllUCddOXDL0tk0ZGNYHwsw4sW3w=
+github.com/go-openapi/analysis v0.25.2 h1:I0vy4n3alz+DHTiN1PRhCb7QZxkK6g5YmswZKv2TKuw=
+github.com/go-openapi/analysis v0.25.2/go.mod h1:Uhs1t/2XR10EnwONYILGEzw8gcfGIG5Xk5K2AxnhqDo=
+github.com/go-openapi/errors v0.22.8 h1:oP7sW7TWc3wFFjrzzj0nI83H2qMBkNjNfSd+XRejk/I=
+github.com/go-openapi/errors v0.22.8/go.mod h1:BuUoHcYrU6E7V9gfj1I5wLQqgtIHnup/alXZ8KdgQ0w=
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/loads v0.23.3 h1:g5Xap1JfwKkUnZdn+S0L3SzBDpcTIYzZ5Qaag0YDkKQ=
-github.com/go-openapi/loads v0.23.3/go.mod h1:NOH07zLajXo8y55hom0omlHWDVVvCwBM/S+csCK8LqA=
-github.com/go-openapi/runtime v0.29.4 h1:k2lDxrGoSAJRdhFG2tONKMpkizY/4X1cciSdtzk4Jjo=
-github.com/go-openapi/runtime v0.29.4/go.mod h1:K0k/2raY6oqXJnZAgWJB2i/12QKrhUKpZcH4PfV9P18=
-github.com/go-openapi/spec v0.22.4 h1:4pxGjipMKu0FzFiu/DPwN3CTBRlVM2yLf/YTWorYfDQ=
-github.com/go-openapi/spec v0.22.4/go.mod h1:WQ6Ai0VPWMZgMT4XySjlRIE6GP1bGQOtEThn3gcWLtQ=
-github.com/go-openapi/strfmt v0.26.2 h1:ysjheCh4i1rmFEo2LanhELDNucNzfWTZhUDKgWWPaFM=
-github.com/go-openapi/strfmt v0.26.2/go.mod h1:fXh1e449cyUn2NYuz+wb3wARBUdMl7qPEZwX00nqivY=
-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-openapi/validate v0.25.2 h1:12NsfLAwGegqbGWr2CnvT65X/Q2USJipmJ9b7xDJZz0=
-github.com/go-openapi/validate v0.25.2/go.mod h1:Pgl1LpPPGFnZ+ys4/hTlDiRYQdI1ocKypgE+8Q8BLfY=
+github.com/go-openapi/jsonreference v0.21.6 h1:NZ5nGfnaM1n4I43Xjm1e5/M2GjOwQwndQz22uhxwD+Y=
+github.com/go-openapi/jsonreference v0.21.6/go.mod h1:xzbgtQ3ZbWxvET3AxdzCJlJt6vkovbf+IfSPJjD0tUY=
+github.com/go-openapi/loads v0.24.0 h1:4LLorXRPTzIN9V6ngMUZbAscsBOUBk3Oa8cClu/bFrQ=
+github.com/go-openapi/loads v0.24.0/go.mod h1:xQMgX+hw5xRAhGrcDXxeMw78IFqUpIzhleu3HqPhyF4=
+github.com/go-openapi/runtime v0.32.3 h1:J7Ycy5DJmhhP1By3NifhRUjnkXTrk21qbeqSULjwX8U=
+github.com/go-openapi/runtime v0.32.3/go.mod h1:/WTQi0fa5DiGnnCXQKsTkSm15OzJp8Uz3H2t+67TBr4=
+github.com/go-openapi/runtime/server-middleware v0.32.3 h1:Y/6h9ix9NCoMG04XazRwX6eA3alh4+JZ6qXdar5yd24=
+github.com/go-openapi/runtime/server-middleware v0.32.3/go.mod h1:fYPep4GdTwg/XqZUjR40uIM/8C12Ba5M+MrGCiwpTHo=
+github.com/go-openapi/spec v0.22.6 h1:Tyy1pLaNCM8GBCFLoGYLonjJi6zykqyLCjXLc19ZPic=
+github.com/go-openapi/spec v0.22.6/go.mod h1:HZvTHat+iH0PALQRWhrqIHtU/PEqxqd89fu0MxGlMeM=
+github.com/go-openapi/strfmt v0.26.3 h1:rzmslHarJgBbf2qfGge+X3htclQfmXqBZMm0Too0HhU=
+github.com/go-openapi/strfmt v0.26.3/go.mod h1:a5nsUw0oRpQzZeOwx8bi6cKbzFZslpbCKt1LEot+KnQ=
+github.com/go-openapi/swag v0.26.1 h1:l5sVEyVpwj+DDYeZyo7wQI/Ebn/mKYIyGB/pFwAfGoQ=
+github.com/go-openapi/swag v0.26.1/go.mod h1:yNY38BbIVthxbkDtq1UHBCGasBqjakW3lCR6ANzdBEw=
+github.com/go-openapi/swag/cmdutils v0.26.1 h1:f2iE1ijYaJ3nuu5PaEMx3zpEhzhZFgivCJObWEObLIQ=
+github.com/go-openapi/swag/cmdutils v0.26.1/go.mod h1:Sm1MVFMkF6guJJ+pQqHnQA3N0j9qALV3NxzDSv6bETM=
+github.com/go-openapi/swag/conv v0.26.1 h1:slr5FVkg9Wc3Y5zcwenD8Sd/PQ94b2I/QJI7N7KTBpg=
+github.com/go-openapi/swag/conv v0.26.1/go.mod h1:mvQXgPptZk9GTrFgGwWvT4q+dN+zQej9JfmGwnipz1A=
+github.com/go-openapi/swag/fileutils v0.26.1 h1:K1XCM2CGhfNsc6YDt6v7Q5+1e59rftYWdcu/isZhvFw=
+github.com/go-openapi/swag/fileutils v0.26.1/go.mod h1:mYUgxQAKX4ShS3qvvySx+/9yrlUnDhjiD1CalaQl8lQ=
+github.com/go-openapi/swag/jsonname v0.26.1 h1:VReupaV6WxlAsCn0e4DUfgV6bPmINnPpyJDLqSfNPcE=
+github.com/go-openapi/swag/jsonname v0.26.1/go.mod h1:OvdW6BoWoj33pTfi7x9vFrgmT+fk7aw0BRwvCE0YOuc=
+github.com/go-openapi/swag/jsonutils v0.26.1 h1:2hdBfFkHg+7Wrz2VsCbeyR6hzkRDs7AztnMR2u84yOY=
+github.com/go-openapi/swag/jsonutils v0.26.1/go.mod h1:U+RMJH3wa+6BRiphuRtIyI8fW9HPFqFQ4sHk2oRx0UQ=
+github.com/go-openapi/swag/jsonutils/fixtures_test v0.26.1 h1:1CD7NiLLb/TXl3tOnFYU4b+mNfb5rtgHkaA+q7RMYYQ=
+github.com/go-openapi/swag/jsonutils/fixtures_test v0.26.1/go.mod h1:ZWafc8nMdYzTE3uYY6W86f0n46+IF0g4uUyRhJw/kXc=
+github.com/go-openapi/swag/loading v0.26.1 h1:E9K4wqXeROlhjFQ13K9zMz6ojFGXIggGe+ad1odrK9w=
+github.com/go-openapi/swag/loading v0.26.1/go.mod h1:3qvRIlWzWdq1HvmldwmuJ2ohpcAryN6xVt2OTKd0/7E=
+github.com/go-openapi/swag/mangling v0.26.1 h1:gpYI4WuPKFJJVjV5cDLGlDVJhFIxYjQc7yN5eEb4CqM=
+github.com/go-openapi/swag/mangling v0.26.1/go.mod h1:POETDH01hqAdASXfw7ISEd9bCOE6xBHOt8NHmGZRmYM=
+github.com/go-openapi/swag/netutils v0.26.1 h1:BNctoc39WTAUMxyAs355fExOPzMZtPbZ0ZZ1Am2FR5M=
+github.com/go-openapi/swag/netutils v0.26.1/go.mod h1:y02vByhZhQPAVwOX+0KipXFZ/hUbk6G/Enhf5rGaOkQ=
+github.com/go-openapi/swag/stringutils v0.26.1 h1:f88uYyTso7TnHrKM/bUBsQ5e2wKf37cpgo6pvbzd9yU=
+github.com/go-openapi/swag/stringutils v0.26.1/go.mod h1:Sc6d3bU8fgk5AyZR8/8jEQ+Is/Ald+TD/IIggPN8UJk=
+github.com/go-openapi/swag/typeutils v0.26.1 h1:yg42FgMzRR6PVQ3M3qHz1s+Y6/P4HoJ3cBarXa3OVnU=
+github.com/go-openapi/swag/typeutils v0.26.1/go.mod h1:VfnV+oUtSP2vCSCn2aJgnr8OevUYemyIzzS1VOzS10o=
+github.com/go-openapi/swag/yamlutils v0.26.1 h1:0TSLK+lXs9vfIhAWzBeI/lOzEnIoot6WTCO1aAeWFTk=
+github.com/go-openapi/swag/yamlutils v0.26.1/go.mod h1:7W5b7PRX9MxwL7TjeG7H8HkyBGRsIDRObhyMWFgBI2M=
+github.com/go-openapi/testify/enable/yaml/v2 v2.5.1 h1:q9NtHwK4qHF7yZziBPvZyv7zWAIk8ok88Gh2mR6Jpc8=
+github.com/go-openapi/testify/enable/yaml/v2 v2.5.1/go.mod h1:JW0MXIotCYps/XsgJnG3a8Q7rE5xAiBwoOD5OfaIQBk=
+github.com/go-openapi/testify/v2 v2.5.1 h1:TMdhCaw8fUNraVSf3Omoob1dO/AzBfhtFAPW0an6sBo=
+github.com/go-openapi/testify/v2 v2.5.1/go.mod h1:SgsVHtfooshd0tublTtJ50FPKhujf47YRqauXXOUxfw=
+github.com/go-openapi/validate v0.26.0 h1:dxWzQ3F+vb1SajqUxHjwb5T4mTpSHmdrtv5Bi7+ZNhw=
+github.com/go-openapi/validate v0.26.0/go.mod h1:b4o00uq7fJeJA+wWhVFCJpKTctzeFwzZImGGmHsl2JA=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
@@ -469,12 +471,12 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto=
golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio=
-golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 h1:jiDhWWeC7jfWqR9c/uplMOqJ0sbNlNWv0UkzE0vX1MA=
-golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90/go.mod h1:xE1HEv6b+1SCZ5/uscMRjUBKtIxworgEcEi+/n9NQDQ=
+golang.org/x/exp v0.0.0-20260611194520-c48552f49976 h1:X8Hz2ImujgbmetVuW+w2YkyZChE3cBpZi2P158rTG9M=
+golang.org/x/exp v0.0.0-20260611194520-c48552f49976/go.mod h1:vnf4pv9iKZXY58sQE1L86zmNWJ4159e1RkcWiLCkeEY=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.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-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -525,8 +527,8 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.45.0 h1:18qN3FAooORvApf5XjCXgsuayZOEtXf6JK18I3+ONa8=
-golang.org/x/tools v0.45.0/go.mod h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0=
+golang.org/x/tools v0.46.0 h1:7jTurBkPZu4moS/Uy4OQT1M+QBlsj3wejyZwsT8Z7rk=
+golang.org/x/tools v0.46.0/go.mod h1:FrD85F8l+NWL+9XWBSyVSHO6Ne4jutsfIFba7AWQ5Ys=
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=
@@ -536,10 +538,10 @@ gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E
google.golang.org/api v0.278.0 h1:W7jiRvRi53VYFfZ/HoZjQBtJk7gOFbHD8ot1RzVZU6E=
google.golang.org/api v0.278.0/go.mod h1:B9TqLBwJqVjp1mtt7WeoQwWRwvu/400y5lETOql+giQ=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa h1:Kjn0N0tCrDgiAFW+lGO4JZ3ck44CehvJQMAwj9QF0G8=
-google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:q4lMZS6kskjT5HvCPrnnypcDPVJqT/f4nfxmkE7gryY=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa h1:mZHHdPZl0dbGHCflZgAq/Q468DWVFcU2whhB2KAo8fk=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
+google.golang.org/genproto/googleapis/api v0.0.0-20260610212136-7ab31c22f7ad h1:3iLyITS/sySRwbUKoC7ogfj2Yr1Cjs0pfaRKj5U5HEw=
+google.golang.org/genproto/googleapis/api v0.0.0-20260610212136-7ab31c22f7ad/go.mod h1:KdNqO+rCIWgFumrNBSEDlDNrkrQnpkax7Tv1WxNY8V4=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad h1:45WmJvIV6C2+O/jjLkPUH+F3aOj/1miDoU2DD0+NWbg=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad/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 v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
@@ -572,26 +574,26 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q=
gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA=
-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/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/api v0.36.2 h1:TF6YDLIzKfccK7cq9YpTcGX8TJmEkHVRv78DM51fRYY=
+k8s.io/api v0.36.2/go.mod h1:F4LbMO4brjZYh7yFkXWhynSvtB7YauxV4c+HHkNRGNg=
+k8s.io/apiextensions-apiserver v0.36.2 h1:3O5gqOj/dt2XWWbpMe+TXWpE9yU6pjM/tXxtHHJT/K4=
+k8s.io/apiextensions-apiserver v0.36.2/go.mod h1:cL1tBWe8XSaP1H30iWKGo7hf6iAUUUJPEU70dskmAnA=
+k8s.io/apimachinery v0.36.2 h1:0PE/W/WNy1UX61NLbXY5TMbJ6UwLL6E6lAPkYrKFxbQ=
+k8s.io/apimachinery v0.36.2/go.mod h1:fvf/HOLXq9RId0rnDIbN1OEBvHXdQbLMM8nu0LcBUf4=
+k8s.io/apiserver v0.36.2 h1:6vMnkmHZPeBloNkHUhmZYq7Ylv8WIB8xjyEl+eSt26E=
+k8s.io/apiserver v0.36.2/go.mod h1:9PoQ2ikCytrZyZg11mGhLEF5m8Rgsb5FJmYJ4Wvnl1k=
+k8s.io/client-go v0.36.2 h1:bfgxmFKc9CgqsgX4xKLAAdmTQlWee7Ob/HlDOrJ5TBI=
+k8s.io/client-go v0.36.2/go.mod h1:1vgO4OAlfPnoLcb+Rze2GF5rAr14w8qjrYMoyXJzQj0=
+k8s.io/component-base v0.36.2 h1:Z0VH80O7Ng0HDZnZj3WRR3urEGa0kTwmO8CwEwjVK1w=
+k8s.io/component-base v0.36.2/go.mod h1:mGfFOA7Gwpdm1VW2cwSQYbiDIlz8GD2WGwH88QSeCyA=
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-20260317180543-43fb72c5454a h1:xCeOEAOoGYl2jnJoHkC3hkbPJgdATINPMAxaynU2Ovg=
-k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0=
-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=
+k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25 h1:mPMaPMpBij2V1Wv/fR+HW124vVGXXvOSS9ver/9yjWs=
+k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25/go.mod h1:V/QaCUYDa+0QpcHhVVc5l99Uz56wEMEXBSj9oCDkNDY=
+k8s.io/streaming v0.36.2 h1:NSKthPPg9UFSKsRauVJUVGH2Dvn8fhKmY4qrMkw/p98=
+k8s.io/streaming v0.36.2/go.mod h1:z6fV3D+NVkoeqRMtWwlUZK6U17SY/LqNzOxWL6GyR/s=
+k8s.io/utils v0.0.0-20260507154919-ff6756f316d2 h1:wU4tMEhLGgIbLvXQb1cfN+EcM0wf7zC6CPF+C79jroc=
+k8s.io/utils v0.0.0-20260507154919-ff6756f316d2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk=
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/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg=
diff --git a/pkg/apis/monitoring/go.mod b/pkg/apis/monitoring/go.mod
index f1ba3fa3a08..da87b8b0cdf 100644
--- a/pkg/apis/monitoring/go.mod
+++ b/pkg/apis/monitoring/go.mod
@@ -3,27 +3,27 @@ module github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring
go 1.26.0
require (
- k8s.io/api v0.36.0
- k8s.io/apiextensions-apiserver v0.36.0
- k8s.io/apimachinery v0.36.0
- k8s.io/utils v0.0.0-20260319190234-28399d86e0b5
+ k8s.io/api v0.36.2
+ k8s.io/apiextensions-apiserver v0.36.2
+ k8s.io/apimachinery v0.36.2
+ k8s.io/utils v0.0.0-20260507154919-ff6756f316d2
sigs.k8s.io/controller-runtime v0.24.1
)
require (
- github.com/fxamacker/cbor/v2 v2.9.0 // indirect
+ github.com/fxamacker/cbor/v2 v2.9.2 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
github.com/x448/float16 v0.8.4 // indirect
go.yaml.in/yaml/v2 v2.4.4 // indirect
- golang.org/x/net v0.52.0 // indirect
- golang.org/x/text v0.35.0 // indirect
+ golang.org/x/net v0.56.0 // indirect
+ golang.org/x/text v0.38.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
k8s.io/klog/v2 v2.140.0 // indirect
- k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a // indirect
+ k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25 // indirect
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect
sigs.k8s.io/randfill v1.0.0 // indirect
- sigs.k8s.io/structured-merge-diff/v6 v6.3.2 // indirect
+ sigs.k8s.io/structured-merge-diff/v6 v6.4.0 // indirect
)
diff --git a/pkg/apis/monitoring/go.sum b/pkg/apis/monitoring/go.sum
index 887f74a6bcf..321f31cd46b 100644
--- a/pkg/apis/monitoring/go.sum
+++ b/pkg/apis/monitoring/go.sum
@@ -2,8 +2,8 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM=
-github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
+github.com/fxamacker/cbor/v2 v2.9.2 h1:X4Ksno9+x3cz0TZv69ec1hxP/+tymuR8PXQJyDwfh78=
+github.com/fxamacker/cbor/v2 v2.9.2/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
@@ -20,8 +20,8 @@ github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWu
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY=
-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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
@@ -30,33 +30,33 @@ github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ=
go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ=
-golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0=
-golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw=
-golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8=
-golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA=
+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/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE=
+golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4=
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-k8s.io/api v0.36.0 h1:SgqDhZzHdOtMk40xVSvCXkP9ME0H05hPM3p9AB1kL80=
-k8s.io/api v0.36.0/go.mod h1:m1LVrGPNYax5NBHdO+QuAedXyuzTt4RryI/qnmNvs34=
-k8s.io/apiextensions-apiserver v0.36.0 h1:Wt7E8J+VBCbj4FjiBfDTK/neXDDjyJVJc7xfuOHImZ0=
-k8s.io/apiextensions-apiserver v0.36.0/go.mod h1:kGDjH0msuiIB3tgsYRV0kS9GqpMYMUsQ3GHv7TApyug=
-k8s.io/apimachinery v0.36.0 h1:jZyPzhd5Z+3h9vJLt0z9XdzW9VzNzWAUw+P1xZ9PXtQ=
-k8s.io/apimachinery v0.36.0/go.mod h1:FklypaRJt6n5wUIwWXIP6GJlIpUizTgfo1T/As+Tyxc=
+k8s.io/api v0.36.2 h1:TF6YDLIzKfccK7cq9YpTcGX8TJmEkHVRv78DM51fRYY=
+k8s.io/api v0.36.2/go.mod h1:F4LbMO4brjZYh7yFkXWhynSvtB7YauxV4c+HHkNRGNg=
+k8s.io/apiextensions-apiserver v0.36.2 h1:3O5gqOj/dt2XWWbpMe+TXWpE9yU6pjM/tXxtHHJT/K4=
+k8s.io/apiextensions-apiserver v0.36.2/go.mod h1:cL1tBWe8XSaP1H30iWKGo7hf6iAUUUJPEU70dskmAnA=
+k8s.io/apimachinery v0.36.2 h1:0PE/W/WNy1UX61NLbXY5TMbJ6UwLL6E6lAPkYrKFxbQ=
+k8s.io/apimachinery v0.36.2/go.mod h1:fvf/HOLXq9RId0rnDIbN1OEBvHXdQbLMM8nu0LcBUf4=
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-20260317180543-43fb72c5454a h1:xCeOEAOoGYl2jnJoHkC3hkbPJgdATINPMAxaynU2Ovg=
-k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0=
-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=
+k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25 h1:mPMaPMpBij2V1Wv/fR+HW124vVGXXvOSS9ver/9yjWs=
+k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25/go.mod h1:V/QaCUYDa+0QpcHhVVc5l99Uz56wEMEXBSj9oCDkNDY=
+k8s.io/utils v0.0.0-20260507154919-ff6756f316d2 h1:wU4tMEhLGgIbLvXQb1cfN+EcM0wf7zC6CPF+C79jroc=
+k8s.io/utils v0.0.0-20260507154919-ff6756f316d2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk=
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/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg=
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
-sigs.k8s.io/structured-merge-diff/v6 v6.3.2 h1:kwVWMx5yS1CrnFWA/2QHyRVJ8jM6dBA80uLmm0wJkk8=
-sigs.k8s.io/structured-merge-diff/v6 v6.3.2/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE=
+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/pkg/client/go.mod b/pkg/client/go.mod
index 1f24d7a5f21..be5a1f07c09 100644
--- a/pkg/client/go.mod
+++ b/pkg/client/go.mod
@@ -4,32 +4,32 @@ go 1.26.0
require (
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.91.0
- k8s.io/api v0.36.0
- k8s.io/apiextensions-apiserver v0.36.0
- k8s.io/apimachinery v0.36.0
- k8s.io/client-go v0.36.0
+ k8s.io/api v0.36.2
+ k8s.io/apiextensions-apiserver v0.36.2
+ k8s.io/apimachinery v0.36.2
+ k8s.io/client-go v0.36.2
sigs.k8s.io/structured-merge-diff/v6 v6.4.0
)
require (
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/emicklei/go-restful/v3 v3.13.0 // indirect
- github.com/fxamacker/cbor/v2 v2.9.0 // indirect
+ github.com/fxamacker/cbor/v2 v2.9.2 // indirect
github.com/go-logr/logr v1.4.3 // indirect
- github.com/go-openapi/jsonpointer v0.22.5 // indirect
- github.com/go-openapi/jsonreference v0.21.5 // indirect
- github.com/go-openapi/swag v0.25.5 // indirect
- github.com/go-openapi/swag/cmdutils v0.25.5 // indirect
- github.com/go-openapi/swag/conv v0.25.5 // indirect
- github.com/go-openapi/swag/fileutils v0.25.5 // indirect
- github.com/go-openapi/swag/jsonname v0.25.5 // indirect
- github.com/go-openapi/swag/jsonutils v0.25.5 // indirect
- github.com/go-openapi/swag/loading v0.25.5 // indirect
- github.com/go-openapi/swag/mangling v0.25.5 // indirect
- github.com/go-openapi/swag/netutils v0.25.5 // indirect
- github.com/go-openapi/swag/stringutils v0.25.5 // indirect
- github.com/go-openapi/swag/typeutils v0.25.5 // indirect
- github.com/go-openapi/swag/yamlutils v0.25.5 // indirect
+ github.com/go-openapi/jsonpointer v0.23.1 // indirect
+ github.com/go-openapi/jsonreference v0.21.6 // indirect
+ github.com/go-openapi/swag v0.26.1 // indirect
+ github.com/go-openapi/swag/cmdutils v0.26.1 // indirect
+ github.com/go-openapi/swag/conv v0.26.1 // indirect
+ github.com/go-openapi/swag/fileutils v0.26.1 // indirect
+ github.com/go-openapi/swag/jsonname v0.26.1 // indirect
+ github.com/go-openapi/swag/jsonutils v0.26.1 // indirect
+ github.com/go-openapi/swag/loading v0.26.1 // indirect
+ github.com/go-openapi/swag/mangling v0.26.1 // indirect
+ github.com/go-openapi/swag/netutils v0.26.1 // indirect
+ github.com/go-openapi/swag/stringutils v0.26.1 // indirect
+ github.com/go-openapi/swag/typeutils v0.26.1 // indirect
+ github.com/go-openapi/swag/yamlutils v0.26.1 // indirect
github.com/google/gnostic-models v0.7.1 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
@@ -41,18 +41,18 @@ require (
github.com/x448/float16 v0.8.4 // indirect
go.yaml.in/yaml/v2 v2.4.4 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
- golang.org/x/net v0.52.0 // indirect
+ golang.org/x/net v0.56.0 // indirect
golang.org/x/oauth2 v0.36.0 // indirect
- golang.org/x/sys v0.42.0 // indirect
- golang.org/x/term v0.41.0 // indirect
- golang.org/x/text v0.35.0 // indirect
+ golang.org/x/sys v0.46.0 // indirect
+ golang.org/x/term v0.44.0 // indirect
+ golang.org/x/text v0.38.0 // indirect
golang.org/x/time v0.15.0 // indirect
google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af // indirect
gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
k8s.io/klog/v2 v2.140.0 // indirect
- k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a // indirect
- k8s.io/utils v0.0.0-20260319190234-28399d86e0b5 // indirect
+ k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25 // indirect
+ k8s.io/utils v0.0.0-20260507154919-ff6756f316d2 // indirect
sigs.k8s.io/controller-runtime v0.24.1 // indirect
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect
sigs.k8s.io/randfill v1.0.0 // indirect
diff --git a/pkg/client/go.sum b/pkg/client/go.sum
index 066a6c29f6f..c31ff9d354f 100644
--- a/pkg/client/go.sum
+++ b/pkg/client/go.sum
@@ -5,44 +5,44 @@ 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/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/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM=
-github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
+github.com/fxamacker/cbor/v2 v2.9.2 h1:X4Ksno9+x3cz0TZv69ec1hxP/+tymuR8PXQJyDwfh78=
+github.com/fxamacker/cbor/v2 v2.9.2/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
-github.com/go-openapi/jsonpointer v0.22.5 h1:8on/0Yp4uTb9f4XvTrM2+1CPrV05QPZXu+rvu2o9jcA=
-github.com/go-openapi/jsonpointer v0.22.5/go.mod h1:gyUR3sCvGSWchA2sUBJGluYMbe1zazrYWIkWPjjMUY0=
-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.25.5 h1:pNkwbUEeGwMtcgxDr+2GBPAk4kT+kJ+AaB+TMKAg+TU=
-github.com/go-openapi/swag v0.25.5/go.mod h1:B3RT6l8q7X803JRxa2e59tHOiZlX1t8viplOcs9CwTA=
-github.com/go-openapi/swag/cmdutils v0.25.5 h1:yh5hHrpgsw4NwM9KAEtaDTXILYzdXh/I8Whhx9hKj7c=
-github.com/go-openapi/swag/cmdutils v0.25.5/go.mod h1:pdae/AFo6WxLl5L0rq87eRzVPm/XRHM3MoYgRMvG4A0=
-github.com/go-openapi/swag/conv v0.25.5 h1:wAXBYEXJjoKwE5+vc9YHhpQOFj2JYBMF2DUi+tGu97g=
-github.com/go-openapi/swag/conv v0.25.5/go.mod h1:CuJ1eWvh1c4ORKx7unQnFGyvBbNlRKbnRyAvDvzWA4k=
-github.com/go-openapi/swag/fileutils v0.25.5 h1:B6JTdOcs2c0dBIs9HnkyTW+5gC+8NIhVBUwERkFhMWk=
-github.com/go-openapi/swag/fileutils v0.25.5/go.mod h1:V3cT9UdMQIaH4WiTrUc9EPtVA4txS0TOmRURmhGF4kc=
-github.com/go-openapi/swag/jsonname v0.25.5 h1:8p150i44rv/Drip4vWI3kGi9+4W9TdI3US3uUYSFhSo=
-github.com/go-openapi/swag/jsonname v0.25.5/go.mod h1:jNqqikyiAK56uS7n8sLkdaNY/uq6+D2m2LANat09pKU=
-github.com/go-openapi/swag/jsonutils v0.25.5 h1:XUZF8awQr75MXeC+/iaw5usY/iM7nXPDwdG3Jbl9vYo=
-github.com/go-openapi/swag/jsonutils v0.25.5/go.mod h1:48FXUaz8YsDAA9s5AnaUvAmry1UcLcNVWUjY42XkrN4=
-github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.5 h1:SX6sE4FrGb4sEnnxbFL/25yZBb5Hcg1inLeErd86Y1U=
-github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.5/go.mod h1:/2KvOTrKWjVA5Xli3DZWdMCZDzz3uV/T7bXwrKWPquo=
-github.com/go-openapi/swag/loading v0.25.5 h1:odQ/umlIZ1ZVRteI6ckSrvP6e2w9UTF5qgNdemJHjuU=
-github.com/go-openapi/swag/loading v0.25.5/go.mod h1:I8A8RaaQ4DApxhPSWLNYWh9NvmX2YKMoB9nwvv6oW6g=
-github.com/go-openapi/swag/mangling v0.25.5 h1:hyrnvbQRS7vKePQPHHDso+k6CGn5ZBs5232UqWZmJZw=
-github.com/go-openapi/swag/mangling v0.25.5/go.mod h1:6hadXM/o312N/h98RwByLg088U61TPGiltQn71Iw0NY=
-github.com/go-openapi/swag/netutils v0.25.5 h1:LZq2Xc2QI8+7838elRAaPCeqJnHODfSyOa7ZGfxDKlU=
-github.com/go-openapi/swag/netutils v0.25.5/go.mod h1:lHbtmj4m57APG/8H7ZcMMSWzNqIQcu0RFiXrPUara14=
-github.com/go-openapi/swag/stringutils v0.25.5 h1:NVkoDOA8YBgtAR/zvCx5rhJKtZF3IzXcDdwOsYzrB6M=
-github.com/go-openapi/swag/stringutils v0.25.5/go.mod h1:PKK8EZdu4QJq8iezt17HM8RXnLAzY7gW0O1KKarrZII=
-github.com/go-openapi/swag/typeutils v0.25.5 h1:EFJ+PCga2HfHGdo8s8VJXEVbeXRCYwzzr9u4rJk7L7E=
-github.com/go-openapi/swag/typeutils v0.25.5/go.mod h1:itmFmScAYE1bSD8C4rS0W+0InZUBrB2xSPbWt6DLGuc=
-github.com/go-openapi/swag/yamlutils v0.25.5 h1:kASCIS+oIeoc55j28T4o8KwlV2S4ZLPT6G0iq2SSbVQ=
-github.com/go-openapi/swag/yamlutils v0.25.5/go.mod h1:Gek1/SjjfbYvM+Iq4QGwa/2lEXde9n2j4a3wI3pNuOQ=
-github.com/go-openapi/testify/enable/yaml/v2 v2.4.0 h1:7SgOMTvJkM8yWrQlU8Jm18VeDPuAvB/xWrdxFJkoFag=
-github.com/go-openapi/testify/enable/yaml/v2 v2.4.0/go.mod h1:14iV8jyyQlinc9StD7w1xVPW3CO3q1Gj04Jy//Kw4VM=
-github.com/go-openapi/testify/v2 v2.4.0 h1:8nsPrHVCWkQ4p8h1EsRVymA2XABB4OT40gcvAu+voFM=
-github.com/go-openapi/testify/v2 v2.4.0/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54=
+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.6 h1:NZ5nGfnaM1n4I43Xjm1e5/M2GjOwQwndQz22uhxwD+Y=
+github.com/go-openapi/jsonreference v0.21.6/go.mod h1:xzbgtQ3ZbWxvET3AxdzCJlJt6vkovbf+IfSPJjD0tUY=
+github.com/go-openapi/swag v0.26.1 h1:l5sVEyVpwj+DDYeZyo7wQI/Ebn/mKYIyGB/pFwAfGoQ=
+github.com/go-openapi/swag v0.26.1/go.mod h1:yNY38BbIVthxbkDtq1UHBCGasBqjakW3lCR6ANzdBEw=
+github.com/go-openapi/swag/cmdutils v0.26.1 h1:f2iE1ijYaJ3nuu5PaEMx3zpEhzhZFgivCJObWEObLIQ=
+github.com/go-openapi/swag/cmdutils v0.26.1/go.mod h1:Sm1MVFMkF6guJJ+pQqHnQA3N0j9qALV3NxzDSv6bETM=
+github.com/go-openapi/swag/conv v0.26.1 h1:slr5FVkg9Wc3Y5zcwenD8Sd/PQ94b2I/QJI7N7KTBpg=
+github.com/go-openapi/swag/conv v0.26.1/go.mod h1:mvQXgPptZk9GTrFgGwWvT4q+dN+zQej9JfmGwnipz1A=
+github.com/go-openapi/swag/fileutils v0.26.1 h1:K1XCM2CGhfNsc6YDt6v7Q5+1e59rftYWdcu/isZhvFw=
+github.com/go-openapi/swag/fileutils v0.26.1/go.mod h1:mYUgxQAKX4ShS3qvvySx+/9yrlUnDhjiD1CalaQl8lQ=
+github.com/go-openapi/swag/jsonname v0.26.1 h1:VReupaV6WxlAsCn0e4DUfgV6bPmINnPpyJDLqSfNPcE=
+github.com/go-openapi/swag/jsonname v0.26.1/go.mod h1:OvdW6BoWoj33pTfi7x9vFrgmT+fk7aw0BRwvCE0YOuc=
+github.com/go-openapi/swag/jsonutils v0.26.1 h1:2hdBfFkHg+7Wrz2VsCbeyR6hzkRDs7AztnMR2u84yOY=
+github.com/go-openapi/swag/jsonutils v0.26.1/go.mod h1:U+RMJH3wa+6BRiphuRtIyI8fW9HPFqFQ4sHk2oRx0UQ=
+github.com/go-openapi/swag/jsonutils/fixtures_test v0.26.1 h1:1CD7NiLLb/TXl3tOnFYU4b+mNfb5rtgHkaA+q7RMYYQ=
+github.com/go-openapi/swag/jsonutils/fixtures_test v0.26.1/go.mod h1:ZWafc8nMdYzTE3uYY6W86f0n46+IF0g4uUyRhJw/kXc=
+github.com/go-openapi/swag/loading v0.26.1 h1:E9K4wqXeROlhjFQ13K9zMz6ojFGXIggGe+ad1odrK9w=
+github.com/go-openapi/swag/loading v0.26.1/go.mod h1:3qvRIlWzWdq1HvmldwmuJ2ohpcAryN6xVt2OTKd0/7E=
+github.com/go-openapi/swag/mangling v0.26.1 h1:gpYI4WuPKFJJVjV5cDLGlDVJhFIxYjQc7yN5eEb4CqM=
+github.com/go-openapi/swag/mangling v0.26.1/go.mod h1:POETDH01hqAdASXfw7ISEd9bCOE6xBHOt8NHmGZRmYM=
+github.com/go-openapi/swag/netutils v0.26.1 h1:BNctoc39WTAUMxyAs355fExOPzMZtPbZ0ZZ1Am2FR5M=
+github.com/go-openapi/swag/netutils v0.26.1/go.mod h1:y02vByhZhQPAVwOX+0KipXFZ/hUbk6G/Enhf5rGaOkQ=
+github.com/go-openapi/swag/stringutils v0.26.1 h1:f88uYyTso7TnHrKM/bUBsQ5e2wKf37cpgo6pvbzd9yU=
+github.com/go-openapi/swag/stringutils v0.26.1/go.mod h1:Sc6d3bU8fgk5AyZR8/8jEQ+Is/Ald+TD/IIggPN8UJk=
+github.com/go-openapi/swag/typeutils v0.26.1 h1:yg42FgMzRR6PVQ3M3qHz1s+Y6/P4HoJ3cBarXa3OVnU=
+github.com/go-openapi/swag/typeutils v0.26.1/go.mod h1:VfnV+oUtSP2vCSCn2aJgnr8OevUYemyIzzS1VOzS10o=
+github.com/go-openapi/swag/yamlutils v0.26.1 h1:0TSLK+lXs9vfIhAWzBeI/lOzEnIoot6WTCO1aAeWFTk=
+github.com/go-openapi/swag/yamlutils v0.26.1/go.mod h1:7W5b7PRX9MxwL7TjeG7H8HkyBGRsIDRObhyMWFgBI2M=
+github.com/go-openapi/testify/enable/yaml/v2 v2.5.1 h1:q9NtHwK4qHF7yZziBPvZyv7zWAIk8ok88Gh2mR6Jpc8=
+github.com/go-openapi/testify/enable/yaml/v2 v2.5.1/go.mod h1:JW0MXIotCYps/XsgJnG3a8Q7rE5xAiBwoOD5OfaIQBk=
+github.com/go-openapi/testify/v2 v2.5.1 h1:TMdhCaw8fUNraVSf3Omoob1dO/AzBfhtFAPW0an6sBo=
+github.com/go-openapi/testify/v2 v2.5.1/go.mod h1:SgsVHtfooshd0tublTtJ50FPKhujf47YRqauXXOUxfw=
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.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
@@ -69,8 +69,8 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
-github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY=
-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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
@@ -85,16 +85,16 @@ 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/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0=
-golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw=
+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/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo=
-golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
-golang.org/x/term v0.41.0 h1:QCgPso/Q3RTJx2Th4bDLqML4W6iJiaXFq2/ftQF13YU=
-golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A=
-golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8=
-golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA=
+golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw=
+golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
+golang.org/x/term v0.44.0 h1:0rLvDRCtNj0gZkyIXhCyOb2OAzEhLVqc4B+hrsBhrmc=
+golang.org/x/term v0.44.0/go.mod h1:7ze4MdzUzLXpSAoFP1H0bOI9aXDqveSvatT5vKcFh2Y=
+golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE=
+golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4=
golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U=
golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno=
google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af h1:+5/Sw3GsDNlEmu7TfklWKPdQ0Ykja5VEmq2i817+jbI=
@@ -108,20 +108,20 @@ gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-k8s.io/api v0.36.0 h1:SgqDhZzHdOtMk40xVSvCXkP9ME0H05hPM3p9AB1kL80=
-k8s.io/api v0.36.0/go.mod h1:m1LVrGPNYax5NBHdO+QuAedXyuzTt4RryI/qnmNvs34=
-k8s.io/apiextensions-apiserver v0.36.0 h1:Wt7E8J+VBCbj4FjiBfDTK/neXDDjyJVJc7xfuOHImZ0=
-k8s.io/apiextensions-apiserver v0.36.0/go.mod h1:kGDjH0msuiIB3tgsYRV0kS9GqpMYMUsQ3GHv7TApyug=
-k8s.io/apimachinery v0.36.0 h1:jZyPzhd5Z+3h9vJLt0z9XdzW9VzNzWAUw+P1xZ9PXtQ=
-k8s.io/apimachinery v0.36.0/go.mod h1:FklypaRJt6n5wUIwWXIP6GJlIpUizTgfo1T/As+Tyxc=
-k8s.io/client-go v0.36.0 h1:pOYi7C4RHChYjMiHpZSpSbIM6ZxVbRXBy7CuiIwqA3c=
-k8s.io/client-go v0.36.0/go.mod h1:ZKKcpwF0aLYfkHFCjillCKaTK/yBkEDHTDXCFY6AS9Y=
+k8s.io/api v0.36.2 h1:TF6YDLIzKfccK7cq9YpTcGX8TJmEkHVRv78DM51fRYY=
+k8s.io/api v0.36.2/go.mod h1:F4LbMO4brjZYh7yFkXWhynSvtB7YauxV4c+HHkNRGNg=
+k8s.io/apiextensions-apiserver v0.36.2 h1:3O5gqOj/dt2XWWbpMe+TXWpE9yU6pjM/tXxtHHJT/K4=
+k8s.io/apiextensions-apiserver v0.36.2/go.mod h1:cL1tBWe8XSaP1H30iWKGo7hf6iAUUUJPEU70dskmAnA=
+k8s.io/apimachinery v0.36.2 h1:0PE/W/WNy1UX61NLbXY5TMbJ6UwLL6E6lAPkYrKFxbQ=
+k8s.io/apimachinery v0.36.2/go.mod h1:fvf/HOLXq9RId0rnDIbN1OEBvHXdQbLMM8nu0LcBUf4=
+k8s.io/client-go v0.36.2 h1:bfgxmFKc9CgqsgX4xKLAAdmTQlWee7Ob/HlDOrJ5TBI=
+k8s.io/client-go v0.36.2/go.mod h1:1vgO4OAlfPnoLcb+Rze2GF5rAr14w8qjrYMoyXJzQj0=
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-20260317180543-43fb72c5454a h1:xCeOEAOoGYl2jnJoHkC3hkbPJgdATINPMAxaynU2Ovg=
-k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0=
-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=
+k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25 h1:mPMaPMpBij2V1Wv/fR+HW124vVGXXvOSS9ver/9yjWs=
+k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25/go.mod h1:V/QaCUYDa+0QpcHhVVc5l99Uz56wEMEXBSj9oCDkNDY=
+k8s.io/utils v0.0.0-20260507154919-ff6756f316d2 h1:wU4tMEhLGgIbLvXQb1cfN+EcM0wf7zC6CPF+C79jroc=
+k8s.io/utils v0.0.0-20260507154919-ff6756f316d2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk=
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/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg=
From 8465d5805279bbfc3703549585d5c07e62024d11 Mon Sep 17 00:00:00 2001
From: Nutmos
Date: Mon, 15 Jun 2026 21:07:45 +0700
Subject: [PATCH 74/81] chore: add myself to maitainers (#8627)
* chore: add myself to maitainers
* chore: add myself to the maintainers
* chore: add myself to triage list
* chore: add myself to triage list
* chore: add my name in the cspell dictionary
---
.github/workflows/cspell.json | 4 +++-
MAINTAINERS.md | 1 +
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/.github/workflows/cspell.json b/.github/workflows/cspell.json
index 8369d76583e..262180e357c 100644
--- a/.github/workflows/cspell.json
+++ b/.github/workflows/cspell.json
@@ -427,6 +427,8 @@
"MLKEM",
"slashexx",
"Errorf",
- "prompkg"
+ "prompkg",
+ "nutmos",
+ "nattapong"
]
}
diff --git a/MAINTAINERS.md b/MAINTAINERS.md
index b5c2e8fb27b..f005841f9a5 100644
--- a/MAINTAINERS.md
+++ b/MAINTAINERS.md
@@ -29,6 +29,7 @@ Full list of triage people is displayed below:
| João Marçal | `@JoaoBraveCoding` | [@JoaoBraveCoding](https://github.com/JoaoBraveCoding) | Red Hat |
| Dong Jiang | `@dongjiang` | [@dongjiang1989](https://github.com/dongjiang1989) | iFlytek |
| S Ashwin | `@Ashwin Sriram` | [@AshwinSriram11](https://github.com/AshwinSriram11) | Deutsche Bank |
+| Mos Nattapong E | `@Nutmos` | [@nutmos](https://github.com/nutmos) | Red Hat |
## Emeritus maintainers
From 7b1591f3296ad55158518387be70429864f7790c Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 17 Jun 2026 12:42:48 +0000
Subject: [PATCH 75/81] build(deps): bump github.com/prometheus/common from
0.68.1 to 0.69.0
Bumps [github.com/prometheus/common](https://github.com/prometheus/common) from 0.68.1 to 0.69.0.
- [Release notes](https://github.com/prometheus/common/releases)
- [Changelog](https://github.com/prometheus/common/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prometheus/common/compare/v0.68.1...v0.69.0)
---
updated-dependencies:
- dependency-name: github.com/prometheus/common
dependency-version: 0.69.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index 236496be2b1..f37d64ca7f2 100644
--- a/go.mod
+++ b/go.mod
@@ -23,7 +23,7 @@ require (
github.com/prometheus-operator/prometheus-operator/pkg/client v0.91.0
github.com/prometheus/alertmanager v0.33.0
github.com/prometheus/client_golang v1.23.2
- github.com/prometheus/common v0.68.1
+ github.com/prometheus/common v0.69.0
github.com/prometheus/exporter-toolkit v0.16.0
github.com/prometheus/prometheus v0.312.0
github.com/stretchr/testify v1.11.1
diff --git a/go.sum b/go.sum
index c20b0bb64da..89a2b6473ae 100644
--- a/go.sum
+++ b/go.sum
@@ -366,8 +366,8 @@ github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8
github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
-github.com/prometheus/common v0.68.1 h1:omjRRl4QP4komogpXuhfeOiisQg7xdy8VM1UY+pStaY=
-github.com/prometheus/common v0.68.1/go.mod h1:ZzL3f6u94qUxh9p+tJTrF+FvBS1XXbbRAZCQkytAL0Y=
+github.com/prometheus/common v0.69.0 h1:OA85nJQS/T/MaYh/Q2CcgDKSGWqNIgrBDvDH85CuiNk=
+github.com/prometheus/common v0.69.0/go.mod h1:ZzL3f6u94qUxh9p+tJTrF+FvBS1XXbbRAZCQkytAL0Y=
github.com/prometheus/exporter-toolkit v0.16.0 h1:xT/j7L2XKF+VJd6B4fpUw6xWabHrSmsUf6mYmFqyu0s=
github.com/prometheus/exporter-toolkit v0.16.0/go.mod h1:d1EL8Z9674xQe/iWhwP2wDyCEoBPbXVeqDbqAUsgJWY=
github.com/prometheus/otlptranslator v1.0.0 h1:s0LJW/iN9dkIH+EnhiD3BlkkP5QVIUVEoIwkU+A6qos=
From badab7fff788b9c855a2490a64ceafc4e13e82db Mon Sep 17 00:00:00 2001
From: s3onghyun
Date: Thu, 18 Jun 2026 15:14:31 +0900
Subject: [PATCH 76/81] docs: fix broken link to BasicAuth API reference
The basic auth user guide linked to ../api.md, but the API reference
actually lives at Documentation/api-reference/api.md, so the link
returned a 404. Point it at ../api-reference/api.md, matching how the
rest of the docs reference the API.
Signed-off-by: s3onghyun
---
Documentation/user-guides/basic-auth.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Documentation/user-guides/basic-auth.md b/Documentation/user-guides/basic-auth.md
index 0470142b456..e50a890a87e 100644
--- a/Documentation/user-guides/basic-auth.md
+++ b/Documentation/user-guides/basic-auth.md
@@ -5,7 +5,7 @@
## Basic auth for targets
-To authenticate a `ServiceMonitor`s over a metrics endpoint use [`basicAuth`](../api.md#monitoring.coreos.com/v1.BasicAuth)
+To authenticate a `ServiceMonitor`s over a metrics endpoint use [`basicAuth`](../api-reference/api.md#monitoring.coreos.com/v1.BasicAuth)
```yaml
apiVersion: monitoring.coreos.com/v1
From c581115e5910a3b77dc683644c1ad555544abc1b Mon Sep 17 00:00:00 2001
From: Jayapriya Pai
Date: Mon, 15 Jun 2026 16:42:23 +0530
Subject: [PATCH 77/81] chore: cut v0.92.0
Signed-off-by: Jayapriya Pai
---
CHANGELOG.md | 21 +++++++++--
Documentation/platform/prometheus-agent.md | 2 +-
Documentation/platform/rbac.md | 6 ++--
Documentation/platform/webhook.md | 10 +++---
VERSION | 2 +-
bundle.yaml | 36 +++++++++----------
example/admission-webhook/deployment.yaml | 6 ++--
.../pod-disruption-budget.yaml | 2 +-
.../admission-webhook/service-account.yaml | 2 +-
.../admission-webhook/service-monitor.yaml | 4 +--
example/admission-webhook/service.yaml | 2 +-
.../alertmanager-crd-conversion/patch.json | 2 +-
...toring.coreos.com_alertmanagerconfigs.yaml | 2 +-
.../monitoring.coreos.com_alertmanagers.yaml | 2 +-
.../monitoring.coreos.com_podmonitors.yaml | 2 +-
.../monitoring.coreos.com_probes.yaml | 2 +-
...onitoring.coreos.com_prometheusagents.yaml | 2 +-
.../monitoring.coreos.com_prometheuses.yaml | 2 +-
...monitoring.coreos.com_prometheusrules.yaml | 2 +-
.../monitoring.coreos.com_scrapeconfigs.yaml | 2 +-
...monitoring.coreos.com_servicemonitors.yaml | 2 +-
.../monitoring.coreos.com_thanosrulers.yaml | 2 +-
...toring.coreos.com_alertmanagerconfigs.yaml | 2 +-
.../monitoring.coreos.com_alertmanagers.yaml | 2 +-
.../monitoring.coreos.com_podmonitors.yaml | 2 +-
.../monitoring.coreos.com_probes.yaml | 2 +-
...onitoring.coreos.com_prometheusagents.yaml | 2 +-
.../monitoring.coreos.com_prometheuses.yaml | 2 +-
...monitoring.coreos.com_prometheusrules.yaml | 2 +-
.../monitoring.coreos.com_scrapeconfigs.yaml | 2 +-
...monitoring.coreos.com_servicemonitors.yaml | 2 +-
.../monitoring.coreos.com_thanosrulers.yaml | 2 +-
...metheus-operator-cluster-role-binding.yaml | 2 +-
.../prometheus-operator-cluster-role.yaml | 2 +-
.../prometheus-operator-deployment.yaml | 8 ++---
.../prometheus-operator-service-account.yaml | 2 +-
.../prometheus-operator-service-monitor.yaml | 4 +--
.../prometheus-operator-service.yaml | 2 +-
go.mod | 4 +--
.../alertmanagerconfigs-crd.json | 2 +-
.../alertmanagers-crd.json | 2 +-
.../prometheus-operator/podmonitors-crd.json | 2 +-
jsonnet/prometheus-operator/probes-crd.json | 2 +-
.../prometheusagents-crd.json | 2 +-
.../prometheus-operator/prometheuses-crd.json | 2 +-
.../prometheusrules-crd.json | 2 +-
.../scrapeconfigs-crd.json | 2 +-
.../servicemonitors-crd.json | 2 +-
.../prometheus-operator/thanosrulers-crd.json | 2 +-
pkg/client/go.mod | 2 +-
50 files changed, 99 insertions(+), 82 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5266ee80b7e..c7c31a6bd97 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,23 @@
-## UNRELEASED
-
+## 0.92.0 / 2026-06-18
+
+> **Note:** The `PrometheusTopologySharding` and `PrometheusShardRetentionPolicy` feature gates have been promoted to **Beta** in this release and are now enabled by default. See the [sharding documentation](https://prometheus-operator.dev/docs/platform/sharding/) for details.
+
+* [CHANGE] Add URL validation for the `tokenUrl` field in OAuth2 configuration across all CRDs. #8579
+* [CHANGE] Add URL validation for the `url` field in `RemoteReadSpec` in `Prometheus` CRD. #8596
+* [FEATURE] Migrate retention options from CLI flags to the config file for `Prometheus` CRD (Prometheus >= v3 uses the config file; older versions continue to use CLI flags). #8547
+* [FEATURE] Add `staleSeriesCompactionThreshold` field to `TSDBSpec` in `Prometheus` and `PrometheusAgent` CRDs. #8563
+* [FEATURE] Add `labelNameUnderscoreSanitization` and `labelNamePreserveMultipleUnderscores` fields to `OTLPConfig` in `Prometheus` and `PrometheusAgent` CRDs. #8562
+* [FEATURE] Add `payload` field to Webhook receiver in `AlertmanagerConfig` CRD. #8507
+* [ENHANCEMENT] Use pod topology labels for zone sharding on Kubernetes >= 1.35 when the `PrometheusTopologySharding` feature gate is enabled (removes the need for `attachMetadata.node=true`). #8564
+* [ENHANCEMENT] Add validation for the Slack `update_message` field in Alertmanager configuration Secret. #8556
* [BUGFIX] Validate target labels in `Probe` static configuration to prevent invalid Prometheus scrape configs. #7901
+* [BUGFIX] Fix goroutine leak and data race in `pollBasedListerWatcher`. #8593
+* [BUGFIX] Validate `ProxyConfig` in OAuth2 configuration. #8610
+* [BUGFIX] Fix SMTP smarthost format error handling in Alertmanager configuration. #8586
+* [BUGFIX] Fix missing `return` in admission webhook after marshal failure. #8582
+* [BUGFIX] Fix `FindOwner` to return `nil` on `meta.Accessor` error. #8585
+* [BUGFIX] Fix dropped gzip `Close` errors in `GzipConfig` and `GunzipConfig`. #8573
+* [BUGFIX] Fix panic on malformed key=value flag input (e.g. `--labels "key"`). #8560
## 0.91.0 / 2026-05-05
diff --git a/Documentation/platform/prometheus-agent.md b/Documentation/platform/prometheus-agent.md
index f17705ca56a..ea561079a22 100644
--- a/Documentation/platform/prometheus-agent.md
+++ b/Documentation/platform/prometheus-agent.md
@@ -26,7 +26,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
name: prometheus-operator
rules:
- apiGroups:
diff --git a/Documentation/platform/rbac.md b/Documentation/platform/rbac.md
index d9e72c1194a..25bed378609 100644
--- a/Documentation/platform/rbac.md
+++ b/Documentation/platform/rbac.md
@@ -26,7 +26,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
name: prometheus-operator
rules:
- apiGroups:
@@ -212,7 +212,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
name: prometheus-operator
namespace: default
```
@@ -228,7 +228,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
name: prometheus-operator
roleRef:
apiGroup: rbac.authorization.k8s.io
diff --git a/Documentation/platform/webhook.md b/Documentation/platform/webhook.md
index 330f05113a4..1169ec335e1 100644
--- a/Documentation/platform/webhook.md
+++ b/Documentation/platform/webhook.md
@@ -86,7 +86,7 @@ kind: ServiceAccount
metadata:
labels:
app.kubernetes.io/name: prometheus-operator-admission-webhook
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
name: prometheus-operator-admission-webhook
namespace: default
```
@@ -97,7 +97,7 @@ kind: Deployment
metadata:
labels:
app.kubernetes.io/name: prometheus-operator-admission-webhook
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
name: prometheus-operator-admission-webhook
namespace: default
spec:
@@ -114,7 +114,7 @@ spec:
kubectl.kubernetes.io/default-container: prometheus-operator-admission-webhook
labels:
app.kubernetes.io/name: prometheus-operator-admission-webhook
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
spec:
affinity:
podAntiAffinity:
@@ -131,7 +131,7 @@ spec:
- --web.enable-tls=true
- --web.cert-file=/etc/tls/private/tls.crt
- --web.key-file=/etc/tls/private/tls.key
- image: quay.io/prometheus-operator/admission-webhook:v0.91.0
+ image: quay.io/prometheus-operator/admission-webhook:v0.92.0
name: prometheus-operator-admission-webhook
ports:
- containerPort: 8443
@@ -179,7 +179,7 @@ kind: Service
metadata:
labels:
app.kubernetes.io/name: prometheus-operator-admission-webhook
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
name: prometheus-operator-admission-webhook
namespace: default
spec:
diff --git a/VERSION b/VERSION
index 8f63f4f9a10..36545ad338e 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-0.91.0
+0.92.0
diff --git a/bundle.yaml b/bundle.yaml
index ee583b0232e..01e70165f82 100644
--- a/bundle.yaml
+++ b/bundle.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: alertmanagerconfigs.monitoring.coreos.com
spec:
group: monitoring.coreos.com
@@ -12372,7 +12372,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: alertmanagers.monitoring.coreos.com
spec:
group: monitoring.coreos.com
@@ -22383,7 +22383,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: podmonitors.monitoring.coreos.com
spec:
group: monitoring.coreos.com
@@ -23786,7 +23786,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: probes.monitoring.coreos.com
spec:
group: monitoring.coreos.com
@@ -25202,7 +25202,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: prometheusagents.monitoring.coreos.com
spec:
group: monitoring.coreos.com
@@ -36759,7 +36759,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: prometheuses.monitoring.coreos.com
spec:
group: monitoring.coreos.com
@@ -50633,7 +50633,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: prometheusrules.monitoring.coreos.com
spec:
group: monitoring.coreos.com
@@ -50900,7 +50900,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: scrapeconfigs.monitoring.coreos.com
spec:
group: monitoring.coreos.com
@@ -63829,7 +63829,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: servicemonitors.monitoring.coreos.com
spec:
group: monitoring.coreos.com
@@ -65249,7 +65249,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: thanosrulers.monitoring.coreos.com
spec:
group: monitoring.coreos.com
@@ -75041,7 +75041,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
name: prometheus-operator
roleRef:
apiGroup: rbac.authorization.k8s.io
@@ -75058,7 +75058,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
name: prometheus-operator
rules:
- apiGroups:
@@ -75171,7 +75171,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
name: prometheus-operator
namespace: default
spec:
@@ -75187,13 +75187,13 @@ spec:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
spec:
automountServiceAccountToken: true
containers:
- args:
- --kubelet-service=kube-system/kubelet
- - --prometheus-config-reloader=quay.io/prometheus-operator/prometheus-config-reloader:v0.91.0
+ - --prometheus-config-reloader=quay.io/prometheus-operator/prometheus-config-reloader:v0.92.0
- --watch-referenced-objects-in-all-namespaces=true
- --disable-unmanaged-prometheus-configuration=true
- --kubelet-endpoints=true
@@ -75201,7 +75201,7 @@ spec:
env:
- name: GOGC
value: "30"
- image: quay.io/prometheus-operator/prometheus-operator:v0.91.0
+ image: quay.io/prometheus-operator/prometheus-operator:v0.92.0
name: prometheus-operator
ports:
- containerPort: 8080
@@ -75235,7 +75235,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
name: prometheus-operator
namespace: default
---
@@ -75245,7 +75245,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
name: prometheus-operator
namespace: default
spec:
diff --git a/example/admission-webhook/deployment.yaml b/example/admission-webhook/deployment.yaml
index 3f7cffdeb20..f5e67e617b4 100644
--- a/example/admission-webhook/deployment.yaml
+++ b/example/admission-webhook/deployment.yaml
@@ -3,7 +3,7 @@ kind: Deployment
metadata:
labels:
app.kubernetes.io/name: prometheus-operator-admission-webhook
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
name: prometheus-operator-admission-webhook
namespace: default
spec:
@@ -20,7 +20,7 @@ spec:
kubectl.kubernetes.io/default-container: prometheus-operator-admission-webhook
labels:
app.kubernetes.io/name: prometheus-operator-admission-webhook
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
spec:
affinity:
podAntiAffinity:
@@ -37,7 +37,7 @@ spec:
- --web.enable-tls=true
- --web.cert-file=/etc/tls/private/tls.crt
- --web.key-file=/etc/tls/private/tls.key
- image: quay.io/prometheus-operator/admission-webhook:v0.91.0
+ image: quay.io/prometheus-operator/admission-webhook:v0.92.0
name: prometheus-operator-admission-webhook
ports:
- containerPort: 8443
diff --git a/example/admission-webhook/pod-disruption-budget.yaml b/example/admission-webhook/pod-disruption-budget.yaml
index f6506a71f53..cf9891b7922 100644
--- a/example/admission-webhook/pod-disruption-budget.yaml
+++ b/example/admission-webhook/pod-disruption-budget.yaml
@@ -3,7 +3,7 @@ kind: PodDisruptionBudget
metadata:
labels:
app.kubernetes.io/name: prometheus-operator-admission-webhook
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
name: prometheus-operator-admission-webhook
namespace: default
spec:
diff --git a/example/admission-webhook/service-account.yaml b/example/admission-webhook/service-account.yaml
index 2ea4ecb4c2c..2de701224ec 100644
--- a/example/admission-webhook/service-account.yaml
+++ b/example/admission-webhook/service-account.yaml
@@ -4,6 +4,6 @@ kind: ServiceAccount
metadata:
labels:
app.kubernetes.io/name: prometheus-operator-admission-webhook
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
name: prometheus-operator-admission-webhook
namespace: default
diff --git a/example/admission-webhook/service-monitor.yaml b/example/admission-webhook/service-monitor.yaml
index 3e1b87ce3d4..f75241b5343 100644
--- a/example/admission-webhook/service-monitor.yaml
+++ b/example/admission-webhook/service-monitor.yaml
@@ -3,7 +3,7 @@ kind: ServiceMonitor
metadata:
labels:
app.kubernetes.io/name: prometheus-operator-admission-webhook
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
name: prometheus-operator-admission-webhook
namespace: default
spec:
@@ -13,4 +13,4 @@ spec:
selector:
matchLabels:
app.kubernetes.io/name: prometheus-operator-admission-webhook
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
diff --git a/example/admission-webhook/service.yaml b/example/admission-webhook/service.yaml
index 40ff7d3e4fb..de65ff45c1b 100644
--- a/example/admission-webhook/service.yaml
+++ b/example/admission-webhook/service.yaml
@@ -3,7 +3,7 @@ kind: Service
metadata:
labels:
app.kubernetes.io/name: prometheus-operator-admission-webhook
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
name: prometheus-operator-admission-webhook
namespace: default
spec:
diff --git a/example/alertmanager-crd-conversion/patch.json b/example/alertmanager-crd-conversion/patch.json
index 5669524ee70..22cff4565cd 100644
--- a/example/alertmanager-crd-conversion/patch.json
+++ b/example/alertmanager-crd-conversion/patch.json
@@ -4,7 +4,7 @@
"metadata": {
"annotations": {
"controller-gen.kubebuilder.io/version": "v0.21.0",
- "operator.prometheus.io/version": "0.91.0"
+ "operator.prometheus.io/version": "0.92.0"
},
"name": "alertmanagerconfigs.monitoring.coreos.com"
},
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml
index aa4e6b933da..ce32c8e32c3 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: alertmanagerconfigs.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml
index 2cc79d860a3..abf722ed165 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: alertmanagers.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml
index 2f0a61f5503..d7ebb3d7416 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: podmonitors.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_probes.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_probes.yaml
index e6ef5919151..a19b154086e 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_probes.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_probes.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: probes.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml
index 4eaa2eba2ae..0ff5a900afc 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: prometheusagents.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
index a901bd7393b..1c2c4f80d8d 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: prometheuses.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusrules.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusrules.yaml
index aa3234bca10..fbfc445b0f9 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusrules.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusrules.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: prometheusrules.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_scrapeconfigs.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_scrapeconfigs.yaml
index 2961e9bbbb6..d6461c6ed3d 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_scrapeconfigs.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_scrapeconfigs.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: scrapeconfigs.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml
index a6568942b62..a0478c098b8 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: servicemonitors.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml
index 7bf5e91cd5e..361f338e8e6 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: thanosrulers.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml
index c3765e5e893..1de268cd7df 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: alertmanagerconfigs.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml
index 2cc79d860a3..abf722ed165 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: alertmanagers.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml
index 2f0a61f5503..d7ebb3d7416 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: podmonitors.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml
index e6ef5919151..a19b154086e 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: probes.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml
index 4eaa2eba2ae..0ff5a900afc 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: prometheusagents.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
index a901bd7393b..1c2c4f80d8d 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: prometheuses.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml
index aa3234bca10..fbfc445b0f9 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: prometheusrules.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml
index 2961e9bbbb6..d6461c6ed3d 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: scrapeconfigs.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml
index a6568942b62..a0478c098b8 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: servicemonitors.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml
index 7bf5e91cd5e..361f338e8e6 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.91.0
+ operator.prometheus.io/version: 0.92.0
name: thanosrulers.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/rbac/prometheus-operator/prometheus-operator-cluster-role-binding.yaml b/example/rbac/prometheus-operator/prometheus-operator-cluster-role-binding.yaml
index e9db851aca9..9dc7c8d3686 100644
--- a/example/rbac/prometheus-operator/prometheus-operator-cluster-role-binding.yaml
+++ b/example/rbac/prometheus-operator/prometheus-operator-cluster-role-binding.yaml
@@ -4,7 +4,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
name: prometheus-operator
roleRef:
apiGroup: rbac.authorization.k8s.io
diff --git a/example/rbac/prometheus-operator/prometheus-operator-cluster-role.yaml b/example/rbac/prometheus-operator/prometheus-operator-cluster-role.yaml
index b5dd7ec1ba4..c7e4e6dd84b 100644
--- a/example/rbac/prometheus-operator/prometheus-operator-cluster-role.yaml
+++ b/example/rbac/prometheus-operator/prometheus-operator-cluster-role.yaml
@@ -4,7 +4,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
name: prometheus-operator
rules:
- apiGroups:
diff --git a/example/rbac/prometheus-operator/prometheus-operator-deployment.yaml b/example/rbac/prometheus-operator/prometheus-operator-deployment.yaml
index a86b95aa014..ebe8419ace9 100644
--- a/example/rbac/prometheus-operator/prometheus-operator-deployment.yaml
+++ b/example/rbac/prometheus-operator/prometheus-operator-deployment.yaml
@@ -4,7 +4,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
name: prometheus-operator
namespace: default
spec:
@@ -20,13 +20,13 @@ spec:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
spec:
automountServiceAccountToken: true
containers:
- args:
- --kubelet-service=kube-system/kubelet
- - --prometheus-config-reloader=quay.io/prometheus-operator/prometheus-config-reloader:v0.91.0
+ - --prometheus-config-reloader=quay.io/prometheus-operator/prometheus-config-reloader:v0.92.0
- --watch-referenced-objects-in-all-namespaces=true
- --disable-unmanaged-prometheus-configuration=true
- --kubelet-endpoints=true
@@ -34,7 +34,7 @@ spec:
env:
- name: GOGC
value: "30"
- image: quay.io/prometheus-operator/prometheus-operator:v0.91.0
+ image: quay.io/prometheus-operator/prometheus-operator:v0.92.0
name: prometheus-operator
ports:
- containerPort: 8080
diff --git a/example/rbac/prometheus-operator/prometheus-operator-service-account.yaml b/example/rbac/prometheus-operator/prometheus-operator-service-account.yaml
index 4ee7935f988..c5ea516800e 100644
--- a/example/rbac/prometheus-operator/prometheus-operator-service-account.yaml
+++ b/example/rbac/prometheus-operator/prometheus-operator-service-account.yaml
@@ -5,6 +5,6 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
name: prometheus-operator
namespace: default
diff --git a/example/rbac/prometheus-operator/prometheus-operator-service-monitor.yaml b/example/rbac/prometheus-operator/prometheus-operator-service-monitor.yaml
index 6f803e1a6b5..82847e3cd20 100644
--- a/example/rbac/prometheus-operator/prometheus-operator-service-monitor.yaml
+++ b/example/rbac/prometheus-operator/prometheus-operator-service-monitor.yaml
@@ -4,7 +4,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
name: prometheus-operator
namespace: default
spec:
@@ -15,4 +15,4 @@ spec:
matchLabels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
diff --git a/example/rbac/prometheus-operator/prometheus-operator-service.yaml b/example/rbac/prometheus-operator/prometheus-operator-service.yaml
index 5fac9236082..1adeae03113 100644
--- a/example/rbac/prometheus-operator/prometheus-operator-service.yaml
+++ b/example/rbac/prometheus-operator/prometheus-operator-service.yaml
@@ -4,7 +4,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.91.0
+ app.kubernetes.io/version: 0.92.0
name: prometheus-operator
namespace: default
spec:
diff --git a/go.mod b/go.mod
index f37d64ca7f2..de105056830 100644
--- a/go.mod
+++ b/go.mod
@@ -19,8 +19,8 @@ require (
github.com/mitchellh/hashstructure v1.1.0
github.com/oklog/run v1.2.0
github.com/prometheus-community/prom-label-proxy v0.13.0
- github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.91.0
- github.com/prometheus-operator/prometheus-operator/pkg/client v0.91.0
+ github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.92.0
+ github.com/prometheus-operator/prometheus-operator/pkg/client v0.92.0
github.com/prometheus/alertmanager v0.33.0
github.com/prometheus/client_golang v1.23.2
github.com/prometheus/common v0.69.0
diff --git a/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json b/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json
index 5d060feae2f..e54128bdc64 100644
--- a/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json
+++ b/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json
@@ -4,7 +4,7 @@
"metadata": {
"annotations": {
"controller-gen.kubebuilder.io/version": "v0.21.0",
- "operator.prometheus.io/version": "0.91.0"
+ "operator.prometheus.io/version": "0.92.0"
},
"name": "alertmanagerconfigs.monitoring.coreos.com"
},
diff --git a/jsonnet/prometheus-operator/alertmanagers-crd.json b/jsonnet/prometheus-operator/alertmanagers-crd.json
index c9afddab7f4..f83e679e5b9 100644
--- a/jsonnet/prometheus-operator/alertmanagers-crd.json
+++ b/jsonnet/prometheus-operator/alertmanagers-crd.json
@@ -4,7 +4,7 @@
"metadata": {
"annotations": {
"controller-gen.kubebuilder.io/version": "v0.21.0",
- "operator.prometheus.io/version": "0.91.0"
+ "operator.prometheus.io/version": "0.92.0"
},
"name": "alertmanagers.monitoring.coreos.com"
},
diff --git a/jsonnet/prometheus-operator/podmonitors-crd.json b/jsonnet/prometheus-operator/podmonitors-crd.json
index 31b5b670a41..2086cb98784 100644
--- a/jsonnet/prometheus-operator/podmonitors-crd.json
+++ b/jsonnet/prometheus-operator/podmonitors-crd.json
@@ -4,7 +4,7 @@
"metadata": {
"annotations": {
"controller-gen.kubebuilder.io/version": "v0.21.0",
- "operator.prometheus.io/version": "0.91.0"
+ "operator.prometheus.io/version": "0.92.0"
},
"name": "podmonitors.monitoring.coreos.com"
},
diff --git a/jsonnet/prometheus-operator/probes-crd.json b/jsonnet/prometheus-operator/probes-crd.json
index 60faf850af8..b4ec503fa92 100644
--- a/jsonnet/prometheus-operator/probes-crd.json
+++ b/jsonnet/prometheus-operator/probes-crd.json
@@ -4,7 +4,7 @@
"metadata": {
"annotations": {
"controller-gen.kubebuilder.io/version": "v0.21.0",
- "operator.prometheus.io/version": "0.91.0"
+ "operator.prometheus.io/version": "0.92.0"
},
"name": "probes.monitoring.coreos.com"
},
diff --git a/jsonnet/prometheus-operator/prometheusagents-crd.json b/jsonnet/prometheus-operator/prometheusagents-crd.json
index 18b1c8edccd..830799a492b 100644
--- a/jsonnet/prometheus-operator/prometheusagents-crd.json
+++ b/jsonnet/prometheus-operator/prometheusagents-crd.json
@@ -4,7 +4,7 @@
"metadata": {
"annotations": {
"controller-gen.kubebuilder.io/version": "v0.21.0",
- "operator.prometheus.io/version": "0.91.0"
+ "operator.prometheus.io/version": "0.92.0"
},
"name": "prometheusagents.monitoring.coreos.com"
},
diff --git a/jsonnet/prometheus-operator/prometheuses-crd.json b/jsonnet/prometheus-operator/prometheuses-crd.json
index 4b7b1d7daaa..6e2e5782a22 100644
--- a/jsonnet/prometheus-operator/prometheuses-crd.json
+++ b/jsonnet/prometheus-operator/prometheuses-crd.json
@@ -4,7 +4,7 @@
"metadata": {
"annotations": {
"controller-gen.kubebuilder.io/version": "v0.21.0",
- "operator.prometheus.io/version": "0.91.0"
+ "operator.prometheus.io/version": "0.92.0"
},
"name": "prometheuses.monitoring.coreos.com"
},
diff --git a/jsonnet/prometheus-operator/prometheusrules-crd.json b/jsonnet/prometheus-operator/prometheusrules-crd.json
index 2318e8529e4..b93cd1bf0fa 100644
--- a/jsonnet/prometheus-operator/prometheusrules-crd.json
+++ b/jsonnet/prometheus-operator/prometheusrules-crd.json
@@ -4,7 +4,7 @@
"metadata": {
"annotations": {
"controller-gen.kubebuilder.io/version": "v0.21.0",
- "operator.prometheus.io/version": "0.91.0"
+ "operator.prometheus.io/version": "0.92.0"
},
"name": "prometheusrules.monitoring.coreos.com"
},
diff --git a/jsonnet/prometheus-operator/scrapeconfigs-crd.json b/jsonnet/prometheus-operator/scrapeconfigs-crd.json
index 2ad4815cc68..94e5b83332d 100644
--- a/jsonnet/prometheus-operator/scrapeconfigs-crd.json
+++ b/jsonnet/prometheus-operator/scrapeconfigs-crd.json
@@ -4,7 +4,7 @@
"metadata": {
"annotations": {
"controller-gen.kubebuilder.io/version": "v0.21.0",
- "operator.prometheus.io/version": "0.91.0"
+ "operator.prometheus.io/version": "0.92.0"
},
"name": "scrapeconfigs.monitoring.coreos.com"
},
diff --git a/jsonnet/prometheus-operator/servicemonitors-crd.json b/jsonnet/prometheus-operator/servicemonitors-crd.json
index c49d65f1c41..286e13d7858 100644
--- a/jsonnet/prometheus-operator/servicemonitors-crd.json
+++ b/jsonnet/prometheus-operator/servicemonitors-crd.json
@@ -4,7 +4,7 @@
"metadata": {
"annotations": {
"controller-gen.kubebuilder.io/version": "v0.21.0",
- "operator.prometheus.io/version": "0.91.0"
+ "operator.prometheus.io/version": "0.92.0"
},
"name": "servicemonitors.monitoring.coreos.com"
},
diff --git a/jsonnet/prometheus-operator/thanosrulers-crd.json b/jsonnet/prometheus-operator/thanosrulers-crd.json
index 3f3cc9ee873..d62edf74f63 100644
--- a/jsonnet/prometheus-operator/thanosrulers-crd.json
+++ b/jsonnet/prometheus-operator/thanosrulers-crd.json
@@ -4,7 +4,7 @@
"metadata": {
"annotations": {
"controller-gen.kubebuilder.io/version": "v0.21.0",
- "operator.prometheus.io/version": "0.91.0"
+ "operator.prometheus.io/version": "0.92.0"
},
"name": "thanosrulers.monitoring.coreos.com"
},
diff --git a/pkg/client/go.mod b/pkg/client/go.mod
index be5a1f07c09..042f16c482e 100644
--- a/pkg/client/go.mod
+++ b/pkg/client/go.mod
@@ -3,7 +3,7 @@ module github.com/prometheus-operator/prometheus-operator/pkg/client
go 1.26.0
require (
- github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.91.0
+ github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.92.0
k8s.io/api v0.36.2
k8s.io/apiextensions-apiserver v0.36.2
k8s.io/apimachinery v0.36.2
From b3fa3563603fb358b303637806f79420e87ef65c Mon Sep 17 00:00:00 2001
From: s3onghyun
Date: Thu, 18 Jun 2026 15:18:58 +0900
Subject: [PATCH 78/81] docs: fix duplicated word in troubleshooting guide
The controller-id behavior table header read "started with with the
--controller-id flag". Drop the repeated "with" to match the surrounding
text, which already says "started with the --controller-id flag", and
reflow the table columns so it stays mdox-formatted.
Signed-off-by: s3onghyun
---
Documentation/platform/troubleshooting.md | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/Documentation/platform/troubleshooting.md b/Documentation/platform/troubleshooting.md
index 4bb2fc79fd7..296e3521676 100644
--- a/Documentation/platform/troubleshooting.md
+++ b/Documentation/platform/troubleshooting.md
@@ -286,12 +286,12 @@ If the `--controller-id` flag is not set, the operator will try to reconcile all
The following table illustrates the behavior based on whether the `--controller-id` flag is set and whether the `operator.prometheus.io/controller-id` annotation is present on the resources:
-| Operator started with with the `--controller-id` flag | Resource with the `operator.prometheus.io/controller-id` annotation | Behavior |
-|-------------------------------------------------------|---------------------------------------------------------------------|-------------------------------------------------------------------------------------|
-| Yes | Yes | The operator reconciles the resource only if the annotation value matches the flag. |
-| Yes | No | The operator does not reconcile the resource |
-| No | Yes | The operator does not reconcile the resource. |
-| No | No | The operator reconciles the resource. |
+| Operator started with the `--controller-id` flag | Resource with the `operator.prometheus.io/controller-id` annotation | Behavior |
+|--------------------------------------------------|---------------------------------------------------------------------|-------------------------------------------------------------------------------------|
+| Yes | Yes | The operator reconciles the resource only if the annotation value matches the flag. |
+| Yes | No | The operator does not reconcile the resource |
+| No | Yes | The operator does not reconcile the resource. |
+| No | No | The operator reconciles the resource. |
### Configuring Prometheus/PrometheusAgent for Mimir and Grafana Cloud
From 996aea59abcad0bd5ed787fe9ffd7460810b4c8b Mon Sep 17 00:00:00 2001
From: Simon Pasquier
Date: Fri, 26 Jun 2026 12:04:39 +0200
Subject: [PATCH 79/81] fix: avoid "namespace not found" errors
This commit ensures that the Prometheus and Alertmanager controllers
look up namespaces in the relevant caches when they watch workload and
configuration resources in different namespace sets.
Signed-off-by: Simon Pasquier
---
pkg/alertmanager/operator.go | 51 ++++++++++++++++++++-----------
pkg/operator/operator.go | 26 ++++++++++++++++
pkg/prometheus/agent/operator.go | 46 ++++++++++++++++------------
pkg/prometheus/operator.go | 13 ++++----
pkg/prometheus/server/operator.go | 48 ++++++++++++++++-------------
5 files changed, 119 insertions(+), 65 deletions(-)
diff --git a/pkg/alertmanager/operator.go b/pkg/alertmanager/operator.go
index 3b9432149a6..374894216ae 100644
--- a/pkg/alertmanager/operator.go
+++ b/pkg/alertmanager/operator.go
@@ -68,12 +68,13 @@ const (
// Whenever the value of one of these parameters is changed, it triggers an
// update of the managed statefulsets.
type Config struct {
- LocalHost string
- ClusterDomain string
- ReloaderConfig operator.ContainerConfig
- AlertmanagerDefaultBaseImage string
- Annotations operator.Map
- Labels operator.Map
+ LocalHost string
+ ClusterDomain string
+ ReloaderConfig operator.ContainerConfig
+ AlertmanagerDefaultBaseImage string
+ Annotations operator.Map
+ Labels operator.Map
+ WatchObjectRefsInAllNamespaces bool
}
// Operator manages the lifecycle of the Alertmanager statefulsets and their
@@ -170,12 +171,13 @@ func New(ctx context.Context, restConfig *rest.Config, c operator.Config, logger
repairPolicy: c.RepairPolicy,
config: Config{
- LocalHost: c.LocalHost,
- ClusterDomain: c.ClusterDomain,
- ReloaderConfig: c.ReloaderConfig,
- AlertmanagerDefaultBaseImage: c.AlertmanagerDefaultBaseImage,
- Annotations: c.Annotations,
- Labels: c.Labels,
+ LocalHost: c.LocalHost,
+ ClusterDomain: c.ClusterDomain,
+ ReloaderConfig: c.ReloaderConfig,
+ AlertmanagerDefaultBaseImage: c.AlertmanagerDefaultBaseImage,
+ Annotations: c.Annotations,
+ Labels: c.Labels,
+ WatchObjectRefsInAllNamespaces: c.WatchObjectRefsInAllNamespaces,
},
}
for _, opt := range options {
@@ -240,7 +242,7 @@ func (c *Operator) bootstrap(ctx context.Context, config operator.Config) error
}
allowList := config.Namespaces.AlertmanagerConfigAllowList
- if config.WatchObjectRefsInAllNamespaces {
+ if c.config.WatchObjectRefsInAllNamespaces {
allowList = operator.MergeAllowLists(
config.Namespaces.AlertmanagerAllowList,
config.Namespaces.AlertmanagerConfigAllowList,
@@ -384,7 +386,7 @@ func (c *Operator) addHandlers() {
c.accessor,
c.metrics,
monitoringv1alpha1.AlertmanagerConfigKind,
- c.enqueueForNamespace,
+ c.enqueueForNamespaceFunc(c.nsAlrtCfgInf.GetStore()),
operator.WithFilter(
operator.AnyFilter(
operator.GenerationChanged,
@@ -397,12 +399,19 @@ func (c *Operator) addHandlers() {
c.alrtInfs,
c.reconciliations,
)
+ var gbk operator.GetByKeyer = c.nsAlrtCfgInf.GetStore()
+ if c.config.WatchObjectRefsInAllNamespaces && c.nsAlrtInf != c.nsAlrtCfgInf {
+ gbk = operator.NewMultiGetByKeyer(
+ c.nsAlrtInf.GetStore(),
+ c.nsAlrtCfgInf.GetStore(),
+ )
+ }
c.secrInfs.AddEventHandler(operator.NewEventHandler(
c.logger,
c.accessor,
c.metrics,
operator.SecretGVK().Kind,
- c.enqueueForNamespace,
+ c.enqueueForNamespaceFunc(gbk),
operator.WithFilter(operator.ResourceVersionChanged),
operator.WithFilter(hasRefFunc),
))
@@ -412,7 +421,7 @@ func (c *Operator) addHandlers() {
c.accessor,
c.metrics,
operator.ConfigMapGVK().Kind,
- c.enqueueForNamespace,
+ c.enqueueForNamespaceFunc(gbk),
operator.WithFilter(operator.ResourceVersionChanged),
operator.WithFilter(hasRefFunc),
))
@@ -427,10 +436,16 @@ func (c *Operator) addHandlers() {
})
}
+func (c *Operator) enqueueForNamespaceFunc(gbk operator.GetByKeyer) func(string) {
+ return func(ns string) {
+ c.enqueueForNamespace(gbk, ns)
+ }
+}
+
// enqueueForNamespace enqueues all Alertmanager object keys that belong to the
// given namespace or select objects in the given namespace.
-func (c *Operator) enqueueForNamespace(nsName string) {
- nsObject, exists, err := c.nsAlrtCfgInf.GetStore().GetByKey(nsName)
+func (c *Operator) enqueueForNamespace(gbk operator.GetByKeyer, nsName string) {
+ nsObject, exists, err := gbk.GetByKey(nsName)
if err != nil {
c.logger.Error(
"get namespace to enqueue Alertmanager instances failed",
diff --git a/pkg/operator/operator.go b/pkg/operator/operator.go
index 40aa4aa31d0..63557fc7c2b 100644
--- a/pkg/operator/operator.go
+++ b/pkg/operator/operator.go
@@ -611,3 +611,29 @@ func SelectNamespacesFromCache(obj metav1.Object, sel *metav1.LabelSelector, nsI
return ns, nil
}
+
+// GetByKeyer is an interface which exposes only the GetByKey() method of the
+// cache.Store interface.
+type GetByKeyer interface {
+ GetByKey(string) (any, bool, error)
+}
+
+// NewMultiGetByKeyer returns an interface which queries multiple GetByKeyer in
+// sequence and returns the first found object.
+func NewMultiGetByKeyer(gbk ...GetByKeyer) GetByKeyer {
+ return multiGetByKeyer(gbk)
+}
+
+type multiGetByKeyer []GetByKeyer
+
+// GetByKey implements the GetByKeyer interface.
+func (m multiGetByKeyer) GetByKey(key string) (any, bool, error) {
+ for _, gbk := range m {
+ o, found, err := gbk.GetByKey(key)
+ if err != nil || found {
+ return o, found, err
+ }
+ }
+
+ return nil, false, nil
+}
diff --git a/pkg/prometheus/agent/operator.go b/pkg/prometheus/agent/operator.go
index 0bb654bc40e..53d7bbf7e7c 100644
--- a/pkg/prometheus/agent/operator.go
+++ b/pkg/prometheus/agent/operator.go
@@ -172,12 +172,13 @@ func New(ctx context.Context, restConfig *rest.Config, c operator.Config, logger
mclient: mclient,
logger: logger,
config: prompkg.Config{
- LocalHost: c.LocalHost,
- ReloaderConfig: c.ReloaderConfig,
- PrometheusDefaultBaseImage: c.PrometheusDefaultBaseImage,
- ThanosDefaultBaseImage: c.ThanosDefaultBaseImage,
- Annotations: c.Annotations,
- Labels: c.Labels,
+ LocalHost: c.LocalHost,
+ ReloaderConfig: c.ReloaderConfig,
+ PrometheusDefaultBaseImage: c.PrometheusDefaultBaseImage,
+ ThanosDefaultBaseImage: c.ThanosDefaultBaseImage,
+ Annotations: c.Annotations,
+ Labels: c.Labels,
+ WatchObjectRefsInAllNamespaces: c.WatchObjectRefsInAllNamespaces,
},
metrics: operator.NewMetrics(r),
reconciliations: &operator.ReconciliationTracker{},
@@ -535,7 +536,7 @@ func (c *Operator) addHandlers() {
c.accessor,
c.metrics,
monitoringv1.ServiceMonitorsKind,
- c.enqueueForMonitorNamespace,
+ c.enqueueForNamespaceFunc(c.nsMonInf.GetStore()),
operator.WithFilter(
operator.AnyFilter(
operator.GenerationChanged,
@@ -549,7 +550,7 @@ func (c *Operator) addHandlers() {
c.accessor,
c.metrics,
monitoringv1.PodMonitorsKind,
- c.enqueueForMonitorNamespace,
+ c.enqueueForNamespaceFunc(c.nsMonInf.GetStore()),
operator.WithFilter(
operator.AnyFilter(
operator.GenerationChanged,
@@ -563,7 +564,7 @@ func (c *Operator) addHandlers() {
c.accessor,
c.metrics,
monitoringv1.ProbesKind,
- c.enqueueForMonitorNamespace,
+ c.enqueueForNamespaceFunc(c.nsMonInf.GetStore()),
operator.WithFilter(
operator.AnyFilter(
operator.GenerationChanged,
@@ -578,7 +579,7 @@ func (c *Operator) addHandlers() {
c.accessor,
c.metrics,
monitoringv1alpha1.ScrapeConfigsKind,
- c.enqueueForMonitorNamespace,
+ c.enqueueForNamespaceFunc(c.nsMonInf.GetStore()),
operator.WithFilter(
operator.AnyFilter(
operator.GenerationChanged,
@@ -592,12 +593,19 @@ func (c *Operator) addHandlers() {
c.promInfs,
c.reconciliations,
)
+ var gbk operator.GetByKeyer = c.nsPromInf.GetStore()
+ if c.config.WatchObjectRefsInAllNamespaces && c.nsPromInf != c.nsMonInf {
+ gbk = operator.NewMultiGetByKeyer(
+ c.nsPromInf.GetStore(),
+ c.nsMonInf.GetStore(),
+ )
+ }
c.cmapInfs.AddEventHandler(operator.NewEventHandler(
c.logger,
c.accessor,
c.metrics,
operator.ConfigMapGVK().Kind,
- c.enqueueForPrometheusNamespace,
+ c.enqueueForNamespaceFunc(gbk),
operator.WithFilter(operator.ResourceVersionChanged),
operator.WithFilter(hasRefFunc),
))
@@ -607,7 +615,7 @@ func (c *Operator) addHandlers() {
c.accessor,
c.metrics,
operator.SecretGVK().Kind,
- c.enqueueForPrometheusNamespace,
+ c.enqueueForNamespaceFunc(gbk),
operator.WithFilter(operator.ResourceVersionChanged),
operator.WithFilter(hasRefFunc),
))
@@ -1100,18 +1108,16 @@ func (c *Operator) createOrUpdateWebConfigSecret(ctx context.Context, p *monitor
return nil
}
-func (c *Operator) enqueueForPrometheusNamespace(nsName string) {
- c.enqueueForNamespace(c.nsPromInf.GetStore(), nsName)
-}
-
-func (c *Operator) enqueueForMonitorNamespace(nsName string) {
- c.enqueueForNamespace(c.nsMonInf.GetStore(), nsName)
+func (c *Operator) enqueueForNamespaceFunc(gbk operator.GetByKeyer) func(string) {
+ return func(ns string) {
+ c.enqueueForNamespace(gbk, ns)
+ }
}
// enqueueForNamespace enqueues all Prometheus object keys that belong to the
// given namespace or select objects in the given namespace.
-func (c *Operator) enqueueForNamespace(store cache.Store, nsName string) {
- nsObject, found, err := store.GetByKey(nsName)
+func (c *Operator) enqueueForNamespace(gbk operator.GetByKeyer, nsName string) {
+ nsObject, found, err := gbk.GetByKey(nsName)
if err != nil {
c.logger.Error(
"get namespace to enqueue Prometheus instances failed",
diff --git a/pkg/prometheus/operator.go b/pkg/prometheus/operator.go
index 2ad8b50bbe3..22a2af060c6 100644
--- a/pkg/prometheus/operator.go
+++ b/pkg/prometheus/operator.go
@@ -41,12 +41,13 @@ import (
// Whenever the value of one of these parameters is changed, it triggers an
// update of the managed statefulsets.
type Config struct {
- LocalHost string
- ReloaderConfig operator.ContainerConfig
- PrometheusDefaultBaseImage string
- ThanosDefaultBaseImage string
- Annotations operator.Map
- Labels operator.Map
+ LocalHost string
+ ReloaderConfig operator.ContainerConfig
+ PrometheusDefaultBaseImage string
+ ThanosDefaultBaseImage string
+ Annotations operator.Map
+ Labels operator.Map
+ WatchObjectRefsInAllNamespaces bool
}
// StatefulSetGetter returns a statefulset object identified by
diff --git a/pkg/prometheus/server/operator.go b/pkg/prometheus/server/operator.go
index 8292b06014d..f61b166f735 100644
--- a/pkg/prometheus/server/operator.go
+++ b/pkg/prometheus/server/operator.go
@@ -219,12 +219,13 @@ func New(ctx context.Context, restConfig *rest.Config, c operator.Config, logger
accessor: operator.NewAccessor(logger),
config: prompkg.Config{
- LocalHost: c.LocalHost,
- ReloaderConfig: c.ReloaderConfig,
- PrometheusDefaultBaseImage: c.PrometheusDefaultBaseImage,
- ThanosDefaultBaseImage: c.ThanosDefaultBaseImage,
- Annotations: c.Annotations,
- Labels: c.Labels,
+ LocalHost: c.LocalHost,
+ ReloaderConfig: c.ReloaderConfig,
+ PrometheusDefaultBaseImage: c.PrometheusDefaultBaseImage,
+ ThanosDefaultBaseImage: c.ThanosDefaultBaseImage,
+ Annotations: c.Annotations,
+ Labels: c.Labels,
+ WatchObjectRefsInAllNamespaces: c.WatchObjectRefsInAllNamespaces,
},
metrics: operator.NewMetrics(r),
reconciliations: &operator.ReconciliationTracker{},
@@ -506,7 +507,7 @@ func (c *Operator) addHandlers() {
c.accessor,
c.metrics,
monitoringv1.ServiceMonitorsKind,
- c.enqueueForMonitorNamespace,
+ c.enqueueForNamespaceFunc(c.nsMonInf.GetStore()),
operator.WithFilter(
operator.AnyFilter(
operator.GenerationChanged,
@@ -520,7 +521,7 @@ func (c *Operator) addHandlers() {
c.accessor,
c.metrics,
monitoringv1.PodMonitorsKind,
- c.enqueueForMonitorNamespace,
+ c.enqueueForNamespaceFunc(c.nsMonInf.GetStore()),
operator.WithFilter(
operator.AnyFilter(
operator.GenerationChanged,
@@ -534,7 +535,7 @@ func (c *Operator) addHandlers() {
c.accessor,
c.metrics,
monitoringv1.ProbesKind,
- c.enqueueForMonitorNamespace,
+ c.enqueueForNamespaceFunc(c.nsMonInf.GetStore()),
operator.WithFilter(
operator.AnyFilter(
operator.GenerationChanged,
@@ -549,7 +550,7 @@ func (c *Operator) addHandlers() {
c.accessor,
c.metrics,
monitoringv1alpha1.ScrapeConfigsKind,
- c.enqueueForMonitorNamespace,
+ c.enqueueForNamespaceFunc(c.nsMonInf.GetStore()),
operator.WithFilter(
operator.AnyFilter(
operator.GenerationChanged,
@@ -564,7 +565,7 @@ func (c *Operator) addHandlers() {
c.accessor,
c.metrics,
monitoringv1.PrometheusRuleKind,
- c.enqueueForMonitorNamespace,
+ c.enqueueForNamespaceFunc(c.nsMonInf.GetStore()),
operator.WithFilter(
operator.AnyFilter(
operator.GenerationChanged,
@@ -577,12 +578,19 @@ func (c *Operator) addHandlers() {
c.promInfs,
c.reconciliations,
)
+ var gbk operator.GetByKeyer = c.nsPromInf.GetStore()
+ if c.config.WatchObjectRefsInAllNamespaces && c.nsPromInf != c.nsMonInf {
+ gbk = operator.NewMultiGetByKeyer(
+ c.nsPromInf.GetStore(),
+ c.nsMonInf.GetStore(),
+ )
+ }
c.cmapInfs.AddEventHandler(operator.NewEventHandler(
c.logger,
c.accessor,
c.metrics,
operator.ConfigMapGVK().Kind,
- c.enqueueForPrometheusNamespace,
+ c.enqueueForNamespaceFunc(gbk),
operator.WithFilter(operator.ResourceVersionChanged),
operator.WithFilter(hasRefFunc),
))
@@ -592,7 +600,7 @@ func (c *Operator) addHandlers() {
c.accessor,
c.metrics,
operator.SecretGVK().Kind,
- c.enqueueForPrometheusNamespace,
+ c.enqueueForNamespaceFunc(gbk),
operator.WithFilter(operator.ResourceVersionChanged),
operator.WithFilter(hasRefFunc),
))
@@ -699,18 +707,16 @@ func (c *Operator) RefreshStatusFor(o metav1.Object) {
c.rr.EnqueueForStatus(o)
}
-func (c *Operator) enqueueForPrometheusNamespace(nsName string) {
- c.enqueueForNamespace(c.nsPromInf.GetStore(), nsName)
-}
-
-func (c *Operator) enqueueForMonitorNamespace(nsName string) {
- c.enqueueForNamespace(c.nsMonInf.GetStore(), nsName)
+func (c *Operator) enqueueForNamespaceFunc(gbk operator.GetByKeyer) func(string) {
+ return func(ns string) {
+ c.enqueueForNamespace(gbk, ns)
+ }
}
// enqueueForNamespace enqueues all Prometheus object keys that belong to the
// given namespace or select objects in the given namespace.
-func (c *Operator) enqueueForNamespace(store cache.Store, nsName string) {
- nsObject, found, err := store.GetByKey(nsName)
+func (c *Operator) enqueueForNamespace(gbk operator.GetByKeyer, nsName string) {
+ nsObject, found, err := gbk.GetByKey(nsName)
if err != nil {
c.logger.Error(
"get namespace to enqueue Prometheus instances failed",
From 2282aed720b21c07dc6db31153cd428084ec5745 Mon Sep 17 00:00:00 2001
From: Simon Pasquier
Date: Tue, 30 Jun 2026 10:15:38 +0200
Subject: [PATCH 80/81] *: cut v0.92.1
Signed-off-by: Simon Pasquier
---
CHANGELOG.md | 4 +++
Documentation/platform/prometheus-agent.md | 2 +-
Documentation/platform/rbac.md | 6 ++--
Documentation/platform/webhook.md | 10 +++---
VERSION | 2 +-
bundle.yaml | 36 +++++++++----------
example/admission-webhook/deployment.yaml | 6 ++--
.../pod-disruption-budget.yaml | 2 +-
.../admission-webhook/service-account.yaml | 2 +-
.../admission-webhook/service-monitor.yaml | 4 +--
example/admission-webhook/service.yaml | 2 +-
.../alertmanager-crd-conversion/patch.json | 2 +-
...toring.coreos.com_alertmanagerconfigs.yaml | 2 +-
.../monitoring.coreos.com_alertmanagers.yaml | 2 +-
.../monitoring.coreos.com_podmonitors.yaml | 2 +-
.../monitoring.coreos.com_probes.yaml | 2 +-
...onitoring.coreos.com_prometheusagents.yaml | 2 +-
.../monitoring.coreos.com_prometheuses.yaml | 2 +-
...monitoring.coreos.com_prometheusrules.yaml | 2 +-
.../monitoring.coreos.com_scrapeconfigs.yaml | 2 +-
...monitoring.coreos.com_servicemonitors.yaml | 2 +-
.../monitoring.coreos.com_thanosrulers.yaml | 2 +-
...toring.coreos.com_alertmanagerconfigs.yaml | 2 +-
.../monitoring.coreos.com_alertmanagers.yaml | 2 +-
.../monitoring.coreos.com_podmonitors.yaml | 2 +-
.../monitoring.coreos.com_probes.yaml | 2 +-
...onitoring.coreos.com_prometheusagents.yaml | 2 +-
.../monitoring.coreos.com_prometheuses.yaml | 2 +-
...monitoring.coreos.com_prometheusrules.yaml | 2 +-
.../monitoring.coreos.com_scrapeconfigs.yaml | 2 +-
...monitoring.coreos.com_servicemonitors.yaml | 2 +-
.../monitoring.coreos.com_thanosrulers.yaml | 2 +-
...metheus-operator-cluster-role-binding.yaml | 2 +-
.../prometheus-operator-cluster-role.yaml | 2 +-
.../prometheus-operator-deployment.yaml | 8 ++---
.../prometheus-operator-service-account.yaml | 2 +-
.../prometheus-operator-service-monitor.yaml | 4 +--
.../prometheus-operator-service.yaml | 2 +-
go.mod | 4 +--
.../alertmanagerconfigs-crd.json | 2 +-
.../alertmanagers-crd.json | 2 +-
.../prometheus-operator/podmonitors-crd.json | 2 +-
jsonnet/prometheus-operator/probes-crd.json | 2 +-
.../prometheusagents-crd.json | 2 +-
.../prometheus-operator/prometheuses-crd.json | 2 +-
.../prometheusrules-crd.json | 2 +-
.../scrapeconfigs-crd.json | 2 +-
.../servicemonitors-crd.json | 2 +-
.../prometheus-operator/thanosrulers-crd.json | 2 +-
pkg/client/go.mod | 2 +-
50 files changed, 84 insertions(+), 80 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c7c31a6bd97..ec35f7005aa 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.92.1 / 2026-06-30
+
+* [BUGFIX] Fix "namespace not found" errors when the operator watches monitoring and workload resources in different resources. #8658
+
## 0.92.0 / 2026-06-18
> **Note:** The `PrometheusTopologySharding` and `PrometheusShardRetentionPolicy` feature gates have been promoted to **Beta** in this release and are now enabled by default. See the [sharding documentation](https://prometheus-operator.dev/docs/platform/sharding/) for details.
diff --git a/Documentation/platform/prometheus-agent.md b/Documentation/platform/prometheus-agent.md
index ea561079a22..1c6f711b3ae 100644
--- a/Documentation/platform/prometheus-agent.md
+++ b/Documentation/platform/prometheus-agent.md
@@ -26,7 +26,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
name: prometheus-operator
rules:
- apiGroups:
diff --git a/Documentation/platform/rbac.md b/Documentation/platform/rbac.md
index 25bed378609..d0e15109cd9 100644
--- a/Documentation/platform/rbac.md
+++ b/Documentation/platform/rbac.md
@@ -26,7 +26,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
name: prometheus-operator
rules:
- apiGroups:
@@ -212,7 +212,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
name: prometheus-operator
namespace: default
```
@@ -228,7 +228,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
name: prometheus-operator
roleRef:
apiGroup: rbac.authorization.k8s.io
diff --git a/Documentation/platform/webhook.md b/Documentation/platform/webhook.md
index 1169ec335e1..c32af3b3e2b 100644
--- a/Documentation/platform/webhook.md
+++ b/Documentation/platform/webhook.md
@@ -86,7 +86,7 @@ kind: ServiceAccount
metadata:
labels:
app.kubernetes.io/name: prometheus-operator-admission-webhook
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
name: prometheus-operator-admission-webhook
namespace: default
```
@@ -97,7 +97,7 @@ kind: Deployment
metadata:
labels:
app.kubernetes.io/name: prometheus-operator-admission-webhook
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
name: prometheus-operator-admission-webhook
namespace: default
spec:
@@ -114,7 +114,7 @@ spec:
kubectl.kubernetes.io/default-container: prometheus-operator-admission-webhook
labels:
app.kubernetes.io/name: prometheus-operator-admission-webhook
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
spec:
affinity:
podAntiAffinity:
@@ -131,7 +131,7 @@ spec:
- --web.enable-tls=true
- --web.cert-file=/etc/tls/private/tls.crt
- --web.key-file=/etc/tls/private/tls.key
- image: quay.io/prometheus-operator/admission-webhook:v0.92.0
+ image: quay.io/prometheus-operator/admission-webhook:v0.92.1
name: prometheus-operator-admission-webhook
ports:
- containerPort: 8443
@@ -179,7 +179,7 @@ kind: Service
metadata:
labels:
app.kubernetes.io/name: prometheus-operator-admission-webhook
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
name: prometheus-operator-admission-webhook
namespace: default
spec:
diff --git a/VERSION b/VERSION
index 36545ad338e..da011ce41e1 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-0.92.0
+0.92.1
diff --git a/bundle.yaml b/bundle.yaml
index 01e70165f82..30fe443b234 100644
--- a/bundle.yaml
+++ b/bundle.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: alertmanagerconfigs.monitoring.coreos.com
spec:
group: monitoring.coreos.com
@@ -12372,7 +12372,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: alertmanagers.monitoring.coreos.com
spec:
group: monitoring.coreos.com
@@ -22383,7 +22383,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: podmonitors.monitoring.coreos.com
spec:
group: monitoring.coreos.com
@@ -23786,7 +23786,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: probes.monitoring.coreos.com
spec:
group: monitoring.coreos.com
@@ -25202,7 +25202,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: prometheusagents.monitoring.coreos.com
spec:
group: monitoring.coreos.com
@@ -36759,7 +36759,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: prometheuses.monitoring.coreos.com
spec:
group: monitoring.coreos.com
@@ -50633,7 +50633,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: prometheusrules.monitoring.coreos.com
spec:
group: monitoring.coreos.com
@@ -50900,7 +50900,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: scrapeconfigs.monitoring.coreos.com
spec:
group: monitoring.coreos.com
@@ -63829,7 +63829,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: servicemonitors.monitoring.coreos.com
spec:
group: monitoring.coreos.com
@@ -65249,7 +65249,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: thanosrulers.monitoring.coreos.com
spec:
group: monitoring.coreos.com
@@ -75041,7 +75041,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
name: prometheus-operator
roleRef:
apiGroup: rbac.authorization.k8s.io
@@ -75058,7 +75058,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
name: prometheus-operator
rules:
- apiGroups:
@@ -75171,7 +75171,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
name: prometheus-operator
namespace: default
spec:
@@ -75187,13 +75187,13 @@ spec:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
spec:
automountServiceAccountToken: true
containers:
- args:
- --kubelet-service=kube-system/kubelet
- - --prometheus-config-reloader=quay.io/prometheus-operator/prometheus-config-reloader:v0.92.0
+ - --prometheus-config-reloader=quay.io/prometheus-operator/prometheus-config-reloader:v0.92.1
- --watch-referenced-objects-in-all-namespaces=true
- --disable-unmanaged-prometheus-configuration=true
- --kubelet-endpoints=true
@@ -75201,7 +75201,7 @@ spec:
env:
- name: GOGC
value: "30"
- image: quay.io/prometheus-operator/prometheus-operator:v0.92.0
+ image: quay.io/prometheus-operator/prometheus-operator:v0.92.1
name: prometheus-operator
ports:
- containerPort: 8080
@@ -75235,7 +75235,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
name: prometheus-operator
namespace: default
---
@@ -75245,7 +75245,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
name: prometheus-operator
namespace: default
spec:
diff --git a/example/admission-webhook/deployment.yaml b/example/admission-webhook/deployment.yaml
index f5e67e617b4..b422389d8dc 100644
--- a/example/admission-webhook/deployment.yaml
+++ b/example/admission-webhook/deployment.yaml
@@ -3,7 +3,7 @@ kind: Deployment
metadata:
labels:
app.kubernetes.io/name: prometheus-operator-admission-webhook
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
name: prometheus-operator-admission-webhook
namespace: default
spec:
@@ -20,7 +20,7 @@ spec:
kubectl.kubernetes.io/default-container: prometheus-operator-admission-webhook
labels:
app.kubernetes.io/name: prometheus-operator-admission-webhook
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
spec:
affinity:
podAntiAffinity:
@@ -37,7 +37,7 @@ spec:
- --web.enable-tls=true
- --web.cert-file=/etc/tls/private/tls.crt
- --web.key-file=/etc/tls/private/tls.key
- image: quay.io/prometheus-operator/admission-webhook:v0.92.0
+ image: quay.io/prometheus-operator/admission-webhook:v0.92.1
name: prometheus-operator-admission-webhook
ports:
- containerPort: 8443
diff --git a/example/admission-webhook/pod-disruption-budget.yaml b/example/admission-webhook/pod-disruption-budget.yaml
index cf9891b7922..2e2d8ec5a30 100644
--- a/example/admission-webhook/pod-disruption-budget.yaml
+++ b/example/admission-webhook/pod-disruption-budget.yaml
@@ -3,7 +3,7 @@ kind: PodDisruptionBudget
metadata:
labels:
app.kubernetes.io/name: prometheus-operator-admission-webhook
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
name: prometheus-operator-admission-webhook
namespace: default
spec:
diff --git a/example/admission-webhook/service-account.yaml b/example/admission-webhook/service-account.yaml
index 2de701224ec..ef84b50e3b0 100644
--- a/example/admission-webhook/service-account.yaml
+++ b/example/admission-webhook/service-account.yaml
@@ -4,6 +4,6 @@ kind: ServiceAccount
metadata:
labels:
app.kubernetes.io/name: prometheus-operator-admission-webhook
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
name: prometheus-operator-admission-webhook
namespace: default
diff --git a/example/admission-webhook/service-monitor.yaml b/example/admission-webhook/service-monitor.yaml
index f75241b5343..f104385f3e8 100644
--- a/example/admission-webhook/service-monitor.yaml
+++ b/example/admission-webhook/service-monitor.yaml
@@ -3,7 +3,7 @@ kind: ServiceMonitor
metadata:
labels:
app.kubernetes.io/name: prometheus-operator-admission-webhook
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
name: prometheus-operator-admission-webhook
namespace: default
spec:
@@ -13,4 +13,4 @@ spec:
selector:
matchLabels:
app.kubernetes.io/name: prometheus-operator-admission-webhook
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
diff --git a/example/admission-webhook/service.yaml b/example/admission-webhook/service.yaml
index de65ff45c1b..696f40b6457 100644
--- a/example/admission-webhook/service.yaml
+++ b/example/admission-webhook/service.yaml
@@ -3,7 +3,7 @@ kind: Service
metadata:
labels:
app.kubernetes.io/name: prometheus-operator-admission-webhook
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
name: prometheus-operator-admission-webhook
namespace: default
spec:
diff --git a/example/alertmanager-crd-conversion/patch.json b/example/alertmanager-crd-conversion/patch.json
index 22cff4565cd..70b91b8e8f6 100644
--- a/example/alertmanager-crd-conversion/patch.json
+++ b/example/alertmanager-crd-conversion/patch.json
@@ -4,7 +4,7 @@
"metadata": {
"annotations": {
"controller-gen.kubebuilder.io/version": "v0.21.0",
- "operator.prometheus.io/version": "0.92.0"
+ "operator.prometheus.io/version": "0.92.1"
},
"name": "alertmanagerconfigs.monitoring.coreos.com"
},
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml
index ce32c8e32c3..7f3d86b4a4e 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: alertmanagerconfigs.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml
index abf722ed165..24298cfe810 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: alertmanagers.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml
index d7ebb3d7416..2d83e87aab9 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: podmonitors.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_probes.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_probes.yaml
index a19b154086e..4f2b5cb4b7a 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_probes.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_probes.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: probes.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml
index 0ff5a900afc..69add8d9752 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: prometheusagents.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
index 1c2c4f80d8d..30204cdc435 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: prometheuses.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusrules.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusrules.yaml
index fbfc445b0f9..b594dfee269 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusrules.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusrules.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: prometheusrules.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_scrapeconfigs.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_scrapeconfigs.yaml
index d6461c6ed3d..75169bf429a 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_scrapeconfigs.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_scrapeconfigs.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: scrapeconfigs.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml
index a0478c098b8..d64c9060370 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: servicemonitors.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml
index 361f338e8e6..314e174c945 100644
--- a/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml
+++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: thanosrulers.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml
index 1de268cd7df..7677a0eb80b 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: alertmanagerconfigs.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml
index abf722ed165..24298cfe810 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: alertmanagers.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml
index d7ebb3d7416..2d83e87aab9 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: podmonitors.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml
index a19b154086e..4f2b5cb4b7a 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: probes.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml
index 0ff5a900afc..69add8d9752 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: prometheusagents.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
index 1c2c4f80d8d..30204cdc435 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: prometheuses.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml
index fbfc445b0f9..b594dfee269 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: prometheusrules.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml
index d6461c6ed3d..75169bf429a 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: scrapeconfigs.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml
index a0478c098b8..d64c9060370 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: servicemonitors.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml
index 361f338e8e6..314e174c945 100644
--- a/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml
+++ b/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml
@@ -4,7 +4,7 @@ kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
- operator.prometheus.io/version: 0.92.0
+ operator.prometheus.io/version: 0.92.1
name: thanosrulers.monitoring.coreos.com
spec:
group: monitoring.coreos.com
diff --git a/example/rbac/prometheus-operator/prometheus-operator-cluster-role-binding.yaml b/example/rbac/prometheus-operator/prometheus-operator-cluster-role-binding.yaml
index 9dc7c8d3686..079ba10b8fc 100644
--- a/example/rbac/prometheus-operator/prometheus-operator-cluster-role-binding.yaml
+++ b/example/rbac/prometheus-operator/prometheus-operator-cluster-role-binding.yaml
@@ -4,7 +4,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
name: prometheus-operator
roleRef:
apiGroup: rbac.authorization.k8s.io
diff --git a/example/rbac/prometheus-operator/prometheus-operator-cluster-role.yaml b/example/rbac/prometheus-operator/prometheus-operator-cluster-role.yaml
index c7e4e6dd84b..f59b0638aa7 100644
--- a/example/rbac/prometheus-operator/prometheus-operator-cluster-role.yaml
+++ b/example/rbac/prometheus-operator/prometheus-operator-cluster-role.yaml
@@ -4,7 +4,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
name: prometheus-operator
rules:
- apiGroups:
diff --git a/example/rbac/prometheus-operator/prometheus-operator-deployment.yaml b/example/rbac/prometheus-operator/prometheus-operator-deployment.yaml
index ebe8419ace9..d1c88bedc35 100644
--- a/example/rbac/prometheus-operator/prometheus-operator-deployment.yaml
+++ b/example/rbac/prometheus-operator/prometheus-operator-deployment.yaml
@@ -4,7 +4,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
name: prometheus-operator
namespace: default
spec:
@@ -20,13 +20,13 @@ spec:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
spec:
automountServiceAccountToken: true
containers:
- args:
- --kubelet-service=kube-system/kubelet
- - --prometheus-config-reloader=quay.io/prometheus-operator/prometheus-config-reloader:v0.92.0
+ - --prometheus-config-reloader=quay.io/prometheus-operator/prometheus-config-reloader:v0.92.1
- --watch-referenced-objects-in-all-namespaces=true
- --disable-unmanaged-prometheus-configuration=true
- --kubelet-endpoints=true
@@ -34,7 +34,7 @@ spec:
env:
- name: GOGC
value: "30"
- image: quay.io/prometheus-operator/prometheus-operator:v0.92.0
+ image: quay.io/prometheus-operator/prometheus-operator:v0.92.1
name: prometheus-operator
ports:
- containerPort: 8080
diff --git a/example/rbac/prometheus-operator/prometheus-operator-service-account.yaml b/example/rbac/prometheus-operator/prometheus-operator-service-account.yaml
index c5ea516800e..93c4df9f41a 100644
--- a/example/rbac/prometheus-operator/prometheus-operator-service-account.yaml
+++ b/example/rbac/prometheus-operator/prometheus-operator-service-account.yaml
@@ -5,6 +5,6 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
name: prometheus-operator
namespace: default
diff --git a/example/rbac/prometheus-operator/prometheus-operator-service-monitor.yaml b/example/rbac/prometheus-operator/prometheus-operator-service-monitor.yaml
index 82847e3cd20..a84494e8c12 100644
--- a/example/rbac/prometheus-operator/prometheus-operator-service-monitor.yaml
+++ b/example/rbac/prometheus-operator/prometheus-operator-service-monitor.yaml
@@ -4,7 +4,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
name: prometheus-operator
namespace: default
spec:
@@ -15,4 +15,4 @@ spec:
matchLabels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
diff --git a/example/rbac/prometheus-operator/prometheus-operator-service.yaml b/example/rbac/prometheus-operator/prometheus-operator-service.yaml
index 1adeae03113..08be5ce6b57 100644
--- a/example/rbac/prometheus-operator/prometheus-operator-service.yaml
+++ b/example/rbac/prometheus-operator/prometheus-operator-service.yaml
@@ -4,7 +4,7 @@ metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: prometheus-operator
- app.kubernetes.io/version: 0.92.0
+ app.kubernetes.io/version: 0.92.1
name: prometheus-operator
namespace: default
spec:
diff --git a/go.mod b/go.mod
index de105056830..b2d8e613e1f 100644
--- a/go.mod
+++ b/go.mod
@@ -19,8 +19,8 @@ require (
github.com/mitchellh/hashstructure v1.1.0
github.com/oklog/run v1.2.0
github.com/prometheus-community/prom-label-proxy v0.13.0
- github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.92.0
- github.com/prometheus-operator/prometheus-operator/pkg/client v0.92.0
+ github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.92.1
+ github.com/prometheus-operator/prometheus-operator/pkg/client v0.92.1
github.com/prometheus/alertmanager v0.33.0
github.com/prometheus/client_golang v1.23.2
github.com/prometheus/common v0.69.0
diff --git a/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json b/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json
index e54128bdc64..475917fa915 100644
--- a/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json
+++ b/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json
@@ -4,7 +4,7 @@
"metadata": {
"annotations": {
"controller-gen.kubebuilder.io/version": "v0.21.0",
- "operator.prometheus.io/version": "0.92.0"
+ "operator.prometheus.io/version": "0.92.1"
},
"name": "alertmanagerconfigs.monitoring.coreos.com"
},
diff --git a/jsonnet/prometheus-operator/alertmanagers-crd.json b/jsonnet/prometheus-operator/alertmanagers-crd.json
index f83e679e5b9..8505d14386b 100644
--- a/jsonnet/prometheus-operator/alertmanagers-crd.json
+++ b/jsonnet/prometheus-operator/alertmanagers-crd.json
@@ -4,7 +4,7 @@
"metadata": {
"annotations": {
"controller-gen.kubebuilder.io/version": "v0.21.0",
- "operator.prometheus.io/version": "0.92.0"
+ "operator.prometheus.io/version": "0.92.1"
},
"name": "alertmanagers.monitoring.coreos.com"
},
diff --git a/jsonnet/prometheus-operator/podmonitors-crd.json b/jsonnet/prometheus-operator/podmonitors-crd.json
index 2086cb98784..c4b29f6db84 100644
--- a/jsonnet/prometheus-operator/podmonitors-crd.json
+++ b/jsonnet/prometheus-operator/podmonitors-crd.json
@@ -4,7 +4,7 @@
"metadata": {
"annotations": {
"controller-gen.kubebuilder.io/version": "v0.21.0",
- "operator.prometheus.io/version": "0.92.0"
+ "operator.prometheus.io/version": "0.92.1"
},
"name": "podmonitors.monitoring.coreos.com"
},
diff --git a/jsonnet/prometheus-operator/probes-crd.json b/jsonnet/prometheus-operator/probes-crd.json
index b4ec503fa92..296613e676d 100644
--- a/jsonnet/prometheus-operator/probes-crd.json
+++ b/jsonnet/prometheus-operator/probes-crd.json
@@ -4,7 +4,7 @@
"metadata": {
"annotations": {
"controller-gen.kubebuilder.io/version": "v0.21.0",
- "operator.prometheus.io/version": "0.92.0"
+ "operator.prometheus.io/version": "0.92.1"
},
"name": "probes.monitoring.coreos.com"
},
diff --git a/jsonnet/prometheus-operator/prometheusagents-crd.json b/jsonnet/prometheus-operator/prometheusagents-crd.json
index 830799a492b..e4035bab8e9 100644
--- a/jsonnet/prometheus-operator/prometheusagents-crd.json
+++ b/jsonnet/prometheus-operator/prometheusagents-crd.json
@@ -4,7 +4,7 @@
"metadata": {
"annotations": {
"controller-gen.kubebuilder.io/version": "v0.21.0",
- "operator.prometheus.io/version": "0.92.0"
+ "operator.prometheus.io/version": "0.92.1"
},
"name": "prometheusagents.monitoring.coreos.com"
},
diff --git a/jsonnet/prometheus-operator/prometheuses-crd.json b/jsonnet/prometheus-operator/prometheuses-crd.json
index 6e2e5782a22..f9ac5ec33b5 100644
--- a/jsonnet/prometheus-operator/prometheuses-crd.json
+++ b/jsonnet/prometheus-operator/prometheuses-crd.json
@@ -4,7 +4,7 @@
"metadata": {
"annotations": {
"controller-gen.kubebuilder.io/version": "v0.21.0",
- "operator.prometheus.io/version": "0.92.0"
+ "operator.prometheus.io/version": "0.92.1"
},
"name": "prometheuses.monitoring.coreos.com"
},
diff --git a/jsonnet/prometheus-operator/prometheusrules-crd.json b/jsonnet/prometheus-operator/prometheusrules-crd.json
index b93cd1bf0fa..9574ec98bbf 100644
--- a/jsonnet/prometheus-operator/prometheusrules-crd.json
+++ b/jsonnet/prometheus-operator/prometheusrules-crd.json
@@ -4,7 +4,7 @@
"metadata": {
"annotations": {
"controller-gen.kubebuilder.io/version": "v0.21.0",
- "operator.prometheus.io/version": "0.92.0"
+ "operator.prometheus.io/version": "0.92.1"
},
"name": "prometheusrules.monitoring.coreos.com"
},
diff --git a/jsonnet/prometheus-operator/scrapeconfigs-crd.json b/jsonnet/prometheus-operator/scrapeconfigs-crd.json
index 94e5b83332d..90c1f959287 100644
--- a/jsonnet/prometheus-operator/scrapeconfigs-crd.json
+++ b/jsonnet/prometheus-operator/scrapeconfigs-crd.json
@@ -4,7 +4,7 @@
"metadata": {
"annotations": {
"controller-gen.kubebuilder.io/version": "v0.21.0",
- "operator.prometheus.io/version": "0.92.0"
+ "operator.prometheus.io/version": "0.92.1"
},
"name": "scrapeconfigs.monitoring.coreos.com"
},
diff --git a/jsonnet/prometheus-operator/servicemonitors-crd.json b/jsonnet/prometheus-operator/servicemonitors-crd.json
index 286e13d7858..7636d04a5f2 100644
--- a/jsonnet/prometheus-operator/servicemonitors-crd.json
+++ b/jsonnet/prometheus-operator/servicemonitors-crd.json
@@ -4,7 +4,7 @@
"metadata": {
"annotations": {
"controller-gen.kubebuilder.io/version": "v0.21.0",
- "operator.prometheus.io/version": "0.92.0"
+ "operator.prometheus.io/version": "0.92.1"
},
"name": "servicemonitors.monitoring.coreos.com"
},
diff --git a/jsonnet/prometheus-operator/thanosrulers-crd.json b/jsonnet/prometheus-operator/thanosrulers-crd.json
index d62edf74f63..b411c100c86 100644
--- a/jsonnet/prometheus-operator/thanosrulers-crd.json
+++ b/jsonnet/prometheus-operator/thanosrulers-crd.json
@@ -4,7 +4,7 @@
"metadata": {
"annotations": {
"controller-gen.kubebuilder.io/version": "v0.21.0",
- "operator.prometheus.io/version": "0.92.0"
+ "operator.prometheus.io/version": "0.92.1"
},
"name": "thanosrulers.monitoring.coreos.com"
},
diff --git a/pkg/client/go.mod b/pkg/client/go.mod
index 042f16c482e..5a9f12e22c2 100644
--- a/pkg/client/go.mod
+++ b/pkg/client/go.mod
@@ -3,7 +3,7 @@ module github.com/prometheus-operator/prometheus-operator/pkg/client
go 1.26.0
require (
- github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.92.0
+ github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.92.1
k8s.io/api v0.36.2
k8s.io/apiextensions-apiserver v0.36.2
k8s.io/apimachinery v0.36.2
From 0293cb50d451a6912ff8c1edaf67671f9fb0fdd5 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
Date: Wed, 1 Jul 2026 01:09:55 +0000
Subject: [PATCH 81/81] [bot] vendor: revendor
Signed-off-by: github-actions[bot]
---
vendor/github.com/armon/go-metrics/.gitignore | 26 +
.../github.com/armon/go-metrics/.travis.yml | 13 +
vendor/github.com/armon/go-metrics/LICENSE | 20 +
vendor/github.com/armon/go-metrics/README.md | 91 +
.../github.com/armon/go-metrics/const_unix.go | 12 +
.../armon/go-metrics/const_windows.go | 13 +
vendor/github.com/armon/go-metrics/inmem.go | 339 +
.../armon/go-metrics/inmem_endpoint.go | 162 +
.../armon/go-metrics/inmem_signal.go | 117 +
vendor/github.com/armon/go-metrics/metrics.go | 299 +
vendor/github.com/armon/go-metrics/sink.go | 132 +
vendor/github.com/armon/go-metrics/start.go | 158 +
vendor/github.com/armon/go-metrics/statsd.go | 184 +
.../github.com/armon/go-metrics/statsite.go | 172 +
.../aws-sdk-go-v2/aws/go_module_metadata.go | 2 +-
.../aws/aws-sdk-go-v2/config/CHANGELOG.md | 22 +
.../config/go_module_metadata.go | 2 +-
.../{ => config}/internal/ini/errors.go | 0
.../{ => config}/internal/ini/ini.go | 0
.../{ => config}/internal/ini/parse.go | 0
.../{ => config}/internal/ini/sections.go | 0
.../{ => config}/internal/ini/strings.go | 0
.../{ => config}/internal/ini/token.go | 0
.../{ => config}/internal/ini/tokenize.go | 0
.../{ => config}/internal/ini/value.go | 0
.../aws/aws-sdk-go-v2/config/shared_config.go | 2 +-
.../aws-sdk-go-v2/credentials/CHANGELOG.md | 18 +
.../credentials/go_module_metadata.go | 2 +-
.../feature/ec2/imds/CHANGELOG.md | 10 +
.../feature/ec2/imds/go_module_metadata.go | 2 +-
.../internal/configsources/CHANGELOG.md | 10 +
.../configsources/go_module_metadata.go | 2 +-
.../internal/endpoints/v2/CHANGELOG.md | 10 +
.../endpoints/v2/go_module_metadata.go | 2 +-
.../aws-sdk-go-v2/internal/ini/CHANGELOG.md | 296 -
.../aws-sdk-go-v2/internal/v4a/CHANGELOG.md | 460 +
.../internal/{ini => v4a}/LICENSE.txt | 0
.../aws-sdk-go-v2/internal/v4a/credentials.go | 141 +
.../aws/aws-sdk-go-v2/internal/v4a/error.go | 17 +
.../{ini => v4a}/go_module_metadata.go | 4 +-
.../internal/v4a/internal/crypto/compare.go | 30 +
.../internal/v4a/internal/crypto/ecc.go | 113 +
.../internal/v4a/internal/v4/const.go | 36 +
.../internal/v4a/internal/v4/header_rules.go | 82 +
.../internal/v4a/internal/v4/headers.go | 68 +
.../internal/v4a/internal/v4/hmac.go | 13 +
.../internal/v4a/internal/v4/host.go | 75 +
.../internal/v4a/internal/v4/time.go | 36 +
.../internal/v4a/internal/v4/util.go | 64 +
.../aws-sdk-go-v2/internal/v4a/middleware.go | 118 +
.../internal/v4a/presign_middleware.go | 117 +
.../aws/aws-sdk-go-v2/internal/v4a/smithy.go | 92 +
.../aws/aws-sdk-go-v2/internal/v4a/v4a.go | 520 +
.../internal/accept-encoding/CHANGELOG.md | 8 +
.../accept-encoding/go_module_metadata.go | 2 +-
.../internal/presigned-url/CHANGELOG.md | 10 +
.../presigned-url/go_module_metadata.go | 2 +-
.../aws-sdk-go-v2/service/signin/CHANGELOG.md | 10 +
.../service/signin/go_module_metadata.go | 2 +-
.../aws-sdk-go-v2/service/sso/CHANGELOG.md | 14 +
.../service/sso/go_module_metadata.go | 2 +-
.../sso/internal/endpoints/endpoints.go | 5 +
.../service/ssooidc/CHANGELOG.md | 18 +
.../service/ssooidc/endpoints.go | 305 +-
.../service/ssooidc/go_module_metadata.go | 2 +-
.../ssooidc/internal/endpoints/endpoints.go | 5 +
.../aws-sdk-go-v2/service/sts/CHANGELOG.md | 11 +
.../aws-sdk-go-v2/service/sts/api_client.go | 28 +
.../aws/aws-sdk-go-v2/service/sts/auth.go | 10 +
.../aws-sdk-go-v2/service/sts/generated.json | 1 +
.../service/sts/go_module_metadata.go | 2 +-
.../aws/aws-sdk-go-v2/service/sts/options.go | 48 +
vendor/github.com/aws/smithy-go/AGENTS.md | 172 +
vendor/github.com/aws/smithy-go/CHANGELOG.md | 40 +-
.../endpoints/private/bdd/evaluate.go | 35 +
.../endpoints/private/rulesfn/split.go | 16 +
.../endpoints/private/rulesfn/string_slice.go | 18 +
.../aws/smithy-go/go_module_metadata.go | 2 +-
.../github.com/cenkalti/backoff/v4/.gitignore | 25 +
vendor/github.com/cenkalti/backoff/v4/LICENSE | 20 +
.../github.com/cenkalti/backoff/v4/README.md | 30 +
.../github.com/cenkalti/backoff/v4/backoff.go | 66 +
.../github.com/cenkalti/backoff/v4/context.go | 62 +
.../cenkalti/backoff/v4/exponential.go | 216 +
.../github.com/cenkalti/backoff/v4/retry.go | 146 +
.../github.com/cenkalti/backoff/v4/ticker.go | 97 +
.../github.com/cenkalti/backoff/v4/timer.go | 35 +
.../github.com/cenkalti/backoff/v4/tries.go | 38 +
vendor/github.com/coder/quartz/.gitignore | 1 +
vendor/github.com/coder/quartz/LICENSE | 18 +
vendor/github.com/coder/quartz/README.md | 632 +
vendor/github.com/coder/quartz/clock.go | 43 +
vendor/github.com/coder/quartz/mock.go | 851 +
vendor/github.com/coder/quartz/real.go | 80 +
vendor/github.com/coder/quartz/ticker.go | 151 +
vendor/github.com/coder/quartz/timer.go | 118 +
vendor/github.com/edsrzf/mmap-go/mmap_unix.go | 2 +-
.../felixge/httpsnoop/capture_metrics.go | 37 +-
.../felixge/httpsnoop/wrap_generated.go | 16179 ++++
.../httpsnoop/wrap_generated_gteq_1.8.go | 436 -
.../httpsnoop/wrap_generated_lt_1.8.go | 278 -
.../github.com/fsnotify/fsnotify/.cirrus.yml | 14 -
.../github.com/fsnotify/fsnotify/CHANGELOG.md | 49 +
.../fsnotify/fsnotify/CONTRIBUTING.md | 2 +
vendor/github.com/fsnotify/fsnotify/README.md | 56 +-
.../fsnotify/fsnotify/backend_fen.go | 4 +-
.../fsnotify/fsnotify/backend_inotify.go | 84 +-
.../fsnotify/fsnotify/backend_kqueue.go | 68 +-
.../fsnotify/fsnotify/backend_windows.go | 78 +-
.../github.com/fsnotify/fsnotify/fsnotify.go | 72 +-
.../fsnotify/fsnotify/internal/darwin.go | 19 -
.../fsnotify/internal/debug_darwin.go | 42 -
.../fsnotify/internal/debug_dragonfly.go | 18 -
.../fsnotify/internal/debug_freebsd.go | 34 +-
.../fsnotify/internal/debug_kqueue.go | 2 +-
.../fsnotify/internal/debug_netbsd.go | 10 -
.../fsnotify/internal/debug_openbsd.go | 12 -
.../fsnotify/fsnotify/internal/freebsd.go | 11 -
.../fsnotify/fsnotify/internal/unix.go | 11 -
.../fsnotify/fsnotify/internal/unix2.go | 18 +
.../fsnotify/fsnotify/internal/windows.go | 1 -
.../fxamacker/cbor/v2/.golangci.yml | 176 +-
vendor/github.com/fxamacker/cbor/v2/README.md | 29 +-
vendor/github.com/fxamacker/cbor/v2/cache.go | 257 +-
vendor/github.com/fxamacker/cbor/v2/decode.go | 442 +-
.../fxamacker/cbor/v2/decode_map_utils.go | 98 +
.../github.com/fxamacker/cbor/v2/diagnose.go | 25 +-
vendor/github.com/fxamacker/cbor/v2/doc.go | 20 +-
vendor/github.com/fxamacker/cbor/v2/encode.go | 55 +-
.../fxamacker/cbor/v2/simplevalue.go | 2 +-
vendor/github.com/fxamacker/cbor/v2/stream.go | 177 +-
.../fxamacker/cbor/v2/structfields.go | 65 +-
vendor/github.com/fxamacker/cbor/v2/tag.go | 5 +
vendor/github.com/fxamacker/cbor/v2/valid.go | 20 +-
.../github.com/go-openapi/analysis/.gitignore | 2 +
.../go-openapi/analysis/CONTRIBUTORS.md | 29 +-
.../github.com/go-openapi/analysis/README.md | 3 +-
.../go-openapi/analysis/analyzer.go | 41 +-
.../github.com/go-openapi/analysis/flatten.go | 1 +
.../go-openapi/analysis/flatten_name.go | 4 +-
.../go-openapi/analysis/flatten_options.go | 14 +-
.../go-openapi/analysis/go.work.sum | 47 -
.../github.com/go-openapi/analysis/mixin.go | 71 +-
.../github.com/go-openapi/analysis/options.go | 21 +
.../github.com/go-openapi/errors/.gitignore | 1 -
.../go-openapi/errors/CONTRIBUTORS.md | 6 +-
vendor/github.com/go-openapi/errors/README.md | 2 +-
.../go-openapi/jsonpointer/.cliff.toml | 181 -
.../go-openapi/jsonpointer/.gitignore | 1 -
.../go-openapi/jsonpointer/CONTRIBUTORS.md | 7 +-
.../github.com/go-openapi/jsonpointer/NOTICE | 2 +-
.../go-openapi/jsonpointer/README.md | 54 +-
.../go-openapi/jsonpointer/errors.go | 26 +-
.../go-openapi/jsonpointer/ifaces.go | 47 +
.../go-openapi/jsonpointer/options.go | 86 +
.../go-openapi/jsonpointer/pointer.go | 348 +-
.../go-openapi/jsonreference/.gitignore | 1 -
.../go-openapi/jsonreference/CONTRIBUTORS.md | 22 +-
.../go-openapi/jsonreference/README.md | 22 +-
vendor/github.com/go-openapi/loads/.gitignore | 1 +
.../github.com/go-openapi/loads/.golangci.yml | 2 +
.../go-openapi/loads/CONTRIBUTORS.md | 6 +-
vendor/github.com/go-openapi/loads/README.md | 55 +-
vendor/github.com/go-openapi/loads/doc.go | 68 +
vendor/github.com/go-openapi/loads/errors.go | 4 +
vendor/github.com/go-openapi/loads/loaders.go | 79 +-
vendor/github.com/go-openapi/loads/options.go | 21 +-
.../github.com/go-openapi/loads/restricted.go | 185 +
vendor/github.com/go-openapi/loads/spec.go | 16 +
.../go-openapi/runtime/.codecov.yml | 9 +
.../github.com/go-openapi/runtime/.gitignore | 2 +
.../go-openapi/runtime/.golangci.yml | 30 +-
.../go-openapi/runtime/CONTRIBUTORS.md | 83 +
.../github.com/go-openapi/runtime/README.md | 76 +-
.../go-openapi/runtime/bytestream.go | 16 +-
.../go-openapi/runtime/client/httptrace.go | 520 +
.../runtime/client/httptrace_tls.go | 353 +
.../client/internal/request/request.go | 945 +
.../go-openapi/runtime/client/keepalive.go | 6 +-
.../runtime/client/opentelemetry.go | 93 +-
.../go-openapi/runtime/client/request.go | 468 -
.../go-openapi/runtime/client/runtime.go | 640 +-
.../go-openapi/runtime/client/tls.go | 197 +
.../go-openapi/runtime/client_operation.go | 24 +-
.../go-openapi/runtime/client_response.go | 2 +-
.../go-openapi/runtime/constants.go | 8 +-
vendor/github.com/go-openapi/runtime/csv.go | 18 +-
vendor/github.com/go-openapi/runtime/file.go | 6 +
vendor/github.com/go-openapi/runtime/form.go | 355 +
vendor/github.com/go-openapi/runtime/go.work | 4 +-
.../github.com/go-openapi/runtime/go.work.sum | 109 -
.../go-openapi/runtime/interfaces.go | 22 +
.../go-openapi/runtime/middleware/context.go | 692 +-
.../middleware/context_skipauth_disabled.go | 24 +
.../middleware/context_skipauth_enabled.go | 61 +
.../runtime/middleware/denco/router.go | 19 +-
.../runtime/middleware/denco/server.go | 26 +-
.../runtime/middleware/negotiate.go | 102 -
.../runtime/middleware/parameter.go | 304 +-
.../go-openapi/runtime/middleware/rapidoc.go | 83 -
.../go-openapi/runtime/middleware/redoc.go | 97 -
.../go-openapi/runtime/middleware/request.go | 24 +-
.../go-openapi/runtime/middleware/router.go | 119 +-
.../go-openapi/runtime/middleware/seam.go | 482 +
.../go-openapi/runtime/middleware/spec.go | 91 -
.../runtime/middleware/swaggerui.go | 178 -
.../runtime/middleware/typeutils.go | 30 +
.../runtime/middleware/ui_options.go | 176 -
.../runtime/middleware/validation.go | 98 +-
.../runtime/security/authenticator.go | 47 +-
.../runtime/server-middleware/LICENSE | 202 +
.../runtime/server-middleware/docui/doc.go | 12 +
.../server-middleware/docui/options.go | 253 +
.../server-middleware/docui/rapidoc.go | 67 +
.../runtime/server-middleware/docui/redoc.go | 82 +
.../runtime/server-middleware/docui/render.go | 33 +
.../runtime/server-middleware/docui/spec.go | 50 +
.../server-middleware/docui/swaggerui.go | 138 +
.../docui}/swaggerui_oauth2.go | 47 +-
.../server-middleware/mediatype/doc.go | 30 +
.../server-middleware/mediatype/lookup.go | 116 +
.../server-middleware/mediatype/match.go | 65 +
.../server-middleware/mediatype/mediatype.go | 392 +
.../server-middleware/mediatype/set.go | 138 +
.../server-middleware/negotiate/doc.go | 13 +
.../negotiate}/header/header.go | 8 +-
.../server-middleware/negotiate/negotiate.go | 215 +
.../github.com/go-openapi/runtime/statuses.go | 2 +-
vendor/github.com/go-openapi/runtime/text.go | 6 +-
.../go-openapi/runtime/yamlpc/yaml.go | 3 +-
vendor/github.com/go-openapi/spec/.gitignore | 1 -
.../github.com/go-openapi/spec/.golangci.yml | 3 +
.../go-openapi/spec/CONTRIBUTORS.md | 6 +-
vendor/github.com/go-openapi/spec/README.md | 18 +-
vendor/github.com/go-openapi/spec/header.go | 6 +-
.../go-openapi/spec/schema_loader.go | 2 +-
.../github.com/go-openapi/strfmt/.gitignore | 2 +-
.../go-openapi/strfmt/CONTRIBUTORS.md | 4 +-
vendor/github.com/go-openapi/strfmt/README.md | 21 +-
.../github.com/go-openapi/strfmt/duration.go | 322 +-
vendor/github.com/go-openapi/strfmt/go.work | 2 +-
.../github.com/go-openapi/strfmt/go.work.sum | 16 -
vendor/github.com/go-openapi/swag/.gitignore | 1 -
.../go-openapi/swag/CONTRIBUTORS.md | 6 +-
vendor/github.com/go-openapi/swag/README.md | 18 +-
vendor/github.com/go-openapi/swag/SECURITY.md | 28 +-
vendor/github.com/go-openapi/swag/go.work | 2 +-
.../swag/jsonname/go_name_provider.go | 286 +
.../go-openapi/swag/jsonname/ifaces.go | 14 +
.../go-openapi/swag/jsonname/name_provider.go | 2 +
.../github.com/go-openapi/swag/loading/doc.go | 24 +
.../go-openapi/swag/loading/loading.go | 36 +-
.../go-openapi/swag/loading/options.go | 47 +-
.../go-openapi/validate/CONTRIBUTORS.md | 6 +-
.../github.com/go-openapi/validate/README.md | 18 +-
vendor/github.com/go-openapi/validate/spec.go | 9 +-
.../go-openapi/validate/spec_messages.go | 20 +
.../go-openapi/validate/spec_ref_warnings.go | 209 +
vendor/github.com/google/btree/LICENSE | 202 +
vendor/github.com/google/btree/README.md | 10 +
vendor/github.com/google/btree/btree.go | 893 +
.../github.com/google/btree/btree_generic.go | 1083 +
.../grpc-gateway/v2/runtime/mux.go | 18 +-
vendor/github.com/hashicorp/errwrap/LICENSE | 354 +
vendor/github.com/hashicorp/errwrap/README.md | 89 +
.../github.com/hashicorp/errwrap/errwrap.go | 178 +
.../hashicorp/go-immutable-radix/.gitignore | 24 +
.../hashicorp/go-immutable-radix/CHANGELOG.md | 23 +
.../hashicorp/go-immutable-radix/LICENSE | 363 +
.../hashicorp/go-immutable-radix/README.md | 66 +
.../hashicorp/go-immutable-radix/edges.go | 21 +
.../hashicorp/go-immutable-radix/iradix.go | 676 +
.../hashicorp/go-immutable-radix/iter.go | 205 +
.../hashicorp/go-immutable-radix/node.go | 334 +
.../hashicorp/go-immutable-radix/raw_iter.go | 78 +
.../go-immutable-radix/reverse_iter.go | 239 +
.../hashicorp/go-metrics/.gitignore | 26 +
.../hashicorp/go-metrics/.travis.yml | 16 +
.../github.com/hashicorp/go-metrics/LICENSE | 18 +
.../github.com/hashicorp/go-metrics/README.md | 131 +
.../hashicorp/go-metrics/compat/armon.go | 129 +
.../hashicorp/go-metrics/compat/hashicorp.go | 129 +
.../hashicorp/go-metrics/const_js.go | 9 +
.../hashicorp/go-metrics/const_unix.go | 16 +
.../hashicorp/go-metrics/const_windows.go | 16 +
.../github.com/hashicorp/go-metrics/inmem.go | 363 +
.../hashicorp/go-metrics/inmem_endpoint.go | 190 +
.../hashicorp/go-metrics/inmem_signal.go | 124 +
.../hashicorp/go-metrics/metrics.go | 336 +
.../github.com/hashicorp/go-metrics/sink.go | 156 +
.../github.com/hashicorp/go-metrics/start.go | 176 +
.../github.com/hashicorp/go-metrics/statsd.go | 197 +
.../hashicorp/go-metrics/statsite.go | 185 +
.../hashicorp/go-msgpack/v2/LICENSE | 22 +
.../hashicorp/go-msgpack/v2/codec/build.sh | 263 +
.../hashicorp/go-msgpack/v2/codec/codecgen.go | 14 +
.../hashicorp/go-msgpack/v2/codec/decode.go | 3111 +
.../hashicorp/go-msgpack/v2/codec/doc.go | 239 +
.../hashicorp/go-msgpack/v2/codec/encode.go | 1812 +
.../go-msgpack/v2/codec/fast-path.not.go | 39 +
.../go-msgpack/v2/codec/gen-dec-array.go.tmpl | 78 +
.../go-msgpack/v2/codec/gen-dec-map.go.tmpl | 42 +
.../go-msgpack/v2/codec/gen-enc-chan.go.tmpl | 27 +
.../v2/codec/gen-helper.generated.go | 343 +
.../go-msgpack/v2/codec/gen-helper.go.tmpl | 308 +
.../go-msgpack/v2/codec/gen-internal.go | 288 +
.../go-msgpack/v2/codec/gen.generated.go | 165 +
.../hashicorp/go-msgpack/v2/codec/gen.go | 1875 +
.../hashicorp/go-msgpack/v2/codec/helper.go | 2926 +
.../go-msgpack/v2/codec/helper_internal.go | 89 +
.../hashicorp/go-msgpack/v2/codec/json.go | 1491 +
.../go-msgpack/v2/codec/mammoth-test.go.tmpl | 154 +
.../go-msgpack/v2/codec/mammoth2-test.go.tmpl | 92 +
.../hashicorp/go-msgpack/v2/codec/msgpack.go | 1150 +
.../hashicorp/go-msgpack/v2/codec/rpc.go | 233 +
.../hashicorp/go-msgpack/v2/codec/test.py | 122 +
.../hashicorp/go-multierror/LICENSE | 353 +
.../hashicorp/go-multierror/Makefile | 31 +
.../hashicorp/go-multierror/README.md | 150 +
.../hashicorp/go-multierror/append.go | 43 +
.../hashicorp/go-multierror/flatten.go | 26 +
.../hashicorp/go-multierror/format.go | 27 +
.../hashicorp/go-multierror/group.go | 38 +
.../hashicorp/go-multierror/multierror.go | 121 +
.../hashicorp/go-multierror/prefix.go | 37 +
.../hashicorp/go-multierror/sort.go | 16 +
.../hashicorp/go-sockaddr/.gitignore | 26 +
.../hashicorp/go-sockaddr/GNUmakefile | 65 +
.../github.com/hashicorp/go-sockaddr/LICENSE | 375 +
.../hashicorp/go-sockaddr/README.md | 118 +
.../github.com/hashicorp/go-sockaddr/doc.go | 5 +
.../hashicorp/go-sockaddr/ifaddr.go | 254 +
.../hashicorp/go-sockaddr/ifaddrs.go | 1317 +
.../hashicorp/go-sockaddr/ifattr.go | 65 +
.../hashicorp/go-sockaddr/ipaddr.go | 169 +
.../hashicorp/go-sockaddr/ipaddrs.go | 98 +
.../hashicorp/go-sockaddr/ipv4addr.go | 516 +
.../hashicorp/go-sockaddr/ipv6addr.go | 591 +
.../github.com/hashicorp/go-sockaddr/rfc.go | 948 +
.../hashicorp/go-sockaddr/route_info.go | 30 +
.../hashicorp/go-sockaddr/route_info_aix.go | 35 +
.../go-sockaddr/route_info_android.go | 32 +
.../hashicorp/go-sockaddr/route_info_bsd.go | 33 +
.../go-sockaddr/route_info_default.go | 19 +
.../hashicorp/go-sockaddr/route_info_linux.go | 39 +
.../go-sockaddr/route_info_solaris.go | 35 +
.../go-sockaddr/route_info_test_windows.go | 25 +
.../go-sockaddr/route_info_windows.go | 65 +
.../hashicorp/go-sockaddr/sockaddr.go | 206 +
.../hashicorp/go-sockaddr/sockaddrs.go | 193 +
.../hashicorp/go-sockaddr/unixsock.go | 148 +
.../github.com/hashicorp/golang-lru/LICENSE | 364 +
.../hashicorp/golang-lru/simplelru/lru.go | 177 +
.../golang-lru/simplelru/lru_interface.go | 40 +
.../hashicorp/golang-lru/v2/.gitignore | 23 +
.../hashicorp/golang-lru/v2/.golangci.yml | 46 +
.../github.com/hashicorp/golang-lru/v2/2q.go | 267 +
.../hashicorp/golang-lru/v2/LICENSE | 364 +
.../hashicorp/golang-lru/v2/README.md | 79 +
.../github.com/hashicorp/golang-lru/v2/doc.go | 24 +
.../hashicorp/golang-lru/v2/internal/list.go | 142 +
.../github.com/hashicorp/golang-lru/v2/lru.go | 250 +
.../golang-lru/v2/simplelru/LICENSE_list | 29 +
.../hashicorp/golang-lru/v2/simplelru/lru.go | 177 +
.../golang-lru/v2/simplelru/lru_interface.go | 46 +
.../hashicorp/memberlist/.gitignore | 25 +
.../hashicorp/memberlist/.go-version | 1 +
.../hashicorp/memberlist/.golangci.yml | 11 +
.../hashicorp/memberlist/CHANGELOG.md | 9 +
.../github.com/hashicorp/memberlist/LICENSE | 356 +
.../github.com/hashicorp/memberlist/Makefile | 33 +
.../github.com/hashicorp/memberlist/README.md | 98 +
.../hashicorp/memberlist/alive_delegate.go | 17 +
.../hashicorp/memberlist/awareness.go | 76 +
.../hashicorp/memberlist/broadcast.go | 108 +
.../github.com/hashicorp/memberlist/config.go | 397 +
.../hashicorp/memberlist/conflict_delegate.go | 13 +
.../hashicorp/memberlist/delegate.go | 40 +
.../hashicorp/memberlist/event_delegate.go | 67 +
.../hashicorp/memberlist/keyring.go | 163 +
.../github.com/hashicorp/memberlist/label.go | 181 +
.../hashicorp/memberlist/logging.go | 33 +
.../hashicorp/memberlist/memberlist.go | 797 +
.../hashicorp/memberlist/merge_delegate.go | 17 +
.../hashicorp/memberlist/mock_transport.go | 200 +
vendor/github.com/hashicorp/memberlist/net.go | 1393 +
.../hashicorp/memberlist/net_transport.go | 378 +
.../hashicorp/memberlist/peeked_conn.go | 48 +
.../hashicorp/memberlist/ping_delegate.go | 17 +
.../github.com/hashicorp/memberlist/queue.go | 425 +
.../hashicorp/memberlist/security.go | 221 +
.../github.com/hashicorp/memberlist/state.go | 1340 +
.../hashicorp/memberlist/suspicion.go | 133 +
vendor/github.com/hashicorp/memberlist/tag.sh | 19 +
.../github.com/hashicorp/memberlist/todo.md | 6 +
.../hashicorp/memberlist/transport.go | 163 +
.../github.com/hashicorp/memberlist/util.go | 333 +
.../klauspost/compress/.gitattributes | 3 +
.../github.com/klauspost/compress/.gitignore | 32 +
.../klauspost/compress/.goreleaser.yml | 132 +
vendor/github.com/klauspost/compress/LICENSE | 304 +
.../github.com/klauspost/compress/README.md | 700 +
.../github.com/klauspost/compress/SECURITY.md | 25 +
.../klauspost/compress/compressible.go | 85 +
.../klauspost/compress/fse/README.md | 79 +
.../klauspost/compress/fse/bitreader.go | 122 +
.../klauspost/compress/fse/bitwriter.go | 167 +
.../klauspost/compress/fse/bytereader.go | 47 +
.../klauspost/compress/fse/compress.go | 683 +
.../klauspost/compress/fse/decompress.go | 376 +
.../github.com/klauspost/compress/fse/fse.go | 144 +
vendor/github.com/klauspost/compress/gen.sh | 4 +
.../klauspost/compress/huff0/.gitignore | 1 +
.../klauspost/compress/huff0/README.md | 89 +
.../klauspost/compress/huff0/bitreader.go | 224 +
.../klauspost/compress/huff0/bitwriter.go | 102 +
.../klauspost/compress/huff0/compress.go | 742 +
.../klauspost/compress/huff0/decompress.go | 1161 +
.../compress/huff0/decompress_amd64.go | 222 +
.../compress/huff0/decompress_amd64.s | 830 +
.../compress/huff0/decompress_generic.go | 298 +
.../klauspost/compress/huff0/huff0.go | 337 +
.../compress/internal/cpuinfo/cpuinfo.go | 34 +
.../internal/cpuinfo/cpuinfo_amd64.go | 10 +
.../compress/internal/cpuinfo/cpuinfo_amd64.s | 36 +
.../klauspost/compress/internal/le/le.go | 5 +
.../compress/internal/le/unsafe_disabled.go | 42 +
.../compress/internal/le/unsafe_enabled.go | 52 +
.../compress/internal/race/norace.go | 13 +
.../klauspost/compress/internal/race/race.go | 26 +
.../compress/internal/snapref}/LICENSE | 22 +-
.../compress/internal/snapref/decode.go | 264 +
.../compress/internal/snapref/decode_other.go | 113 +
.../compress/internal/snapref/encode.go | 291 +
.../compress/internal/snapref/encode_other.go | 250 +
.../compress/internal/snapref/snappy.go | 98 +
.../klauspost/compress/s2/.gitignore | 15 +
.../github.com/klauspost/compress/s2/LICENSE | 28 +
.../klauspost/compress/s2/README.md | 1134 +
.../klauspost/compress/s2/decode.go | 443 +
.../klauspost/compress/s2/decode_amd64.s | 568 +
.../klauspost/compress/s2/decode_arm64.s | 574 +
.../klauspost/compress/s2/decode_asm.go | 17 +
.../klauspost/compress/s2/decode_other.go | 287 +
.../github.com/klauspost/compress/s2/dict.go | 350 +
.../klauspost/compress/s2/encode.go | 418 +
.../klauspost/compress/s2/encode_all.go | 1477 +
.../klauspost/compress/s2/encode_amd64.go | 316 +
.../klauspost/compress/s2/encode_best.go | 797 +
.../klauspost/compress/s2/encode_better.go | 1513 +
.../klauspost/compress/s2/encode_go.go | 740 +
.../compress/s2/encodeblock_amd64.go | 228 +
.../klauspost/compress/s2/encodeblock_amd64.s | 21303 +++++
.../klauspost/compress/s2/hashtable_pool.go | 65 +
.../github.com/klauspost/compress/s2/index.go | 602 +
.../klauspost/compress/s2/lz4convert.go | 585 +
.../klauspost/compress/s2/lz4sconvert.go | 467 +
.../klauspost/compress/s2/reader.go | 1075 +
vendor/github.com/klauspost/compress/s2/s2.go | 151 +
.../klauspost/compress/s2/writer.go | 1064 +
vendor/github.com/klauspost/compress/s2sx.mod | 3 +
vendor/github.com/klauspost/compress/s2sx.sum | 0
.../klauspost/compress/zstd/README.md | 441 +
.../klauspost/compress/zstd/bitreader.go | 135 +
.../klauspost/compress/zstd/bitwriter.go | 112 +
.../klauspost/compress/zstd/blockdec.go | 712 +
.../klauspost/compress/zstd/blockenc.go | 893 +
.../compress/zstd/blocktype_string.go | 85 +
.../klauspost/compress/zstd/bytebuf.go | 131 +
.../klauspost/compress/zstd/bytereader.go | 82 +
.../klauspost/compress/zstd/decodeheader.go | 261 +
.../klauspost/compress/zstd/decoder.go | 957 +
.../compress/zstd/decoder_options.go | 213 +
.../klauspost/compress/zstd/dict.go | 559 +
.../klauspost/compress/zstd/enc_base.go | 171 +
.../klauspost/compress/zstd/enc_best.go | 553 +
.../klauspost/compress/zstd/enc_better.go | 1238 +
.../klauspost/compress/zstd/enc_dfast.go | 1107 +
.../klauspost/compress/zstd/enc_fast.go | 875 +
.../klauspost/compress/zstd/encoder.go | 671 +
.../compress/zstd/encoder_options.go | 378 +
.../klauspost/compress/zstd/framedec.go | 412 +
.../klauspost/compress/zstd/frameenc.go | 137 +
.../klauspost/compress/zstd/fse_decoder.go | 307 +
.../compress/zstd/fse_decoder_amd64.go | 64 +
.../compress/zstd/fse_decoder_amd64.s | 126 +
.../compress/zstd/fse_decoder_generic.go | 72 +
.../klauspost/compress/zstd/fse_encoder.go | 701 +
.../klauspost/compress/zstd/fse_predefined.go | 158 +
.../klauspost/compress/zstd/hash.go | 35 +
.../klauspost/compress/zstd/history.go | 116 +
.../compress/zstd/internal/xxhash/LICENSE.txt | 22 +
.../compress/zstd/internal/xxhash/README.md | 71 +
.../compress/zstd/internal/xxhash/xxhash.go | 230 +
.../zstd/internal/xxhash/xxhash_amd64.s | 210 +
.../zstd/internal/xxhash/xxhash_arm64.s | 184 +
.../zstd/internal/xxhash/xxhash_asm.go | 16 +
.../zstd/internal/xxhash/xxhash_other.go | 75 +
.../zstd/internal/xxhash/xxhash_safe.go | 11 +
.../klauspost/compress/zstd/matchlen_amd64.go | 15 +
.../klauspost/compress/zstd/matchlen_amd64.s | 66 +
.../compress/zstd/matchlen_generic.go | 37 +
.../klauspost/compress/zstd/seqdec.go | 500 +
.../klauspost/compress/zstd/seqdec_amd64.go | 387 +
.../klauspost/compress/zstd/seqdec_amd64.s | 4151 +
.../klauspost/compress/zstd/seqdec_generic.go | 236 +
.../klauspost/compress/zstd/seqenc.go | 112 +
.../klauspost/compress/zstd/simple_go124.go | 56 +
.../klauspost/compress/zstd/snappy.go | 434 +
.../github.com/klauspost/compress/zstd/zip.go | 141 +
.../klauspost/compress/zstd/zstd.go | 126 +
vendor/github.com/miekg/dns/.codecov.yml | 8 +
vendor/github.com/miekg/dns/.gitignore | 4 +
vendor/github.com/miekg/dns/AUTHORS | 1 +
vendor/github.com/miekg/dns/CODEOWNERS | 1 +
vendor/github.com/miekg/dns/CONTRIBUTORS | 10 +
vendor/github.com/miekg/dns/COPYRIGHT | 9 +
vendor/github.com/miekg/dns/LICENSE | 29 +
vendor/github.com/miekg/dns/Makefile.fuzz | 33 +
vendor/github.com/miekg/dns/Makefile.release | 52 +
vendor/github.com/miekg/dns/README.md | 219 +
vendor/github.com/miekg/dns/acceptfunc.go | 59 +
vendor/github.com/miekg/dns/client.go | 469 +
vendor/github.com/miekg/dns/clientconfig.go | 135 +
vendor/github.com/miekg/dns/dane.go | 43 +
vendor/github.com/miekg/dns/defaults.go | 396 +
vendor/github.com/miekg/dns/dns.go | 158 +
vendor/github.com/miekg/dns/dnssec.go | 761 +
vendor/github.com/miekg/dns/dnssec_keygen.go | 139 +
vendor/github.com/miekg/dns/dnssec_keyscan.go | 310 +
vendor/github.com/miekg/dns/dnssec_privkey.go | 77 +
vendor/github.com/miekg/dns/doc.go | 292 +
vendor/github.com/miekg/dns/duplicate.go | 37 +
vendor/github.com/miekg/dns/edns.go | 970 +
vendor/github.com/miekg/dns/format.go | 93 +
vendor/github.com/miekg/dns/fuzz.go | 33 +
vendor/github.com/miekg/dns/generate.go | 248 +
vendor/github.com/miekg/dns/hash.go | 31 +
vendor/github.com/miekg/dns/labels.go | 212 +
.../miekg/dns/listen_no_socket_options.go | 40 +
.../miekg/dns/listen_socket_options.go | 97 +
vendor/github.com/miekg/dns/msg.go | 1225 +
vendor/github.com/miekg/dns/msg_helpers.go | 834 +
vendor/github.com/miekg/dns/msg_truncate.go | 117 +
vendor/github.com/miekg/dns/nsecx.go | 95 +
vendor/github.com/miekg/dns/privaterr.go | 113 +
vendor/github.com/miekg/dns/reverse.go | 55 +
vendor/github.com/miekg/dns/sanitize.go | 86 +
vendor/github.com/miekg/dns/scan.go | 1418 +
vendor/github.com/miekg/dns/scan_rr.go | 1967 +
vendor/github.com/miekg/dns/serve_mux.go | 122 +
vendor/github.com/miekg/dns/server.go | 860 +
vendor/github.com/miekg/dns/sig0.go | 193 +
vendor/github.com/miekg/dns/smimea.go | 44 +
vendor/github.com/miekg/dns/svcb.go | 969 +
vendor/github.com/miekg/dns/tlsa.go | 44 +
vendor/github.com/miekg/dns/tools.go | 10 +
vendor/github.com/miekg/dns/tsig.go | 456 +
vendor/github.com/miekg/dns/types.go | 1712 +
vendor/github.com/miekg/dns/udp.go | 103 +
vendor/github.com/miekg/dns/udp_no_control.go | 37 +
vendor/github.com/miekg/dns/update.go | 119 +
vendor/github.com/miekg/dns/version.go | 15 +
vendor/github.com/miekg/dns/xfr.go | 290 +
vendor/github.com/miekg/dns/zduplicate.go | 1459 +
vendor/github.com/miekg/dns/zmsg.go | 3077 +
vendor/github.com/miekg/dns/ztypes.go | 1353 +
.../mxk/go-flowrate/flowrate/flowrate.go | 267 -
.../github.com/mxk/go-flowrate/flowrate/io.go | 133 -
.../mxk/go-flowrate/flowrate/util.go | 67 -
vendor/github.com/pierrec/lz4/v4/.gitignore | 36 +
vendor/github.com/pierrec/lz4/v4/LICENSE | 28 +
vendor/github.com/pierrec/lz4/v4/README.md | 92 +
.../pierrec/lz4/v4/compressing_reader.go | 222 +
.../pierrec/lz4/v4/internal/lz4block/block.go | 481 +
.../lz4/v4/internal/lz4block/blocks.go | 94 +
.../lz4/v4/internal/lz4block/decode_amd64.s | 448 +
.../lz4/v4/internal/lz4block/decode_arm.s | 231 +
.../lz4/v4/internal/lz4block/decode_arm64.s | 241 +
.../lz4/v4/internal/lz4block/decode_asm.go | 10 +
.../lz4/v4/internal/lz4block/decode_other.go | 128 +
.../lz4/v4/internal/lz4errors/errors.go | 20 +
.../lz4/v4/internal/lz4stream/block.go | 348 +
.../lz4/v4/internal/lz4stream/frame.go | 203 +
.../lz4/v4/internal/lz4stream/frame_gen.go | 103 +
.../lz4/v4/internal/xxh32/xxh32zero.go | 212 +
.../lz4/v4/internal/xxh32/xxh32zero_arm.go | 11 +
.../lz4/v4/internal/xxh32/xxh32zero_arm.s | 251 +
.../lz4/v4/internal/xxh32/xxh32zero_other.go | 10 +
vendor/github.com/pierrec/lz4/v4/lz4.go | 157 +
vendor/github.com/pierrec/lz4/v4/options.go | 242 +
.../github.com/pierrec/lz4/v4/options_gen.go | 92 +
vendor/github.com/pierrec/lz4/v4/reader.go | 309 +
vendor/github.com/pierrec/lz4/v4/state.go | 81 +
vendor/github.com/pierrec/lz4/v4/state_gen.go | 28 +
vendor/github.com/pierrec/lz4/v4/writer.go | 244 +
.../apis/monitoring/v1/prometheus_types.go | 66 +-
.../pkg/apis/monitoring/v1/tls_types.go | 50 +-
.../pkg/apis/monitoring/v1/types.go | 34 +-
.../monitoring/v1/zz_generated.deepcopy.go | 15 +
.../v1alpha1/alertmanager_config_types.go | 11 +-
.../v1alpha1/prometheusagent_types.go | 3 +-
.../monitoring/v1alpha1/scrapeconfig_types.go | 3 +-
.../apis/monitoring/v1alpha1/validation.go | 20 +-
.../v1alpha1/zz_generated.deepcopy.go | 5 +
.../v1beta1/alertmanager_config_types.go | 11 +-
.../monitoring/v1beta1/conversion_from.go | 1 +
.../apis/monitoring/v1beta1/conversion_to.go | 1 +
.../pkg/apis/monitoring/v1beta1/validation.go | 20 +-
.../v1beta1/zz_generated.deepcopy.go | 5 +
.../monitoring/v1/attachmetadata.go | 4 +
.../monitoring/v1/endpoint.go | 9 +-
.../monitoring/v1/oauth2.go | 5 +-
.../monitoring/v1/otlpconfig.go | 32 +
.../monitoring/v1/prometheusspec.go | 5 +-
.../monitoring/v1/remotereadspec.go | 6 +-
.../monitoring/v1/tsdbspec.go | 23 +
.../monitoring/v1alpha1/webhookconfig.go | 13 +
.../monitoring/v1beta1/webhookconfig.go | 13 +
.../informers/externalversions/factory.go | 110 +-
.../internalinterfaces/factory_interfaces.go | 19 +
.../monitoring/v1/alertmanager.go | 48 +-
.../monitoring/v1/podmonitor.go | 48 +-
.../externalversions/monitoring/v1/probe.go | 48 +-
.../monitoring/v1/prometheus.go | 48 +-
.../monitoring/v1/prometheusrule.go | 48 +-
.../monitoring/v1/servicemonitor.go | 48 +-
.../monitoring/v1/thanosruler.go | 48 +-
.../monitoring/v1alpha1/alertmanagerconfig.go | 48 +-
.../monitoring/v1alpha1/prometheusagent.go | 48 +-
.../monitoring/v1alpha1/scrapeconfig.go | 48 +-
.../monitoring/v1beta1/alertmanagerconfig.go | 48 +-
.../versioned/fake/clientset_generated.go | 10 +-
.../prometheus/alertmanager/alert/alert.go | 164 +
.../prometheus/alertmanager/alert/state.go | 47 +
.../prometheus/alertmanager/alert/status.go | 26 +
.../prometheus/alertmanager/alert/validate.go | 34 +
.../v2/client/alert/get_alerts_parameters.go | 45 +
.../alertgroup/get_alert_groups_parameters.go | 45 +
.../receiver/get_receivers_parameters.go | 47 +
.../receiver/get_receivers_responses.go | 74 +
.../alertmanager/api/v2/models/alert_group.go | 2 +-
.../api/v2/models/gettable_alert.go | 6 +-
.../alertmanager/api/v2/models/receiver.go | 64 +-
.../api/v2/models/receiver_reference.go | 85 +
.../alertmanager/cluster/advertise.go | 89 +
.../alertmanager/cluster/channel.go | 155 +
.../alertmanager/cluster/cluster.go | 862 +
.../cluster/clusterpb/cluster.pb.go | 308 +
.../cluster/clusterpb/cluster.proto | 25 +
.../alertmanager/cluster/connection_pool.go | 78 +
.../alertmanager/cluster/delegate.go | 294 +
.../alertmanager/cluster/tls_config.go | 59 +
.../alertmanager/cluster/tls_connection.go | 188 +
.../alertmanager/cluster/tls_transport.go | 347 +
.../prometheus/alertmanager/config/config.go | 70 +-
.../alertmanager/config/coordinator.go | 33 +
.../alertmanager/config/notifiers.go | 390 +-
.../alertmanager/eventrecorder/config.go | 60 +
.../eventrecorderpb/eventrecorder.pb.go | 2096 +
.../eventrecorderpb/eventrecorder.proto | 389 +
.../alertmanager/eventrecorder/events.go | 291 +
.../alertmanager/eventrecorder/file.go | 198 +
.../alertmanager/eventrecorder/kafka.go | 364 +
.../alertmanager/eventrecorder/metrics.go | 82 +
.../alertmanager/eventrecorder/recorder.go | 371 +
.../alertmanager/eventrecorder/webhook.go | 302 +
.../featurecontrol/featurecontrol.go | 43 +-
.../prometheus/alertmanager/inhibit/index.go | 64 +
.../alertmanager/inhibit/inhibit.go | 419 +
.../prometheus/alertmanager/kafka/broker.go | 45 +
.../prometheus/alertmanager/kafka/client.go | 156 +
.../prometheus/alertmanager/kafka/errors.go | 62 +
.../prometheus/alertmanager/kafka/kafka.go | 147 +
.../prometheus/alertmanager/limit/bucket.go | 160 +
.../prometheus/alertmanager/marker/alert.go | 98 +
.../prometheus/alertmanager/marker/context.go | 40 +
.../prometheus/alertmanager/marker/group.go | 79 +
.../prometheus/alertmanager/marker/marker.go | 61 +
.../prometheus/alertmanager/marker/status.go | 29 +
.../prometheus/alertmanager/nflog/nflog.go | 675 +
.../alertmanager/nflog/nflogpb/nflog.pb.go | 452 +
.../alertmanager/nflog/nflogpb/nflog.proto | 58 +
.../alertmanager/nflog/nflogpb/set.go | 47 +
.../alertmanager/notify/cluster_stages.go | 63 +
.../prometheus/alertmanager/notify/context.go | 233 +
.../alertmanager/notify/dedup_stage.go | 174 +
.../alertmanager/notify/discord/config.go | 65 +
.../alertmanager/notify/discord/discord.go | 184 +
.../prometheus/alertmanager/notify/event.go | 143 +
.../alertmanager/notify/incidentio/config.go | 82 +
.../notify/incidentio/incidentio.go | 240 +
.../alertmanager/notify/jira/config.go | 109 +
.../alertmanager/notify/jira/jira.go | 421 +
.../alertmanager/notify/jira/types.go | 171 +
.../alertmanager/notify/mattermost/config.go | 138 +
.../notify/mattermost/mattermost.go | 303 +
.../prometheus/alertmanager/notify/metrics.go | 140 +
.../alertmanager/notify/msteams/config.go | 60 +
.../alertmanager/notify/msteams/msteams.go | 157 +
.../prometheus/alertmanager/notify/mute.go | 267 +
.../prometheus/alertmanager/notify/notify.go | 365 +
.../alertmanager/notify/retry_stage.go | 187 +
.../alertmanager/notify/set_notifies_stage.go | 80 +
.../prometheus/alertmanager/notify/util.go | 319 +
.../alertmanager/notify/webhook/config.go | 67 +
.../alertmanager/notify/webhook/webhook.go | 176 +
.../alertmanager/provider/provider.go | 105 +
.../prometheus/alertmanager/silence/cache.go | 72 +
.../alertmanager/silence/silence.go | 1489 +
.../silence/silencepb/silence.pb.go | 545 +
.../silence/silencepb/silence.proto | 78 +
.../prometheus/alertmanager/silence/state.go | 36 +
.../prometheus/alertmanager/store/store.go | 232 +
.../alertmanager/template/.gitignore | 1 +
.../prometheus/alertmanager/template/Makefile | 6 +
.../alertmanager/template/default.tmpl | 236 +
.../alertmanager/template/email.html | 412 +
.../alertmanager/template/email.tmpl | 179 +
.../alertmanager/template/inline-css.js | 40 +
.../alertmanager/template/package-lock.json | 511 +
.../alertmanager/template/package.json | 8 +
.../alertmanager/template/template.go | 536 +
.../alertmanager/tracing/tracing.go | 2 +-
.../prometheus/alertmanager/types/types.go | 27 +
.../prometheus/common/config/config.go | 4 +-
.../prometheus/common/config/http_config.go | 180 +-
.../common/config/oauth_assertion.go | 5 +-
.../prometheus/common/expfmt/expfmt.go | 4 +-
.../common/expfmt/openmetrics_create.go | 26 +-
.../prometheus/common/expfmt/text_create.go | 4 +-
.../prometheus/common/expfmt/text_parse.go | 10 +
.../common/helpers/templates/time.go | 6 +-
.../prometheus/common/model/labels.go | 2 +-
.../prometheus/common/model/labelset.go | 13 +-
.../prometheus/common/model/metric.go | 14 +-
.../prometheus/common/model/time.go | 44 +-
.../prometheus/common/model/value.go | 8 +-
.../prometheus/common/model/value_float.go | 2 +-
.../common/model/value_histogram.go | 8 +-
.../prometheus/common/promslog/slog.go | 2 +-
.../prometheus/common/version/info.go | 18 +
.../prometheus/model/histogram/generic.go | 10 +-
.../prometheus/model/rulefmt/rulefmt.go | 26 +-
.../prometheus/model/textparse/interface.go | 4 +-
.../model/textparse/openmetricsparse.go | 10 +-
.../model/textparse/protobufparse.go | 49 +-
.../prometheus/model/timestamp/timestamp.go | 6 +-
.../prompb/io/prometheus/client/decoder.go | 6 +-
.../prompb/io/prometheus/client/metrics.pb.go | 192 +-
.../prompb/io/prometheus/client/metrics.proto | 6 +-
.../prometheus/prometheus/promql/durations.go | 13 +-
.../prometheus/prometheus/promql/engine.go | 177 +-
.../prometheus/prometheus/promql/functions.go | 159 +-
.../promql/histogram_stats_iterator.go | 4 +
.../prometheus/prometheus/promql/info.go | 39 +-
.../prometheus/promql/parser/ast.go | 4 +-
.../prometheus/promql/parser/functions.go | 24 +
.../promql/parser/generated_parser.y | 98 +-
.../promql/parser/generated_parser.y.go | 1171 +-
.../prometheus/promql/parser/lex.go | 75 +-
.../prometheus/promql/parser/prettier.go | 13 +-
.../prometheus/prometheus/promql/value.go | 18 +
.../prometheus/prometheus/storage/generic.go | 382 +
.../prometheus/storage/interface.go | 118 +
.../prometheus/prometheus/storage/noop.go | 10 +
.../prometheus/storage/secondary.go | 74 +
.../prometheus/tsdb/chunkenc/chunk.go | 7 +
.../tsdb/chunkenc/float_histogram.go | 8 +-
.../prometheus/tsdb/chunkenc/histogram.go | 8 +-
.../prometheus/tsdb/chunkenc/xor.go | 2 +
.../prometheus/tsdb/chunkenc/xor2.go | 3 +
.../prometheus/tsdb/fileutil/flock_aix.go | 59 +
.../util/annotations/annotations.go | 10 +
.../util/convertnhcb/convertnhcb.go | 5 +
.../prometheus/util/kahansum/kahansum.go | 8 +-
.../prometheus/util/strutil/jarowinkler.go | 189 +
.../prometheus/util/strutil/subsequence.go | 272 +
vendor/github.com/sean-/seed/.gitignore | 24 +
vendor/github.com/sean-/seed/LICENSE | 54 +
vendor/github.com/sean-/seed/README.md | 44 +
vendor/github.com/sean-/seed/init.go | 84 +
vendor/github.com/twmb/franz-go/LICENSE | 24 +
.../twmb/franz-go/pkg/kbin/primitives.go | 856 +
.../github.com/twmb/franz-go/pkg/kerr/kerr.go | 348 +
.../twmb/franz-go/pkg/kgo/CLAUDE.md | 127 +
.../franz-go/pkg/kgo/atomic_maybe_work.go | 76 +
.../twmb/franz-go/pkg/kgo/broker.go | 1651 +
.../twmb/franz-go/pkg/kgo/client.go | 5527 ++
.../twmb/franz-go/pkg/kgo/compression.go | 453 +
.../twmb/franz-go/pkg/kgo/config.go | 2203 +
.../twmb/franz-go/pkg/kgo/connreset_unix.go | 11 +
.../franz-go/pkg/kgo/connreset_windows.go | 9 +
.../franz-go/pkg/kgo/consumer-bugs-prompt.md | 71 +
.../pkg/kgo/consumer-efficiency-prompt.md | 57 +
.../twmb/franz-go/pkg/kgo/consumer.go | 2574 +
.../twmb/franz-go/pkg/kgo/consumer_direct.go | 141 +
.../twmb/franz-go/pkg/kgo/consumer_group.go | 3437 +
.../franz-go/pkg/kgo/consumer_group_848.go | 661 +
.../twmb/franz-go/pkg/kgo/consumer_share.go | 2994 +
.../twmb/franz-go/pkg/kgo/errors.go | 455 +
.../twmb/franz-go/pkg/kgo/group_balancer.go | 1068 +
.../github.com/twmb/franz-go/pkg/kgo/hooks.go | 439 +
.../franz-go/pkg/kgo/internal/sticky/graph.go | 226 +
.../pkg/kgo/internal/sticky/rbtree.go | 392 +
.../pkg/kgo/internal/sticky/sticky.go | 932 +
.../pkg/kgo/internal/xsync/sync_mutex.go | 13 +
.../pkg/kgo/internal/xsync/synctest_mutex.go | 169 +
.../twmb/franz-go/pkg/kgo/logger.go | 140 +
.../twmb/franz-go/pkg/kgo/metadata.go | 1153 +
.../twmb/franz-go/pkg/kgo/metrics_714.go | 986 +
.../twmb/franz-go/pkg/kgo/partitioner.go | 614 +
.../github.com/twmb/franz-go/pkg/kgo/pools.go | 201 +
.../franz-go/pkg/kgo/produce-bugs-prompt.md | 64 +
.../pkg/kgo/produce-efficiency-prompt.md | 58 +
.../twmb/franz-go/pkg/kgo/producer.go | 1336 +
.../twmb/franz-go/pkg/kgo/record_and_fetch.go | 734 +
.../twmb/franz-go/pkg/kgo/record_formatter.go | 2274 +
.../github.com/twmb/franz-go/pkg/kgo/ring.go | 140 +
.../github.com/twmb/franz-go/pkg/kgo/sink.go | 2633 +
.../twmb/franz-go/pkg/kgo/source.go | 2771 +
.../twmb/franz-go/pkg/kgo/strftime.go | 205 +
.../franz-go/pkg/kgo/topics_and_partitions.go | 1043 +
.../github.com/twmb/franz-go/pkg/kgo/txn.go | 1165 +
.../github.com/twmb/franz-go/pkg/kmsg/LICENSE | 24 +
.../github.com/twmb/franz-go/pkg/kmsg/api.go | 477 +
.../twmb/franz-go/pkg/kmsg/generated.go | 69191 ++++++++++++++++
.../pkg/kmsg/internal/kbin/primitives.go | 856 +
.../twmb/franz-go/pkg/kmsg/record.go | 173 +
.../twmb/franz-go/pkg/kversion/kversion.go | 352 +
.../twmb/franz-go/pkg/kversion/requests.go | 1309 +
.../github.com/twmb/franz-go/pkg/sasl/sasl.go | 41 +
.../twmb/franz-go/plugin/kslog/LICENSE | 24 +
.../twmb/franz-go/plugin/kslog/README.md | 13 +
.../twmb/franz-go/plugin/kslog/kslog.go | 66 +
.../httptrace/otelhttptrace/clienttrace.go | 33 +-
.../otelhttptrace/internal/semconv/client.go | 45 +-
.../otelhttptrace/internal/semconv/server.go | 43 +-
.../otelhttptrace/internal/semconv/util.go | 2 +-
.../http/httptrace/otelhttptrace/version.go | 2 +-
.../net/http/otelhttp/handler.go | 17 +-
.../http/otelhttp/internal/semconv/client.go | 45 +-
.../http/otelhttp/internal/semconv/server.go | 43 +-
.../http/otelhttp/internal/semconv/util.go | 2 +-
.../net/http/otelhttp/transport.go | 3 +-
.../net/http/otelhttp/version.go | 2 +-
vendor/go.opentelemetry.io/otel/.golangci.yml | 18 +-
vendor/go.opentelemetry.io/otel/AGENTS.md | 109 +
vendor/go.opentelemetry.io/otel/CHANGELOG.md | 97 +-
vendor/go.opentelemetry.io/otel/CLAUDE.md | 3 +
.../go.opentelemetry.io/otel/CONTRIBUTING.md | 101 +-
vendor/go.opentelemetry.io/otel/Makefile | 10 +-
.../otel/attribute/encoder.go | 4 +-
.../otel/attribute/hash.go | 58 +-
.../go.opentelemetry.io/otel/attribute/key.go | 22 +
.../go.opentelemetry.io/otel/attribute/kv.go | 10 +
.../go.opentelemetry.io/otel/attribute/set.go | 4 +-
.../otel/attribute/type_string.go | 6 +-
.../otel/attribute/value.go | 742 +
.../otel/baggage/baggage.go | 30 +-
.../otel/dependencies.Dockerfile | 2 +-
.../internal/tracetransform/attribute.go | 18 +
.../otlp/otlptrace/otlptracegrpc/client.go | 52 +-
.../internal/observ/instrumentation.go | 10 +-
.../internal/otlpconfig/options.go | 43 +-
.../otlptracegrpc/internal/version.go | 2 +-
.../otlp/otlptrace/otlptracegrpc/options.go | 10 +
.../otlp/otlptrace/otlptracehttp/client.go | 58 +-
.../internal/observ/instrumentation.go | 18 +-
.../internal/otlpconfig/options.go | 43 +-
.../otlptracehttp/internal/version.go | 2 +-
.../otlp/otlptrace/otlptracehttp/options.go | 10 +
.../otel/exporters/otlp/otlptrace/version.go | 2 +-
.../otel/metric/asyncfloat64.go | 9 +
.../otel/metric/asyncint64.go | 9 +
.../go.opentelemetry.io/otel/metric/config.go | 7 +
vendor/go.opentelemetry.io/otel/metric/doc.go | 51 +-
.../otel/metric/instrument.go | 39 +-
.../otel/metric/syncfloat64.go | 12 +
.../otel/metric/syncint64.go | 12 +
.../otel/propagation/baggage.go | 72 +-
.../otel/sdk/resource/builtin.go | 4 +-
.../otel/sdk/resource/container.go | 2 +-
.../otel/sdk/resource/env.go | 2 +-
.../otel/sdk/resource/host_id.go | 2 +-
.../otel/sdk/resource/host_id_exec.go | 7 +-
.../otel/sdk/resource/os.go | 2 +-
.../otel/sdk/resource/os_unix.go | 3 +-
.../otel/sdk/resource/os_windows.go | 6 +-
.../otel/sdk/resource/process.go | 5 +-
.../otel/sdk/trace/batch_span_processor.go | 10 +-
.../internal/observ/batch_span_processor.go | 4 +-
.../internal/observ/simple_span_processor.go | 5 +-
.../otel/sdk/trace/internal/observ/tracer.go | 2 +-
.../otel/sdk/trace/provider.go | 9 +-
.../otel/sdk/trace/sampling.go | 5 +-
.../otel/sdk/trace/span.go | 97 +-
.../otel/sdk/trace/span_limits.go | 6 +-
.../go.opentelemetry.io/otel/sdk/version.go | 2 +-
.../otel/semconv/v1.37.0/attribute_group.go | 12 +-
.../otel/semconv/v1.39.0/MIGRATION.md | 78 -
.../otel/semconv/v1.39.0/README.md | 3 -
.../otel/semconv/v1.39.0/error_type.go | 56 -
.../otel/semconv/v1.40.0/attribute_group.go | 12 +-
.../otel/semconv/v1.40.0/error_type.go | 19 +-
.../otel/semconv/v1.41.0/MIGRATION.md | 17 +
.../otel/semconv/v1.41.0/README.md | 3 +
.../{v1.39.0 => v1.41.0}/attribute_group.go | 1418 +-
.../otel/semconv/{v1.39.0 => v1.41.0}/doc.go | 6 +-
.../otel/semconv/v1.41.0/error_type.go | 83 +
.../semconv/{v1.39.0 => v1.41.0}/exception.go | 4 +-
.../{v1.40.0 => v1.41.0}/httpconv/metric.go | 369 +
.../{v1.40.0 => v1.41.0}/otelconv/metric.go | 1042 +-
.../semconv/{v1.39.0 => v1.41.0}/schema.go | 6 +-
vendor/go.opentelemetry.io/otel/trace/auto.go | 20 +-
.../go.opentelemetry.io/otel/trace/config.go | 16 +
.../otel/trace/internal/telemetry/span.go | 8 +-
vendor/go.opentelemetry.io/otel/version.go | 2 +-
vendor/go.opentelemetry.io/otel/versions.yaml | 12 +-
vendor/golang.org/x/mod/LICENSE | 27 +
vendor/golang.org/x/mod/PATENTS | 22 +
vendor/golang.org/x/mod/semver/semver.go | 407 +
vendor/golang.org/x/net/html/atom/atom.go | 78 -
vendor/golang.org/x/net/html/atom/table.go | 785 -
vendor/golang.org/x/net/html/const.go | 111 -
vendor/golang.org/x/net/html/doc.go | 122 -
vendor/golang.org/x/net/html/doctype.go | 156 -
vendor/golang.org/x/net/html/entity.go | 2253 -
vendor/golang.org/x/net/html/escape.go | 339 -
vendor/golang.org/x/net/html/foreign.go | 221 -
vendor/golang.org/x/net/html/iter.go | 54 -
vendor/golang.org/x/net/html/node.go | 230 -
.../golang.org/x/net/html/nodetype_string.go | 31 -
vendor/golang.org/x/net/html/parse.go | 2489 -
vendor/golang.org/x/net/html/render.go | 293 -
vendor/golang.org/x/net/html/token.go | 1286 -
vendor/golang.org/x/net/http2/README.md | 19 +
.../x/net/http2/client_conn_pool.go | 14 +-
vendor/golang.org/x/net/http2/clientconn.go | 57 +
vendor/golang.org/x/net/http2/config.go | 2 +
vendor/golang.org/x/net/http2/hpack/tables.go | 13 +-
vendor/golang.org/x/net/http2/http2.go | 2 +-
vendor/golang.org/x/net/http2/server.go | 214 +-
.../golang.org/x/net/http2/server_common.go | 221 +
vendor/golang.org/x/net/http2/server_wrap.go | 217 +
vendor/golang.org/x/net/http2/transport.go | 453 +-
.../x/net/http2/transport_common.go | 447 +
.../golang.org/x/net/http2/transport_wrap.go | 392 +
vendor/golang.org/x/net/http2/writesched.go | 46 +-
.../x/net/http2/writesched_common.go | 90 +
.../net/http2/writesched_priority_rfc7540.go | 43 +-
.../net/http2/writesched_priority_rfc9218.go | 2 +
.../x/net/http2/writesched_random.go | 2 +
.../x/net/http2/writesched_roundrobin.go | 2 +
vendor/golang.org/x/net/idna/go118.go | 13 -
.../x/net/idna/{idna10.0.0.go => idna.go} | 181 +-
vendor/golang.org/x/net/idna/idna9.0.0.go | 717 -
vendor/golang.org/x/net/idna/punycode.go | 5 +-
vendor/golang.org/x/net/idna/tables10.0.0.go | 4559 -
vendor/golang.org/x/net/idna/tables11.0.0.go | 4653 --
vendor/golang.org/x/net/idna/tables12.0.0.go | 4733 --
vendor/golang.org/x/net/idna/tables13.0.0.go | 4959 --
vendor/golang.org/x/net/idna/tables15.0.0.go | 2 +-
vendor/golang.org/x/net/idna/tables17.0.0.go | 5302 ++
vendor/golang.org/x/net/idna/tables9.0.0.go | 4486 -
vendor/golang.org/x/net/idna/trie12.0.0.go | 30 -
vendor/golang.org/x/net/idna/trie13.0.0.go | 30 -
.../x/net/internal/httpcommon/request.go | 8 +
.../golang.org/x/net/internal/iana/const.go | 223 +
.../x/net/internal/socket/cmsghdr.go | 11 +
.../x/net/internal/socket/cmsghdr_bsd.go | 13 +
.../internal/socket/cmsghdr_linux_32bit.go | 13 +
.../internal/socket/cmsghdr_linux_64bit.go | 13 +
.../internal/socket/cmsghdr_solaris_64bit.go | 13 +
.../x/net/internal/socket/cmsghdr_stub.go | 27 +
.../x/net/internal/socket/cmsghdr_unix.go | 21 +
.../net/internal/socket/cmsghdr_zos_s390x.go | 11 +
.../net/internal/socket/complete_dontwait.go | 25 +
.../internal/socket/complete_nodontwait.go | 21 +
.../golang.org/x/net/internal/socket/empty.s | 7 +
.../x/net/internal/socket/error_unix.go | 31 +
.../x/net/internal/socket/error_windows.go | 26 +
.../x/net/internal/socket/iovec_32bit.go | 18 +
.../x/net/internal/socket/iovec_64bit.go | 18 +
.../internal/socket/iovec_solaris_64bit.go | 18 +
.../x/net/internal/socket/iovec_stub.go | 11 +
.../x/net/internal/socket/mmsghdr_stub.go | 21 +
.../x/net/internal/socket/mmsghdr_unix.go | 195 +
.../x/net/internal/socket/msghdr_bsd.go | 39 +
.../x/net/internal/socket/msghdr_bsdvar.go | 16 +
.../x/net/internal/socket/msghdr_linux.go | 36 +
.../net/internal/socket/msghdr_linux_32bit.go | 23 +
.../net/internal/socket/msghdr_linux_64bit.go | 23 +
.../x/net/internal/socket/msghdr_openbsd.go | 14 +
.../internal/socket/msghdr_solaris_64bit.go | 38 +
.../x/net/internal/socket/msghdr_stub.go | 14 +
.../x/net/internal/socket/msghdr_zos_s390x.go | 35 +
.../x/net/internal/socket/norace.go | 12 +
.../golang.org/x/net/internal/socket/race.go | 37 +
.../x/net/internal/socket/rawconn.go | 91 +
.../x/net/internal/socket/rawconn_mmsg.go | 53 +
.../x/net/internal/socket/rawconn_msg.go | 59 +
.../x/net/internal/socket/rawconn_nommsg.go | 15 +
.../x/net/internal/socket/rawconn_nomsg.go | 15 +
.../x/net/internal/socket/socket.go | 281 +
.../x/net/internal/socket/sys_bsd.go | 15 +
.../x/net/internal/socket/sys_const_unix.go | 20 +
.../x/net/internal/socket/sys_linux.go | 22 +
.../x/net/internal/socket/sys_linux_386.go | 28 +
.../x/net/internal/socket/sys_linux_386.s | 11 +
.../x/net/internal/socket/sys_linux_amd64.go | 10 +
.../x/net/internal/socket/sys_linux_arm.go | 10 +
.../x/net/internal/socket/sys_linux_arm64.go | 10 +
.../socket/sys_linux_loong64.go} | 11 +-
.../x/net/internal/socket/sys_linux_mips.go | 10 +
.../x/net/internal/socket/sys_linux_mips64.go | 10 +
.../net/internal/socket/sys_linux_mips64le.go | 10 +
.../x/net/internal/socket/sys_linux_mipsle.go | 10 +
.../x/net/internal/socket/sys_linux_ppc.go | 10 +
.../x/net/internal/socket/sys_linux_ppc64.go | 10 +
.../net/internal/socket/sys_linux_ppc64le.go | 10 +
.../net/internal/socket/sys_linux_riscv64.go | 12 +
.../x/net/internal/socket/sys_linux_s390x.go | 28 +
.../x/net/internal/socket/sys_linux_s390x.s | 11 +
.../x/net/internal/socket/sys_netbsd.go | 25 +
.../x/net/internal/socket/sys_posix.go | 184 +
.../x/net/internal/socket/sys_stub.go | 52 +
.../x/net/internal/socket/sys_unix.go | 121 +
.../x/net/internal/socket/sys_windows.go | 55 +
.../x/net/internal/socket/sys_zos_s390x.go | 66 +
.../x/net/internal/socket/sys_zos_s390x.s | 11 +
.../x/net/internal/socket/zsys_aix_ppc64.go | 39 +
.../net/internal/socket/zsys_darwin_amd64.go | 32 +
.../net/internal/socket/zsys_darwin_arm64.go | 32 +
.../internal/socket/zsys_dragonfly_amd64.go | 32 +
.../x/net/internal/socket/zsys_freebsd_386.go | 30 +
.../net/internal/socket/zsys_freebsd_amd64.go | 32 +
.../x/net/internal/socket/zsys_freebsd_arm.go | 30 +
.../net/internal/socket/zsys_freebsd_arm64.go | 32 +
.../internal/socket/zsys_freebsd_riscv64.go | 30 +
.../x/net/internal/socket/zsys_linux_386.go | 35 +
.../x/net/internal/socket/zsys_linux_amd64.go | 38 +
.../x/net/internal/socket/zsys_linux_arm.go | 35 +
.../x/net/internal/socket/zsys_linux_arm64.go | 38 +
.../net/internal/socket/zsys_linux_loong64.go | 39 +
.../x/net/internal/socket/zsys_linux_mips.go | 35 +
.../net/internal/socket/zsys_linux_mips64.go | 38 +
.../internal/socket/zsys_linux_mips64le.go | 38 +
.../net/internal/socket/zsys_linux_mipsle.go | 35 +
.../x/net/internal/socket/zsys_linux_ppc.go | 35 +
.../x/net/internal/socket/zsys_linux_ppc64.go | 38 +
.../net/internal/socket/zsys_linux_ppc64le.go | 38 +
.../net/internal/socket/zsys_linux_riscv64.go | 39 +
.../x/net/internal/socket/zsys_linux_s390x.go | 38 +
.../x/net/internal/socket/zsys_netbsd_386.go | 35 +
.../net/internal/socket/zsys_netbsd_amd64.go | 38 +
.../x/net/internal/socket/zsys_netbsd_arm.go | 35 +
.../net/internal/socket/zsys_netbsd_arm64.go | 38 +
.../x/net/internal/socket/zsys_openbsd_386.go | 30 +
.../net/internal/socket/zsys_openbsd_amd64.go | 32 +
.../x/net/internal/socket/zsys_openbsd_arm.go | 30 +
.../net/internal/socket/zsys_openbsd_arm64.go | 32 +
.../internal/socket/zsys_openbsd_mips64.go | 30 +
.../net/internal/socket/zsys_openbsd_ppc64.go | 30 +
.../internal/socket/zsys_openbsd_riscv64.go | 30 +
.../net/internal/socket/zsys_solaris_amd64.go | 32 +
.../x/net/internal/socket/zsys_zos_s390x.go | 28 +
vendor/golang.org/x/net/ipv4/batch.go | 194 +
vendor/golang.org/x/net/ipv4/control.go | 144 +
vendor/golang.org/x/net/ipv4/control_bsd.go | 43 +
.../golang.org/x/net/ipv4/control_pktinfo.go | 41 +
vendor/golang.org/x/net/ipv4/control_stub.go | 13 +
vendor/golang.org/x/net/ipv4/control_unix.go | 75 +
.../golang.org/x/net/ipv4/control_windows.go | 12 +
vendor/golang.org/x/net/ipv4/control_zos.go | 88 +
vendor/golang.org/x/net/ipv4/dgramopt.go | 264 +
vendor/golang.org/x/net/ipv4/doc.go | 240 +
vendor/golang.org/x/net/ipv4/endpoint.go | 186 +
vendor/golang.org/x/net/ipv4/genericopt.go | 55 +
vendor/golang.org/x/net/ipv4/header.go | 170 +
vendor/golang.org/x/net/ipv4/helper.go | 77 +
vendor/golang.org/x/net/ipv4/iana.go | 38 +
vendor/golang.org/x/net/ipv4/icmp.go | 57 +
vendor/golang.org/x/net/ipv4/icmp_linux.go | 25 +
vendor/golang.org/x/net/ipv4/icmp_stub.go | 25 +
vendor/golang.org/x/net/ipv4/packet.go | 117 +
vendor/golang.org/x/net/ipv4/payload.go | 23 +
vendor/golang.org/x/net/ipv4/payload_cmsg.go | 84 +
.../golang.org/x/net/ipv4/payload_nocmsg.go | 39 +
vendor/golang.org/x/net/ipv4/sockopt.go | 44 +
vendor/golang.org/x/net/ipv4/sockopt_posix.go | 71 +
vendor/golang.org/x/net/ipv4/sockopt_stub.go | 42 +
vendor/golang.org/x/net/ipv4/sys_aix.go | 43 +
vendor/golang.org/x/net/ipv4/sys_asmreq.go | 122 +
.../golang.org/x/net/ipv4/sys_asmreq_stub.go | 25 +
vendor/golang.org/x/net/ipv4/sys_asmreqn.go | 44 +
.../golang.org/x/net/ipv4/sys_asmreqn_stub.go | 21 +
vendor/golang.org/x/net/ipv4/sys_bpf.go | 24 +
vendor/golang.org/x/net/ipv4/sys_bpf_stub.go | 16 +
vendor/golang.org/x/net/ipv4/sys_bsd.go | 41 +
vendor/golang.org/x/net/ipv4/sys_darwin.go | 69 +
vendor/golang.org/x/net/ipv4/sys_dragonfly.go | 39 +
vendor/golang.org/x/net/ipv4/sys_freebsd.go | 80 +
vendor/golang.org/x/net/ipv4/sys_linux.go | 61 +
vendor/golang.org/x/net/ipv4/sys_solaris.go | 61 +
vendor/golang.org/x/net/ipv4/sys_ssmreq.go | 52 +
.../golang.org/x/net/ipv4/sys_ssmreq_stub.go | 21 +
vendor/golang.org/x/net/ipv4/sys_stub.go | 13 +
vendor/golang.org/x/net/ipv4/sys_windows.go | 44 +
vendor/golang.org/x/net/ipv4/sys_zos.go | 57 +
.../golang.org/x/net/ipv4/zsys_aix_ppc64.go | 16 +
vendor/golang.org/x/net/ipv4/zsys_darwin.go | 59 +
.../golang.org/x/net/ipv4/zsys_dragonfly.go | 13 +
.../golang.org/x/net/ipv4/zsys_freebsd_386.go | 52 +
.../x/net/ipv4/zsys_freebsd_amd64.go | 54 +
.../golang.org/x/net/ipv4/zsys_freebsd_arm.go | 54 +
.../x/net/ipv4/zsys_freebsd_arm64.go | 52 +
.../x/net/ipv4/zsys_freebsd_riscv64.go | 52 +
.../golang.org/x/net/ipv4/zsys_linux_386.go | 72 +
.../golang.org/x/net/ipv4/zsys_linux_amd64.go | 74 +
.../golang.org/x/net/ipv4/zsys_linux_arm.go | 72 +
.../golang.org/x/net/ipv4/zsys_linux_arm64.go | 74 +
.../x/net/ipv4/zsys_linux_loong64.go | 76 +
.../golang.org/x/net/ipv4/zsys_linux_mips.go | 72 +
.../x/net/ipv4/zsys_linux_mips64.go | 74 +
.../x/net/ipv4/zsys_linux_mips64le.go | 74 +
.../x/net/ipv4/zsys_linux_mipsle.go | 72 +
.../golang.org/x/net/ipv4/zsys_linux_ppc.go | 72 +
.../golang.org/x/net/ipv4/zsys_linux_ppc64.go | 74 +
.../x/net/ipv4/zsys_linux_ppc64le.go | 74 +
.../x/net/ipv4/zsys_linux_riscv64.go | 76 +
.../golang.org/x/net/ipv4/zsys_linux_s390x.go | 74 +
vendor/golang.org/x/net/ipv4/zsys_netbsd.go | 13 +
vendor/golang.org/x/net/ipv4/zsys_openbsd.go | 13 +
vendor/golang.org/x/net/ipv4/zsys_solaris.go | 57 +
.../golang.org/x/net/ipv4/zsys_zos_s390x.go | 56 +
vendor/golang.org/x/net/ipv6/batch.go | 116 +
vendor/golang.org/x/net/ipv6/control.go | 187 +
.../x/net/ipv6/control_rfc2292_unix.go | 51 +
.../x/net/ipv6/control_rfc3542_unix.go | 97 +
vendor/golang.org/x/net/ipv6/control_stub.go | 13 +
vendor/golang.org/x/net/ipv6/control_unix.go | 55 +
.../golang.org/x/net/ipv6/control_windows.go | 12 +
vendor/golang.org/x/net/ipv6/dgramopt.go | 301 +
vendor/golang.org/x/net/ipv6/doc.go | 239 +
vendor/golang.org/x/net/ipv6/endpoint.go | 127 +
vendor/golang.org/x/net/ipv6/genericopt.go | 56 +
vendor/golang.org/x/net/ipv6/header.go | 55 +
vendor/golang.org/x/net/ipv6/helper.go | 58 +
vendor/golang.org/x/net/ipv6/iana.go | 86 +
vendor/golang.org/x/net/ipv6/icmp.go | 60 +
vendor/golang.org/x/net/ipv6/icmp_bsd.go | 29 +
vendor/golang.org/x/net/ipv6/icmp_linux.go | 27 +
vendor/golang.org/x/net/ipv6/icmp_solaris.go | 27 +
vendor/golang.org/x/net/ipv6/icmp_stub.go | 23 +
vendor/golang.org/x/net/ipv6/icmp_windows.go | 22 +
vendor/golang.org/x/net/ipv6/icmp_zos.go | 29 +
vendor/golang.org/x/net/ipv6/payload.go | 23 +
vendor/golang.org/x/net/ipv6/payload_cmsg.go | 70 +
.../golang.org/x/net/ipv6/payload_nocmsg.go | 38 +
vendor/golang.org/x/net/ipv6/sockopt.go | 43 +
vendor/golang.org/x/net/ipv6/sockopt_posix.go | 89 +
vendor/golang.org/x/net/ipv6/sockopt_stub.go | 46 +
vendor/golang.org/x/net/ipv6/sys_aix.go | 79 +
vendor/golang.org/x/net/ipv6/sys_asmreq.go | 24 +
.../golang.org/x/net/ipv6/sys_asmreq_stub.go | 17 +
vendor/golang.org/x/net/ipv6/sys_bpf.go | 24 +
vendor/golang.org/x/net/ipv6/sys_bpf_stub.go | 16 +
vendor/golang.org/x/net/ipv6/sys_bsd.go | 59 +
vendor/golang.org/x/net/ipv6/sys_darwin.go | 80 +
vendor/golang.org/x/net/ipv6/sys_freebsd.go | 94 +
vendor/golang.org/x/net/ipv6/sys_linux.go | 76 +
vendor/golang.org/x/net/ipv6/sys_solaris.go | 76 +
vendor/golang.org/x/net/ipv6/sys_ssmreq.go | 54 +
.../golang.org/x/net/ipv6/sys_ssmreq_stub.go | 21 +
vendor/golang.org/x/net/ipv6/sys_stub.go | 13 +
vendor/golang.org/x/net/ipv6/sys_windows.go | 68 +
vendor/golang.org/x/net/ipv6/sys_zos.go | 72 +
.../golang.org/x/net/ipv6/zsys_aix_ppc64.go | 68 +
vendor/golang.org/x/net/ipv6/zsys_darwin.go | 64 +
.../golang.org/x/net/ipv6/zsys_dragonfly.go | 42 +
.../golang.org/x/net/ipv6/zsys_freebsd_386.go | 64 +
.../x/net/ipv6/zsys_freebsd_amd64.go | 66 +
.../golang.org/x/net/ipv6/zsys_freebsd_arm.go | 66 +
.../x/net/ipv6/zsys_freebsd_arm64.go | 64 +
.../x/net/ipv6/zsys_freebsd_riscv64.go | 64 +
.../golang.org/x/net/ipv6/zsys_linux_386.go | 72 +
.../golang.org/x/net/ipv6/zsys_linux_amd64.go | 74 +
.../golang.org/x/net/ipv6/zsys_linux_arm.go | 72 +
.../golang.org/x/net/ipv6/zsys_linux_arm64.go | 74 +
.../x/net/ipv6/zsys_linux_loong64.go | 76 +
.../golang.org/x/net/ipv6/zsys_linux_mips.go | 72 +
.../x/net/ipv6/zsys_linux_mips64.go | 74 +
.../x/net/ipv6/zsys_linux_mips64le.go | 74 +
.../x/net/ipv6/zsys_linux_mipsle.go | 72 +
.../golang.org/x/net/ipv6/zsys_linux_ppc.go | 72 +
.../golang.org/x/net/ipv6/zsys_linux_ppc64.go | 74 +
.../x/net/ipv6/zsys_linux_ppc64le.go | 74 +
.../x/net/ipv6/zsys_linux_riscv64.go | 76 +
.../golang.org/x/net/ipv6/zsys_linux_s390x.go | 74 +
vendor/golang.org/x/net/ipv6/zsys_netbsd.go | 42 +
vendor/golang.org/x/net/ipv6/zsys_openbsd.go | 42 +
vendor/golang.org/x/net/ipv6/zsys_solaris.go | 63 +
.../golang.org/x/net/ipv6/zsys_zos_s390x.go | 62 +
vendor/golang.org/x/sync/errgroup/errgroup.go | 2 +-
.../golang.org/x/sys/unix/affinity_linux.go | 128 +-
vendor/golang.org/x/sys/unix/mkall.sh | 2 +-
vendor/golang.org/x/sys/unix/mkerrors.sh | 3 +
vendor/golang.org/x/sys/unix/readv_unix.go | 103 +
.../golang.org/x/sys/unix/syscall_darwin.go | 89 -
vendor/golang.org/x/sys/unix/syscall_linux.go | 114 +-
.../x/sys/unix/syscall_linux_arm.go | 3 +
.../x/sys/unix/syscall_linux_arm64.go | 3 +
.../x/sys/unix/syscall_linux_loong64.go | 3 +
.../x/sys/unix/syscall_linux_riscv64.go | 3 +
.../golang.org/x/sys/unix/syscall_openbsd.go | 4 +
vendor/golang.org/x/sys/unix/zerrors_linux.go | 61 +-
.../x/sys/unix/zerrors_linux_386.go | 7 +-
.../x/sys/unix/zerrors_linux_amd64.go | 7 +-
.../x/sys/unix/zerrors_linux_arm.go | 7 +-
.../x/sys/unix/zerrors_linux_arm64.go | 7 +-
.../x/sys/unix/zerrors_linux_loong64.go | 7 +-
.../x/sys/unix/zerrors_linux_mips.go | 7 +-
.../x/sys/unix/zerrors_linux_mips64.go | 7 +-
.../x/sys/unix/zerrors_linux_mips64le.go | 7 +-
.../x/sys/unix/zerrors_linux_mipsle.go | 7 +-
.../x/sys/unix/zerrors_linux_ppc.go | 7 +-
.../x/sys/unix/zerrors_linux_ppc64.go | 7 +-
.../x/sys/unix/zerrors_linux_ppc64le.go | 7 +-
.../x/sys/unix/zerrors_linux_riscv64.go | 1114 +-
.../x/sys/unix/zerrors_linux_s390x.go | 7 +-
.../x/sys/unix/zerrors_linux_sparc64.go | 7 +-
.../golang.org/x/sys/unix/zsyscall_linux.go | 12 +-
.../x/sys/unix/zsyscall_openbsd_386.go | 84 +
.../x/sys/unix/zsyscall_openbsd_386.s | 20 +
.../x/sys/unix/zsyscall_openbsd_amd64.go | 84 +
.../x/sys/unix/zsyscall_openbsd_amd64.s | 20 +
.../x/sys/unix/zsyscall_openbsd_arm.go | 84 +
.../x/sys/unix/zsyscall_openbsd_arm.s | 20 +
.../x/sys/unix/zsyscall_openbsd_arm64.go | 84 +
.../x/sys/unix/zsyscall_openbsd_arm64.s | 20 +
.../x/sys/unix/zsyscall_openbsd_mips64.go | 84 +
.../x/sys/unix/zsyscall_openbsd_mips64.s | 20 +
.../x/sys/unix/zsyscall_openbsd_ppc64.go | 84 +
.../x/sys/unix/zsyscall_openbsd_ppc64.s | 24 +
.../x/sys/unix/zsyscall_openbsd_riscv64.go | 84 +
.../x/sys/unix/zsyscall_openbsd_riscv64.s | 20 +
.../x/sys/unix/zsysnum_linux_386.go | 4 +
.../x/sys/unix/zsysnum_linux_amd64.go | 5 +
.../x/sys/unix/zsysnum_linux_arm.go | 4 +
.../x/sys/unix/zsysnum_linux_arm64.go | 4 +
.../x/sys/unix/zsysnum_linux_loong64.go | 5 +
.../x/sys/unix/zsysnum_linux_mips.go | 4 +
.../x/sys/unix/zsysnum_linux_mips64.go | 4 +
.../x/sys/unix/zsysnum_linux_mips64le.go | 4 +
.../x/sys/unix/zsysnum_linux_mipsle.go | 4 +
.../x/sys/unix/zsysnum_linux_ppc.go | 4 +
.../x/sys/unix/zsysnum_linux_ppc64.go | 4 +
.../x/sys/unix/zsysnum_linux_ppc64le.go | 4 +
.../x/sys/unix/zsysnum_linux_riscv64.go | 4 +
.../x/sys/unix/zsysnum_linux_s390x.go | 4 +
.../x/sys/unix/zsysnum_linux_sparc64.go | 5 +
vendor/golang.org/x/sys/unix/ztypes_linux.go | 123 +-
.../golang.org/x/sys/unix/ztypes_linux_386.go | 12 +
.../x/sys/unix/ztypes_linux_amd64.go | 12 +
.../golang.org/x/sys/unix/ztypes_linux_arm.go | 12 +
.../x/sys/unix/ztypes_linux_arm64.go | 12 +
.../x/sys/unix/ztypes_linux_loong64.go | 12 +
.../x/sys/unix/ztypes_linux_mips.go | 12 +
.../x/sys/unix/ztypes_linux_mips64.go | 12 +
.../x/sys/unix/ztypes_linux_mips64le.go | 12 +
.../x/sys/unix/ztypes_linux_mipsle.go | 12 +
.../golang.org/x/sys/unix/ztypes_linux_ppc.go | 12 +
.../x/sys/unix/ztypes_linux_ppc64.go | 12 +
.../x/sys/unix/ztypes_linux_ppc64le.go | 12 +
.../x/sys/unix/ztypes_linux_riscv64.go | 12 +
.../x/sys/unix/ztypes_linux_s390x.go | 12 +
.../x/sys/unix/ztypes_linux_sparc64.go | 12 +
.../x/sys/windows/syscall_windows.go | 16 +-
.../golang.org/x/sys/windows/types_windows.go | 33 +-
.../x/sys/windows/zsyscall_windows.go | 71 +
vendor/golang.org/x/tools/LICENSE | 27 +
vendor/golang.org/x/tools/PATENTS | 22 +
vendor/golang.org/x/tools/go/ast/edge/edge.go | 299 +
.../x/tools/go/ast/inspector/cursor.go | 551 +
.../x/tools/go/ast/inspector/inspector.go | 311 +
.../x/tools/go/ast/inspector/iter.go | 113 +
.../x/tools/go/ast/inspector/typeof.go | 227 +
.../x/tools/go/ast/inspector/walk.go | 341 +
.../x/tools/go/gcexportdata/gcexportdata.go | 236 +
.../x/tools/go/gcexportdata/importer.go | 75 +
vendor/golang.org/x/tools/go/packages/doc.go | 253 +
.../x/tools/go/packages/external.go | 153 +
.../golang.org/x/tools/go/packages/golist.go | 1126 +
.../x/tools/go/packages/golist_overlay.go | 83 +
.../x/tools/go/packages/loadmode_string.go | 56 +
.../x/tools/go/packages/packages.go | 1605 +
.../golang.org/x/tools/go/packages/visit.go | 133 +
.../x/tools/go/types/objectpath/objectpath.go | 945 +
.../x/tools/go/types/typeutil/callee.go | 86 +
.../x/tools/go/types/typeutil/imports.go | 30 +
.../x/tools/go/types/typeutil/map.go | 459 +
.../tools/go/types/typeutil/methodsetcache.go | 71 +
.../x/tools/go/types/typeutil/ui.go | 53 +
.../x/tools/internal/aliases/aliases.go | 18 +
.../x/tools/internal/event/core/event.go | 95 +
.../x/tools/internal/event/core/export.go | 67 +
.../x/tools/internal/event/core/fast.go | 77 +
.../golang.org/x/tools/internal/event/doc.go | 7 +
.../x/tools/internal/event/event.go | 127 +
.../x/tools/internal/event/keys/keys.go | 237 +
.../x/tools/internal/event/keys/standard.go | 22 +
.../x/tools/internal/event/keys/util.go | 21 +
.../x/tools/internal/event/label/label.go | 203 +
.../x/tools/internal/gcimporter/bimport.go | 89 +
.../x/tools/internal/gcimporter/exportdata.go | 421 +
.../x/tools/internal/gcimporter/gcimporter.go | 108 +
.../x/tools/internal/gcimporter/iexport.go | 1605 +
.../x/tools/internal/gcimporter/iimport.go | 1122 +
.../tools/internal/gcimporter/predeclared.go | 91 +
.../x/tools/internal/gcimporter/support.go | 30 +
.../x/tools/internal/gcimporter/ureader.go | 813 +
.../x/tools/internal/gocommand/invoke.go | 567 +
.../internal/gocommand/invoke_notunix.go | 13 +
.../x/tools/internal/gocommand/invoke_unix.go | 13 +
.../x/tools/internal/gocommand/vendor.go | 163 +
.../x/tools/internal/gocommand/version.go | 75 +
.../internal/packagesinternal/packages.go | 23 +
.../x/tools/internal/pkgbits/codes.go | 77 +
.../x/tools/internal/pkgbits/decoder.go | 519 +
.../x/tools/internal/pkgbits/doc.go | 32 +
.../x/tools/internal/pkgbits/encoder.go | 392 +
.../x/tools/internal/pkgbits/flags.go | 9 +
.../x/tools/internal/pkgbits/reloc.go | 42 +
.../x/tools/internal/pkgbits/support.go | 17 +
.../x/tools/internal/pkgbits/sync.go | 136 +
.../internal/pkgbits/syncmarker_string.go | 92 +
.../x/tools/internal/pkgbits/version.go | 102 +
.../x/tools/internal/stdlib/deps.go | 527 +
.../x/tools/internal/stdlib/import.go | 97 +
.../x/tools/internal/stdlib/manifest.go | 18328 ++++
.../x/tools/internal/stdlib/stdlib.go | 105 +
.../x/tools/internal/typeparams/common.go | 68 +
.../x/tools/internal/typeparams/coretype.go | 157 +
.../x/tools/internal/typeparams/free.go | 129 +
.../x/tools/internal/typeparams/normalize.go | 216 +
.../x/tools/internal/typeparams/termlist.go | 169 +
.../x/tools/internal/typeparams/typeterm.go | 172 +
.../internal/typesinternal/classify_call.go | 137 +
.../x/tools/internal/typesinternal/element.go | 137 +
.../tools/internal/typesinternal/errorcode.go | 1560 +
.../typesinternal/errorcode_string.go | 179 +
.../x/tools/internal/typesinternal/fx.go | 88 +
.../x/tools/internal/typesinternal/isnamed.go | 71 +
.../tools/internal/typesinternal/qualifier.go | 54 +
.../x/tools/internal/typesinternal/recv.go | 44 +
.../x/tools/internal/typesinternal/toonew.go | 89 +
.../x/tools/internal/typesinternal/types.go | 272 +
.../x/tools/internal/typesinternal/varkind.go | 23 +
.../internal/typesinternal/varkind_go124.go | 39 +
.../tools/internal/typesinternal/zerovalue.go | 381 +
.../x/tools/internal/versions/features.go | 49 +
.../x/tools/internal/versions/gover.go | 172 +
.../x/tools/internal/versions/types.go | 33 +
.../x/tools/internal/versions/versions.go | 57 +
vendor/google.golang.org/grpc/clientconn.go | 48 +-
.../grpc/experimental/stats/metrics.go | 17 +
.../grpc/internal/envconfig/envconfig.go | 10 +
.../grpc/internal/envconfig/xds.go | 10 +
.../grpc/internal/mem/buffer_pool.go | 27 +-
.../grpc/internal/resolver/config_selector.go | 6 +
.../grpc/internal/transport/http2_client.go | 18 +-
.../grpc/internal/transport/http_util.go | 54 +-
.../transport/readyreader/raw_conn_linux.go | 39 +
.../readyreader/raw_conn_nonlinux.go | 35 +
.../transport/readyreader/ready_reader.go | 253 +
.../grpc/internal/transport/transport.go | 17 +
.../grpc/mem/buffer_slice.go | 2 +-
vendor/google.golang.org/grpc/mem/buffers.go | 40 +
vendor/google.golang.org/grpc/stream.go | 3 +-
vendor/google.golang.org/grpc/version.go | 2 +-
.../encoding/protodelim/protodelim.go | 9 +-
.../protobuf/encoding/protojson/decode.go | 12 +
.../encoding/protojson/well_known_types.go | 5 +-
.../protobuf/encoding/prototext/decode.go | 18 +
.../protobuf/internal/descfmt/stringer.go | 269 +-
.../protobuf/internal/version/version.go | 2 +-
.../k8s.io/api/admission/v1/generated.proto | 7 +
.../admission/v1/generated.protomessage.pb.go | 28 -
vendor/k8s.io/api/admission/v1/types.go | 7 +
.../admissionregistration/v1/generated.pb.go | 4760 +-
.../admissionregistration/v1/generated.proto | 450 +-
.../v1/generated.protomessage.pb.go | 76 -
.../api/admissionregistration/v1/register.go | 4 +
.../api/admissionregistration/v1/types.go | 478 +-
.../v1/types_swagger_doc_generated.go | 239 +-
.../v1/zz_generated.deepcopy.go | 252 +
.../v1/zz_generated.model_name.go | 45 +
.../v1/zz_generated.prerelease-lifecycle.go | 24 +
.../v1alpha1/generated.proto | 89 +-
.../v1alpha1/generated.protomessage.pb.go | 74 -
.../admissionregistration/v1alpha1/types.go | 85 +-
.../v1alpha1/types_swagger_doc_generated.go | 80 +-
.../v1beta1/generated.proto | 155 +-
.../v1beta1/generated.protomessage.pb.go | 90 -
.../admissionregistration/v1beta1/types.go | 159 +-
.../v1beta1/types_swagger_doc_generated.go | 148 +-
.../zz_generated.prerelease-lifecycle.go | 24 +
.../api/apidiscovery/v2/generated.proto | 2 +-
.../v2/generated.protomessage.pb.go | 32 -
vendor/k8s.io/api/apidiscovery/v2/types.go | 2 +-
.../api/apidiscovery/v2beta1/generated.proto | 2 +-
.../k8s.io/api/apidiscovery/v2beta1/types.go | 2 +-
.../v1alpha1/generated.proto | 41 +-
.../v1alpha1/generated.protomessage.pb.go | 34 -
.../api/apiserverinternal/v1alpha1/types.go | 41 +-
.../v1alpha1/types_swagger_doc_generated.go | 32 +-
.../api/apps/v1/generated.protomessage.pb.go | 82 -
.../k8s.io/api/apps/v1beta1/generated.proto | 4 +-
.../apps/v1beta1/generated.protomessage.pb.go | 68 -
vendor/k8s.io/api/apps/v1beta1/types.go | 6 +-
.../k8s.io/api/apps/v1beta2/generated.proto | 4 +-
.../apps/v1beta2/generated.protomessage.pb.go | 88 -
vendor/k8s.io/api/apps/v1beta2/types.go | 6 +-
.../api/authentication/v1/generated.proto | 64 +-
.../v1/generated.protomessage.pb.go | 44 -
vendor/k8s.io/api/authentication/v1/types.go | 64 +-
.../v1/types_swagger_doc_generated.go | 56 +-
.../authentication/v1alpha1/generated.proto | 7 +-
.../v1alpha1/generated.protomessage.pb.go | 26 -
.../api/authentication/v1alpha1/types.go | 7 +-
.../v1alpha1/types_swagger_doc_generated.go | 6 +-
.../authentication/v1beta1/generated.proto | 36 +-
.../v1beta1/generated.protomessage.pb.go | 36 -
.../api/authentication/v1beta1/types.go | 36 +-
.../v1beta1/types_swagger_doc_generated.go | 32 +-
.../api/authorization/v1/generated.proto | 96 +-
.../v1/generated.protomessage.pb.go | 54 -
vendor/k8s.io/api/authorization/v1/types.go | 96 +-
.../v1/types_swagger_doc_generated.go | 92 +-
.../api/authorization/v1beta1/generated.proto | 96 +-
.../v1beta1/generated.protomessage.pb.go | 50 -
.../k8s.io/api/authorization/v1beta1/types.go | 96 +-
.../v1beta1/types_swagger_doc_generated.go | 92 +-
.../k8s.io/api/autoscaling/v1/generated.proto | 12 +-
.../v1/generated.protomessage.pb.go | 64 -
vendor/k8s.io/api/autoscaling/v1/types.go | 16 +-
.../k8s.io/api/autoscaling/v2/generated.proto | 8 +-
.../v2/generated.protomessage.pb.go | 70 -
vendor/k8s.io/api/autoscaling/v2/types.go | 10 +-
vendor/k8s.io/api/autoscaling/v2beta1/doc.go | 23 -
.../api/autoscaling/v2beta1/generated.pb.go | 5106 --
.../api/autoscaling/v2beta1/generated.proto | 474 -
.../v2beta1/generated.protomessage.pb.go | 58 -
.../api/autoscaling/v2beta1/register.go | 52 -
.../k8s.io/api/autoscaling/v2beta1/types.go | 486 -
.../v2beta1/types_swagger_doc_generated.go | 247 -
.../v2beta1/zz_generated.deepcopy.go | 525 -
.../v2beta1/zz_generated.model_name.go | 112 -
.../zz_generated.prerelease-lifecycle.go | 74 -
vendor/k8s.io/api/autoscaling/v2beta2/doc.go | 23 -
.../api/autoscaling/v2beta2/generated.pb.go | 5817 --
.../api/autoscaling/v2beta2/generated.proto | 493 -
.../v2beta2/generated.protomessage.pb.go | 70 -
.../api/autoscaling/v2beta2/register.go | 50 -
.../k8s.io/api/autoscaling/v2beta2/types.go | 578 -
.../v2beta2/types_swagger_doc_generated.go | 297 -
.../v2beta2/zz_generated.deepcopy.go | 610 -
.../v2beta2/zz_generated.model_name.go | 142 -
.../zz_generated.prerelease-lifecycle.go | 68 -
vendor/k8s.io/api/batch/v1/generated.proto | 4 +-
.../api/batch/v1/generated.protomessage.pb.go | 56 -
vendor/k8s.io/api/batch/v1/types.go | 4 +-
.../k8s.io/api/batch/v1beta1/generated.proto | 4 +-
.../v1beta1/generated.protomessage.pb.go | 32 -
vendor/k8s.io/api/batch/v1beta1/types.go | 4 +-
.../api/certificates/v1/generated.proto | 16 +-
.../v1/generated.protomessage.pb.go | 34 -
vendor/k8s.io/api/certificates/v1/types.go | 16 +-
.../v1alpha1/generated.protomessage.pb.go | 28 -
.../api/certificates/v1beta1/generated.pb.go | 46 +
.../api/certificates/v1beta1/generated.proto | 60 +-
.../v1beta1/generated.protomessage.pb.go | 48 -
.../k8s.io/api/certificates/v1beta1/types.go | 62 +-
.../v1beta1/types_swagger_doc_generated.go | 5 +-
.../v1beta1/zz_generated.deepcopy.go | 5 +
.../zz_generated.prerelease-lifecycle.go | 8 +-
.../v1/generated.protomessage.pb.go | 28 -
.../api/coordination/v1alpha2/generated.proto | 2 +-
.../v1alpha2/generated.protomessage.pb.go | 28 -
.../k8s.io/api/coordination/v1alpha2/types.go | 2 +-
.../api/coordination/v1beta1/generated.proto | 2 +-
.../v1beta1/generated.protomessage.pb.go | 34 -
.../k8s.io/api/coordination/v1beta1/types.go | 2 +-
vendor/k8s.io/api/core/v1/generated.pb.go | 1697 +-
vendor/k8s.io/api/core/v1/generated.proto | 179 +-
.../api/core/v1/generated.protomessage.pb.go | 498 -
vendor/k8s.io/api/core/v1/types.go | 189 +-
.../core/v1/types_swagger_doc_generated.go | 114 +-
.../api/core/v1/zz_generated.deepcopy.go | 132 +-
.../api/core/v1/zz_generated.model_name.go | 25 +-
.../k8s.io/api/discovery/v1/generated.proto | 8 +
.../discovery/v1/generated.protomessage.pb.go | 38 -
vendor/k8s.io/api/discovery/v1/types.go | 9 +
.../api/discovery/v1beta1/generated.proto | 7 +
.../v1beta1/generated.protomessage.pb.go | 38 -
vendor/k8s.io/api/discovery/v1beta1/types.go | 9 +
.../events/v1/generated.protomessage.pb.go | 28 -
.../v1beta1/generated.protomessage.pb.go | 28 -
.../api/extensions/v1beta1/generated.proto | 11 +-
.../v1beta1/generated.protomessage.pb.go | 112 -
vendor/k8s.io/api/extensions/v1beta1/types.go | 13 +-
.../v1beta1/zz_generated.validations.go | 193 +-
.../k8s.io/api/flowcontrol/v1/generated.proto | 13 +
.../v1/generated.protomessage.pb.go | 68 -
vendor/k8s.io/api/flowcontrol/v1/types.go | 13 +
.../api/flowcontrol/v1beta1/generated.proto | 13 +
.../v1beta1/generated.protomessage.pb.go | 68 -
.../k8s.io/api/flowcontrol/v1beta1/types.go | 13 +
.../api/flowcontrol/v1beta2/generated.proto | 13 +
.../v1beta2/generated.protomessage.pb.go | 68 -
.../k8s.io/api/flowcontrol/v1beta2/types.go | 13 +
.../api/flowcontrol/v1beta3/generated.proto | 13 +
.../v1beta3/generated.protomessage.pb.go | 68 -
.../k8s.io/api/flowcontrol/v1beta3/types.go | 13 +
.../api/imagepolicy/v1alpha1/generated.proto | 2 +
.../v1alpha1/generated.protomessage.pb.go | 30 -
.../k8s.io/api/imagepolicy/v1alpha1/types.go | 2 +
.../k8s.io/api/networking/v1/generated.proto | 18 +-
.../v1/generated.protomessage.pb.go | 92 -
vendor/k8s.io/api/networking/v1/types.go | 18 +-
.../api/networking/v1beta1/generated.proto | 11 +-
.../v1beta1/generated.protomessage.pb.go | 72 -
vendor/k8s.io/api/networking/v1beta1/types.go | 11 +-
vendor/k8s.io/api/node/v1/generated.proto | 4 +
.../api/node/v1/generated.protomessage.pb.go | 30 -
vendor/k8s.io/api/node/v1/types.go | 4 +
.../k8s.io/api/node/v1alpha1/generated.proto | 5 +
.../v1alpha1/generated.protomessage.pb.go | 32 -
vendor/k8s.io/api/node/v1alpha1/types.go | 5 +
.../k8s.io/api/node/v1beta1/generated.proto | 4 +
.../node/v1beta1/generated.protomessage.pb.go | 30 -
vendor/k8s.io/api/node/v1beta1/types.go | 4 +
vendor/k8s.io/api/policy/v1/generated.proto | 4 +
.../policy/v1/generated.protomessage.pb.go | 32 -
vendor/k8s.io/api/policy/v1/types.go | 4 +
.../k8s.io/api/policy/v1beta1/generated.proto | 4 +
.../v1beta1/generated.protomessage.pb.go | 32 -
vendor/k8s.io/api/policy/v1beta1/types.go | 4 +
vendor/k8s.io/api/rbac/v1/generated.proto | 15 +-
.../api/rbac/v1/generated.protomessage.pb.go | 46 -
vendor/k8s.io/api/rbac/v1/types.go | 15 +-
.../k8s.io/api/rbac/v1alpha1/generated.proto | 15 +-
.../v1alpha1/generated.protomessage.pb.go | 46 -
vendor/k8s.io/api/rbac/v1alpha1/types.go | 15 +-
.../k8s.io/api/rbac/v1beta1/generated.proto | 15 +-
.../rbac/v1beta1/generated.protomessage.pb.go | 46 -
vendor/k8s.io/api/rbac/v1beta1/types.go | 15 +-
vendor/k8s.io/api/resource/v1/generated.pb.go | 641 +
vendor/k8s.io/api/resource/v1/generated.proto | 405 +-
.../resource/v1/generated.protomessage.pb.go | 108 -
vendor/k8s.io/api/resource/v1/types.go | 450 +-
.../v1/types_swagger_doc_generated.go | 89 +-
.../api/resource/v1/zz_generated.deepcopy.go | 53 +
.../resource/v1/zz_generated.model_name.go | 5 +
.../api/resource/v1alpha3/generated.pb.go | 1762 +-
.../api/resource/v1alpha3/generated.proto | 220 +-
.../v1alpha3/generated.protomessage.pb.go | 38 -
.../k8s.io/api/resource/v1alpha3/register.go | 2 +
vendor/k8s.io/api/resource/v1alpha3/types.go | 244 +-
.../v1alpha3/types_swagger_doc_generated.go | 63 +-
.../v1alpha3/zz_generated.deepcopy.go | 177 +
.../v1alpha3/zz_generated.model_name.go | 25 +
.../zz_generated.prerelease-lifecycle.go | 36 +
.../api/resource/v1beta1/generated.pb.go | 641 +
.../api/resource/v1beta1/generated.proto | 384 +-
.../v1beta1/generated.protomessage.pb.go | 108 -
vendor/k8s.io/api/resource/v1beta1/types.go | 411 +-
.../v1beta1/types_swagger_doc_generated.go | 75 +-
.../resource/v1beta1/zz_generated.deepcopy.go | 53 +
.../v1beta1/zz_generated.model_name.go | 5 +
.../api/resource/v1beta2/generated.pb.go | 2038 +-
.../api/resource/v1beta2/generated.proto | 496 +-
.../v1beta2/generated.protomessage.pb.go | 108 -
.../k8s.io/api/resource/v1beta2/register.go | 2 +
vendor/k8s.io/api/resource/v1beta2/types.go | 564 +-
.../v1beta2/types_swagger_doc_generated.go | 128 +-
.../resource/v1beta2/zz_generated.deepcopy.go | 190 +
.../v1beta2/zz_generated.model_name.go | 30 +
.../zz_generated.prerelease-lifecycle.go | 36 +
.../k8s.io/api/scheduling/v1/generated.proto | 1 +
.../v1/generated.protomessage.pb.go | 26 -
vendor/k8s.io/api/scheduling/v1/types.go | 1 +
.../api/scheduling/v1alpha1/generated.pb.go | 2010 -
.../api/scheduling/v1alpha1/generated.proto | 190 -
.../v1alpha1/generated.protomessage.pb.go | 42 -
.../k8s.io/api/scheduling/v1alpha1/types.go | 201 -
.../v1alpha1/types_swagger_doc_generated.go | 131 -
.../v1alpha1/zz_generated.deepcopy.go | 270 -
.../v1alpha1/zz_generated.model_name.go | 72 -
.../scheduling/{v1alpha1 => v1alpha2}/doc.go | 6 +-
.../api/scheduling/v1alpha2/generated.pb.go | 3828 +
.../api/scheduling/v1alpha2/generated.proto | 550 +
.../{v1alpha1 => v1alpha2}/register.go | 13 +-
.../k8s.io/api/scheduling/v1alpha2/types.go | 601 +
.../v1alpha2/types_swagger_doc_generated.go | 217 +
.../v1alpha2/zz_generated.deepcopy.go | 484 +
.../v1alpha2/zz_generated.model_name.go | 112 +
.../api/scheduling/v1beta1/generated.proto | 1 +
.../v1beta1/generated.protomessage.pb.go | 26 -
vendor/k8s.io/api/scheduling/v1beta1/types.go | 1 +
vendor/k8s.io/api/storage/v1/generated.pb.go | 35 +
vendor/k8s.io/api/storage/v1/generated.proto | 40 +-
.../storage/v1/generated.protomessage.pb.go | 64 -
vendor/k8s.io/api/storage/v1/types.go | 41 +-
.../storage/v1/types_swagger_doc_generated.go | 5 +-
.../api/storage/v1/zz_generated.deepcopy.go | 5 +
.../api/storage/v1alpha1/generated.proto | 6 +
.../v1alpha1/generated.protomessage.pb.go | 42 -
vendor/k8s.io/api/storage/v1alpha1/types.go | 7 +
.../api/storage/v1beta1/generated.pb.go | 35 +
.../api/storage/v1beta1/generated.proto | 36 +-
.../v1beta1/generated.protomessage.pb.go | 64 -
vendor/k8s.io/api/storage/v1beta1/types.go | 37 +-
.../v1beta1/types_swagger_doc_generated.go | 1 +
.../storage/v1beta1/zz_generated.deepcopy.go | 5 +
.../v1beta1/generated.protomessage.pb.go | 30 -
.../v1/generated.protomessage.pb.go | 76 -
.../pkg/apis/apiextensions/v1/types.go | 3 +
.../v1beta1/generated.protomessage.pb.go | 74 -
.../apimachinery/pkg/api/equality/semantic.go | 3 +
.../api/resource/generated.protomessage.pb.go | 26 -
.../pkg/api/validate/content/errors.go | 6 +
.../pkg/api/validate/content/path.go | 63 +
.../pkg/api/validate/discriminator.go | 71 +
.../apimachinery/pkg/api/validate/limits.go | 85 +-
.../apimachinery/pkg/api/validate/strfmt.go | 17 +
.../apimachinery/pkg/api/validate/union.go | 4 +-
.../pkg/api/validation/objectmeta.go | 2 +-
.../apis/meta/internalversion/conversion.go} | 24 +-
.../pkg/apis/meta/internalversion/types.go | 5 +
.../zz_generated.conversion.go | 16 +-
.../apimachinery/pkg/apis/meta/v1/fieldsv1.go | 170 +
.../pkg/apis/meta/v1/fieldsv1_byte.go | 105 +
.../pkg/apis/meta/v1/fieldsv1_string.go | 113 +
.../pkg/apis/meta/v1/generated.pb.go | 353 +-
.../pkg/apis/meta/v1/generated.proto | 56 +
.../apis/meta/v1/generated.protomessage.pb.go | 112 -
.../apimachinery/pkg/apis/meta/v1/helpers.go | 27 +-
.../apimachinery/pkg/apis/meta/v1/meta.go | 9 +
.../pkg/apis/meta/v1/micro_time_fuzz.go | 1 -
.../pkg/apis/meta/v1/time_fuzz.go | 1 -
.../apimachinery/pkg/apis/meta/v1/types.go | 73 +-
.../meta/v1/types_swagger_doc_generated.go | 19 +-
.../apis/meta/v1/zz_generated.conversion.go | 7 +
.../pkg/apis/meta/v1/zz_generated.deepcopy.go | 45 +-
.../apis/meta/v1/zz_generated.model_name.go | 5 +
.../meta/v1beta1/generated.protomessage.pb.go | 24 -
.../pkg/runtime/generated.protomessage.pb.go | 28 -
.../schema/generated.protomessage.pb.go | 22 -
.../serializer/cbor/internal/modes/decode.go | 18 +-
.../pkg/runtime/serializer/cbor/raw.go | 4 +-
.../k8s.io/apimachinery/pkg/util/diff/cmp.go | 31 -
.../k8s.io/apimachinery/pkg/util/diff/diff.go | 5 +-
.../apimachinery/pkg/util/diff/legacy_diff.go | 2 +-
.../apimachinery/pkg/util/httpstream/doc.go | 5 +-
.../pkg/util/httpstream/spdy}/doc.go | 10 +-
.../pkg/util/httpstream/spdy/spdy.go | 236 +
.../util/intstr/generated.protomessage.pb.go | 24 -
.../pkg/util/intstr/instr_fuzz.go | 1 -
.../pkg/util/managedfields/extract.go | 3 +-
.../pkg/util/managedfields/internal/fields.go | 7 +-
.../apimachinery/pkg/util/mergepatch/util.go | 2 +-
.../k8s.io/apimachinery/pkg/util/net/http.go | 5 +
.../apimachinery/pkg/util/net/interface.go | 112 +-
.../apimachinery/pkg/util/proxy/dial.go | 122 -
.../apimachinery/pkg/util/proxy/transport.go | 272 -
.../pkg/util/proxy/upgradeaware.go | 558 -
.../apimachinery/pkg/util/runtime/runtime.go | 33 +-
.../pkg/util/strategicpatch/patch.go | 8 +-
.../util/validation/field/error_matcher.go | 40 +-
.../pkg/util/validation/field/errors.go | 232 +-
.../apimachinery/pkg/util/validation/ip.go | 4 +-
.../third_party/forked/golang/netutil/addr.go | 28 -
.../forked/golang/reflect/deep_equal.go | 4 +-
.../configmap_cafile_content.go | 2 +-
.../dynamic_cafile_content.go | 2 +-
.../dynamic_serving_content.go | 2 +-
.../v1/applyconfiguration.go | 81 +
.../v1/expressionwarning.go | 4 +-
.../admissionregistration/v1/jsonpatch.go | 105 +
.../v1/matchcondition.go | 4 +-
.../v1/matchresources.go | 8 +-
.../v1/mutatingadmissionpolicy.go | 274 +
.../v1/mutatingadmissionpolicybinding.go | 284 +
.../v1/mutatingadmissionpolicybindingspec.go | 75 +
.../v1/mutatingadmissionpolicyspec.go | 172 +
.../v1/mutatingwebhook.go | 20 +-
.../v1/mutatingwebhookconfiguration.go | 4 +-
.../admissionregistration/v1/mutation.go | 72 +
.../v1/namedrulewithoperations.go | 2 +-
.../admissionregistration/v1/paramkind.go | 4 +-
.../admissionregistration/v1/paramref.go | 2 +-
.../admissionregistration/v1/rule.go | 6 +-
.../v1/rulewithoperations.go | 2 +-
.../v1/servicereference.go | 8 +-
.../admissionregistration/v1/typechecking.go | 2 +-
.../v1/validatingadmissionpolicy.go | 6 +-
.../v1/validatingadmissionpolicybinding.go | 4 +-
.../validatingadmissionpolicybindingspec.go | 4 +-
.../v1/validatingadmissionpolicyspec.go | 10 +-
.../v1/validatingadmissionpolicystatus.go | 6 +-
.../v1/validatingwebhook.go | 20 +-
.../v1/validatingwebhookconfiguration.go | 4 +-
.../admissionregistration/v1/validation.go | 6 +-
.../admissionregistration/v1/variable.go | 4 +-
.../v1/webhookclientconfig.go | 6 +-
.../v1alpha1/expressionwarning.go | 4 +-
.../v1alpha1/matchcondition.go | 4 +-
.../v1alpha1/matchresources.go | 8 +-
.../v1alpha1/mutatingadmissionpolicy.go | 4 +-
.../mutatingadmissionpolicybinding.go | 4 +-
.../v1alpha1/namedrulewithoperations.go | 2 +-
.../v1alpha1/paramkind.go | 4 +-
.../v1alpha1/paramref.go | 4 +-
.../v1alpha1/typechecking.go | 2 +-
.../v1alpha1/validatingadmissionpolicy.go | 6 +-
.../validatingadmissionpolicybinding.go | 4 +-
.../validatingadmissionpolicybindingspec.go | 4 +-
.../v1alpha1/validatingadmissionpolicyspec.go | 10 +-
.../validatingadmissionpolicystatus.go | 6 +-
.../v1alpha1/validation.go | 6 +-
.../v1alpha1/variable.go | 4 +-
.../v1beta1/expressionwarning.go | 4 +-
.../v1beta1/matchcondition.go | 4 +-
.../v1beta1/matchresources.go | 8 +-
.../v1beta1/mutatingadmissionpolicy.go | 4 +-
.../v1beta1/mutatingadmissionpolicybinding.go | 4 +-
.../v1beta1/mutatingwebhook.go | 20 +-
.../v1beta1/mutatingwebhookconfiguration.go | 4 +-
.../v1beta1/namedrulewithoperations.go | 2 +-
.../v1beta1/paramkind.go | 4 +-
.../admissionregistration/v1beta1/paramref.go | 2 +-
.../v1beta1/servicereference.go | 10 +-
.../v1beta1/typechecking.go | 2 +-
.../v1beta1/validatingadmissionpolicy.go | 6 +-
.../validatingadmissionpolicybinding.go | 4 +-
.../validatingadmissionpolicybindingspec.go | 4 +-
.../v1beta1/validatingadmissionpolicyspec.go | 10 +-
.../validatingadmissionpolicystatus.go | 6 +-
.../v1beta1/validatingwebhook.go | 20 +-
.../v1beta1/validatingwebhookconfiguration.go | 4 +-
.../v1beta1/validation.go | 6 +-
.../admissionregistration/v1beta1/variable.go | 4 +-
.../v1beta1/webhookclientconfig.go | 6 +-
.../v1alpha1/serverstorageversion.go | 7 +-
.../v1alpha1/storageversion.go | 5 +-
.../v1alpha1/storageversioncondition.go | 12 +-
.../v1alpha1/storageversionstatus.go | 9 +-
.../v2beta1/containerresourcemetricsource.go | 87 -
.../v2beta1/containerresourcemetricstatus.go | 88 -
.../v2beta1/crossversionobjectreference.go | 62 -
.../v2beta1/externalmetricsource.go | 83 -
.../v2beta1/externalmetricstatus.go | 80 -
.../horizontalpodautoscalercondition.go | 91 -
.../v2beta1/horizontalpodautoscalerspec.go | 89 -
.../v2beta1/horizontalpodautoscalerstatus.go | 110 -
.../autoscaling/v2beta1/metricspec.go | 113 -
.../autoscaling/v2beta1/metricstatus.go | 112 -
.../autoscaling/v2beta1/objectmetricsource.go | 91 -
.../autoscaling/v2beta1/objectmetricstatus.go | 91 -
.../autoscaling/v2beta1/podsmetricsource.go | 73 -
.../autoscaling/v2beta1/podsmetricstatus.go | 71 -
.../v2beta1/resourcemetricsource.go | 77 -
.../v2beta1/resourcemetricstatus.go | 78 -
.../v2beta2/containerresourcemetricsource.go | 72 -
.../v2beta2/containerresourcemetricstatus.go | 70 -
.../v2beta2/crossversionobjectreference.go | 62 -
.../v2beta2/externalmetricsource.go | 54 -
.../v2beta2/externalmetricstatus.go | 53 -
.../horizontalpodautoscalerbehavior.go | 60 -
.../horizontalpodautoscalercondition.go | 91 -
.../v2beta2/horizontalpodautoscalerspec.go | 102 -
.../v2beta2/horizontalpodautoscalerstatus.go | 110 -
.../autoscaling/v2beta2/hpascalingpolicy.go | 68 -
.../autoscaling/v2beta2/hpascalingrules.go | 83 -
.../autoscaling/v2beta2/metricidentifier.go | 58 -
.../autoscaling/v2beta2/metricspec.go | 113 -
.../autoscaling/v2beta2/metricstatus.go | 112 -
.../autoscaling/v2beta2/metrictarget.go | 81 -
.../autoscaling/v2beta2/metricvaluestatus.go | 69 -
.../autoscaling/v2beta2/objectmetricsource.go | 62 -
.../autoscaling/v2beta2/objectmetricstatus.go | 62 -
.../autoscaling/v2beta2/podsmetricsource.go | 55 -
.../autoscaling/v2beta2/podsmetricstatus.go | 53 -
.../v2beta2/resourcemetricsource.go | 62 -
.../v2beta2/resourcemetricstatus.go | 60 -
.../v1beta1/podcertificaterequestspec.go | 48 +-
.../core/v1/imagevolumestatus.go | 44 +
.../v1/nodeallocatableresourceclaimstatus.go | 75 +
.../core/v1/persistentvolumesource.go | 3 +-
.../core/v1/podcondition.go | 1 -
.../core/v1/podresourceclaim.go | 18 +
.../core/v1/podresourceclaimstatus.go | 13 +-
.../core/v1/podschedulinggroup.go | 46 +
.../applyconfigurations/core/v1/podspec.go | 28 +-
.../applyconfigurations/core/v1/podstatus.go | 19 +
.../core/v1/resourcehealth.go | 11 +
.../core/v1/securitycontext.go | 1 -
.../core/v1/volumemountstatus.go | 11 +
.../core/v1/volumesource.go | 5 +-
.../core/v1/volumestatus.go | 43 +
.../core/v1/workloadreference.go | 74 -
.../applyconfigurations/internal/internal.go | 1498 +-
.../resource/v1/allocationresult.go | 2 +-
.../resource/v1/celdeviceselector.go | 8 +
.../applyconfigurations/resource/v1/device.go | 35 +-
.../resource/v1/deviceattribute.go | 56 +
.../resource/v1/deviceclass.go | 3 -
.../resource/v1/deviceclassspec.go | 2 +-
.../resource/v1/deviceconstraint.go | 10 +
.../v1/devicerequestallocationresult.go | 9 +-
.../resource/v1/devicesubrequest.go | 2 +-
.../resource/v1/devicetaint.go | 11 +-
.../resource/v1/exactdevicerequest.go | 5 +-
.../resource/v1/networkdevicedata.go | 4 +-
.../v1/nodeallocatableresourcemapping.go | 84 +
.../resource/v1/resourceclaim.go | 3 -
.../resource/v1/resourceclaimtemplate.go | 3 -
.../resource/v1/resourceslice.go | 3 -
.../resource/v1alpha3/devicetaint.go | 11 +-
.../resource/v1alpha3/poolstatus.go | 152 +
.../v1alpha3/resourcepoolstatusrequest.go} | 165 +-
.../v1alpha3/resourcepoolstatusrequestspec.go | 73 +
.../resourcepoolstatusrequeststatus.go | 87 +
.../resource/v1beta1/allocationresult.go | 2 +-
.../resource/v1beta1/basicdevice.go | 35 +-
.../resource/v1beta1/celdeviceselector.go | 8 +
.../resource/v1beta1/deviceattribute.go | 56 +
.../resource/v1beta1/deviceclassspec.go | 2 +-
.../resource/v1beta1/deviceconstraint.go | 10 +
.../resource/v1beta1/devicerequest.go | 2 +-
.../v1beta1/devicerequestallocationresult.go | 6 +-
.../resource/v1beta1/devicesubrequest.go | 2 +-
.../resource/v1beta1/devicetaint.go | 11 +-
.../resource/v1beta1/networkdevicedata.go | 4 +-
.../v1beta1/nodeallocatableresourcemapping.go | 84 +
.../resource/v1beta2/allocationresult.go | 2 +-
.../resource/v1beta2/celdeviceselector.go | 8 +
.../resource/v1beta2/device.go | 35 +-
.../resource/v1beta2/deviceattribute.go | 56 +
.../resource/v1beta2/deviceclassspec.go | 2 +-
.../resource/v1beta2/deviceconstraint.go | 10 +
.../v1beta2/devicerequestallocationresult.go | 6 +-
.../resource/v1beta2/devicesubrequest.go | 2 +-
.../resource/v1beta2/devicetaint.go | 11 +-
.../v1beta2/devicetaintrule.go} | 128 +-
.../resource/v1beta2/devicetaintrulespec.go | 55 +
.../resource/v1beta2/devicetaintrulestatus.go | 70 +
.../resource/v1beta2/devicetaintselector.go | 76 +
.../resource/v1beta2/exactdevicerequest.go | 2 +-
.../resource/v1beta2/networkdevicedata.go | 4 +-
.../v1beta2/nodeallocatableresourcemapping.go | 84 +
.../scheduling/v1alpha1/podgroup.go | 53 -
.../gangschedulingpolicy.go | 2 +-
.../v1alpha2/podgroup.go} | 126 +-
.../v1alpha2/podgroupresourceclaim.go | 89 +
.../v1alpha2/podgroupresourceclaimstatus.go | 59 +
.../v1alpha2/podgroupschedulingconstraints.go | 48 +
.../podgroupschedulingpolicy.go} | 23 +-
.../scheduling/v1alpha2/podgroupspec.go | 145 +
.../scheduling/v1alpha2/podgroupstatus.go | 81 +
.../scheduling/v1alpha2/podgrouptemplate.go | 136 +
.../v1alpha2/podgrouptemplatereference.go | 44 +
.../scheduling/v1alpha2/topologyconstraint.go | 45 +
.../typedlocalobjectreference.go | 2 +-
.../{v1alpha1 => v1alpha2}/workload.go | 19 +-
.../workloadpodgrouptemplatereference.go | 52 +
.../{v1alpha1 => v1alpha2}/workloadspec.go | 20 +-
.../storage/v1/csidriverspec.go | 28 +-
.../storage/v1/volumeerror.go | 2 +-
.../storage/v1beta1/csidriverspec.go | 26 +
.../client-go/applyconfigurations/utils.go | 184 +-
vendor/k8s.io/client-go/features/envvar.go | 35 +-
vendor/k8s.io/client-go/features/features.go | 6 +-
.../client-go/features/known_features.go | 40 +
.../admissionregistration/v1/interface.go | 14 +
.../v1/mutatingadmissionpolicy.go | 115 +
.../v1/mutatingadmissionpolicybinding.go | 115 +
.../v1/mutatingwebhookconfiguration.go | 48 +-
.../v1/validatingadmissionpolicy.go | 48 +-
.../v1/validatingadmissionpolicybinding.go | 48 +-
.../v1/validatingwebhookconfiguration.go | 48 +-
.../v1alpha1/mutatingadmissionpolicy.go | 48 +-
.../mutatingadmissionpolicybinding.go | 48 +-
.../v1alpha1/validatingadmissionpolicy.go | 48 +-
.../validatingadmissionpolicybinding.go | 48 +-
.../v1beta1/mutatingadmissionpolicy.go | 48 +-
.../v1beta1/mutatingadmissionpolicybinding.go | 48 +-
.../v1beta1/mutatingwebhookconfiguration.go | 48 +-
.../v1beta1/validatingadmissionpolicy.go | 48 +-
.../validatingadmissionpolicybinding.go | 48 +-
.../v1beta1/validatingwebhookconfiguration.go | 48 +-
.../v1alpha1/storageversion.go | 48 +-
.../informers/apps/v1/controllerrevision.go | 48 +-
.../client-go/informers/apps/v1/daemonset.go | 48 +-
.../client-go/informers/apps/v1/deployment.go | 48 +-
.../client-go/informers/apps/v1/replicaset.go | 48 +-
.../informers/apps/v1/statefulset.go | 48 +-
.../apps/v1beta1/controllerrevision.go | 48 +-
.../informers/apps/v1beta1/deployment.go | 48 +-
.../informers/apps/v1beta1/statefulset.go | 48 +-
.../apps/v1beta2/controllerrevision.go | 48 +-
.../informers/apps/v1beta2/daemonset.go | 48 +-
.../informers/apps/v1beta2/deployment.go | 48 +-
.../informers/apps/v1beta2/replicaset.go | 48 +-
.../informers/apps/v1beta2/statefulset.go | 48 +-
.../informers/autoscaling/interface.go | 16 -
.../autoscaling/v1/horizontalpodautoscaler.go | 48 +-
.../autoscaling/v2/horizontalpodautoscaler.go | 48 +-
.../v2beta1/horizontalpodautoscaler.go | 102 -
.../autoscaling/v2beta1/interface.go | 45 -
.../v2beta2/horizontalpodautoscaler.go | 102 -
.../autoscaling/v2beta2/interface.go | 45 -
.../client-go/informers/batch/v1/cronjob.go | 48 +-
.../client-go/informers/batch/v1/job.go | 48 +-
.../informers/batch/v1beta1/cronjob.go | 48 +-
.../v1/certificatesigningrequest.go | 48 +-
.../v1alpha1/clustertrustbundle.go | 48 +-
.../v1beta1/certificatesigningrequest.go | 48 +-
.../v1beta1/clustertrustbundle.go | 48 +-
.../v1beta1/podcertificaterequest.go | 48 +-
.../informers/coordination/v1/lease.go | 48 +-
.../coordination/v1alpha2/leasecandidate.go | 48 +-
.../informers/coordination/v1beta1/lease.go | 48 +-
.../coordination/v1beta1/leasecandidate.go | 48 +-
.../informers/core/v1/componentstatus.go | 48 +-
.../client-go/informers/core/v1/configmap.go | 48 +-
.../client-go/informers/core/v1/endpoints.go | 48 +-
.../client-go/informers/core/v1/event.go | 48 +-
.../client-go/informers/core/v1/limitrange.go | 48 +-
.../client-go/informers/core/v1/namespace.go | 48 +-
.../client-go/informers/core/v1/node.go | 48 +-
.../informers/core/v1/persistentvolume.go | 48 +-
.../core/v1/persistentvolumeclaim.go | 48 +-
.../k8s.io/client-go/informers/core/v1/pod.go | 48 +-
.../informers/core/v1/podtemplate.go | 48 +-
.../core/v1/replicationcontroller.go | 48 +-
.../informers/core/v1/resourcequota.go | 48 +-
.../client-go/informers/core/v1/secret.go | 48 +-
.../client-go/informers/core/v1/service.go | 48 +-
.../informers/core/v1/serviceaccount.go | 48 +-
.../informers/discovery/v1/endpointslice.go | 48 +-
.../discovery/v1beta1/endpointslice.go | 48 +-
.../client-go/informers/events/v1/event.go | 48 +-
.../informers/events/v1beta1/event.go | 48 +-
.../informers/extensions/v1beta1/daemonset.go | 48 +-
.../extensions/v1beta1/deployment.go | 48 +-
.../informers/extensions/v1beta1/ingress.go | 48 +-
.../extensions/v1beta1/networkpolicy.go | 48 +-
.../extensions/v1beta1/replicaset.go | 48 +-
vendor/k8s.io/client-go/informers/factory.go | 110 +-
.../informers/flowcontrol/v1/flowschema.go | 48 +-
.../v1/prioritylevelconfiguration.go | 48 +-
.../flowcontrol/v1beta1/flowschema.go | 48 +-
.../v1beta1/prioritylevelconfiguration.go | 48 +-
.../flowcontrol/v1beta2/flowschema.go | 48 +-
.../v1beta2/prioritylevelconfiguration.go | 48 +-
.../flowcontrol/v1beta3/flowschema.go | 48 +-
.../v1beta3/prioritylevelconfiguration.go | 48 +-
vendor/k8s.io/client-go/informers/generic.go | 30 +-
.../internalinterfaces/factory_interfaces.go | 19 +
.../informers/networking/v1/ingress.go | 48 +-
.../informers/networking/v1/ingressclass.go | 48 +-
.../informers/networking/v1/ipaddress.go | 48 +-
.../informers/networking/v1/networkpolicy.go | 48 +-
.../informers/networking/v1/servicecidr.go | 48 +-
.../informers/networking/v1beta1/ingress.go | 48 +-
.../networking/v1beta1/ingressclass.go | 48 +-
.../informers/networking/v1beta1/ipaddress.go | 48 +-
.../networking/v1beta1/servicecidr.go | 48 +-
.../informers/node/v1/runtimeclass.go | 48 +-
.../informers/node/v1alpha1/runtimeclass.go | 48 +-
.../informers/node/v1beta1/runtimeclass.go | 48 +-
.../policy/v1/poddisruptionbudget.go | 48 +-
.../policy/v1beta1/poddisruptionbudget.go | 48 +-
.../informers/rbac/v1/clusterrole.go | 48 +-
.../informers/rbac/v1/clusterrolebinding.go | 48 +-
.../client-go/informers/rbac/v1/role.go | 48 +-
.../informers/rbac/v1/rolebinding.go | 48 +-
.../informers/rbac/v1alpha1/clusterrole.go | 48 +-
.../rbac/v1alpha1/clusterrolebinding.go | 48 +-
.../client-go/informers/rbac/v1alpha1/role.go | 48 +-
.../informers/rbac/v1alpha1/rolebinding.go | 48 +-
.../informers/rbac/v1beta1/clusterrole.go | 48 +-
.../rbac/v1beta1/clusterrolebinding.go | 48 +-
.../client-go/informers/rbac/v1beta1/role.go | 48 +-
.../informers/rbac/v1beta1/rolebinding.go | 48 +-
.../informers/resource/v1/deviceclass.go | 48 +-
.../informers/resource/v1/resourceclaim.go | 48 +-
.../resource/v1/resourceclaimtemplate.go | 48 +-
.../informers/resource/v1/resourceslice.go | 48 +-
.../resource/v1alpha3/devicetaintrule.go | 48 +-
.../informers/resource/v1alpha3/interface.go | 7 +
.../v1alpha3/resourcepoolstatusrequest.go | 115 +
.../informers/resource/v1beta1/deviceclass.go | 48 +-
.../resource/v1beta1/resourceclaim.go | 48 +-
.../resource/v1beta1/resourceclaimtemplate.go | 48 +-
.../resource/v1beta1/resourceslice.go | 48 +-
.../informers/resource/v1beta2/deviceclass.go | 48 +-
.../resource/v1beta2/devicetaintrule.go | 115 +
.../informers/resource/v1beta2/interface.go | 7 +
.../resource/v1beta2/resourceclaim.go | 48 +-
.../resource/v1beta2/resourceclaimtemplate.go | 48 +-
.../resource/v1beta2/resourceslice.go | 48 +-
.../informers/scheduling/interface.go | 12 +-
.../informers/scheduling/v1/priorityclass.go | 48 +-
.../scheduling/v1alpha1/priorityclass.go | 101 -
.../informers/scheduling/v1alpha1/workload.go | 102 -
.../{v1alpha1 => v1alpha2}/interface.go | 12 +-
.../informers/scheduling/v1alpha2/podgroup.go | 116 +
.../informers/scheduling/v1alpha2/workload.go | 116 +
.../scheduling/v1beta1/priorityclass.go | 48 +-
.../informers/storage/v1/csidriver.go | 48 +-
.../client-go/informers/storage/v1/csinode.go | 48 +-
.../storage/v1/csistoragecapacity.go | 48 +-
.../informers/storage/v1/storageclass.go | 48 +-
.../informers/storage/v1/volumeattachment.go | 48 +-
.../storage/v1/volumeattributesclass.go | 48 +-
.../storage/v1alpha1/csistoragecapacity.go | 48 +-
.../storage/v1alpha1/volumeattachment.go | 48 +-
.../storage/v1alpha1/volumeattributesclass.go | 48 +-
.../informers/storage/v1beta1/csidriver.go | 48 +-
.../informers/storage/v1beta1/csinode.go | 48 +-
.../storage/v1beta1/csistoragecapacity.go | 48 +-
.../informers/storage/v1beta1/storageclass.go | 48 +-
.../storage/v1beta1/volumeattachment.go | 48 +-
.../storage/v1beta1/volumeattributesclass.go | 48 +-
.../v1beta1/storageversionmigration.go | 48 +-
.../k8s.io/client-go/kubernetes/clientset.go | 42 +-
.../kubernetes/fake/clientset_generated.go | 26 +-
.../client-go/kubernetes/fake/register.go | 8 +-
.../client-go/kubernetes/scheme/register.go | 8 +-
.../v1/admissionregistration_client.go | 10 +
.../fake/fake_admissionregistration_client.go | 8 +
.../v1/fake/fake_mutatingadmissionpolicy.go | 53 +
.../fake_mutatingadmissionpolicybinding.go | 53 +
.../v1/generated_expansion.go | 4 +
.../v1/mutatingadmissionpolicy.go | 75 +
.../v1/mutatingadmissionpolicybinding.go | 75 +
.../autoscaling/v2beta1/autoscaling_client.go | 101 -
.../typed/autoscaling/v2beta1/doc.go | 20 -
.../v2beta1/fake/fake_autoscaling_client.go | 40 -
.../fake/fake_horizontalpodautoscaler.go | 53 -
.../v2beta1/generated_expansion.go | 21 -
.../v2beta1/horizontalpodautoscaler.go | 79 -
.../autoscaling/v2beta2/autoscaling_client.go | 101 -
.../typed/autoscaling/v2beta2/doc.go | 20 -
.../v2beta2/fake/fake_autoscaling_client.go | 40 -
.../fake/fake_horizontalpodautoscaler.go | 53 -
.../v2beta2/generated_expansion.go | 21 -
.../v2beta2/horizontalpodautoscaler.go | 79 -
.../typed/core/v1/fake/fake_pod_expansion.go | 21 +-
.../v1alpha3/fake/fake_resource_client.go | 4 +
.../fake/fake_resourcepoolstatusrequest.go | 53 +
.../resource/v1alpha3/generated_expansion.go | 2 +
.../resource/v1alpha3/resource_client.go | 5 +
.../v1alpha3/resourcepoolstatusrequest.go | 79 +
.../typed/resource/v1beta2/devicetaintrule.go | 75 +
.../v1beta2/fake/fake_devicetaintrule.go | 53 +
.../v1beta2/fake/fake_resource_client.go | 4 +
.../resource/v1beta2/generated_expansion.go | 2 +
.../typed/resource/v1beta2/resource_client.go | 5 +
.../typed/scheduling/v1alpha1/fake/doc.go | 20 -
.../v1alpha1/fake/fake_priorityclass.go | 53 -
.../scheduling/v1alpha1/fake/fake_workload.go | 51 -
.../scheduling/v1alpha1/priorityclass.go | 71 -
.../scheduling/{v1alpha1 => v1alpha2}/doc.go | 2 +-
.../v1alpha2}/fake/doc.go | 0
.../scheduling/v1alpha2/fake/fake_podgroup.go | 51 +
.../fake/fake_scheduling_client.go | 12 +-
.../scheduling/v1alpha2/fake/fake_workload.go | 51 +
.../generated_expansion.go | 4 +-
.../typed/scheduling/v1alpha2/podgroup.go | 75 +
.../scheduling_client.go | 42 +-
.../{v1alpha1 => v1alpha2}/workload.go | 30 +-
.../v1/expansion_generated.go | 8 +
.../v1/mutatingadmissionpolicy.go | 48 +
.../v1/mutatingadmissionpolicybinding.go | 48 +
.../v2beta1/expansion_generated.go | 27 -
.../v2beta1/horizontalpodautoscaler.go | 70 -
.../v2beta2/expansion_generated.go | 27 -
.../v2beta2/horizontalpodautoscaler.go | 70 -
.../resource/v1alpha3/expansion_generated.go | 4 +
.../v1alpha3/resourcepoolstatusrequest.go | 48 +
.../v1beta2/devicetaintrule.go} | 30 +-
.../resource/v1beta2/expansion_generated.go | 4 +
.../expansion_generated.go | 12 +-
.../listers/scheduling/v1alpha2/podgroup.go | 70 +
.../{v1alpha1 => v1alpha2}/workload.go | 18 +-
.../k8s.io/client-go/metadata/fake/simple.go | 6 +-
.../metadata/metadatainformer/informer.go | 12 +-
.../plugin/pkg/client/auth/exec/exec.go | 20 +-
vendor/k8s.io/client-go/testing/doc.go | 70 +
vendor/k8s.io/client-go/testing/fixture.go | 122 +-
vendor/k8s.io/client-go/tools/cache/OWNERS | 1 +
.../client-go/tools/cache/controller.go | 171 +-
.../client-go/tools/cache/delta_fifo.go | 95 +-
.../tools/cache/event_handler_name.go | 121 +
.../client-go/tools/cache/expiration_cache.go | 12 +-
vendor/k8s.io/client-go/tools/cache/fifo.go | 79 +-
.../client-go/tools/cache/fifo_metrics.go | 122 +
.../k8s.io/client-go/tools/cache/identity.go | 217 +
.../k8s.io/client-go/tools/cache/reflector.go | 199 +-
.../tools/cache/reflector_metrics.go | 6 +
.../client-go/tools/cache/shared_informer.go | 350 +-
vendor/k8s.io/client-go/tools/cache/store.go | 54 +-
.../tools/cache/synctrack/synctrack.go | 132 +-
.../client-go/tools/cache/the_real_fifo.go | 459 +-
.../tools/cache/thread_safe_store.go | 128 +-
.../client-go/tools/clientcmd/api/types.go | 6 +-
.../tools/clientcmd/client_config.go | 2 +
.../client-go/tools/clientcmd/config.go | 1 +
.../client-go/tools/clientcmd/loader.go | 2 +
.../tools/clientcmd/merged_client_builder.go | 2 +
.../tools/leaderelection/leaderelection.go | 42 +-
.../tools/leaderelection/leasecandidate.go | 21 +-
.../leaderelection/resourcelock/leaselock.go | 2 +-
.../k8s.io/client-go/tools/metrics/metrics.go | 78 +-
.../tools/portforward/fallback_dialer.go | 31 +
.../tools/portforward/portforward.go | 98 +
.../tools/portforward/tunneling_dialer.go | 65 +-
vendor/k8s.io/client-go/tools/record/event.go | 5 +-
.../tools/remotecommand/errorstream.go | 5 +-
.../client-go/tools/remotecommand/fallback.go | 2 +-
.../tools/remotecommand/remotecommand.go | 5 +-
.../client-go/tools/remotecommand/spdy.go | 9 +-
.../client-go/tools/remotecommand/v1.go | 12 +-
.../client-go/tools/remotecommand/v2.go | 35 +-
.../client-go/tools/remotecommand/v3.go | 21 +-
.../client-go/tools/remotecommand/v4.go | 17 +-
.../client-go/tools/remotecommand/v5.go | 6 +-
.../tools/remotecommand/websocket.go | 57 +-
.../k8s.io/client-go/transport/ca_rotation.go | 154 +
vendor/k8s.io/client-go/transport/cache.go | 153 +-
vendor/k8s.io/client-go/transport/config.go | 3 +-
.../client-go/transport/round_trippers.go | 2 +-
.../k8s.io/client-go/transport/spdy/spdy.go | 214 +-
.../k8s.io/client-go/transport/transport.go | 25 +-
.../transport/websocket/roundtripper.go | 4 +-
.../client-go/util/watchlist/watch_list.go | 3 +
.../component-base/cli/flag/curves_flag.go | 50 +
.../klog/v2/internal/verbosity/verbosity.go | 303 +
vendor/k8s.io/klog/v2/textlogger/options.go | 172 +
.../k8s.io/klog/v2/textlogger/textlogger.go | 200 +
.../klog/v2/textlogger/textlogger_slog.go | 52 +
.../pkg/internal/serialization.go | 2 +-
.../go-json-experiment/json/README.md | 246 +-
.../go-json-experiment/json/alias.go | 967 +
.../go-json-experiment/json/arshal.go | 523 +-
.../go-json-experiment/json/arshal_any.go | 283 +-
.../go-json-experiment/json/arshal_default.go | 1469 +-
.../go-json-experiment/json/arshal_funcs.go | 209 +-
.../go-json-experiment/json/arshal_inlined.go | 123 +-
.../go-json-experiment/json/arshal_methods.go | 328 +-
.../go-json-experiment/json/arshal_time.go | 846 +-
.../go-json-experiment/json/decode.go | 1655 -
.../go-json-experiment/json/doc.go | 228 +-
.../go-json-experiment/json/encode.go | 1170 -
.../go-json-experiment/json/errors.go | 409 +-
.../go-json-experiment/json/fields.go | 503 +-
.../go-json-experiment/json/fold.go | 2 +
.../go-json-experiment/json/intern.go | 8 +-
.../json/internal/internal.go | 42 +
.../json/internal/jsonflags/flags.go | 215 +
.../json/internal/jsonopts/options.go | 202 +
.../json/internal/jsonwire/decode.go | 629 +
.../json/internal/jsonwire/encode.go | 290 +
.../json/internal/jsonwire/wire.go | 217 +
.../go-json-experiment/json/jsontext/alias.go | 536 +
.../json/jsontext/decode.go | 1179 +
.../go-json-experiment/json/jsontext/doc.go | 111 +
.../json/jsontext/encode.go | 977 +
.../json/jsontext/errors.go | 182 +
.../json/jsontext/export.go | 77 +
.../json/jsontext/options.go | 304 +
.../json/{ => jsontext}/pools.go | 92 +-
.../go-json-experiment/json/jsontext/quote.go | 41 +
.../json/{ => jsontext}/state.go | 447 +-
.../json/{ => jsontext}/token.go | 87 +-
.../go-json-experiment/json/jsontext/value.go | 395 +
.../go-json-experiment/json/migrate.sh | 48 +
.../go-json-experiment/json/options.go | 289 +
.../go-json-experiment/json/value.go | 381 -
.../kube-openapi/pkg/schemaconv/openapi.go | 6 +-
.../pkg/schemaconv/proto_models.go | 10 +-
.../k8s.io/kube-openapi/pkg/spec3/encoding.go | 13 +-
.../k8s.io/kube-openapi/pkg/spec3/example.go | 13 +-
.../pkg/spec3/external_documentation.go | 13 +-
.../k8s.io/kube-openapi/pkg/spec3/header.go | 13 +-
.../kube-openapi/pkg/spec3/media_type.go | 13 +-
.../kube-openapi/pkg/spec3/operation.go | 13 +-
.../kube-openapi/pkg/spec3/parameter.go | 13 +-
vendor/k8s.io/kube-openapi/pkg/spec3/path.go | 25 +-
.../kube-openapi/pkg/spec3/request_body.go | 13 +-
.../k8s.io/kube-openapi/pkg/spec3/response.go | 47 +-
.../kube-openapi/pkg/spec3/security_scheme.go | 7 +-
.../k8s.io/kube-openapi/pkg/spec3/server.go | 25 +-
vendor/k8s.io/kube-openapi/pkg/spec3/spec.go | 5 +-
.../pkg/validation/spec/header.go | 13 +-
.../kube-openapi/pkg/validation/spec/info.go | 13 +-
.../kube-openapi/pkg/validation/spec/items.go | 13 +-
.../pkg/validation/spec/operation.go | 13 +-
.../pkg/validation/spec/parameter.go | 13 +-
.../pkg/validation/spec/path_item.go | 15 +-
.../kube-openapi/pkg/validation/spec/paths.go | 11 +-
.../pkg/validation/spec/response.go | 15 +-
.../pkg/validation/spec/responses.go | 17 +-
.../pkg/validation/spec/schema.go | 13 +-
.../pkg/validation/spec/security_scheme.go | 13 +-
.../pkg/validation/spec/swagger.go | 59 +-
.../kube-openapi/pkg/validation/spec/tag.go | 13 +-
vendor/k8s.io/streaming/LICENSE | 202 +
.../proxy => streaming/pkg/httpstream}/doc.go | 7 +-
.../streaming/pkg/httpstream/httpstream.go | 201 +
.../pkg}/httpstream/spdy/connection.go | 4 +-
.../pkg}/httpstream/spdy/roundtripper.go | 255 +-
.../pkg}/httpstream/spdy/upgrade.go | 8 +-
.../pkg}/httpstream/wsstream/conn.go | 44 +-
.../pkg}/httpstream/wsstream/doc.go | 0
.../pkg}/httpstream/wsstream/stream.go | 28 +-
.../k8s.io/streaming/pkg/runtime/runtime.go | 62 +
.../pkg/util => utils}/dump/dump.go | 0
vendor/k8s.io/utils/ptr/ptr.go | 2 +-
vendor/modules.txt | 423 +-
.../pkg/client/apiutil/errors.go | 4 +-
.../pkg/client/apiutil/restmapper.go | 3 +-
.../pkg/client/applyconfigurations.go | 22 -
.../controller-runtime/pkg/client/options.go | 13 +-
.../pkg/client/typed_client.go | 53 +-
.../v6/fieldpath/element.go | 28 +-
.../v6/fieldpath/pathelementmap.go | 25 +-
.../structured-merge-diff/v6/fieldpath/set.go | 24 +-
.../v6/value/allocator.go | 80 +-
.../v6/value/jsontagutil.go | 7 +-
2245 files changed, 407828 insertions(+), 84554 deletions(-)
create mode 100644 vendor/github.com/armon/go-metrics/.gitignore
create mode 100644 vendor/github.com/armon/go-metrics/.travis.yml
create mode 100644 vendor/github.com/armon/go-metrics/LICENSE
create mode 100644 vendor/github.com/armon/go-metrics/README.md
create mode 100644 vendor/github.com/armon/go-metrics/const_unix.go
create mode 100644 vendor/github.com/armon/go-metrics/const_windows.go
create mode 100644 vendor/github.com/armon/go-metrics/inmem.go
create mode 100644 vendor/github.com/armon/go-metrics/inmem_endpoint.go
create mode 100644 vendor/github.com/armon/go-metrics/inmem_signal.go
create mode 100644 vendor/github.com/armon/go-metrics/metrics.go
create mode 100644 vendor/github.com/armon/go-metrics/sink.go
create mode 100644 vendor/github.com/armon/go-metrics/start.go
create mode 100644 vendor/github.com/armon/go-metrics/statsd.go
create mode 100644 vendor/github.com/armon/go-metrics/statsite.go
rename vendor/github.com/aws/aws-sdk-go-v2/{ => config}/internal/ini/errors.go (100%)
rename vendor/github.com/aws/aws-sdk-go-v2/{ => config}/internal/ini/ini.go (100%)
rename vendor/github.com/aws/aws-sdk-go-v2/{ => config}/internal/ini/parse.go (100%)
rename vendor/github.com/aws/aws-sdk-go-v2/{ => config}/internal/ini/sections.go (100%)
rename vendor/github.com/aws/aws-sdk-go-v2/{ => config}/internal/ini/strings.go (100%)
rename vendor/github.com/aws/aws-sdk-go-v2/{ => config}/internal/ini/token.go (100%)
rename vendor/github.com/aws/aws-sdk-go-v2/{ => config}/internal/ini/tokenize.go (100%)
rename vendor/github.com/aws/aws-sdk-go-v2/{ => config}/internal/ini/value.go (100%)
delete mode 100644 vendor/github.com/aws/aws-sdk-go-v2/internal/ini/CHANGELOG.md
create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/CHANGELOG.md
rename vendor/github.com/aws/aws-sdk-go-v2/internal/{ini => v4a}/LICENSE.txt (100%)
create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/credentials.go
create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/error.go
rename vendor/github.com/aws/aws-sdk-go-v2/internal/{ini => v4a}/go_module_metadata.go (74%)
create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/crypto/compare.go
create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/crypto/ecc.go
create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/const.go
create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/header_rules.go
create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/headers.go
create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/hmac.go
create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/host.go
create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/time.go
create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/util.go
create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/middleware.go
create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/presign_middleware.go
create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/smithy.go
create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/v4a.go
create mode 100644 vendor/github.com/aws/smithy-go/AGENTS.md
create mode 100644 vendor/github.com/aws/smithy-go/endpoints/private/bdd/evaluate.go
create mode 100644 vendor/github.com/aws/smithy-go/endpoints/private/rulesfn/split.go
create mode 100644 vendor/github.com/aws/smithy-go/endpoints/private/rulesfn/string_slice.go
create mode 100644 vendor/github.com/cenkalti/backoff/v4/.gitignore
create mode 100644 vendor/github.com/cenkalti/backoff/v4/LICENSE
create mode 100644 vendor/github.com/cenkalti/backoff/v4/README.md
create mode 100644 vendor/github.com/cenkalti/backoff/v4/backoff.go
create mode 100644 vendor/github.com/cenkalti/backoff/v4/context.go
create mode 100644 vendor/github.com/cenkalti/backoff/v4/exponential.go
create mode 100644 vendor/github.com/cenkalti/backoff/v4/retry.go
create mode 100644 vendor/github.com/cenkalti/backoff/v4/ticker.go
create mode 100644 vendor/github.com/cenkalti/backoff/v4/timer.go
create mode 100644 vendor/github.com/cenkalti/backoff/v4/tries.go
create mode 100644 vendor/github.com/coder/quartz/.gitignore
create mode 100644 vendor/github.com/coder/quartz/LICENSE
create mode 100644 vendor/github.com/coder/quartz/README.md
create mode 100644 vendor/github.com/coder/quartz/clock.go
create mode 100644 vendor/github.com/coder/quartz/mock.go
create mode 100644 vendor/github.com/coder/quartz/real.go
create mode 100644 vendor/github.com/coder/quartz/ticker.go
create mode 100644 vendor/github.com/coder/quartz/timer.go
create mode 100644 vendor/github.com/felixge/httpsnoop/wrap_generated.go
delete mode 100644 vendor/github.com/felixge/httpsnoop/wrap_generated_gteq_1.8.go
delete mode 100644 vendor/github.com/felixge/httpsnoop/wrap_generated_lt_1.8.go
delete mode 100644 vendor/github.com/fsnotify/fsnotify/.cirrus.yml
create mode 100644 vendor/github.com/fxamacker/cbor/v2/decode_map_utils.go
delete mode 100644 vendor/github.com/go-openapi/analysis/go.work.sum
create mode 100644 vendor/github.com/go-openapi/analysis/options.go
delete mode 100644 vendor/github.com/go-openapi/jsonpointer/.cliff.toml
create mode 100644 vendor/github.com/go-openapi/jsonpointer/ifaces.go
create mode 100644 vendor/github.com/go-openapi/jsonpointer/options.go
create mode 100644 vendor/github.com/go-openapi/loads/restricted.go
create mode 100644 vendor/github.com/go-openapi/runtime/.codecov.yml
create mode 100644 vendor/github.com/go-openapi/runtime/CONTRIBUTORS.md
create mode 100644 vendor/github.com/go-openapi/runtime/client/httptrace.go
create mode 100644 vendor/github.com/go-openapi/runtime/client/httptrace_tls.go
create mode 100644 vendor/github.com/go-openapi/runtime/client/internal/request/request.go
delete mode 100644 vendor/github.com/go-openapi/runtime/client/request.go
create mode 100644 vendor/github.com/go-openapi/runtime/client/tls.go
create mode 100644 vendor/github.com/go-openapi/runtime/form.go
delete mode 100644 vendor/github.com/go-openapi/runtime/go.work.sum
create mode 100644 vendor/github.com/go-openapi/runtime/middleware/context_skipauth_disabled.go
create mode 100644 vendor/github.com/go-openapi/runtime/middleware/context_skipauth_enabled.go
delete mode 100644 vendor/github.com/go-openapi/runtime/middleware/negotiate.go
delete mode 100644 vendor/github.com/go-openapi/runtime/middleware/rapidoc.go
delete mode 100644 vendor/github.com/go-openapi/runtime/middleware/redoc.go
create mode 100644 vendor/github.com/go-openapi/runtime/middleware/seam.go
delete mode 100644 vendor/github.com/go-openapi/runtime/middleware/spec.go
delete mode 100644 vendor/github.com/go-openapi/runtime/middleware/swaggerui.go
create mode 100644 vendor/github.com/go-openapi/runtime/middleware/typeutils.go
delete mode 100644 vendor/github.com/go-openapi/runtime/middleware/ui_options.go
create mode 100644 vendor/github.com/go-openapi/runtime/server-middleware/LICENSE
create mode 100644 vendor/github.com/go-openapi/runtime/server-middleware/docui/doc.go
create mode 100644 vendor/github.com/go-openapi/runtime/server-middleware/docui/options.go
create mode 100644 vendor/github.com/go-openapi/runtime/server-middleware/docui/rapidoc.go
create mode 100644 vendor/github.com/go-openapi/runtime/server-middleware/docui/redoc.go
create mode 100644 vendor/github.com/go-openapi/runtime/server-middleware/docui/render.go
create mode 100644 vendor/github.com/go-openapi/runtime/server-middleware/docui/spec.go
create mode 100644 vendor/github.com/go-openapi/runtime/server-middleware/docui/swaggerui.go
rename vendor/github.com/go-openapi/runtime/{middleware => server-middleware/docui}/swaggerui_oauth2.go (70%)
create mode 100644 vendor/github.com/go-openapi/runtime/server-middleware/mediatype/doc.go
create mode 100644 vendor/github.com/go-openapi/runtime/server-middleware/mediatype/lookup.go
create mode 100644 vendor/github.com/go-openapi/runtime/server-middleware/mediatype/match.go
create mode 100644 vendor/github.com/go-openapi/runtime/server-middleware/mediatype/mediatype.go
create mode 100644 vendor/github.com/go-openapi/runtime/server-middleware/mediatype/set.go
create mode 100644 vendor/github.com/go-openapi/runtime/server-middleware/negotiate/doc.go
rename vendor/github.com/go-openapi/runtime/{middleware => server-middleware/negotiate}/header/header.go (97%)
create mode 100644 vendor/github.com/go-openapi/runtime/server-middleware/negotiate/negotiate.go
delete mode 100644 vendor/github.com/go-openapi/strfmt/go.work.sum
create mode 100644 vendor/github.com/go-openapi/swag/jsonname/go_name_provider.go
create mode 100644 vendor/github.com/go-openapi/swag/jsonname/ifaces.go
create mode 100644 vendor/github.com/go-openapi/validate/spec_ref_warnings.go
create mode 100644 vendor/github.com/google/btree/LICENSE
create mode 100644 vendor/github.com/google/btree/README.md
create mode 100644 vendor/github.com/google/btree/btree.go
create mode 100644 vendor/github.com/google/btree/btree_generic.go
create mode 100644 vendor/github.com/hashicorp/errwrap/LICENSE
create mode 100644 vendor/github.com/hashicorp/errwrap/README.md
create mode 100644 vendor/github.com/hashicorp/errwrap/errwrap.go
create mode 100644 vendor/github.com/hashicorp/go-immutable-radix/.gitignore
create mode 100644 vendor/github.com/hashicorp/go-immutable-radix/CHANGELOG.md
create mode 100644 vendor/github.com/hashicorp/go-immutable-radix/LICENSE
create mode 100644 vendor/github.com/hashicorp/go-immutable-radix/README.md
create mode 100644 vendor/github.com/hashicorp/go-immutable-radix/edges.go
create mode 100644 vendor/github.com/hashicorp/go-immutable-radix/iradix.go
create mode 100644 vendor/github.com/hashicorp/go-immutable-radix/iter.go
create mode 100644 vendor/github.com/hashicorp/go-immutable-radix/node.go
create mode 100644 vendor/github.com/hashicorp/go-immutable-radix/raw_iter.go
create mode 100644 vendor/github.com/hashicorp/go-immutable-radix/reverse_iter.go
create mode 100644 vendor/github.com/hashicorp/go-metrics/.gitignore
create mode 100644 vendor/github.com/hashicorp/go-metrics/.travis.yml
create mode 100644 vendor/github.com/hashicorp/go-metrics/LICENSE
create mode 100644 vendor/github.com/hashicorp/go-metrics/README.md
create mode 100644 vendor/github.com/hashicorp/go-metrics/compat/armon.go
create mode 100644 vendor/github.com/hashicorp/go-metrics/compat/hashicorp.go
create mode 100644 vendor/github.com/hashicorp/go-metrics/const_js.go
create mode 100644 vendor/github.com/hashicorp/go-metrics/const_unix.go
create mode 100644 vendor/github.com/hashicorp/go-metrics/const_windows.go
create mode 100644 vendor/github.com/hashicorp/go-metrics/inmem.go
create mode 100644 vendor/github.com/hashicorp/go-metrics/inmem_endpoint.go
create mode 100644 vendor/github.com/hashicorp/go-metrics/inmem_signal.go
create mode 100644 vendor/github.com/hashicorp/go-metrics/metrics.go
create mode 100644 vendor/github.com/hashicorp/go-metrics/sink.go
create mode 100644 vendor/github.com/hashicorp/go-metrics/start.go
create mode 100644 vendor/github.com/hashicorp/go-metrics/statsd.go
create mode 100644 vendor/github.com/hashicorp/go-metrics/statsite.go
create mode 100644 vendor/github.com/hashicorp/go-msgpack/v2/LICENSE
create mode 100644 vendor/github.com/hashicorp/go-msgpack/v2/codec/build.sh
create mode 100644 vendor/github.com/hashicorp/go-msgpack/v2/codec/codecgen.go
create mode 100644 vendor/github.com/hashicorp/go-msgpack/v2/codec/decode.go
create mode 100644 vendor/github.com/hashicorp/go-msgpack/v2/codec/doc.go
create mode 100644 vendor/github.com/hashicorp/go-msgpack/v2/codec/encode.go
create mode 100644 vendor/github.com/hashicorp/go-msgpack/v2/codec/fast-path.not.go
create mode 100644 vendor/github.com/hashicorp/go-msgpack/v2/codec/gen-dec-array.go.tmpl
create mode 100644 vendor/github.com/hashicorp/go-msgpack/v2/codec/gen-dec-map.go.tmpl
create mode 100644 vendor/github.com/hashicorp/go-msgpack/v2/codec/gen-enc-chan.go.tmpl
create mode 100644 vendor/github.com/hashicorp/go-msgpack/v2/codec/gen-helper.generated.go
create mode 100644 vendor/github.com/hashicorp/go-msgpack/v2/codec/gen-helper.go.tmpl
create mode 100644 vendor/github.com/hashicorp/go-msgpack/v2/codec/gen-internal.go
create mode 100644 vendor/github.com/hashicorp/go-msgpack/v2/codec/gen.generated.go
create mode 100644 vendor/github.com/hashicorp/go-msgpack/v2/codec/gen.go
create mode 100644 vendor/github.com/hashicorp/go-msgpack/v2/codec/helper.go
create mode 100644 vendor/github.com/hashicorp/go-msgpack/v2/codec/helper_internal.go
create mode 100644 vendor/github.com/hashicorp/go-msgpack/v2/codec/json.go
create mode 100644 vendor/github.com/hashicorp/go-msgpack/v2/codec/mammoth-test.go.tmpl
create mode 100644 vendor/github.com/hashicorp/go-msgpack/v2/codec/mammoth2-test.go.tmpl
create mode 100644 vendor/github.com/hashicorp/go-msgpack/v2/codec/msgpack.go
create mode 100644 vendor/github.com/hashicorp/go-msgpack/v2/codec/rpc.go
create mode 100644 vendor/github.com/hashicorp/go-msgpack/v2/codec/test.py
create mode 100644 vendor/github.com/hashicorp/go-multierror/LICENSE
create mode 100644 vendor/github.com/hashicorp/go-multierror/Makefile
create mode 100644 vendor/github.com/hashicorp/go-multierror/README.md
create mode 100644 vendor/github.com/hashicorp/go-multierror/append.go
create mode 100644 vendor/github.com/hashicorp/go-multierror/flatten.go
create mode 100644 vendor/github.com/hashicorp/go-multierror/format.go
create mode 100644 vendor/github.com/hashicorp/go-multierror/group.go
create mode 100644 vendor/github.com/hashicorp/go-multierror/multierror.go
create mode 100644 vendor/github.com/hashicorp/go-multierror/prefix.go
create mode 100644 vendor/github.com/hashicorp/go-multierror/sort.go
create mode 100644 vendor/github.com/hashicorp/go-sockaddr/.gitignore
create mode 100644 vendor/github.com/hashicorp/go-sockaddr/GNUmakefile
create mode 100644 vendor/github.com/hashicorp/go-sockaddr/LICENSE
create mode 100644 vendor/github.com/hashicorp/go-sockaddr/README.md
create mode 100644 vendor/github.com/hashicorp/go-sockaddr/doc.go
create mode 100644 vendor/github.com/hashicorp/go-sockaddr/ifaddr.go
create mode 100644 vendor/github.com/hashicorp/go-sockaddr/ifaddrs.go
create mode 100644 vendor/github.com/hashicorp/go-sockaddr/ifattr.go
create mode 100644 vendor/github.com/hashicorp/go-sockaddr/ipaddr.go
create mode 100644 vendor/github.com/hashicorp/go-sockaddr/ipaddrs.go
create mode 100644 vendor/github.com/hashicorp/go-sockaddr/ipv4addr.go
create mode 100644 vendor/github.com/hashicorp/go-sockaddr/ipv6addr.go
create mode 100644 vendor/github.com/hashicorp/go-sockaddr/rfc.go
create mode 100644 vendor/github.com/hashicorp/go-sockaddr/route_info.go
create mode 100644 vendor/github.com/hashicorp/go-sockaddr/route_info_aix.go
create mode 100644 vendor/github.com/hashicorp/go-sockaddr/route_info_android.go
create mode 100644 vendor/github.com/hashicorp/go-sockaddr/route_info_bsd.go
create mode 100644 vendor/github.com/hashicorp/go-sockaddr/route_info_default.go
create mode 100644 vendor/github.com/hashicorp/go-sockaddr/route_info_linux.go
create mode 100644 vendor/github.com/hashicorp/go-sockaddr/route_info_solaris.go
create mode 100644 vendor/github.com/hashicorp/go-sockaddr/route_info_test_windows.go
create mode 100644 vendor/github.com/hashicorp/go-sockaddr/route_info_windows.go
create mode 100644 vendor/github.com/hashicorp/go-sockaddr/sockaddr.go
create mode 100644 vendor/github.com/hashicorp/go-sockaddr/sockaddrs.go
create mode 100644 vendor/github.com/hashicorp/go-sockaddr/unixsock.go
create mode 100644 vendor/github.com/hashicorp/golang-lru/LICENSE
create mode 100644 vendor/github.com/hashicorp/golang-lru/simplelru/lru.go
create mode 100644 vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go
create mode 100644 vendor/github.com/hashicorp/golang-lru/v2/.gitignore
create mode 100644 vendor/github.com/hashicorp/golang-lru/v2/.golangci.yml
create mode 100644 vendor/github.com/hashicorp/golang-lru/v2/2q.go
create mode 100644 vendor/github.com/hashicorp/golang-lru/v2/LICENSE
create mode 100644 vendor/github.com/hashicorp/golang-lru/v2/README.md
create mode 100644 vendor/github.com/hashicorp/golang-lru/v2/doc.go
create mode 100644 vendor/github.com/hashicorp/golang-lru/v2/internal/list.go
create mode 100644 vendor/github.com/hashicorp/golang-lru/v2/lru.go
create mode 100644 vendor/github.com/hashicorp/golang-lru/v2/simplelru/LICENSE_list
create mode 100644 vendor/github.com/hashicorp/golang-lru/v2/simplelru/lru.go
create mode 100644 vendor/github.com/hashicorp/golang-lru/v2/simplelru/lru_interface.go
create mode 100644 vendor/github.com/hashicorp/memberlist/.gitignore
create mode 100644 vendor/github.com/hashicorp/memberlist/.go-version
create mode 100644 vendor/github.com/hashicorp/memberlist/.golangci.yml
create mode 100644 vendor/github.com/hashicorp/memberlist/CHANGELOG.md
create mode 100644 vendor/github.com/hashicorp/memberlist/LICENSE
create mode 100644 vendor/github.com/hashicorp/memberlist/Makefile
create mode 100644 vendor/github.com/hashicorp/memberlist/README.md
create mode 100644 vendor/github.com/hashicorp/memberlist/alive_delegate.go
create mode 100644 vendor/github.com/hashicorp/memberlist/awareness.go
create mode 100644 vendor/github.com/hashicorp/memberlist/broadcast.go
create mode 100644 vendor/github.com/hashicorp/memberlist/config.go
create mode 100644 vendor/github.com/hashicorp/memberlist/conflict_delegate.go
create mode 100644 vendor/github.com/hashicorp/memberlist/delegate.go
create mode 100644 vendor/github.com/hashicorp/memberlist/event_delegate.go
create mode 100644 vendor/github.com/hashicorp/memberlist/keyring.go
create mode 100644 vendor/github.com/hashicorp/memberlist/label.go
create mode 100644 vendor/github.com/hashicorp/memberlist/logging.go
create mode 100644 vendor/github.com/hashicorp/memberlist/memberlist.go
create mode 100644 vendor/github.com/hashicorp/memberlist/merge_delegate.go
create mode 100644 vendor/github.com/hashicorp/memberlist/mock_transport.go
create mode 100644 vendor/github.com/hashicorp/memberlist/net.go
create mode 100644 vendor/github.com/hashicorp/memberlist/net_transport.go
create mode 100644 vendor/github.com/hashicorp/memberlist/peeked_conn.go
create mode 100644 vendor/github.com/hashicorp/memberlist/ping_delegate.go
create mode 100644 vendor/github.com/hashicorp/memberlist/queue.go
create mode 100644 vendor/github.com/hashicorp/memberlist/security.go
create mode 100644 vendor/github.com/hashicorp/memberlist/state.go
create mode 100644 vendor/github.com/hashicorp/memberlist/suspicion.go
create mode 100644 vendor/github.com/hashicorp/memberlist/tag.sh
create mode 100644 vendor/github.com/hashicorp/memberlist/todo.md
create mode 100644 vendor/github.com/hashicorp/memberlist/transport.go
create mode 100644 vendor/github.com/hashicorp/memberlist/util.go
create mode 100644 vendor/github.com/klauspost/compress/.gitattributes
create mode 100644 vendor/github.com/klauspost/compress/.gitignore
create mode 100644 vendor/github.com/klauspost/compress/.goreleaser.yml
create mode 100644 vendor/github.com/klauspost/compress/LICENSE
create mode 100644 vendor/github.com/klauspost/compress/README.md
create mode 100644 vendor/github.com/klauspost/compress/SECURITY.md
create mode 100644 vendor/github.com/klauspost/compress/compressible.go
create mode 100644 vendor/github.com/klauspost/compress/fse/README.md
create mode 100644 vendor/github.com/klauspost/compress/fse/bitreader.go
create mode 100644 vendor/github.com/klauspost/compress/fse/bitwriter.go
create mode 100644 vendor/github.com/klauspost/compress/fse/bytereader.go
create mode 100644 vendor/github.com/klauspost/compress/fse/compress.go
create mode 100644 vendor/github.com/klauspost/compress/fse/decompress.go
create mode 100644 vendor/github.com/klauspost/compress/fse/fse.go
create mode 100644 vendor/github.com/klauspost/compress/gen.sh
create mode 100644 vendor/github.com/klauspost/compress/huff0/.gitignore
create mode 100644 vendor/github.com/klauspost/compress/huff0/README.md
create mode 100644 vendor/github.com/klauspost/compress/huff0/bitreader.go
create mode 100644 vendor/github.com/klauspost/compress/huff0/bitwriter.go
create mode 100644 vendor/github.com/klauspost/compress/huff0/compress.go
create mode 100644 vendor/github.com/klauspost/compress/huff0/decompress.go
create mode 100644 vendor/github.com/klauspost/compress/huff0/decompress_amd64.go
create mode 100644 vendor/github.com/klauspost/compress/huff0/decompress_amd64.s
create mode 100644 vendor/github.com/klauspost/compress/huff0/decompress_generic.go
create mode 100644 vendor/github.com/klauspost/compress/huff0/huff0.go
create mode 100644 vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo.go
create mode 100644 vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.go
create mode 100644 vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.s
create mode 100644 vendor/github.com/klauspost/compress/internal/le/le.go
create mode 100644 vendor/github.com/klauspost/compress/internal/le/unsafe_disabled.go
create mode 100644 vendor/github.com/klauspost/compress/internal/le/unsafe_enabled.go
create mode 100644 vendor/github.com/klauspost/compress/internal/race/norace.go
create mode 100644 vendor/github.com/klauspost/compress/internal/race/race.go
rename vendor/github.com/{mxk/go-flowrate => klauspost/compress/internal/snapref}/LICENSE (59%)
create mode 100644 vendor/github.com/klauspost/compress/internal/snapref/decode.go
create mode 100644 vendor/github.com/klauspost/compress/internal/snapref/decode_other.go
create mode 100644 vendor/github.com/klauspost/compress/internal/snapref/encode.go
create mode 100644 vendor/github.com/klauspost/compress/internal/snapref/encode_other.go
create mode 100644 vendor/github.com/klauspost/compress/internal/snapref/snappy.go
create mode 100644 vendor/github.com/klauspost/compress/s2/.gitignore
create mode 100644 vendor/github.com/klauspost/compress/s2/LICENSE
create mode 100644 vendor/github.com/klauspost/compress/s2/README.md
create mode 100644 vendor/github.com/klauspost/compress/s2/decode.go
create mode 100644 vendor/github.com/klauspost/compress/s2/decode_amd64.s
create mode 100644 vendor/github.com/klauspost/compress/s2/decode_arm64.s
create mode 100644 vendor/github.com/klauspost/compress/s2/decode_asm.go
create mode 100644 vendor/github.com/klauspost/compress/s2/decode_other.go
create mode 100644 vendor/github.com/klauspost/compress/s2/dict.go
create mode 100644 vendor/github.com/klauspost/compress/s2/encode.go
create mode 100644 vendor/github.com/klauspost/compress/s2/encode_all.go
create mode 100644 vendor/github.com/klauspost/compress/s2/encode_amd64.go
create mode 100644 vendor/github.com/klauspost/compress/s2/encode_best.go
create mode 100644 vendor/github.com/klauspost/compress/s2/encode_better.go
create mode 100644 vendor/github.com/klauspost/compress/s2/encode_go.go
create mode 100644 vendor/github.com/klauspost/compress/s2/encodeblock_amd64.go
create mode 100644 vendor/github.com/klauspost/compress/s2/encodeblock_amd64.s
create mode 100644 vendor/github.com/klauspost/compress/s2/hashtable_pool.go
create mode 100644 vendor/github.com/klauspost/compress/s2/index.go
create mode 100644 vendor/github.com/klauspost/compress/s2/lz4convert.go
create mode 100644 vendor/github.com/klauspost/compress/s2/lz4sconvert.go
create mode 100644 vendor/github.com/klauspost/compress/s2/reader.go
create mode 100644 vendor/github.com/klauspost/compress/s2/s2.go
create mode 100644 vendor/github.com/klauspost/compress/s2/writer.go
create mode 100644 vendor/github.com/klauspost/compress/s2sx.mod
create mode 100644 vendor/github.com/klauspost/compress/s2sx.sum
create mode 100644 vendor/github.com/klauspost/compress/zstd/README.md
create mode 100644 vendor/github.com/klauspost/compress/zstd/bitreader.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/bitwriter.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/blockdec.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/blockenc.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/blocktype_string.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/bytebuf.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/bytereader.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/decodeheader.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/decoder.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/decoder_options.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/dict.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/enc_base.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/enc_best.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/enc_better.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/enc_dfast.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/enc_fast.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/encoder.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/encoder_options.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/framedec.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/frameenc.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/fse_decoder.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/fse_decoder_amd64.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/fse_decoder_amd64.s
create mode 100644 vendor/github.com/klauspost/compress/zstd/fse_decoder_generic.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/fse_encoder.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/fse_predefined.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/hash.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/history.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/LICENSE.txt
create mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/README.md
create mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_amd64.s
create mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_arm64.s
create mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_asm.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_other.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_safe.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/matchlen_amd64.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/matchlen_amd64.s
create mode 100644 vendor/github.com/klauspost/compress/zstd/matchlen_generic.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/seqdec.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/seqdec_amd64.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/seqdec_amd64.s
create mode 100644 vendor/github.com/klauspost/compress/zstd/seqdec_generic.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/seqenc.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/simple_go124.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/snappy.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/zip.go
create mode 100644 vendor/github.com/klauspost/compress/zstd/zstd.go
create mode 100644 vendor/github.com/miekg/dns/.codecov.yml
create mode 100644 vendor/github.com/miekg/dns/.gitignore
create mode 100644 vendor/github.com/miekg/dns/AUTHORS
create mode 100644 vendor/github.com/miekg/dns/CODEOWNERS
create mode 100644 vendor/github.com/miekg/dns/CONTRIBUTORS
create mode 100644 vendor/github.com/miekg/dns/COPYRIGHT
create mode 100644 vendor/github.com/miekg/dns/LICENSE
create mode 100644 vendor/github.com/miekg/dns/Makefile.fuzz
create mode 100644 vendor/github.com/miekg/dns/Makefile.release
create mode 100644 vendor/github.com/miekg/dns/README.md
create mode 100644 vendor/github.com/miekg/dns/acceptfunc.go
create mode 100644 vendor/github.com/miekg/dns/client.go
create mode 100644 vendor/github.com/miekg/dns/clientconfig.go
create mode 100644 vendor/github.com/miekg/dns/dane.go
create mode 100644 vendor/github.com/miekg/dns/defaults.go
create mode 100644 vendor/github.com/miekg/dns/dns.go
create mode 100644 vendor/github.com/miekg/dns/dnssec.go
create mode 100644 vendor/github.com/miekg/dns/dnssec_keygen.go
create mode 100644 vendor/github.com/miekg/dns/dnssec_keyscan.go
create mode 100644 vendor/github.com/miekg/dns/dnssec_privkey.go
create mode 100644 vendor/github.com/miekg/dns/doc.go
create mode 100644 vendor/github.com/miekg/dns/duplicate.go
create mode 100644 vendor/github.com/miekg/dns/edns.go
create mode 100644 vendor/github.com/miekg/dns/format.go
create mode 100644 vendor/github.com/miekg/dns/fuzz.go
create mode 100644 vendor/github.com/miekg/dns/generate.go
create mode 100644 vendor/github.com/miekg/dns/hash.go
create mode 100644 vendor/github.com/miekg/dns/labels.go
create mode 100644 vendor/github.com/miekg/dns/listen_no_socket_options.go
create mode 100644 vendor/github.com/miekg/dns/listen_socket_options.go
create mode 100644 vendor/github.com/miekg/dns/msg.go
create mode 100644 vendor/github.com/miekg/dns/msg_helpers.go
create mode 100644 vendor/github.com/miekg/dns/msg_truncate.go
create mode 100644 vendor/github.com/miekg/dns/nsecx.go
create mode 100644 vendor/github.com/miekg/dns/privaterr.go
create mode 100644 vendor/github.com/miekg/dns/reverse.go
create mode 100644 vendor/github.com/miekg/dns/sanitize.go
create mode 100644 vendor/github.com/miekg/dns/scan.go
create mode 100644 vendor/github.com/miekg/dns/scan_rr.go
create mode 100644 vendor/github.com/miekg/dns/serve_mux.go
create mode 100644 vendor/github.com/miekg/dns/server.go
create mode 100644 vendor/github.com/miekg/dns/sig0.go
create mode 100644 vendor/github.com/miekg/dns/smimea.go
create mode 100644 vendor/github.com/miekg/dns/svcb.go
create mode 100644 vendor/github.com/miekg/dns/tlsa.go
create mode 100644 vendor/github.com/miekg/dns/tools.go
create mode 100644 vendor/github.com/miekg/dns/tsig.go
create mode 100644 vendor/github.com/miekg/dns/types.go
create mode 100644 vendor/github.com/miekg/dns/udp.go
create mode 100644 vendor/github.com/miekg/dns/udp_no_control.go
create mode 100644 vendor/github.com/miekg/dns/update.go
create mode 100644 vendor/github.com/miekg/dns/version.go
create mode 100644 vendor/github.com/miekg/dns/xfr.go
create mode 100644 vendor/github.com/miekg/dns/zduplicate.go
create mode 100644 vendor/github.com/miekg/dns/zmsg.go
create mode 100644 vendor/github.com/miekg/dns/ztypes.go
delete mode 100644 vendor/github.com/mxk/go-flowrate/flowrate/flowrate.go
delete mode 100644 vendor/github.com/mxk/go-flowrate/flowrate/io.go
delete mode 100644 vendor/github.com/mxk/go-flowrate/flowrate/util.go
create mode 100644 vendor/github.com/pierrec/lz4/v4/.gitignore
create mode 100644 vendor/github.com/pierrec/lz4/v4/LICENSE
create mode 100644 vendor/github.com/pierrec/lz4/v4/README.md
create mode 100644 vendor/github.com/pierrec/lz4/v4/compressing_reader.go
create mode 100644 vendor/github.com/pierrec/lz4/v4/internal/lz4block/block.go
create mode 100644 vendor/github.com/pierrec/lz4/v4/internal/lz4block/blocks.go
create mode 100644 vendor/github.com/pierrec/lz4/v4/internal/lz4block/decode_amd64.s
create mode 100644 vendor/github.com/pierrec/lz4/v4/internal/lz4block/decode_arm.s
create mode 100644 vendor/github.com/pierrec/lz4/v4/internal/lz4block/decode_arm64.s
create mode 100644 vendor/github.com/pierrec/lz4/v4/internal/lz4block/decode_asm.go
create mode 100644 vendor/github.com/pierrec/lz4/v4/internal/lz4block/decode_other.go
create mode 100644 vendor/github.com/pierrec/lz4/v4/internal/lz4errors/errors.go
create mode 100644 vendor/github.com/pierrec/lz4/v4/internal/lz4stream/block.go
create mode 100644 vendor/github.com/pierrec/lz4/v4/internal/lz4stream/frame.go
create mode 100644 vendor/github.com/pierrec/lz4/v4/internal/lz4stream/frame_gen.go
create mode 100644 vendor/github.com/pierrec/lz4/v4/internal/xxh32/xxh32zero.go
create mode 100644 vendor/github.com/pierrec/lz4/v4/internal/xxh32/xxh32zero_arm.go
create mode 100644 vendor/github.com/pierrec/lz4/v4/internal/xxh32/xxh32zero_arm.s
create mode 100644 vendor/github.com/pierrec/lz4/v4/internal/xxh32/xxh32zero_other.go
create mode 100644 vendor/github.com/pierrec/lz4/v4/lz4.go
create mode 100644 vendor/github.com/pierrec/lz4/v4/options.go
create mode 100644 vendor/github.com/pierrec/lz4/v4/options_gen.go
create mode 100644 vendor/github.com/pierrec/lz4/v4/reader.go
create mode 100644 vendor/github.com/pierrec/lz4/v4/state.go
create mode 100644 vendor/github.com/pierrec/lz4/v4/state_gen.go
create mode 100644 vendor/github.com/pierrec/lz4/v4/writer.go
create mode 100644 vendor/github.com/prometheus/alertmanager/alert/alert.go
create mode 100644 vendor/github.com/prometheus/alertmanager/alert/state.go
create mode 100644 vendor/github.com/prometheus/alertmanager/alert/status.go
create mode 100644 vendor/github.com/prometheus/alertmanager/alert/validate.go
create mode 100644 vendor/github.com/prometheus/alertmanager/api/v2/models/receiver_reference.go
create mode 100644 vendor/github.com/prometheus/alertmanager/cluster/advertise.go
create mode 100644 vendor/github.com/prometheus/alertmanager/cluster/channel.go
create mode 100644 vendor/github.com/prometheus/alertmanager/cluster/cluster.go
create mode 100644 vendor/github.com/prometheus/alertmanager/cluster/clusterpb/cluster.pb.go
create mode 100644 vendor/github.com/prometheus/alertmanager/cluster/clusterpb/cluster.proto
create mode 100644 vendor/github.com/prometheus/alertmanager/cluster/connection_pool.go
create mode 100644 vendor/github.com/prometheus/alertmanager/cluster/delegate.go
create mode 100644 vendor/github.com/prometheus/alertmanager/cluster/tls_config.go
create mode 100644 vendor/github.com/prometheus/alertmanager/cluster/tls_connection.go
create mode 100644 vendor/github.com/prometheus/alertmanager/cluster/tls_transport.go
create mode 100644 vendor/github.com/prometheus/alertmanager/eventrecorder/config.go
create mode 100644 vendor/github.com/prometheus/alertmanager/eventrecorder/eventrecorderpb/eventrecorder.pb.go
create mode 100644 vendor/github.com/prometheus/alertmanager/eventrecorder/eventrecorderpb/eventrecorder.proto
create mode 100644 vendor/github.com/prometheus/alertmanager/eventrecorder/events.go
create mode 100644 vendor/github.com/prometheus/alertmanager/eventrecorder/file.go
create mode 100644 vendor/github.com/prometheus/alertmanager/eventrecorder/kafka.go
create mode 100644 vendor/github.com/prometheus/alertmanager/eventrecorder/metrics.go
create mode 100644 vendor/github.com/prometheus/alertmanager/eventrecorder/recorder.go
create mode 100644 vendor/github.com/prometheus/alertmanager/eventrecorder/webhook.go
create mode 100644 vendor/github.com/prometheus/alertmanager/inhibit/index.go
create mode 100644 vendor/github.com/prometheus/alertmanager/inhibit/inhibit.go
create mode 100644 vendor/github.com/prometheus/alertmanager/kafka/broker.go
create mode 100644 vendor/github.com/prometheus/alertmanager/kafka/client.go
create mode 100644 vendor/github.com/prometheus/alertmanager/kafka/errors.go
create mode 100644 vendor/github.com/prometheus/alertmanager/kafka/kafka.go
create mode 100644 vendor/github.com/prometheus/alertmanager/limit/bucket.go
create mode 100644 vendor/github.com/prometheus/alertmanager/marker/alert.go
create mode 100644 vendor/github.com/prometheus/alertmanager/marker/context.go
create mode 100644 vendor/github.com/prometheus/alertmanager/marker/group.go
create mode 100644 vendor/github.com/prometheus/alertmanager/marker/marker.go
create mode 100644 vendor/github.com/prometheus/alertmanager/marker/status.go
create mode 100644 vendor/github.com/prometheus/alertmanager/nflog/nflog.go
create mode 100644 vendor/github.com/prometheus/alertmanager/nflog/nflogpb/nflog.pb.go
create mode 100644 vendor/github.com/prometheus/alertmanager/nflog/nflogpb/nflog.proto
create mode 100644 vendor/github.com/prometheus/alertmanager/nflog/nflogpb/set.go
create mode 100644 vendor/github.com/prometheus/alertmanager/notify/cluster_stages.go
create mode 100644 vendor/github.com/prometheus/alertmanager/notify/context.go
create mode 100644 vendor/github.com/prometheus/alertmanager/notify/dedup_stage.go
create mode 100644 vendor/github.com/prometheus/alertmanager/notify/discord/config.go
create mode 100644 vendor/github.com/prometheus/alertmanager/notify/discord/discord.go
create mode 100644 vendor/github.com/prometheus/alertmanager/notify/event.go
create mode 100644 vendor/github.com/prometheus/alertmanager/notify/incidentio/config.go
create mode 100644 vendor/github.com/prometheus/alertmanager/notify/incidentio/incidentio.go
create mode 100644 vendor/github.com/prometheus/alertmanager/notify/jira/config.go
create mode 100644 vendor/github.com/prometheus/alertmanager/notify/jira/jira.go
create mode 100644 vendor/github.com/prometheus/alertmanager/notify/jira/types.go
create mode 100644 vendor/github.com/prometheus/alertmanager/notify/mattermost/config.go
create mode 100644 vendor/github.com/prometheus/alertmanager/notify/mattermost/mattermost.go
create mode 100644 vendor/github.com/prometheus/alertmanager/notify/metrics.go
create mode 100644 vendor/github.com/prometheus/alertmanager/notify/msteams/config.go
create mode 100644 vendor/github.com/prometheus/alertmanager/notify/msteams/msteams.go
create mode 100644 vendor/github.com/prometheus/alertmanager/notify/mute.go
create mode 100644 vendor/github.com/prometheus/alertmanager/notify/notify.go
create mode 100644 vendor/github.com/prometheus/alertmanager/notify/retry_stage.go
create mode 100644 vendor/github.com/prometheus/alertmanager/notify/set_notifies_stage.go
create mode 100644 vendor/github.com/prometheus/alertmanager/notify/util.go
create mode 100644 vendor/github.com/prometheus/alertmanager/notify/webhook/config.go
create mode 100644 vendor/github.com/prometheus/alertmanager/notify/webhook/webhook.go
create mode 100644 vendor/github.com/prometheus/alertmanager/provider/provider.go
create mode 100644 vendor/github.com/prometheus/alertmanager/silence/cache.go
create mode 100644 vendor/github.com/prometheus/alertmanager/silence/silence.go
create mode 100644 vendor/github.com/prometheus/alertmanager/silence/silencepb/silence.pb.go
create mode 100644 vendor/github.com/prometheus/alertmanager/silence/silencepb/silence.proto
create mode 100644 vendor/github.com/prometheus/alertmanager/silence/state.go
create mode 100644 vendor/github.com/prometheus/alertmanager/store/store.go
create mode 100644 vendor/github.com/prometheus/alertmanager/template/.gitignore
create mode 100644 vendor/github.com/prometheus/alertmanager/template/Makefile
create mode 100644 vendor/github.com/prometheus/alertmanager/template/default.tmpl
create mode 100644 vendor/github.com/prometheus/alertmanager/template/email.html
create mode 100644 vendor/github.com/prometheus/alertmanager/template/email.tmpl
create mode 100644 vendor/github.com/prometheus/alertmanager/template/inline-css.js
create mode 100644 vendor/github.com/prometheus/alertmanager/template/package-lock.json
create mode 100644 vendor/github.com/prometheus/alertmanager/template/package.json
create mode 100644 vendor/github.com/prometheus/alertmanager/template/template.go
create mode 100644 vendor/github.com/prometheus/alertmanager/types/types.go
create mode 100644 vendor/github.com/prometheus/prometheus/tsdb/fileutil/flock_aix.go
create mode 100644 vendor/github.com/prometheus/prometheus/util/strutil/jarowinkler.go
create mode 100644 vendor/github.com/prometheus/prometheus/util/strutil/subsequence.go
create mode 100644 vendor/github.com/sean-/seed/.gitignore
create mode 100644 vendor/github.com/sean-/seed/LICENSE
create mode 100644 vendor/github.com/sean-/seed/README.md
create mode 100644 vendor/github.com/sean-/seed/init.go
create mode 100644 vendor/github.com/twmb/franz-go/LICENSE
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kbin/primitives.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kerr/kerr.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/CLAUDE.md
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/atomic_maybe_work.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/broker.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/client.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/compression.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/config.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/connreset_unix.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/connreset_windows.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/consumer-bugs-prompt.md
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/consumer-efficiency-prompt.md
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/consumer.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/consumer_direct.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/consumer_group.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/consumer_group_848.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/consumer_share.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/errors.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/group_balancer.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/hooks.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/internal/sticky/graph.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/internal/sticky/rbtree.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/internal/sticky/sticky.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/internal/xsync/sync_mutex.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/internal/xsync/synctest_mutex.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/logger.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/metadata.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/metrics_714.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/partitioner.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/pools.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/produce-bugs-prompt.md
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/produce-efficiency-prompt.md
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/producer.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/record_and_fetch.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/record_formatter.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/ring.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/sink.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/source.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/strftime.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/topics_and_partitions.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kgo/txn.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kmsg/LICENSE
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kmsg/api.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kmsg/generated.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kmsg/internal/kbin/primitives.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kmsg/record.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kversion/kversion.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/kversion/requests.go
create mode 100644 vendor/github.com/twmb/franz-go/pkg/sasl/sasl.go
create mode 100644 vendor/github.com/twmb/franz-go/plugin/kslog/LICENSE
create mode 100644 vendor/github.com/twmb/franz-go/plugin/kslog/README.md
create mode 100644 vendor/github.com/twmb/franz-go/plugin/kslog/kslog.go
create mode 100644 vendor/go.opentelemetry.io/otel/AGENTS.md
create mode 100644 vendor/go.opentelemetry.io/otel/CLAUDE.md
delete mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.39.0/MIGRATION.md
delete mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.39.0/README.md
delete mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.39.0/error_type.go
create mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.41.0/MIGRATION.md
create mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.41.0/README.md
rename vendor/go.opentelemetry.io/otel/semconv/{v1.39.0 => v1.41.0}/attribute_group.go (92%)
rename vendor/go.opentelemetry.io/otel/semconv/{v1.39.0 => v1.41.0}/doc.go (68%)
create mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.41.0/error_type.go
rename vendor/go.opentelemetry.io/otel/semconv/{v1.39.0 => v1.41.0}/exception.go (59%)
rename vendor/go.opentelemetry.io/otel/semconv/{v1.40.0 => v1.41.0}/httpconv/metric.go (82%)
rename vendor/go.opentelemetry.io/otel/semconv/{v1.40.0 => v1.41.0}/otelconv/metric.go (66%)
rename vendor/go.opentelemetry.io/otel/semconv/{v1.39.0 => v1.41.0}/schema.go (61%)
create mode 100644 vendor/golang.org/x/mod/LICENSE
create mode 100644 vendor/golang.org/x/mod/PATENTS
create mode 100644 vendor/golang.org/x/mod/semver/semver.go
delete mode 100644 vendor/golang.org/x/net/html/atom/atom.go
delete mode 100644 vendor/golang.org/x/net/html/atom/table.go
delete mode 100644 vendor/golang.org/x/net/html/const.go
delete mode 100644 vendor/golang.org/x/net/html/doc.go
delete mode 100644 vendor/golang.org/x/net/html/doctype.go
delete mode 100644 vendor/golang.org/x/net/html/entity.go
delete mode 100644 vendor/golang.org/x/net/html/escape.go
delete mode 100644 vendor/golang.org/x/net/html/foreign.go
delete mode 100644 vendor/golang.org/x/net/html/iter.go
delete mode 100644 vendor/golang.org/x/net/html/node.go
delete mode 100644 vendor/golang.org/x/net/html/nodetype_string.go
delete mode 100644 vendor/golang.org/x/net/html/parse.go
delete mode 100644 vendor/golang.org/x/net/html/render.go
delete mode 100644 vendor/golang.org/x/net/html/token.go
create mode 100644 vendor/golang.org/x/net/http2/README.md
create mode 100644 vendor/golang.org/x/net/http2/clientconn.go
create mode 100644 vendor/golang.org/x/net/http2/server_common.go
create mode 100644 vendor/golang.org/x/net/http2/server_wrap.go
create mode 100644 vendor/golang.org/x/net/http2/transport_common.go
create mode 100644 vendor/golang.org/x/net/http2/transport_wrap.go
create mode 100644 vendor/golang.org/x/net/http2/writesched_common.go
delete mode 100644 vendor/golang.org/x/net/idna/go118.go
rename vendor/golang.org/x/net/idna/{idna10.0.0.go => idna.go} (81%)
delete mode 100644 vendor/golang.org/x/net/idna/idna9.0.0.go
delete mode 100644 vendor/golang.org/x/net/idna/tables10.0.0.go
delete mode 100644 vendor/golang.org/x/net/idna/tables11.0.0.go
delete mode 100644 vendor/golang.org/x/net/idna/tables12.0.0.go
delete mode 100644 vendor/golang.org/x/net/idna/tables13.0.0.go
create mode 100644 vendor/golang.org/x/net/idna/tables17.0.0.go
delete mode 100644 vendor/golang.org/x/net/idna/tables9.0.0.go
delete mode 100644 vendor/golang.org/x/net/idna/trie12.0.0.go
delete mode 100644 vendor/golang.org/x/net/idna/trie13.0.0.go
create mode 100644 vendor/golang.org/x/net/internal/iana/const.go
create mode 100644 vendor/golang.org/x/net/internal/socket/cmsghdr.go
create mode 100644 vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go
create mode 100644 vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go
create mode 100644 vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go
create mode 100644 vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go
create mode 100644 vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go
create mode 100644 vendor/golang.org/x/net/internal/socket/cmsghdr_unix.go
create mode 100644 vendor/golang.org/x/net/internal/socket/cmsghdr_zos_s390x.go
create mode 100644 vendor/golang.org/x/net/internal/socket/complete_dontwait.go
create mode 100644 vendor/golang.org/x/net/internal/socket/complete_nodontwait.go
create mode 100644 vendor/golang.org/x/net/internal/socket/empty.s
create mode 100644 vendor/golang.org/x/net/internal/socket/error_unix.go
create mode 100644 vendor/golang.org/x/net/internal/socket/error_windows.go
create mode 100644 vendor/golang.org/x/net/internal/socket/iovec_32bit.go
create mode 100644 vendor/golang.org/x/net/internal/socket/iovec_64bit.go
create mode 100644 vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go
create mode 100644 vendor/golang.org/x/net/internal/socket/iovec_stub.go
create mode 100644 vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go
create mode 100644 vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go
create mode 100644 vendor/golang.org/x/net/internal/socket/msghdr_bsd.go
create mode 100644 vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go
create mode 100644 vendor/golang.org/x/net/internal/socket/msghdr_linux.go
create mode 100644 vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go
create mode 100644 vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go
create mode 100644 vendor/golang.org/x/net/internal/socket/msghdr_openbsd.go
create mode 100644 vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go
create mode 100644 vendor/golang.org/x/net/internal/socket/msghdr_stub.go
create mode 100644 vendor/golang.org/x/net/internal/socket/msghdr_zos_s390x.go
create mode 100644 vendor/golang.org/x/net/internal/socket/norace.go
create mode 100644 vendor/golang.org/x/net/internal/socket/race.go
create mode 100644 vendor/golang.org/x/net/internal/socket/rawconn.go
create mode 100644 vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go
create mode 100644 vendor/golang.org/x/net/internal/socket/rawconn_msg.go
create mode 100644 vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go
create mode 100644 vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go
create mode 100644 vendor/golang.org/x/net/internal/socket/socket.go
create mode 100644 vendor/golang.org/x/net/internal/socket/sys_bsd.go
create mode 100644 vendor/golang.org/x/net/internal/socket/sys_const_unix.go
create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux.go
create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_386.go
create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_386.s
create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_amd64.go
create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_arm.go
create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_arm64.go
rename vendor/golang.org/x/net/{idna/pre_go118.go => internal/socket/sys_linux_loong64.go} (53%)
create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_mips.go
create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_mips64.go
create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_mips64le.go
create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_mipsle.go
create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_ppc.go
create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_ppc64.go
create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_ppc64le.go
create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_riscv64.go
create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_s390x.go
create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_s390x.s
create mode 100644 vendor/golang.org/x/net/internal/socket/sys_netbsd.go
create mode 100644 vendor/golang.org/x/net/internal/socket/sys_posix.go
create mode 100644 vendor/golang.org/x/net/internal/socket/sys_stub.go
create mode 100644 vendor/golang.org/x/net/internal/socket/sys_unix.go
create mode 100644 vendor/golang.org/x/net/internal/socket/sys_windows.go
create mode 100644 vendor/golang.org/x/net/internal/socket/sys_zos_s390x.go
create mode 100644 vendor/golang.org/x/net/internal/socket/sys_zos_s390x.s
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_darwin_arm64.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm64.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_freebsd_riscv64.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_386.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_loong64.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_ppc.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_netbsd_amd64.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm64.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_openbsd_386.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_openbsd_amd64.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm64.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_openbsd_mips64.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_openbsd_ppc64.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_openbsd_riscv64.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_solaris_amd64.go
create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_zos_s390x.go
create mode 100644 vendor/golang.org/x/net/ipv4/batch.go
create mode 100644 vendor/golang.org/x/net/ipv4/control.go
create mode 100644 vendor/golang.org/x/net/ipv4/control_bsd.go
create mode 100644 vendor/golang.org/x/net/ipv4/control_pktinfo.go
create mode 100644 vendor/golang.org/x/net/ipv4/control_stub.go
create mode 100644 vendor/golang.org/x/net/ipv4/control_unix.go
create mode 100644 vendor/golang.org/x/net/ipv4/control_windows.go
create mode 100644 vendor/golang.org/x/net/ipv4/control_zos.go
create mode 100644 vendor/golang.org/x/net/ipv4/dgramopt.go
create mode 100644 vendor/golang.org/x/net/ipv4/doc.go
create mode 100644 vendor/golang.org/x/net/ipv4/endpoint.go
create mode 100644 vendor/golang.org/x/net/ipv4/genericopt.go
create mode 100644 vendor/golang.org/x/net/ipv4/header.go
create mode 100644 vendor/golang.org/x/net/ipv4/helper.go
create mode 100644 vendor/golang.org/x/net/ipv4/iana.go
create mode 100644 vendor/golang.org/x/net/ipv4/icmp.go
create mode 100644 vendor/golang.org/x/net/ipv4/icmp_linux.go
create mode 100644 vendor/golang.org/x/net/ipv4/icmp_stub.go
create mode 100644 vendor/golang.org/x/net/ipv4/packet.go
create mode 100644 vendor/golang.org/x/net/ipv4/payload.go
create mode 100644 vendor/golang.org/x/net/ipv4/payload_cmsg.go
create mode 100644 vendor/golang.org/x/net/ipv4/payload_nocmsg.go
create mode 100644 vendor/golang.org/x/net/ipv4/sockopt.go
create mode 100644 vendor/golang.org/x/net/ipv4/sockopt_posix.go
create mode 100644 vendor/golang.org/x/net/ipv4/sockopt_stub.go
create mode 100644 vendor/golang.org/x/net/ipv4/sys_aix.go
create mode 100644 vendor/golang.org/x/net/ipv4/sys_asmreq.go
create mode 100644 vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go
create mode 100644 vendor/golang.org/x/net/ipv4/sys_asmreqn.go
create mode 100644 vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go
create mode 100644 vendor/golang.org/x/net/ipv4/sys_bpf.go
create mode 100644 vendor/golang.org/x/net/ipv4/sys_bpf_stub.go
create mode 100644 vendor/golang.org/x/net/ipv4/sys_bsd.go
create mode 100644 vendor/golang.org/x/net/ipv4/sys_darwin.go
create mode 100644 vendor/golang.org/x/net/ipv4/sys_dragonfly.go
create mode 100644 vendor/golang.org/x/net/ipv4/sys_freebsd.go
create mode 100644 vendor/golang.org/x/net/ipv4/sys_linux.go
create mode 100644 vendor/golang.org/x/net/ipv4/sys_solaris.go
create mode 100644 vendor/golang.org/x/net/ipv4/sys_ssmreq.go
create mode 100644 vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go
create mode 100644 vendor/golang.org/x/net/ipv4/sys_stub.go
create mode 100644 vendor/golang.org/x/net/ipv4/sys_windows.go
create mode 100644 vendor/golang.org/x/net/ipv4/sys_zos.go
create mode 100644 vendor/golang.org/x/net/ipv4/zsys_aix_ppc64.go
create mode 100644 vendor/golang.org/x/net/ipv4/zsys_darwin.go
create mode 100644 vendor/golang.org/x/net/ipv4/zsys_dragonfly.go
create mode 100644 vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go
create mode 100644 vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go
create mode 100644 vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go
create mode 100644 vendor/golang.org/x/net/ipv4/zsys_freebsd_arm64.go
create mode 100644 vendor/golang.org/x/net/ipv4/zsys_freebsd_riscv64.go
create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_386.go
create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go
create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_arm.go
create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go
create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_loong64.go
create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_mips.go
create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go
create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go
create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go
create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go
create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go
create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go
create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_riscv64.go
create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go
create mode 100644 vendor/golang.org/x/net/ipv4/zsys_netbsd.go
create mode 100644 vendor/golang.org/x/net/ipv4/zsys_openbsd.go
create mode 100644 vendor/golang.org/x/net/ipv4/zsys_solaris.go
create mode 100644 vendor/golang.org/x/net/ipv4/zsys_zos_s390x.go
create mode 100644 vendor/golang.org/x/net/ipv6/batch.go
create mode 100644 vendor/golang.org/x/net/ipv6/control.go
create mode 100644 vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go
create mode 100644 vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go
create mode 100644 vendor/golang.org/x/net/ipv6/control_stub.go
create mode 100644 vendor/golang.org/x/net/ipv6/control_unix.go
create mode 100644 vendor/golang.org/x/net/ipv6/control_windows.go
create mode 100644 vendor/golang.org/x/net/ipv6/dgramopt.go
create mode 100644 vendor/golang.org/x/net/ipv6/doc.go
create mode 100644 vendor/golang.org/x/net/ipv6/endpoint.go
create mode 100644 vendor/golang.org/x/net/ipv6/genericopt.go
create mode 100644 vendor/golang.org/x/net/ipv6/header.go
create mode 100644 vendor/golang.org/x/net/ipv6/helper.go
create mode 100644 vendor/golang.org/x/net/ipv6/iana.go
create mode 100644 vendor/golang.org/x/net/ipv6/icmp.go
create mode 100644 vendor/golang.org/x/net/ipv6/icmp_bsd.go
create mode 100644 vendor/golang.org/x/net/ipv6/icmp_linux.go
create mode 100644 vendor/golang.org/x/net/ipv6/icmp_solaris.go
create mode 100644 vendor/golang.org/x/net/ipv6/icmp_stub.go
create mode 100644 vendor/golang.org/x/net/ipv6/icmp_windows.go
create mode 100644 vendor/golang.org/x/net/ipv6/icmp_zos.go
create mode 100644 vendor/golang.org/x/net/ipv6/payload.go
create mode 100644 vendor/golang.org/x/net/ipv6/payload_cmsg.go
create mode 100644 vendor/golang.org/x/net/ipv6/payload_nocmsg.go
create mode 100644 vendor/golang.org/x/net/ipv6/sockopt.go
create mode 100644 vendor/golang.org/x/net/ipv6/sockopt_posix.go
create mode 100644 vendor/golang.org/x/net/ipv6/sockopt_stub.go
create mode 100644 vendor/golang.org/x/net/ipv6/sys_aix.go
create mode 100644 vendor/golang.org/x/net/ipv6/sys_asmreq.go
create mode 100644 vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go
create mode 100644 vendor/golang.org/x/net/ipv6/sys_bpf.go
create mode 100644 vendor/golang.org/x/net/ipv6/sys_bpf_stub.go
create mode 100644 vendor/golang.org/x/net/ipv6/sys_bsd.go
create mode 100644 vendor/golang.org/x/net/ipv6/sys_darwin.go
create mode 100644 vendor/golang.org/x/net/ipv6/sys_freebsd.go
create mode 100644 vendor/golang.org/x/net/ipv6/sys_linux.go
create mode 100644 vendor/golang.org/x/net/ipv6/sys_solaris.go
create mode 100644 vendor/golang.org/x/net/ipv6/sys_ssmreq.go
create mode 100644 vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go
create mode 100644 vendor/golang.org/x/net/ipv6/sys_stub.go
create mode 100644 vendor/golang.org/x/net/ipv6/sys_windows.go
create mode 100644 vendor/golang.org/x/net/ipv6/sys_zos.go
create mode 100644 vendor/golang.org/x/net/ipv6/zsys_aix_ppc64.go
create mode 100644 vendor/golang.org/x/net/ipv6/zsys_darwin.go
create mode 100644 vendor/golang.org/x/net/ipv6/zsys_dragonfly.go
create mode 100644 vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go
create mode 100644 vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go
create mode 100644 vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go
create mode 100644 vendor/golang.org/x/net/ipv6/zsys_freebsd_arm64.go
create mode 100644 vendor/golang.org/x/net/ipv6/zsys_freebsd_riscv64.go
create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_386.go
create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go
create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_arm.go
create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go
create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_loong64.go
create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_mips.go
create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go
create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go
create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go
create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go
create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go
create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go
create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_riscv64.go
create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go
create mode 100644 vendor/golang.org/x/net/ipv6/zsys_netbsd.go
create mode 100644 vendor/golang.org/x/net/ipv6/zsys_openbsd.go
create mode 100644 vendor/golang.org/x/net/ipv6/zsys_solaris.go
create mode 100644 vendor/golang.org/x/net/ipv6/zsys_zos_s390x.go
create mode 100644 vendor/golang.org/x/sys/unix/readv_unix.go
create mode 100644 vendor/golang.org/x/tools/LICENSE
create mode 100644 vendor/golang.org/x/tools/PATENTS
create mode 100644 vendor/golang.org/x/tools/go/ast/edge/edge.go
create mode 100644 vendor/golang.org/x/tools/go/ast/inspector/cursor.go
create mode 100644 vendor/golang.org/x/tools/go/ast/inspector/inspector.go
create mode 100644 vendor/golang.org/x/tools/go/ast/inspector/iter.go
create mode 100644 vendor/golang.org/x/tools/go/ast/inspector/typeof.go
create mode 100644 vendor/golang.org/x/tools/go/ast/inspector/walk.go
create mode 100644 vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go
create mode 100644 vendor/golang.org/x/tools/go/gcexportdata/importer.go
create mode 100644 vendor/golang.org/x/tools/go/packages/doc.go
create mode 100644 vendor/golang.org/x/tools/go/packages/external.go
create mode 100644 vendor/golang.org/x/tools/go/packages/golist.go
create mode 100644 vendor/golang.org/x/tools/go/packages/golist_overlay.go
create mode 100644 vendor/golang.org/x/tools/go/packages/loadmode_string.go
create mode 100644 vendor/golang.org/x/tools/go/packages/packages.go
create mode 100644 vendor/golang.org/x/tools/go/packages/visit.go
create mode 100644 vendor/golang.org/x/tools/go/types/objectpath/objectpath.go
create mode 100644 vendor/golang.org/x/tools/go/types/typeutil/callee.go
create mode 100644 vendor/golang.org/x/tools/go/types/typeutil/imports.go
create mode 100644 vendor/golang.org/x/tools/go/types/typeutil/map.go
create mode 100644 vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go
create mode 100644 vendor/golang.org/x/tools/go/types/typeutil/ui.go
create mode 100644 vendor/golang.org/x/tools/internal/aliases/aliases.go
create mode 100644 vendor/golang.org/x/tools/internal/event/core/event.go
create mode 100644 vendor/golang.org/x/tools/internal/event/core/export.go
create mode 100644 vendor/golang.org/x/tools/internal/event/core/fast.go
create mode 100644 vendor/golang.org/x/tools/internal/event/doc.go
create mode 100644 vendor/golang.org/x/tools/internal/event/event.go
create mode 100644 vendor/golang.org/x/tools/internal/event/keys/keys.go
create mode 100644 vendor/golang.org/x/tools/internal/event/keys/standard.go
create mode 100644 vendor/golang.org/x/tools/internal/event/keys/util.go
create mode 100644 vendor/golang.org/x/tools/internal/event/label/label.go
create mode 100644 vendor/golang.org/x/tools/internal/gcimporter/bimport.go
create mode 100644 vendor/golang.org/x/tools/internal/gcimporter/exportdata.go
create mode 100644 vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go
create mode 100644 vendor/golang.org/x/tools/internal/gcimporter/iexport.go
create mode 100644 vendor/golang.org/x/tools/internal/gcimporter/iimport.go
create mode 100644 vendor/golang.org/x/tools/internal/gcimporter/predeclared.go
create mode 100644 vendor/golang.org/x/tools/internal/gcimporter/support.go
create mode 100644 vendor/golang.org/x/tools/internal/gcimporter/ureader.go
create mode 100644 vendor/golang.org/x/tools/internal/gocommand/invoke.go
create mode 100644 vendor/golang.org/x/tools/internal/gocommand/invoke_notunix.go
create mode 100644 vendor/golang.org/x/tools/internal/gocommand/invoke_unix.go
create mode 100644 vendor/golang.org/x/tools/internal/gocommand/vendor.go
create mode 100644 vendor/golang.org/x/tools/internal/gocommand/version.go
create mode 100644 vendor/golang.org/x/tools/internal/packagesinternal/packages.go
create mode 100644 vendor/golang.org/x/tools/internal/pkgbits/codes.go
create mode 100644 vendor/golang.org/x/tools/internal/pkgbits/decoder.go
create mode 100644 vendor/golang.org/x/tools/internal/pkgbits/doc.go
create mode 100644 vendor/golang.org/x/tools/internal/pkgbits/encoder.go
create mode 100644 vendor/golang.org/x/tools/internal/pkgbits/flags.go
create mode 100644 vendor/golang.org/x/tools/internal/pkgbits/reloc.go
create mode 100644 vendor/golang.org/x/tools/internal/pkgbits/support.go
create mode 100644 vendor/golang.org/x/tools/internal/pkgbits/sync.go
create mode 100644 vendor/golang.org/x/tools/internal/pkgbits/syncmarker_string.go
create mode 100644 vendor/golang.org/x/tools/internal/pkgbits/version.go
create mode 100644 vendor/golang.org/x/tools/internal/stdlib/deps.go
create mode 100644 vendor/golang.org/x/tools/internal/stdlib/import.go
create mode 100644 vendor/golang.org/x/tools/internal/stdlib/manifest.go
create mode 100644 vendor/golang.org/x/tools/internal/stdlib/stdlib.go
create mode 100644 vendor/golang.org/x/tools/internal/typeparams/common.go
create mode 100644 vendor/golang.org/x/tools/internal/typeparams/coretype.go
create mode 100644 vendor/golang.org/x/tools/internal/typeparams/free.go
create mode 100644 vendor/golang.org/x/tools/internal/typeparams/normalize.go
create mode 100644 vendor/golang.org/x/tools/internal/typeparams/termlist.go
create mode 100644 vendor/golang.org/x/tools/internal/typeparams/typeterm.go
create mode 100644 vendor/golang.org/x/tools/internal/typesinternal/classify_call.go
create mode 100644 vendor/golang.org/x/tools/internal/typesinternal/element.go
create mode 100644 vendor/golang.org/x/tools/internal/typesinternal/errorcode.go
create mode 100644 vendor/golang.org/x/tools/internal/typesinternal/errorcode_string.go
create mode 100644 vendor/golang.org/x/tools/internal/typesinternal/fx.go
create mode 100644 vendor/golang.org/x/tools/internal/typesinternal/isnamed.go
create mode 100644 vendor/golang.org/x/tools/internal/typesinternal/qualifier.go
create mode 100644 vendor/golang.org/x/tools/internal/typesinternal/recv.go
create mode 100644 vendor/golang.org/x/tools/internal/typesinternal/toonew.go
create mode 100644 vendor/golang.org/x/tools/internal/typesinternal/types.go
create mode 100644 vendor/golang.org/x/tools/internal/typesinternal/varkind.go
create mode 100644 vendor/golang.org/x/tools/internal/typesinternal/varkind_go124.go
create mode 100644 vendor/golang.org/x/tools/internal/typesinternal/zerovalue.go
create mode 100644 vendor/golang.org/x/tools/internal/versions/features.go
create mode 100644 vendor/golang.org/x/tools/internal/versions/gover.go
create mode 100644 vendor/golang.org/x/tools/internal/versions/types.go
create mode 100644 vendor/golang.org/x/tools/internal/versions/versions.go
create mode 100644 vendor/google.golang.org/grpc/internal/transport/readyreader/raw_conn_linux.go
create mode 100644 vendor/google.golang.org/grpc/internal/transport/readyreader/raw_conn_nonlinux.go
create mode 100644 vendor/google.golang.org/grpc/internal/transport/readyreader/ready_reader.go
delete mode 100644 vendor/k8s.io/api/admission/v1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/admissionregistration/v1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/admissionregistration/v1alpha1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/admissionregistration/v1beta1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/apidiscovery/v2/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/apiserverinternal/v1alpha1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/apps/v1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/apps/v1beta1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/apps/v1beta2/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/authentication/v1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/authentication/v1alpha1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/authentication/v1beta1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/authorization/v1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/authorization/v1beta1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/autoscaling/v1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/autoscaling/v2/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta1/doc.go
delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta1/generated.pb.go
delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta1/generated.proto
delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta1/register.go
delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta1/types.go
delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta1/types_swagger_doc_generated.go
delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta1/zz_generated.deepcopy.go
delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta1/zz_generated.model_name.go
delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta1/zz_generated.prerelease-lifecycle.go
delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/doc.go
delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/generated.pb.go
delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/generated.proto
delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/register.go
delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/types.go
delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/types_swagger_doc_generated.go
delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/zz_generated.deepcopy.go
delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/zz_generated.model_name.go
delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/zz_generated.prerelease-lifecycle.go
delete mode 100644 vendor/k8s.io/api/batch/v1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/batch/v1beta1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/certificates/v1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/certificates/v1alpha1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/certificates/v1beta1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/coordination/v1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/coordination/v1alpha2/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/coordination/v1beta1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/core/v1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/discovery/v1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/discovery/v1beta1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/events/v1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/events/v1beta1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/extensions/v1beta1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/flowcontrol/v1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/flowcontrol/v1beta1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/flowcontrol/v1beta2/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/flowcontrol/v1beta3/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/imagepolicy/v1alpha1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/networking/v1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/networking/v1beta1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/node/v1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/node/v1alpha1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/node/v1beta1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/policy/v1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/policy/v1beta1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/rbac/v1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/rbac/v1alpha1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/rbac/v1beta1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/resource/v1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/resource/v1alpha3/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/resource/v1beta1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/resource/v1beta2/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/scheduling/v1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/scheduling/v1alpha1/generated.pb.go
delete mode 100644 vendor/k8s.io/api/scheduling/v1alpha1/generated.proto
delete mode 100644 vendor/k8s.io/api/scheduling/v1alpha1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/scheduling/v1alpha1/types.go
delete mode 100644 vendor/k8s.io/api/scheduling/v1alpha1/types_swagger_doc_generated.go
delete mode 100644 vendor/k8s.io/api/scheduling/v1alpha1/zz_generated.deepcopy.go
delete mode 100644 vendor/k8s.io/api/scheduling/v1alpha1/zz_generated.model_name.go
rename vendor/k8s.io/api/scheduling/{v1alpha1 => v1alpha2}/doc.go (84%)
create mode 100644 vendor/k8s.io/api/scheduling/v1alpha2/generated.pb.go
create mode 100644 vendor/k8s.io/api/scheduling/v1alpha2/generated.proto
rename vendor/k8s.io/api/scheduling/{v1alpha1 => v1alpha2}/register.go (90%)
create mode 100644 vendor/k8s.io/api/scheduling/v1alpha2/types.go
create mode 100644 vendor/k8s.io/api/scheduling/v1alpha2/types_swagger_doc_generated.go
create mode 100644 vendor/k8s.io/api/scheduling/v1alpha2/zz_generated.deepcopy.go
create mode 100644 vendor/k8s.io/api/scheduling/v1alpha2/zz_generated.model_name.go
delete mode 100644 vendor/k8s.io/api/scheduling/v1beta1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/storage/v1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/storage/v1alpha1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/storage/v1beta1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/api/storagemigration/v1beta1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/resource/generated.protomessage.pb.go
create mode 100644 vendor/k8s.io/apimachinery/pkg/api/validate/content/path.go
create mode 100644 vendor/k8s.io/apimachinery/pkg/api/validate/discriminator.go
rename vendor/k8s.io/{api/apidiscovery/v2beta1/generated.protomessage.pb.go => apimachinery/pkg/apis/meta/internalversion/conversion.go} (51%)
create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/fieldsv1.go
create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/fieldsv1_byte.go
create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/fieldsv1_string.go
delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/diff/cmp.go
rename vendor/k8s.io/{client-go/kubernetes/typed/autoscaling/v2beta2/fake => apimachinery/pkg/util/httpstream/spdy}/doc.go (72%)
create mode 100644 vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/spdy.go
delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/intstr/generated.protomessage.pb.go
delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/proxy/dial.go
delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/proxy/transport.go
delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/proxy/upgradeaware.go
delete mode 100644 vendor/k8s.io/apimachinery/third_party/forked/golang/netutil/addr.go
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/applyconfiguration.go
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/jsonpatch.go
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/mutatingadmissionpolicy.go
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/mutatingadmissionpolicybinding.go
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/mutatingadmissionpolicybindingspec.go
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/mutatingadmissionpolicyspec.go
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/mutation.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/containerresourcemetricsource.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/containerresourcemetricstatus.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/crossversionobjectreference.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/externalmetricsource.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/externalmetricstatus.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/horizontalpodautoscalercondition.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/horizontalpodautoscalerspec.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/horizontalpodautoscalerstatus.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/metricspec.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/metricstatus.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/objectmetricsource.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/objectmetricstatus.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/podsmetricsource.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/podsmetricstatus.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/resourcemetricsource.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/resourcemetricstatus.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/containerresourcemetricsource.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/containerresourcemetricstatus.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/crossversionobjectreference.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/externalmetricsource.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/externalmetricstatus.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/horizontalpodautoscalerbehavior.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/horizontalpodautoscalercondition.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/horizontalpodautoscalerspec.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/horizontalpodautoscalerstatus.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/hpascalingpolicy.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/hpascalingrules.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/metricidentifier.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/metricspec.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/metricstatus.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/metrictarget.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/metricvaluestatus.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/objectmetricsource.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/objectmetricstatus.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/podsmetricsource.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/podsmetricstatus.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/resourcemetricsource.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/resourcemetricstatus.go
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/imagevolumestatus.go
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeallocatableresourceclaimstatus.go
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/podschedulinggroup.go
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/volumestatus.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/workloadreference.go
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1/nodeallocatableresourcemapping.go
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha3/poolstatus.go
rename vendor/k8s.io/client-go/applyconfigurations/{scheduling/v1alpha1/priorityclass.go => resource/v1alpha3/resourcepoolstatusrequest.go} (57%)
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcepoolstatusrequestspec.go
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha3/resourcepoolstatusrequeststatus.go
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1beta1/nodeallocatableresourcemapping.go
rename vendor/k8s.io/client-go/applyconfigurations/{autoscaling/v2beta2/horizontalpodautoscaler.go => resource/v1beta2/devicetaintrule.go} (60%)
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1beta2/devicetaintrulespec.go
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1beta2/devicetaintrulestatus.go
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1beta2/devicetaintselector.go
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1beta2/nodeallocatableresourcemapping.go
delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/scheduling/v1alpha1/podgroup.go
rename vendor/k8s.io/client-go/applyconfigurations/scheduling/{v1alpha1 => v1alpha2}/gangschedulingpolicy.go (99%)
rename vendor/k8s.io/client-go/applyconfigurations/{autoscaling/v2beta1/horizontalpodautoscaler.go => scheduling/v1alpha2/podgroup.go} (61%)
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/scheduling/v1alpha2/podgroupresourceclaim.go
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/scheduling/v1alpha2/podgroupresourceclaimstatus.go
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/scheduling/v1alpha2/podgroupschedulingconstraints.go
rename vendor/k8s.io/client-go/applyconfigurations/scheduling/{v1alpha1/podgrouppolicy.go => v1alpha2/podgroupschedulingpolicy.go} (60%)
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/scheduling/v1alpha2/podgroupspec.go
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/scheduling/v1alpha2/podgroupstatus.go
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/scheduling/v1alpha2/podgrouptemplate.go
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/scheduling/v1alpha2/podgrouptemplatereference.go
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/scheduling/v1alpha2/topologyconstraint.go
rename vendor/k8s.io/client-go/applyconfigurations/scheduling/{v1alpha1 => v1alpha2}/typedlocalobjectreference.go (99%)
rename vendor/k8s.io/client-go/applyconfigurations/scheduling/{v1alpha1 => v1alpha2}/workload.go (95%)
create mode 100644 vendor/k8s.io/client-go/applyconfigurations/scheduling/v1alpha2/workloadpodgrouptemplatereference.go
rename vendor/k8s.io/client-go/applyconfigurations/scheduling/{v1alpha1 => v1alpha2}/workloadspec.go (75%)
create mode 100644 vendor/k8s.io/client-go/informers/admissionregistration/v1/mutatingadmissionpolicy.go
create mode 100644 vendor/k8s.io/client-go/informers/admissionregistration/v1/mutatingadmissionpolicybinding.go
delete mode 100644 vendor/k8s.io/client-go/informers/autoscaling/v2beta1/horizontalpodautoscaler.go
delete mode 100644 vendor/k8s.io/client-go/informers/autoscaling/v2beta1/interface.go
delete mode 100644 vendor/k8s.io/client-go/informers/autoscaling/v2beta2/horizontalpodautoscaler.go
delete mode 100644 vendor/k8s.io/client-go/informers/autoscaling/v2beta2/interface.go
create mode 100644 vendor/k8s.io/client-go/informers/resource/v1alpha3/resourcepoolstatusrequest.go
create mode 100644 vendor/k8s.io/client-go/informers/resource/v1beta2/devicetaintrule.go
delete mode 100644 vendor/k8s.io/client-go/informers/scheduling/v1alpha1/priorityclass.go
delete mode 100644 vendor/k8s.io/client-go/informers/scheduling/v1alpha1/workload.go
rename vendor/k8s.io/client-go/informers/scheduling/{v1alpha1 => v1alpha2}/interface.go (82%)
create mode 100644 vendor/k8s.io/client-go/informers/scheduling/v1alpha2/podgroup.go
create mode 100644 vendor/k8s.io/client-go/informers/scheduling/v1alpha2/workload.go
create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/fake/fake_mutatingadmissionpolicy.go
create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/fake/fake_mutatingadmissionpolicybinding.go
create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/mutatingadmissionpolicy.go
create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/mutatingadmissionpolicybinding.go
delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/autoscaling_client.go
delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/doc.go
delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake/fake_autoscaling_client.go
delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake/fake_horizontalpodautoscaler.go
delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/generated_expansion.go
delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/horizontalpodautoscaler.go
delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/autoscaling_client.go
delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/doc.go
delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/fake/fake_autoscaling_client.go
delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/fake/fake_horizontalpodautoscaler.go
delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/generated_expansion.go
delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/horizontalpodautoscaler.go
create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/fake/fake_resourcepoolstatusrequest.go
create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha3/resourcepoolstatusrequest.go
create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1beta2/devicetaintrule.go
create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1beta2/fake/fake_devicetaintrule.go
delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/doc.go
delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/fake_priorityclass.go
delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/fake_workload.go
delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/priorityclass.go
rename vendor/k8s.io/client-go/kubernetes/typed/scheduling/{v1alpha1 => v1alpha2}/doc.go (97%)
rename vendor/k8s.io/client-go/kubernetes/typed/{autoscaling/v2beta1 => scheduling/v1alpha2}/fake/doc.go (100%)
create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha2/fake/fake_podgroup.go
rename vendor/k8s.io/client-go/kubernetes/typed/scheduling/{v1alpha1 => v1alpha2}/fake/fake_scheduling_client.go (70%)
create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha2/fake/fake_workload.go
rename vendor/k8s.io/client-go/kubernetes/typed/scheduling/{v1alpha1 => v1alpha2}/generated_expansion.go (91%)
create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha2/podgroup.go
rename vendor/k8s.io/client-go/kubernetes/typed/scheduling/{v1alpha1 => v1alpha2}/scheduling_client.go (67%)
rename vendor/k8s.io/client-go/kubernetes/typed/scheduling/{v1alpha1 => v1alpha2}/workload.go (60%)
create mode 100644 vendor/k8s.io/client-go/listers/admissionregistration/v1/mutatingadmissionpolicy.go
create mode 100644 vendor/k8s.io/client-go/listers/admissionregistration/v1/mutatingadmissionpolicybinding.go
delete mode 100644 vendor/k8s.io/client-go/listers/autoscaling/v2beta1/expansion_generated.go
delete mode 100644 vendor/k8s.io/client-go/listers/autoscaling/v2beta1/horizontalpodautoscaler.go
delete mode 100644 vendor/k8s.io/client-go/listers/autoscaling/v2beta2/expansion_generated.go
delete mode 100644 vendor/k8s.io/client-go/listers/autoscaling/v2beta2/horizontalpodautoscaler.go
create mode 100644 vendor/k8s.io/client-go/listers/resource/v1alpha3/resourcepoolstatusrequest.go
rename vendor/k8s.io/client-go/listers/{scheduling/v1alpha1/priorityclass.go => resource/v1beta2/devicetaintrule.go} (50%)
rename vendor/k8s.io/client-go/listers/scheduling/{v1alpha1 => v1alpha2}/expansion_generated.go (75%)
create mode 100644 vendor/k8s.io/client-go/listers/scheduling/v1alpha2/podgroup.go
rename vendor/k8s.io/client-go/listers/scheduling/{v1alpha1 => v1alpha2}/workload.go (80%)
create mode 100644 vendor/k8s.io/client-go/testing/doc.go
create mode 100644 vendor/k8s.io/client-go/tools/cache/event_handler_name.go
create mode 100644 vendor/k8s.io/client-go/tools/cache/fifo_metrics.go
create mode 100644 vendor/k8s.io/client-go/tools/cache/identity.go
create mode 100644 vendor/k8s.io/client-go/transport/ca_rotation.go
create mode 100644 vendor/k8s.io/component-base/cli/flag/curves_flag.go
create mode 100644 vendor/k8s.io/klog/v2/internal/verbosity/verbosity.go
create mode 100644 vendor/k8s.io/klog/v2/textlogger/options.go
create mode 100644 vendor/k8s.io/klog/v2/textlogger/textlogger.go
create mode 100644 vendor/k8s.io/klog/v2/textlogger/textlogger_slog.go
create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/alias.go
delete mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/decode.go
delete mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/encode.go
create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/internal/internal.go
create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/internal/jsonflags/flags.go
create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/internal/jsonopts/options.go
create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/internal/jsonwire/decode.go
create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/internal/jsonwire/encode.go
create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/internal/jsonwire/wire.go
create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/jsontext/alias.go
create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/jsontext/decode.go
create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/jsontext/doc.go
create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/jsontext/encode.go
create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/jsontext/errors.go
create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/jsontext/export.go
create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/jsontext/options.go
rename vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/{ => jsontext}/pools.go (64%)
create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/jsontext/quote.go
rename vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/{ => jsontext}/state.go (63%)
rename vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/{ => jsontext}/token.go (87%)
create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/jsontext/value.go
create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/migrate.sh
create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/options.go
delete mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/value.go
create mode 100644 vendor/k8s.io/streaming/LICENSE
rename vendor/k8s.io/{apimachinery/pkg/util/proxy => streaming/pkg/httpstream}/doc.go (75%)
create mode 100644 vendor/k8s.io/streaming/pkg/httpstream/httpstream.go
rename vendor/k8s.io/{apimachinery/pkg/util => streaming/pkg}/httpstream/spdy/connection.go (97%)
rename vendor/k8s.io/{apimachinery/pkg/util => streaming/pkg}/httpstream/spdy/roundtripper.go (65%)
rename vendor/k8s.io/{apimachinery/pkg/util => streaming/pkg}/httpstream/spdy/upgrade.go (93%)
rename vendor/k8s.io/{apimachinery/pkg/util => streaming/pkg}/httpstream/wsstream/conn.go (88%)
rename vendor/k8s.io/{apimachinery/pkg/util => streaming/pkg}/httpstream/wsstream/doc.go (100%)
rename vendor/k8s.io/{apimachinery/pkg/util => streaming/pkg}/httpstream/wsstream/stream.go (81%)
create mode 100644 vendor/k8s.io/streaming/pkg/runtime/runtime.go
rename vendor/k8s.io/{apimachinery/pkg/util => utils}/dump/dump.go (100%)
diff --git a/vendor/github.com/armon/go-metrics/.gitignore b/vendor/github.com/armon/go-metrics/.gitignore
new file mode 100644
index 00000000000..e5750f5720e
--- /dev/null
+++ b/vendor/github.com/armon/go-metrics/.gitignore
@@ -0,0 +1,26 @@
+# Compiled Object files, Static and Dynamic libs (Shared Objects)
+*.o
+*.a
+*.so
+
+# Folders
+_obj
+_test
+
+# Architecture specific extensions/prefixes
+*.[568vq]
+[568vq].out
+
+*.cgo1.go
+*.cgo2.c
+_cgo_defun.c
+_cgo_gotypes.go
+_cgo_export.*
+
+_testmain.go
+
+*.exe
+
+/metrics.out
+
+.idea
diff --git a/vendor/github.com/armon/go-metrics/.travis.yml b/vendor/github.com/armon/go-metrics/.travis.yml
new file mode 100644
index 00000000000..87d230c8d78
--- /dev/null
+++ b/vendor/github.com/armon/go-metrics/.travis.yml
@@ -0,0 +1,13 @@
+language: go
+
+go:
+ - "1.x"
+
+env:
+ - GO111MODULE=on
+
+install:
+ - go get ./...
+
+script:
+ - go test ./...
diff --git a/vendor/github.com/armon/go-metrics/LICENSE b/vendor/github.com/armon/go-metrics/LICENSE
new file mode 100644
index 00000000000..106569e542b
--- /dev/null
+++ b/vendor/github.com/armon/go-metrics/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2013 Armon Dadgar
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vendor/github.com/armon/go-metrics/README.md b/vendor/github.com/armon/go-metrics/README.md
new file mode 100644
index 00000000000..aa73348c08d
--- /dev/null
+++ b/vendor/github.com/armon/go-metrics/README.md
@@ -0,0 +1,91 @@
+go-metrics
+==========
+
+This library provides a `metrics` package which can be used to instrument code,
+expose application metrics, and profile runtime performance in a flexible manner.
+
+Current API: [](https://godoc.org/github.com/armon/go-metrics)
+
+Sinks
+-----
+
+The `metrics` package makes use of a `MetricSink` interface to support delivery
+to any type of backend. Currently the following sinks are provided:
+
+* StatsiteSink : Sinks to a [statsite](https://github.com/armon/statsite/) instance (TCP)
+* StatsdSink: Sinks to a [StatsD](https://github.com/etsy/statsd/) / statsite instance (UDP)
+* PrometheusSink: Sinks to a [Prometheus](http://prometheus.io/) metrics endpoint (exposed via HTTP for scrapes)
+* InmemSink : Provides in-memory aggregation, can be used to export stats
+* FanoutSink : Sinks to multiple sinks. Enables writing to multiple statsite instances for example.
+* BlackholeSink : Sinks to nowhere
+
+In addition to the sinks, the `InmemSignal` can be used to catch a signal,
+and dump a formatted output of recent metrics. For example, when a process gets
+a SIGUSR1, it can dump to stderr recent performance metrics for debugging.
+
+Labels
+------
+
+Most metrics do have an equivalent ending with `WithLabels`, such methods
+allow to push metrics with labels and use some features of underlying Sinks
+(ex: translated into Prometheus labels).
+
+Since some of these labels may increase greatly cardinality of metrics, the
+library allow to filter labels using a blacklist/whitelist filtering system
+which is global to all metrics.
+
+* If `Config.AllowedLabels` is not nil, then only labels specified in this value will be sent to underlying Sink, otherwise, all labels are sent by default.
+* If `Config.BlockedLabels` is not nil, any label specified in this value will not be sent to underlying Sinks.
+
+By default, both `Config.AllowedLabels` and `Config.BlockedLabels` are nil, meaning that
+no tags are filetered at all, but it allow to a user to globally block some tags with high
+cardinality at application level.
+
+Examples
+--------
+
+Here is an example of using the package:
+
+```go
+func SlowMethod() {
+ // Profiling the runtime of a method
+ defer metrics.MeasureSince([]string{"SlowMethod"}, time.Now())
+}
+
+// Configure a statsite sink as the global metrics sink
+sink, _ := metrics.NewStatsiteSink("statsite:8125")
+metrics.NewGlobal(metrics.DefaultConfig("service-name"), sink)
+
+// Emit a Key/Value pair
+metrics.EmitKey([]string{"questions", "meaning of life"}, 42)
+```
+
+Here is an example of setting up a signal handler:
+
+```go
+// Setup the inmem sink and signal handler
+inm := metrics.NewInmemSink(10*time.Second, time.Minute)
+sig := metrics.DefaultInmemSignal(inm)
+metrics.NewGlobal(metrics.DefaultConfig("service-name"), inm)
+
+// Run some code
+inm.SetGauge([]string{"foo"}, 42)
+inm.EmitKey([]string{"bar"}, 30)
+
+inm.IncrCounter([]string{"baz"}, 42)
+inm.IncrCounter([]string{"baz"}, 1)
+inm.IncrCounter([]string{"baz"}, 80)
+
+inm.AddSample([]string{"method", "wow"}, 42)
+inm.AddSample([]string{"method", "wow"}, 100)
+inm.AddSample([]string{"method", "wow"}, 22)
+
+....
+```
+
+When a signal comes in, output like the following will be dumped to stderr:
+
+ [2014-01-28 14:57:33.04 -0800 PST][G] 'foo': 42.000
+ [2014-01-28 14:57:33.04 -0800 PST][P] 'bar': 30.000
+ [2014-01-28 14:57:33.04 -0800 PST][C] 'baz': Count: 3 Min: 1.000 Mean: 41.000 Max: 80.000 Stddev: 39.509
+ [2014-01-28 14:57:33.04 -0800 PST][S] 'method.wow': Count: 3 Min: 22.000 Mean: 54.667 Max: 100.000 Stddev: 40.513
\ No newline at end of file
diff --git a/vendor/github.com/armon/go-metrics/const_unix.go b/vendor/github.com/armon/go-metrics/const_unix.go
new file mode 100644
index 00000000000..31098dd57e5
--- /dev/null
+++ b/vendor/github.com/armon/go-metrics/const_unix.go
@@ -0,0 +1,12 @@
+// +build !windows
+
+package metrics
+
+import (
+ "syscall"
+)
+
+const (
+ // DefaultSignal is used with DefaultInmemSignal
+ DefaultSignal = syscall.SIGUSR1
+)
diff --git a/vendor/github.com/armon/go-metrics/const_windows.go b/vendor/github.com/armon/go-metrics/const_windows.go
new file mode 100644
index 00000000000..38136af3e42
--- /dev/null
+++ b/vendor/github.com/armon/go-metrics/const_windows.go
@@ -0,0 +1,13 @@
+// +build windows
+
+package metrics
+
+import (
+ "syscall"
+)
+
+const (
+ // DefaultSignal is used with DefaultInmemSignal
+ // Windows has no SIGUSR1, use SIGBREAK
+ DefaultSignal = syscall.Signal(21)
+)
diff --git a/vendor/github.com/armon/go-metrics/inmem.go b/vendor/github.com/armon/go-metrics/inmem.go
new file mode 100644
index 00000000000..7c427aca979
--- /dev/null
+++ b/vendor/github.com/armon/go-metrics/inmem.go
@@ -0,0 +1,339 @@
+package metrics
+
+import (
+ "bytes"
+ "fmt"
+ "math"
+ "net/url"
+ "strings"
+ "sync"
+ "time"
+)
+
+var spaceReplacer = strings.NewReplacer(" ", "_")
+
+// InmemSink provides a MetricSink that does in-memory aggregation
+// without sending metrics over a network. It can be embedded within
+// an application to provide profiling information.
+type InmemSink struct {
+ // How long is each aggregation interval
+ interval time.Duration
+
+ // Retain controls how many metrics interval we keep
+ retain time.Duration
+
+ // maxIntervals is the maximum length of intervals.
+ // It is retain / interval.
+ maxIntervals int
+
+ // intervals is a slice of the retained intervals
+ intervals []*IntervalMetrics
+ intervalLock sync.RWMutex
+
+ rateDenom float64
+}
+
+// IntervalMetrics stores the aggregated metrics
+// for a specific interval
+type IntervalMetrics struct {
+ sync.RWMutex
+
+ // The start time of the interval
+ Interval time.Time
+
+ // Gauges maps the key to the last set value
+ Gauges map[string]GaugeValue
+
+ // Points maps the string to the list of emitted values
+ // from EmitKey
+ Points map[string][]float32
+
+ // Counters maps the string key to a sum of the counter
+ // values
+ Counters map[string]SampledValue
+
+ // Samples maps the key to an AggregateSample,
+ // which has the rolled up view of a sample
+ Samples map[string]SampledValue
+
+ // done is closed when this interval has ended, and a new IntervalMetrics
+ // has been created to receive any future metrics.
+ done chan struct{}
+}
+
+// NewIntervalMetrics creates a new IntervalMetrics for a given interval
+func NewIntervalMetrics(intv time.Time) *IntervalMetrics {
+ return &IntervalMetrics{
+ Interval: intv,
+ Gauges: make(map[string]GaugeValue),
+ Points: make(map[string][]float32),
+ Counters: make(map[string]SampledValue),
+ Samples: make(map[string]SampledValue),
+ done: make(chan struct{}),
+ }
+}
+
+// AggregateSample is used to hold aggregate metrics
+// about a sample
+type AggregateSample struct {
+ Count int // The count of emitted pairs
+ Rate float64 // The values rate per time unit (usually 1 second)
+ Sum float64 // The sum of values
+ SumSq float64 `json:"-"` // The sum of squared values
+ Min float64 // Minimum value
+ Max float64 // Maximum value
+ LastUpdated time.Time `json:"-"` // When value was last updated
+}
+
+// Computes a Stddev of the values
+func (a *AggregateSample) Stddev() float64 {
+ num := (float64(a.Count) * a.SumSq) - math.Pow(a.Sum, 2)
+ div := float64(a.Count * (a.Count - 1))
+ if div == 0 {
+ return 0
+ }
+ return math.Sqrt(num / div)
+}
+
+// Computes a mean of the values
+func (a *AggregateSample) Mean() float64 {
+ if a.Count == 0 {
+ return 0
+ }
+ return a.Sum / float64(a.Count)
+}
+
+// Ingest is used to update a sample
+func (a *AggregateSample) Ingest(v float64, rateDenom float64) {
+ a.Count++
+ a.Sum += v
+ a.SumSq += (v * v)
+ if v < a.Min || a.Count == 1 {
+ a.Min = v
+ }
+ if v > a.Max || a.Count == 1 {
+ a.Max = v
+ }
+ a.Rate = float64(a.Sum) / rateDenom
+ a.LastUpdated = time.Now()
+}
+
+func (a *AggregateSample) String() string {
+ if a.Count == 0 {
+ return "Count: 0"
+ } else if a.Stddev() == 0 {
+ return fmt.Sprintf("Count: %d Sum: %0.3f LastUpdated: %s", a.Count, a.Sum, a.LastUpdated)
+ } else {
+ return fmt.Sprintf("Count: %d Min: %0.3f Mean: %0.3f Max: %0.3f Stddev: %0.3f Sum: %0.3f LastUpdated: %s",
+ a.Count, a.Min, a.Mean(), a.Max, a.Stddev(), a.Sum, a.LastUpdated)
+ }
+}
+
+// NewInmemSinkFromURL creates an InmemSink from a URL. It is used
+// (and tested) from NewMetricSinkFromURL.
+func NewInmemSinkFromURL(u *url.URL) (MetricSink, error) {
+ params := u.Query()
+
+ interval, err := time.ParseDuration(params.Get("interval"))
+ if err != nil {
+ return nil, fmt.Errorf("Bad 'interval' param: %s", err)
+ }
+
+ retain, err := time.ParseDuration(params.Get("retain"))
+ if err != nil {
+ return nil, fmt.Errorf("Bad 'retain' param: %s", err)
+ }
+
+ return NewInmemSink(interval, retain), nil
+}
+
+// NewInmemSink is used to construct a new in-memory sink.
+// Uses an aggregation interval and maximum retention period.
+func NewInmemSink(interval, retain time.Duration) *InmemSink {
+ rateTimeUnit := time.Second
+ i := &InmemSink{
+ interval: interval,
+ retain: retain,
+ maxIntervals: int(retain / interval),
+ rateDenom: float64(interval.Nanoseconds()) / float64(rateTimeUnit.Nanoseconds()),
+ }
+ i.intervals = make([]*IntervalMetrics, 0, i.maxIntervals)
+ return i
+}
+
+func (i *InmemSink) SetGauge(key []string, val float32) {
+ i.SetGaugeWithLabels(key, val, nil)
+}
+
+func (i *InmemSink) SetGaugeWithLabels(key []string, val float32, labels []Label) {
+ k, name := i.flattenKeyLabels(key, labels)
+ intv := i.getInterval()
+
+ intv.Lock()
+ defer intv.Unlock()
+ intv.Gauges[k] = GaugeValue{Name: name, Value: val, Labels: labels}
+}
+
+func (i *InmemSink) EmitKey(key []string, val float32) {
+ k := i.flattenKey(key)
+ intv := i.getInterval()
+
+ intv.Lock()
+ defer intv.Unlock()
+ vals := intv.Points[k]
+ intv.Points[k] = append(vals, val)
+}
+
+func (i *InmemSink) IncrCounter(key []string, val float32) {
+ i.IncrCounterWithLabels(key, val, nil)
+}
+
+func (i *InmemSink) IncrCounterWithLabels(key []string, val float32, labels []Label) {
+ k, name := i.flattenKeyLabels(key, labels)
+ intv := i.getInterval()
+
+ intv.Lock()
+ defer intv.Unlock()
+
+ agg, ok := intv.Counters[k]
+ if !ok {
+ agg = SampledValue{
+ Name: name,
+ AggregateSample: &AggregateSample{},
+ Labels: labels,
+ }
+ intv.Counters[k] = agg
+ }
+ agg.Ingest(float64(val), i.rateDenom)
+}
+
+func (i *InmemSink) AddSample(key []string, val float32) {
+ i.AddSampleWithLabels(key, val, nil)
+}
+
+func (i *InmemSink) AddSampleWithLabels(key []string, val float32, labels []Label) {
+ k, name := i.flattenKeyLabels(key, labels)
+ intv := i.getInterval()
+
+ intv.Lock()
+ defer intv.Unlock()
+
+ agg, ok := intv.Samples[k]
+ if !ok {
+ agg = SampledValue{
+ Name: name,
+ AggregateSample: &AggregateSample{},
+ Labels: labels,
+ }
+ intv.Samples[k] = agg
+ }
+ agg.Ingest(float64(val), i.rateDenom)
+}
+
+// Data is used to retrieve all the aggregated metrics
+// Intervals may be in use, and a read lock should be acquired
+func (i *InmemSink) Data() []*IntervalMetrics {
+ // Get the current interval, forces creation
+ i.getInterval()
+
+ i.intervalLock.RLock()
+ defer i.intervalLock.RUnlock()
+
+ n := len(i.intervals)
+ intervals := make([]*IntervalMetrics, n)
+
+ copy(intervals[:n-1], i.intervals[:n-1])
+ current := i.intervals[n-1]
+
+ // make its own copy for current interval
+ intervals[n-1] = &IntervalMetrics{}
+ copyCurrent := intervals[n-1]
+ current.RLock()
+ *copyCurrent = *current
+ // RWMutex is not safe to copy, so create a new instance on the copy
+ copyCurrent.RWMutex = sync.RWMutex{}
+
+ copyCurrent.Gauges = make(map[string]GaugeValue, len(current.Gauges))
+ for k, v := range current.Gauges {
+ copyCurrent.Gauges[k] = v
+ }
+ // saved values will be not change, just copy its link
+ copyCurrent.Points = make(map[string][]float32, len(current.Points))
+ for k, v := range current.Points {
+ copyCurrent.Points[k] = v
+ }
+ copyCurrent.Counters = make(map[string]SampledValue, len(current.Counters))
+ for k, v := range current.Counters {
+ copyCurrent.Counters[k] = v.deepCopy()
+ }
+ copyCurrent.Samples = make(map[string]SampledValue, len(current.Samples))
+ for k, v := range current.Samples {
+ copyCurrent.Samples[k] = v.deepCopy()
+ }
+ current.RUnlock()
+
+ return intervals
+}
+
+// getInterval returns the current interval. A new interval is created if no
+// previous interval exists, or if the current time is beyond the window for the
+// current interval.
+func (i *InmemSink) getInterval() *IntervalMetrics {
+ intv := time.Now().Truncate(i.interval)
+
+ // Attempt to return the existing interval first, because it only requires
+ // a read lock.
+ i.intervalLock.RLock()
+ n := len(i.intervals)
+ if n > 0 && i.intervals[n-1].Interval == intv {
+ defer i.intervalLock.RUnlock()
+ return i.intervals[n-1]
+ }
+ i.intervalLock.RUnlock()
+
+ i.intervalLock.Lock()
+ defer i.intervalLock.Unlock()
+
+ // Re-check for an existing interval now that the lock is re-acquired.
+ n = len(i.intervals)
+ if n > 0 && i.intervals[n-1].Interval == intv {
+ return i.intervals[n-1]
+ }
+
+ current := NewIntervalMetrics(intv)
+ i.intervals = append(i.intervals, current)
+ if n > 0 {
+ close(i.intervals[n-1].done)
+ }
+
+ n++
+ // Prune old intervals if the count exceeds the max.
+ if n >= i.maxIntervals {
+ copy(i.intervals[0:], i.intervals[n-i.maxIntervals:])
+ i.intervals = i.intervals[:i.maxIntervals]
+ }
+ return current
+}
+
+// Flattens the key for formatting, removes spaces
+func (i *InmemSink) flattenKey(parts []string) string {
+ buf := &bytes.Buffer{}
+
+ joined := strings.Join(parts, ".")
+
+ spaceReplacer.WriteString(buf, joined)
+
+ return buf.String()
+}
+
+// Flattens the key for formatting along with its labels, removes spaces
+func (i *InmemSink) flattenKeyLabels(parts []string, labels []Label) (string, string) {
+ key := i.flattenKey(parts)
+ buf := bytes.NewBufferString(key)
+
+ for _, label := range labels {
+ spaceReplacer.WriteString(buf, fmt.Sprintf(";%s=%s", label.Name, label.Value))
+ }
+
+ return buf.String(), key
+}
diff --git a/vendor/github.com/armon/go-metrics/inmem_endpoint.go b/vendor/github.com/armon/go-metrics/inmem_endpoint.go
new file mode 100644
index 00000000000..24eefa96389
--- /dev/null
+++ b/vendor/github.com/armon/go-metrics/inmem_endpoint.go
@@ -0,0 +1,162 @@
+package metrics
+
+import (
+ "context"
+ "fmt"
+ "net/http"
+ "sort"
+ "time"
+)
+
+// MetricsSummary holds a roll-up of metrics info for a given interval
+type MetricsSummary struct {
+ Timestamp string
+ Gauges []GaugeValue
+ Points []PointValue
+ Counters []SampledValue
+ Samples []SampledValue
+}
+
+type GaugeValue struct {
+ Name string
+ Hash string `json:"-"`
+ Value float32
+
+ Labels []Label `json:"-"`
+ DisplayLabels map[string]string `json:"Labels"`
+}
+
+type PointValue struct {
+ Name string
+ Points []float32
+}
+
+type SampledValue struct {
+ Name string
+ Hash string `json:"-"`
+ *AggregateSample
+ Mean float64
+ Stddev float64
+
+ Labels []Label `json:"-"`
+ DisplayLabels map[string]string `json:"Labels"`
+}
+
+// deepCopy allocates a new instance of AggregateSample
+func (source *SampledValue) deepCopy() SampledValue {
+ dest := *source
+ if source.AggregateSample != nil {
+ dest.AggregateSample = &AggregateSample{}
+ *dest.AggregateSample = *source.AggregateSample
+ }
+ return dest
+}
+
+// DisplayMetrics returns a summary of the metrics from the most recent finished interval.
+func (i *InmemSink) DisplayMetrics(resp http.ResponseWriter, req *http.Request) (interface{}, error) {
+ data := i.Data()
+
+ var interval *IntervalMetrics
+ n := len(data)
+ switch {
+ case n == 0:
+ return nil, fmt.Errorf("no metric intervals have been initialized yet")
+ case n == 1:
+ // Show the current interval if it's all we have
+ interval = data[0]
+ default:
+ // Show the most recent finished interval if we have one
+ interval = data[n-2]
+ }
+
+ return newMetricSummaryFromInterval(interval), nil
+}
+
+func newMetricSummaryFromInterval(interval *IntervalMetrics) MetricsSummary {
+ interval.RLock()
+ defer interval.RUnlock()
+
+ summary := MetricsSummary{
+ Timestamp: interval.Interval.Round(time.Second).UTC().String(),
+ Gauges: make([]GaugeValue, 0, len(interval.Gauges)),
+ Points: make([]PointValue, 0, len(interval.Points)),
+ }
+
+ // Format and sort the output of each metric type, so it gets displayed in a
+ // deterministic order.
+ for name, points := range interval.Points {
+ summary.Points = append(summary.Points, PointValue{name, points})
+ }
+ sort.Slice(summary.Points, func(i, j int) bool {
+ return summary.Points[i].Name < summary.Points[j].Name
+ })
+
+ for hash, value := range interval.Gauges {
+ value.Hash = hash
+ value.DisplayLabels = make(map[string]string)
+ for _, label := range value.Labels {
+ value.DisplayLabels[label.Name] = label.Value
+ }
+ value.Labels = nil
+
+ summary.Gauges = append(summary.Gauges, value)
+ }
+ sort.Slice(summary.Gauges, func(i, j int) bool {
+ return summary.Gauges[i].Hash < summary.Gauges[j].Hash
+ })
+
+ summary.Counters = formatSamples(interval.Counters)
+ summary.Samples = formatSamples(interval.Samples)
+
+ return summary
+}
+
+func formatSamples(source map[string]SampledValue) []SampledValue {
+ output := make([]SampledValue, 0, len(source))
+ for hash, sample := range source {
+ displayLabels := make(map[string]string)
+ for _, label := range sample.Labels {
+ displayLabels[label.Name] = label.Value
+ }
+
+ output = append(output, SampledValue{
+ Name: sample.Name,
+ Hash: hash,
+ AggregateSample: sample.AggregateSample,
+ Mean: sample.AggregateSample.Mean(),
+ Stddev: sample.AggregateSample.Stddev(),
+ DisplayLabels: displayLabels,
+ })
+ }
+ sort.Slice(output, func(i, j int) bool {
+ return output[i].Hash < output[j].Hash
+ })
+
+ return output
+}
+
+type Encoder interface {
+ Encode(interface{}) error
+}
+
+// Stream writes metrics using encoder.Encode each time an interval ends. Runs
+// until the request context is cancelled, or the encoder returns an error.
+// The caller is responsible for logging any errors from encoder.
+func (i *InmemSink) Stream(ctx context.Context, encoder Encoder) {
+ interval := i.getInterval()
+
+ for {
+ select {
+ case <-interval.done:
+ summary := newMetricSummaryFromInterval(interval)
+ if err := encoder.Encode(summary); err != nil {
+ return
+ }
+
+ // update interval to the next one
+ interval = i.getInterval()
+ case <-ctx.Done():
+ return
+ }
+ }
+}
diff --git a/vendor/github.com/armon/go-metrics/inmem_signal.go b/vendor/github.com/armon/go-metrics/inmem_signal.go
new file mode 100644
index 00000000000..0937f4aedf7
--- /dev/null
+++ b/vendor/github.com/armon/go-metrics/inmem_signal.go
@@ -0,0 +1,117 @@
+package metrics
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "os"
+ "os/signal"
+ "strings"
+ "sync"
+ "syscall"
+)
+
+// InmemSignal is used to listen for a given signal, and when received,
+// to dump the current metrics from the InmemSink to an io.Writer
+type InmemSignal struct {
+ signal syscall.Signal
+ inm *InmemSink
+ w io.Writer
+ sigCh chan os.Signal
+
+ stop bool
+ stopCh chan struct{}
+ stopLock sync.Mutex
+}
+
+// NewInmemSignal creates a new InmemSignal which listens for a given signal,
+// and dumps the current metrics out to a writer
+func NewInmemSignal(inmem *InmemSink, sig syscall.Signal, w io.Writer) *InmemSignal {
+ i := &InmemSignal{
+ signal: sig,
+ inm: inmem,
+ w: w,
+ sigCh: make(chan os.Signal, 1),
+ stopCh: make(chan struct{}),
+ }
+ signal.Notify(i.sigCh, sig)
+ go i.run()
+ return i
+}
+
+// DefaultInmemSignal returns a new InmemSignal that responds to SIGUSR1
+// and writes output to stderr. Windows uses SIGBREAK
+func DefaultInmemSignal(inmem *InmemSink) *InmemSignal {
+ return NewInmemSignal(inmem, DefaultSignal, os.Stderr)
+}
+
+// Stop is used to stop the InmemSignal from listening
+func (i *InmemSignal) Stop() {
+ i.stopLock.Lock()
+ defer i.stopLock.Unlock()
+
+ if i.stop {
+ return
+ }
+ i.stop = true
+ close(i.stopCh)
+ signal.Stop(i.sigCh)
+}
+
+// run is a long running routine that handles signals
+func (i *InmemSignal) run() {
+ for {
+ select {
+ case <-i.sigCh:
+ i.dumpStats()
+ case <-i.stopCh:
+ return
+ }
+ }
+}
+
+// dumpStats is used to dump the data to output writer
+func (i *InmemSignal) dumpStats() {
+ buf := bytes.NewBuffer(nil)
+
+ data := i.inm.Data()
+ // Skip the last period which is still being aggregated
+ for j := 0; j < len(data)-1; j++ {
+ intv := data[j]
+ intv.RLock()
+ for _, val := range intv.Gauges {
+ name := i.flattenLabels(val.Name, val.Labels)
+ fmt.Fprintf(buf, "[%v][G] '%s': %0.3f\n", intv.Interval, name, val.Value)
+ }
+ for name, vals := range intv.Points {
+ for _, val := range vals {
+ fmt.Fprintf(buf, "[%v][P] '%s': %0.3f\n", intv.Interval, name, val)
+ }
+ }
+ for _, agg := range intv.Counters {
+ name := i.flattenLabels(agg.Name, agg.Labels)
+ fmt.Fprintf(buf, "[%v][C] '%s': %s\n", intv.Interval, name, agg.AggregateSample)
+ }
+ for _, agg := range intv.Samples {
+ name := i.flattenLabels(agg.Name, agg.Labels)
+ fmt.Fprintf(buf, "[%v][S] '%s': %s\n", intv.Interval, name, agg.AggregateSample)
+ }
+ intv.RUnlock()
+ }
+
+ // Write out the bytes
+ i.w.Write(buf.Bytes())
+}
+
+// Flattens the key for formatting along with its labels, removes spaces
+func (i *InmemSignal) flattenLabels(name string, labels []Label) string {
+ buf := bytes.NewBufferString(name)
+ replacer := strings.NewReplacer(" ", "_", ":", "_")
+
+ for _, label := range labels {
+ replacer.WriteString(buf, ".")
+ replacer.WriteString(buf, label.Value)
+ }
+
+ return buf.String()
+}
diff --git a/vendor/github.com/armon/go-metrics/metrics.go b/vendor/github.com/armon/go-metrics/metrics.go
new file mode 100644
index 00000000000..36642a42937
--- /dev/null
+++ b/vendor/github.com/armon/go-metrics/metrics.go
@@ -0,0 +1,299 @@
+package metrics
+
+import (
+ "runtime"
+ "strings"
+ "time"
+
+ iradix "github.com/hashicorp/go-immutable-radix"
+)
+
+type Label struct {
+ Name string
+ Value string
+}
+
+func (m *Metrics) SetGauge(key []string, val float32) {
+ m.SetGaugeWithLabels(key, val, nil)
+}
+
+func (m *Metrics) SetGaugeWithLabels(key []string, val float32, labels []Label) {
+ if m.HostName != "" {
+ if m.EnableHostnameLabel {
+ labels = append(labels, Label{"host", m.HostName})
+ } else if m.EnableHostname {
+ key = insert(0, m.HostName, key)
+ }
+ }
+ if m.EnableTypePrefix {
+ key = insert(0, "gauge", key)
+ }
+ if m.ServiceName != "" {
+ if m.EnableServiceLabel {
+ labels = append(labels, Label{"service", m.ServiceName})
+ } else {
+ key = insert(0, m.ServiceName, key)
+ }
+ }
+ allowed, labelsFiltered := m.allowMetric(key, labels)
+ if !allowed {
+ return
+ }
+ m.sink.SetGaugeWithLabels(key, val, labelsFiltered)
+}
+
+func (m *Metrics) EmitKey(key []string, val float32) {
+ if m.EnableTypePrefix {
+ key = insert(0, "kv", key)
+ }
+ if m.ServiceName != "" {
+ key = insert(0, m.ServiceName, key)
+ }
+ allowed, _ := m.allowMetric(key, nil)
+ if !allowed {
+ return
+ }
+ m.sink.EmitKey(key, val)
+}
+
+func (m *Metrics) IncrCounter(key []string, val float32) {
+ m.IncrCounterWithLabels(key, val, nil)
+}
+
+func (m *Metrics) IncrCounterWithLabels(key []string, val float32, labels []Label) {
+ if m.HostName != "" && m.EnableHostnameLabel {
+ labels = append(labels, Label{"host", m.HostName})
+ }
+ if m.EnableTypePrefix {
+ key = insert(0, "counter", key)
+ }
+ if m.ServiceName != "" {
+ if m.EnableServiceLabel {
+ labels = append(labels, Label{"service", m.ServiceName})
+ } else {
+ key = insert(0, m.ServiceName, key)
+ }
+ }
+ allowed, labelsFiltered := m.allowMetric(key, labels)
+ if !allowed {
+ return
+ }
+ m.sink.IncrCounterWithLabels(key, val, labelsFiltered)
+}
+
+func (m *Metrics) AddSample(key []string, val float32) {
+ m.AddSampleWithLabels(key, val, nil)
+}
+
+func (m *Metrics) AddSampleWithLabels(key []string, val float32, labels []Label) {
+ if m.HostName != "" && m.EnableHostnameLabel {
+ labels = append(labels, Label{"host", m.HostName})
+ }
+ if m.EnableTypePrefix {
+ key = insert(0, "sample", key)
+ }
+ if m.ServiceName != "" {
+ if m.EnableServiceLabel {
+ labels = append(labels, Label{"service", m.ServiceName})
+ } else {
+ key = insert(0, m.ServiceName, key)
+ }
+ }
+ allowed, labelsFiltered := m.allowMetric(key, labels)
+ if !allowed {
+ return
+ }
+ m.sink.AddSampleWithLabels(key, val, labelsFiltered)
+}
+
+func (m *Metrics) MeasureSince(key []string, start time.Time) {
+ m.MeasureSinceWithLabels(key, start, nil)
+}
+
+func (m *Metrics) MeasureSinceWithLabels(key []string, start time.Time, labels []Label) {
+ if m.HostName != "" && m.EnableHostnameLabel {
+ labels = append(labels, Label{"host", m.HostName})
+ }
+ if m.EnableTypePrefix {
+ key = insert(0, "timer", key)
+ }
+ if m.ServiceName != "" {
+ if m.EnableServiceLabel {
+ labels = append(labels, Label{"service", m.ServiceName})
+ } else {
+ key = insert(0, m.ServiceName, key)
+ }
+ }
+ allowed, labelsFiltered := m.allowMetric(key, labels)
+ if !allowed {
+ return
+ }
+ now := time.Now()
+ elapsed := now.Sub(start)
+ msec := float32(elapsed.Nanoseconds()) / float32(m.TimerGranularity)
+ m.sink.AddSampleWithLabels(key, msec, labelsFiltered)
+}
+
+// UpdateFilter overwrites the existing filter with the given rules.
+func (m *Metrics) UpdateFilter(allow, block []string) {
+ m.UpdateFilterAndLabels(allow, block, m.AllowedLabels, m.BlockedLabels)
+}
+
+// UpdateFilterAndLabels overwrites the existing filter with the given rules.
+func (m *Metrics) UpdateFilterAndLabels(allow, block, allowedLabels, blockedLabels []string) {
+ m.filterLock.Lock()
+ defer m.filterLock.Unlock()
+
+ m.AllowedPrefixes = allow
+ m.BlockedPrefixes = block
+
+ if allowedLabels == nil {
+ // Having a white list means we take only elements from it
+ m.allowedLabels = nil
+ } else {
+ m.allowedLabels = make(map[string]bool)
+ for _, v := range allowedLabels {
+ m.allowedLabels[v] = true
+ }
+ }
+ m.blockedLabels = make(map[string]bool)
+ for _, v := range blockedLabels {
+ m.blockedLabels[v] = true
+ }
+ m.AllowedLabels = allowedLabels
+ m.BlockedLabels = blockedLabels
+
+ m.filter = iradix.New()
+ for _, prefix := range m.AllowedPrefixes {
+ m.filter, _, _ = m.filter.Insert([]byte(prefix), true)
+ }
+ for _, prefix := range m.BlockedPrefixes {
+ m.filter, _, _ = m.filter.Insert([]byte(prefix), false)
+ }
+}
+
+func (m *Metrics) Shutdown() {
+ if ss, ok := m.sink.(ShutdownSink); ok {
+ ss.Shutdown()
+ }
+}
+
+// labelIsAllowed return true if a should be included in metric
+// the caller should lock m.filterLock while calling this method
+func (m *Metrics) labelIsAllowed(label *Label) bool {
+ labelName := (*label).Name
+ if m.blockedLabels != nil {
+ _, ok := m.blockedLabels[labelName]
+ if ok {
+ // If present, let's remove this label
+ return false
+ }
+ }
+ if m.allowedLabels != nil {
+ _, ok := m.allowedLabels[labelName]
+ return ok
+ }
+ // Allow by default
+ return true
+}
+
+// filterLabels return only allowed labels
+// the caller should lock m.filterLock while calling this method
+func (m *Metrics) filterLabels(labels []Label) []Label {
+ if labels == nil {
+ return nil
+ }
+ toReturn := []Label{}
+ for _, label := range labels {
+ if m.labelIsAllowed(&label) {
+ toReturn = append(toReturn, label)
+ }
+ }
+ return toReturn
+}
+
+// Returns whether the metric should be allowed based on configured prefix filters
+// Also return the applicable labels
+func (m *Metrics) allowMetric(key []string, labels []Label) (bool, []Label) {
+ m.filterLock.RLock()
+ defer m.filterLock.RUnlock()
+
+ if m.filter == nil || m.filter.Len() == 0 {
+ return m.Config.FilterDefault, m.filterLabels(labels)
+ }
+
+ _, allowed, ok := m.filter.Root().LongestPrefix([]byte(strings.Join(key, ".")))
+ if !ok {
+ return m.Config.FilterDefault, m.filterLabels(labels)
+ }
+
+ return allowed.(bool), m.filterLabels(labels)
+}
+
+// Periodically collects runtime stats to publish
+func (m *Metrics) collectStats() {
+ for {
+ time.Sleep(m.ProfileInterval)
+ m.EmitRuntimeStats()
+ }
+}
+
+// Emits various runtime statsitics
+func (m *Metrics) EmitRuntimeStats() {
+ // Export number of Goroutines
+ numRoutines := runtime.NumGoroutine()
+ m.SetGauge([]string{"runtime", "num_goroutines"}, float32(numRoutines))
+
+ // Export memory stats
+ var stats runtime.MemStats
+ runtime.ReadMemStats(&stats)
+ m.SetGauge([]string{"runtime", "alloc_bytes"}, float32(stats.Alloc))
+ m.SetGauge([]string{"runtime", "sys_bytes"}, float32(stats.Sys))
+ m.SetGauge([]string{"runtime", "malloc_count"}, float32(stats.Mallocs))
+ m.SetGauge([]string{"runtime", "free_count"}, float32(stats.Frees))
+ m.SetGauge([]string{"runtime", "heap_objects"}, float32(stats.HeapObjects))
+ m.SetGauge([]string{"runtime", "total_gc_pause_ns"}, float32(stats.PauseTotalNs))
+ m.SetGauge([]string{"runtime", "total_gc_runs"}, float32(stats.NumGC))
+
+ // Export info about the last few GC runs
+ num := stats.NumGC
+
+ // Handle wrap around
+ if num < m.lastNumGC {
+ m.lastNumGC = 0
+ }
+
+ // Ensure we don't scan more than 256
+ if num-m.lastNumGC >= 256 {
+ m.lastNumGC = num - 255
+ }
+
+ for i := m.lastNumGC; i < num; i++ {
+ pause := stats.PauseNs[i%256]
+ m.AddSample([]string{"runtime", "gc_pause_ns"}, float32(pause))
+ }
+ m.lastNumGC = num
+}
+
+// Creates a new slice with the provided string value as the first element
+// and the provided slice values as the remaining values.
+// Ordering of the values in the provided input slice is kept in tact in the output slice.
+func insert(i int, v string, s []string) []string {
+ // Allocate new slice to avoid modifying the input slice
+ newS := make([]string, len(s)+1)
+
+ // Copy s[0, i-1] into newS
+ for j := 0; j < i; j++ {
+ newS[j] = s[j]
+ }
+
+ // Insert provided element at index i
+ newS[i] = v
+
+ // Copy s[i, len(s)-1] into newS starting at newS[i+1]
+ for j := i; j < len(s); j++ {
+ newS[j+1] = s[j]
+ }
+
+ return newS
+}
diff --git a/vendor/github.com/armon/go-metrics/sink.go b/vendor/github.com/armon/go-metrics/sink.go
new file mode 100644
index 00000000000..6f4108ff405
--- /dev/null
+++ b/vendor/github.com/armon/go-metrics/sink.go
@@ -0,0 +1,132 @@
+package metrics
+
+import (
+ "fmt"
+ "net/url"
+)
+
+// The MetricSink interface is used to transmit metrics information
+// to an external system
+type MetricSink interface {
+ // A Gauge should retain the last value it is set to
+ SetGauge(key []string, val float32)
+ SetGaugeWithLabels(key []string, val float32, labels []Label)
+
+ // Should emit a Key/Value pair for each call
+ EmitKey(key []string, val float32)
+
+ // Counters should accumulate values
+ IncrCounter(key []string, val float32)
+ IncrCounterWithLabels(key []string, val float32, labels []Label)
+
+ // Samples are for timing information, where quantiles are used
+ AddSample(key []string, val float32)
+ AddSampleWithLabels(key []string, val float32, labels []Label)
+}
+
+type ShutdownSink interface {
+ MetricSink
+
+ // Shutdown the metric sink, flush metrics to storage, and cleanup resources.
+ // Called immediately prior to application exit. Implementations must block
+ // until metrics are flushed to storage.
+ Shutdown()
+}
+
+// BlackholeSink is used to just blackhole messages
+type BlackholeSink struct{}
+
+func (*BlackholeSink) SetGauge(key []string, val float32) {}
+func (*BlackholeSink) SetGaugeWithLabels(key []string, val float32, labels []Label) {}
+func (*BlackholeSink) EmitKey(key []string, val float32) {}
+func (*BlackholeSink) IncrCounter(key []string, val float32) {}
+func (*BlackholeSink) IncrCounterWithLabels(key []string, val float32, labels []Label) {}
+func (*BlackholeSink) AddSample(key []string, val float32) {}
+func (*BlackholeSink) AddSampleWithLabels(key []string, val float32, labels []Label) {}
+
+// FanoutSink is used to sink to fanout values to multiple sinks
+type FanoutSink []MetricSink
+
+func (fh FanoutSink) SetGauge(key []string, val float32) {
+ fh.SetGaugeWithLabels(key, val, nil)
+}
+
+func (fh FanoutSink) SetGaugeWithLabels(key []string, val float32, labels []Label) {
+ for _, s := range fh {
+ s.SetGaugeWithLabels(key, val, labels)
+ }
+}
+
+func (fh FanoutSink) EmitKey(key []string, val float32) {
+ for _, s := range fh {
+ s.EmitKey(key, val)
+ }
+}
+
+func (fh FanoutSink) IncrCounter(key []string, val float32) {
+ fh.IncrCounterWithLabels(key, val, nil)
+}
+
+func (fh FanoutSink) IncrCounterWithLabels(key []string, val float32, labels []Label) {
+ for _, s := range fh {
+ s.IncrCounterWithLabels(key, val, labels)
+ }
+}
+
+func (fh FanoutSink) AddSample(key []string, val float32) {
+ fh.AddSampleWithLabels(key, val, nil)
+}
+
+func (fh FanoutSink) AddSampleWithLabels(key []string, val float32, labels []Label) {
+ for _, s := range fh {
+ s.AddSampleWithLabels(key, val, labels)
+ }
+}
+
+func (fh FanoutSink) Shutdown() {
+ for _, s := range fh {
+ if ss, ok := s.(ShutdownSink); ok {
+ ss.Shutdown()
+ }
+ }
+}
+
+// sinkURLFactoryFunc is an generic interface around the *SinkFromURL() function provided
+// by each sink type
+type sinkURLFactoryFunc func(*url.URL) (MetricSink, error)
+
+// sinkRegistry supports the generic NewMetricSink function by mapping URL
+// schemes to metric sink factory functions
+var sinkRegistry = map[string]sinkURLFactoryFunc{
+ "statsd": NewStatsdSinkFromURL,
+ "statsite": NewStatsiteSinkFromURL,
+ "inmem": NewInmemSinkFromURL,
+}
+
+// NewMetricSinkFromURL allows a generic URL input to configure any of the
+// supported sinks. The scheme of the URL identifies the type of the sink, the
+// and query parameters are used to set options.
+//
+// "statsd://" - Initializes a StatsdSink. The host and port are passed through
+// as the "addr" of the sink
+//
+// "statsite://" - Initializes a StatsiteSink. The host and port become the
+// "addr" of the sink
+//
+// "inmem://" - Initializes an InmemSink. The host and port are ignored. The
+// "interval" and "duration" query parameters must be specified with valid
+// durations, see NewInmemSink for details.
+func NewMetricSinkFromURL(urlStr string) (MetricSink, error) {
+ u, err := url.Parse(urlStr)
+ if err != nil {
+ return nil, err
+ }
+
+ sinkURLFactoryFunc := sinkRegistry[u.Scheme]
+ if sinkURLFactoryFunc == nil {
+ return nil, fmt.Errorf(
+ "cannot create metric sink, unrecognized sink name: %q", u.Scheme)
+ }
+
+ return sinkURLFactoryFunc(u)
+}
diff --git a/vendor/github.com/armon/go-metrics/start.go b/vendor/github.com/armon/go-metrics/start.go
new file mode 100644
index 00000000000..38976f8dc93
--- /dev/null
+++ b/vendor/github.com/armon/go-metrics/start.go
@@ -0,0 +1,158 @@
+package metrics
+
+import (
+ "os"
+ "sync"
+ "sync/atomic"
+ "time"
+
+ iradix "github.com/hashicorp/go-immutable-radix"
+)
+
+// Config is used to configure metrics settings
+type Config struct {
+ ServiceName string // Prefixed with keys to separate services
+ HostName string // Hostname to use. If not provided and EnableHostname, it will be os.Hostname
+ EnableHostname bool // Enable prefixing gauge values with hostname
+ EnableHostnameLabel bool // Enable adding hostname to labels
+ EnableServiceLabel bool // Enable adding service to labels
+ EnableRuntimeMetrics bool // Enables profiling of runtime metrics (GC, Goroutines, Memory)
+ EnableTypePrefix bool // Prefixes key with a type ("counter", "gauge", "timer")
+ TimerGranularity time.Duration // Granularity of timers.
+ ProfileInterval time.Duration // Interval to profile runtime metrics
+
+ AllowedPrefixes []string // A list of metric prefixes to allow, with '.' as the separator
+ BlockedPrefixes []string // A list of metric prefixes to block, with '.' as the separator
+ AllowedLabels []string // A list of metric labels to allow, with '.' as the separator
+ BlockedLabels []string // A list of metric labels to block, with '.' as the separator
+ FilterDefault bool // Whether to allow metrics by default
+}
+
+// Metrics represents an instance of a metrics sink that can
+// be used to emit
+type Metrics struct {
+ Config
+ lastNumGC uint32
+ sink MetricSink
+ filter *iradix.Tree
+ allowedLabels map[string]bool
+ blockedLabels map[string]bool
+ filterLock sync.RWMutex // Lock filters and allowedLabels/blockedLabels access
+}
+
+// Shared global metrics instance
+var globalMetrics atomic.Value // *Metrics
+
+func init() {
+ // Initialize to a blackhole sink to avoid errors
+ globalMetrics.Store(&Metrics{sink: &BlackholeSink{}})
+}
+
+// Default returns the shared global metrics instance.
+func Default() *Metrics {
+ return globalMetrics.Load().(*Metrics)
+}
+
+// DefaultConfig provides a sane default configuration
+func DefaultConfig(serviceName string) *Config {
+ c := &Config{
+ ServiceName: serviceName, // Use client provided service
+ HostName: "",
+ EnableHostname: true, // Enable hostname prefix
+ EnableRuntimeMetrics: true, // Enable runtime profiling
+ EnableTypePrefix: false, // Disable type prefix
+ TimerGranularity: time.Millisecond, // Timers are in milliseconds
+ ProfileInterval: time.Second, // Poll runtime every second
+ FilterDefault: true, // Don't filter metrics by default
+ }
+
+ // Try to get the hostname
+ name, _ := os.Hostname()
+ c.HostName = name
+ return c
+}
+
+// New is used to create a new instance of Metrics
+func New(conf *Config, sink MetricSink) (*Metrics, error) {
+ met := &Metrics{}
+ met.Config = *conf
+ met.sink = sink
+ met.UpdateFilterAndLabels(conf.AllowedPrefixes, conf.BlockedPrefixes, conf.AllowedLabels, conf.BlockedLabels)
+
+ // Start the runtime collector
+ if conf.EnableRuntimeMetrics {
+ go met.collectStats()
+ }
+ return met, nil
+}
+
+// NewGlobal is the same as New, but it assigns the metrics object to be
+// used globally as well as returning it.
+func NewGlobal(conf *Config, sink MetricSink) (*Metrics, error) {
+ metrics, err := New(conf, sink)
+ if err == nil {
+ globalMetrics.Store(metrics)
+ }
+ return metrics, err
+}
+
+// Proxy all the methods to the globalMetrics instance
+func SetGauge(key []string, val float32) {
+ globalMetrics.Load().(*Metrics).SetGauge(key, val)
+}
+
+func SetGaugeWithLabels(key []string, val float32, labels []Label) {
+ globalMetrics.Load().(*Metrics).SetGaugeWithLabels(key, val, labels)
+}
+
+func EmitKey(key []string, val float32) {
+ globalMetrics.Load().(*Metrics).EmitKey(key, val)
+}
+
+func IncrCounter(key []string, val float32) {
+ globalMetrics.Load().(*Metrics).IncrCounter(key, val)
+}
+
+func IncrCounterWithLabels(key []string, val float32, labels []Label) {
+ globalMetrics.Load().(*Metrics).IncrCounterWithLabels(key, val, labels)
+}
+
+func AddSample(key []string, val float32) {
+ globalMetrics.Load().(*Metrics).AddSample(key, val)
+}
+
+func AddSampleWithLabels(key []string, val float32, labels []Label) {
+ globalMetrics.Load().(*Metrics).AddSampleWithLabels(key, val, labels)
+}
+
+func MeasureSince(key []string, start time.Time) {
+ globalMetrics.Load().(*Metrics).MeasureSince(key, start)
+}
+
+func MeasureSinceWithLabels(key []string, start time.Time, labels []Label) {
+ globalMetrics.Load().(*Metrics).MeasureSinceWithLabels(key, start, labels)
+}
+
+func UpdateFilter(allow, block []string) {
+ globalMetrics.Load().(*Metrics).UpdateFilter(allow, block)
+}
+
+// UpdateFilterAndLabels set allow/block prefixes of metrics while allowedLabels
+// and blockedLabels - when not nil - allow filtering of labels in order to
+// block/allow globally labels (especially useful when having large number of
+// values for a given label). See README.md for more information about usage.
+func UpdateFilterAndLabels(allow, block, allowedLabels, blockedLabels []string) {
+ globalMetrics.Load().(*Metrics).UpdateFilterAndLabels(allow, block, allowedLabels, blockedLabels)
+}
+
+// Shutdown disables metric collection, then blocks while attempting to flush metrics to storage.
+// WARNING: Not all MetricSink backends support this functionality, and calling this will cause them to leak resources.
+// This is intended for use immediately prior to application exit.
+func Shutdown() {
+ m := globalMetrics.Load().(*Metrics)
+ // Swap whatever MetricSink is currently active with a BlackholeSink. Callers must not have a
+ // reason to expect that calls to the library will successfully collect metrics after Shutdown
+ // has been called.
+ globalMetrics.Store(&Metrics{sink: &BlackholeSink{}})
+ m.Shutdown()
+}
diff --git a/vendor/github.com/armon/go-metrics/statsd.go b/vendor/github.com/armon/go-metrics/statsd.go
new file mode 100644
index 00000000000..1bfffce46e2
--- /dev/null
+++ b/vendor/github.com/armon/go-metrics/statsd.go
@@ -0,0 +1,184 @@
+package metrics
+
+import (
+ "bytes"
+ "fmt"
+ "log"
+ "net"
+ "net/url"
+ "strings"
+ "time"
+)
+
+const (
+ // statsdMaxLen is the maximum size of a packet
+ // to send to statsd
+ statsdMaxLen = 1400
+)
+
+// StatsdSink provides a MetricSink that can be used
+// with a statsite or statsd metrics server. It uses
+// only UDP packets, while StatsiteSink uses TCP.
+type StatsdSink struct {
+ addr string
+ metricQueue chan string
+}
+
+// NewStatsdSinkFromURL creates an StatsdSink from a URL. It is used
+// (and tested) from NewMetricSinkFromURL.
+func NewStatsdSinkFromURL(u *url.URL) (MetricSink, error) {
+ return NewStatsdSink(u.Host)
+}
+
+// NewStatsdSink is used to create a new StatsdSink
+func NewStatsdSink(addr string) (*StatsdSink, error) {
+ s := &StatsdSink{
+ addr: addr,
+ metricQueue: make(chan string, 4096),
+ }
+ go s.flushMetrics()
+ return s, nil
+}
+
+// Close is used to stop flushing to statsd
+func (s *StatsdSink) Shutdown() {
+ close(s.metricQueue)
+}
+
+func (s *StatsdSink) SetGauge(key []string, val float32) {
+ flatKey := s.flattenKey(key)
+ s.pushMetric(fmt.Sprintf("%s:%f|g\n", flatKey, val))
+}
+
+func (s *StatsdSink) SetGaugeWithLabels(key []string, val float32, labels []Label) {
+ flatKey := s.flattenKeyLabels(key, labels)
+ s.pushMetric(fmt.Sprintf("%s:%f|g\n", flatKey, val))
+}
+
+func (s *StatsdSink) EmitKey(key []string, val float32) {
+ flatKey := s.flattenKey(key)
+ s.pushMetric(fmt.Sprintf("%s:%f|kv\n", flatKey, val))
+}
+
+func (s *StatsdSink) IncrCounter(key []string, val float32) {
+ flatKey := s.flattenKey(key)
+ s.pushMetric(fmt.Sprintf("%s:%f|c\n", flatKey, val))
+}
+
+func (s *StatsdSink) IncrCounterWithLabels(key []string, val float32, labels []Label) {
+ flatKey := s.flattenKeyLabels(key, labels)
+ s.pushMetric(fmt.Sprintf("%s:%f|c\n", flatKey, val))
+}
+
+func (s *StatsdSink) AddSample(key []string, val float32) {
+ flatKey := s.flattenKey(key)
+ s.pushMetric(fmt.Sprintf("%s:%f|ms\n", flatKey, val))
+}
+
+func (s *StatsdSink) AddSampleWithLabels(key []string, val float32, labels []Label) {
+ flatKey := s.flattenKeyLabels(key, labels)
+ s.pushMetric(fmt.Sprintf("%s:%f|ms\n", flatKey, val))
+}
+
+// Flattens the key for formatting, removes spaces
+func (s *StatsdSink) flattenKey(parts []string) string {
+ joined := strings.Join(parts, ".")
+ return strings.Map(func(r rune) rune {
+ switch r {
+ case ':':
+ fallthrough
+ case ' ':
+ return '_'
+ default:
+ return r
+ }
+ }, joined)
+}
+
+// Flattens the key along with labels for formatting, removes spaces
+func (s *StatsdSink) flattenKeyLabels(parts []string, labels []Label) string {
+ for _, label := range labels {
+ parts = append(parts, label.Value)
+ }
+ return s.flattenKey(parts)
+}
+
+// Does a non-blocking push to the metrics queue
+func (s *StatsdSink) pushMetric(m string) {
+ select {
+ case s.metricQueue <- m:
+ default:
+ }
+}
+
+// Flushes metrics
+func (s *StatsdSink) flushMetrics() {
+ var sock net.Conn
+ var err error
+ var wait <-chan time.Time
+ ticker := time.NewTicker(flushInterval)
+ defer ticker.Stop()
+
+CONNECT:
+ // Create a buffer
+ buf := bytes.NewBuffer(nil)
+
+ // Attempt to connect
+ sock, err = net.Dial("udp", s.addr)
+ if err != nil {
+ log.Printf("[ERR] Error connecting to statsd! Err: %s", err)
+ goto WAIT
+ }
+
+ for {
+ select {
+ case metric, ok := <-s.metricQueue:
+ // Get a metric from the queue
+ if !ok {
+ goto QUIT
+ }
+
+ // Check if this would overflow the packet size
+ if len(metric)+buf.Len() > statsdMaxLen {
+ _, err := sock.Write(buf.Bytes())
+ buf.Reset()
+ if err != nil {
+ log.Printf("[ERR] Error writing to statsd! Err: %s", err)
+ goto WAIT
+ }
+ }
+
+ // Append to the buffer
+ buf.WriteString(metric)
+
+ case <-ticker.C:
+ if buf.Len() == 0 {
+ continue
+ }
+
+ _, err := sock.Write(buf.Bytes())
+ buf.Reset()
+ if err != nil {
+ log.Printf("[ERR] Error flushing to statsd! Err: %s", err)
+ goto WAIT
+ }
+ }
+ }
+
+WAIT:
+ // Wait for a while
+ wait = time.After(time.Duration(5) * time.Second)
+ for {
+ select {
+ // Dequeue the messages to avoid backlog
+ case _, ok := <-s.metricQueue:
+ if !ok {
+ goto QUIT
+ }
+ case <-wait:
+ goto CONNECT
+ }
+ }
+QUIT:
+ s.metricQueue = nil
+}
diff --git a/vendor/github.com/armon/go-metrics/statsite.go b/vendor/github.com/armon/go-metrics/statsite.go
new file mode 100644
index 00000000000..6c0d284d2dd
--- /dev/null
+++ b/vendor/github.com/armon/go-metrics/statsite.go
@@ -0,0 +1,172 @@
+package metrics
+
+import (
+ "bufio"
+ "fmt"
+ "log"
+ "net"
+ "net/url"
+ "strings"
+ "time"
+)
+
+const (
+ // We force flush the statsite metrics after this period of
+ // inactivity. Prevents stats from getting stuck in a buffer
+ // forever.
+ flushInterval = 100 * time.Millisecond
+)
+
+// NewStatsiteSinkFromURL creates an StatsiteSink from a URL. It is used
+// (and tested) from NewMetricSinkFromURL.
+func NewStatsiteSinkFromURL(u *url.URL) (MetricSink, error) {
+ return NewStatsiteSink(u.Host)
+}
+
+// StatsiteSink provides a MetricSink that can be used with a
+// statsite metrics server
+type StatsiteSink struct {
+ addr string
+ metricQueue chan string
+}
+
+// NewStatsiteSink is used to create a new StatsiteSink
+func NewStatsiteSink(addr string) (*StatsiteSink, error) {
+ s := &StatsiteSink{
+ addr: addr,
+ metricQueue: make(chan string, 4096),
+ }
+ go s.flushMetrics()
+ return s, nil
+}
+
+// Close is used to stop flushing to statsite
+func (s *StatsiteSink) Shutdown() {
+ close(s.metricQueue)
+}
+
+func (s *StatsiteSink) SetGauge(key []string, val float32) {
+ flatKey := s.flattenKey(key)
+ s.pushMetric(fmt.Sprintf("%s:%f|g\n", flatKey, val))
+}
+
+func (s *StatsiteSink) SetGaugeWithLabels(key []string, val float32, labels []Label) {
+ flatKey := s.flattenKeyLabels(key, labels)
+ s.pushMetric(fmt.Sprintf("%s:%f|g\n", flatKey, val))
+}
+
+func (s *StatsiteSink) EmitKey(key []string, val float32) {
+ flatKey := s.flattenKey(key)
+ s.pushMetric(fmt.Sprintf("%s:%f|kv\n", flatKey, val))
+}
+
+func (s *StatsiteSink) IncrCounter(key []string, val float32) {
+ flatKey := s.flattenKey(key)
+ s.pushMetric(fmt.Sprintf("%s:%f|c\n", flatKey, val))
+}
+
+func (s *StatsiteSink) IncrCounterWithLabels(key []string, val float32, labels []Label) {
+ flatKey := s.flattenKeyLabels(key, labels)
+ s.pushMetric(fmt.Sprintf("%s:%f|c\n", flatKey, val))
+}
+
+func (s *StatsiteSink) AddSample(key []string, val float32) {
+ flatKey := s.flattenKey(key)
+ s.pushMetric(fmt.Sprintf("%s:%f|ms\n", flatKey, val))
+}
+
+func (s *StatsiteSink) AddSampleWithLabels(key []string, val float32, labels []Label) {
+ flatKey := s.flattenKeyLabels(key, labels)
+ s.pushMetric(fmt.Sprintf("%s:%f|ms\n", flatKey, val))
+}
+
+// Flattens the key for formatting, removes spaces
+func (s *StatsiteSink) flattenKey(parts []string) string {
+ joined := strings.Join(parts, ".")
+ return strings.Map(func(r rune) rune {
+ switch r {
+ case ':':
+ fallthrough
+ case ' ':
+ return '_'
+ default:
+ return r
+ }
+ }, joined)
+}
+
+// Flattens the key along with labels for formatting, removes spaces
+func (s *StatsiteSink) flattenKeyLabels(parts []string, labels []Label) string {
+ for _, label := range labels {
+ parts = append(parts, label.Value)
+ }
+ return s.flattenKey(parts)
+}
+
+// Does a non-blocking push to the metrics queue
+func (s *StatsiteSink) pushMetric(m string) {
+ select {
+ case s.metricQueue <- m:
+ default:
+ }
+}
+
+// Flushes metrics
+func (s *StatsiteSink) flushMetrics() {
+ var sock net.Conn
+ var err error
+ var wait <-chan time.Time
+ var buffered *bufio.Writer
+ ticker := time.NewTicker(flushInterval)
+ defer ticker.Stop()
+
+CONNECT:
+ // Attempt to connect
+ sock, err = net.Dial("tcp", s.addr)
+ if err != nil {
+ log.Printf("[ERR] Error connecting to statsite! Err: %s", err)
+ goto WAIT
+ }
+
+ // Create a buffered writer
+ buffered = bufio.NewWriter(sock)
+
+ for {
+ select {
+ case metric, ok := <-s.metricQueue:
+ // Get a metric from the queue
+ if !ok {
+ goto QUIT
+ }
+
+ // Try to send to statsite
+ _, err := buffered.Write([]byte(metric))
+ if err != nil {
+ log.Printf("[ERR] Error writing to statsite! Err: %s", err)
+ goto WAIT
+ }
+ case <-ticker.C:
+ if err := buffered.Flush(); err != nil {
+ log.Printf("[ERR] Error flushing to statsite! Err: %s", err)
+ goto WAIT
+ }
+ }
+ }
+
+WAIT:
+ // Wait for a while
+ wait = time.After(time.Duration(5) * time.Second)
+ for {
+ select {
+ // Dequeue the messages to avoid backlog
+ case _, ok := <-s.metricQueue:
+ if !ok {
+ goto QUIT
+ }
+ case <-wait:
+ goto CONNECT
+ }
+ }
+QUIT:
+ s.metricQueue = nil
+}
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go
index 57bfbfb694c..e589f615619 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go
@@ -3,4 +3,4 @@
package aws
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.41.5"
+const goModuleVersion = "1.41.7"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md
index 404561eede3..a977899a4a2 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md
@@ -1,3 +1,25 @@
+# v1.32.18 (2026-05-22)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.32.17 (2026-04-29)
+
+* **Dependency Update**: Update to smithy-go v1.25.1.
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.32.16 (2026-04-17)
+
+* **Dependency Update**: Bump smithy-go to 1.25.0 to support endpointBdd trait
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.32.15 (2026-04-16)
+
+* No change notes available for this release.
+
+# v1.32.14 (2026-04-02)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
# v1.32.13 (2026-03-26)
* **Dependency Update**: Updated to the latest SDK module versions
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go
index 80aee928f6d..36b7e501ce1 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go
@@ -3,4 +3,4 @@
package config
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.32.13"
+const goModuleVersion = "1.32.18"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/errors.go b/vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/errors.go
similarity index 100%
rename from vendor/github.com/aws/aws-sdk-go-v2/internal/ini/errors.go
rename to vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/errors.go
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/ini.go b/vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/ini.go
similarity index 100%
rename from vendor/github.com/aws/aws-sdk-go-v2/internal/ini/ini.go
rename to vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/ini.go
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/parse.go b/vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/parse.go
similarity index 100%
rename from vendor/github.com/aws/aws-sdk-go-v2/internal/ini/parse.go
rename to vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/parse.go
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/sections.go b/vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/sections.go
similarity index 100%
rename from vendor/github.com/aws/aws-sdk-go-v2/internal/ini/sections.go
rename to vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/sections.go
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/strings.go b/vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/strings.go
similarity index 100%
rename from vendor/github.com/aws/aws-sdk-go-v2/internal/ini/strings.go
rename to vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/strings.go
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/token.go b/vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/token.go
similarity index 100%
rename from vendor/github.com/aws/aws-sdk-go-v2/internal/ini/token.go
rename to vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/token.go
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/tokenize.go b/vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/tokenize.go
similarity index 100%
rename from vendor/github.com/aws/aws-sdk-go-v2/internal/ini/tokenize.go
rename to vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/tokenize.go
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/value.go b/vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/value.go
similarity index 100%
rename from vendor/github.com/aws/aws-sdk-go-v2/internal/ini/value.go
rename to vendor/github.com/aws/aws-sdk-go-v2/config/internal/ini/value.go
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/config/shared_config.go b/vendor/github.com/aws/aws-sdk-go-v2/config/shared_config.go
index 44c616fd57e..5b251f54f57 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/config/shared_config.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/config/shared_config.go
@@ -12,8 +12,8 @@ import (
"time"
"github.com/aws/aws-sdk-go-v2/aws"
+ "github.com/aws/aws-sdk-go-v2/config/internal/ini"
"github.com/aws/aws-sdk-go-v2/feature/ec2/imds"
- "github.com/aws/aws-sdk-go-v2/internal/ini"
"github.com/aws/aws-sdk-go-v2/internal/shareddefaults"
"github.com/aws/smithy-go/logging"
smithyrequestcompression "github.com/aws/smithy-go/private/requestcompression"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md
index e0af6364ae1..1eda74ea7c6 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md
@@ -1,3 +1,21 @@
+# v1.19.17 (2026-05-22)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.19.16 (2026-04-29)
+
+* **Dependency Update**: Update to smithy-go v1.25.1.
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.19.15 (2026-04-17)
+
+* **Dependency Update**: Bump smithy-go to 1.25.0 to support endpointBdd trait
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.19.14 (2026-04-02)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
# v1.19.13 (2026-03-26)
* **Dependency Update**: Updated to the latest SDK module versions
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go
index 450279760ec..cfabb14a687 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go
@@ -3,4 +3,4 @@
package credentials
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.19.13"
+const goModuleVersion = "1.19.17"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md
index 829592ace27..e17294549fc 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md
@@ -1,3 +1,13 @@
+# v1.18.23 (2026-04-29)
+
+* **Dependency Update**: Update to smithy-go v1.25.1.
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.18.22 (2026-04-17)
+
+* **Dependency Update**: Bump smithy-go to 1.25.0 to support endpointBdd trait
+* **Dependency Update**: Updated to the latest SDK module versions
+
# v1.18.21 (2026-03-26)
* **Dependency Update**: Updated to the latest SDK module versions
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go
index 52c3d3923dd..7f59387edc3 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go
@@ -3,4 +3,4 @@
package imds
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.18.21"
+const goModuleVersion = "1.18.23"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md
index 1def5e2d9fa..0990a4143a7 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md
@@ -1,3 +1,13 @@
+# v1.4.23 (2026-04-29)
+
+* **Dependency Update**: Update to smithy-go v1.25.1.
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.4.22 (2026-04-17)
+
+* **Dependency Update**: Bump smithy-go to 1.25.0 to support endpointBdd trait
+* **Dependency Update**: Updated to the latest SDK module versions
+
# v1.4.21 (2026-03-26)
* **Dependency Update**: Updated to the latest SDK module versions
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go
index 548da96016c..05a8d3e7bc1 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go
@@ -3,4 +3,4 @@
package configsources
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.4.21"
+const goModuleVersion = "1.4.23"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md
index a2a1c183ffa..49577e3e94c 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md
@@ -1,3 +1,13 @@
+# v2.7.23 (2026-04-29)
+
+* **Dependency Update**: Update to smithy-go v1.25.1.
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v2.7.22 (2026-04-17)
+
+* **Dependency Update**: Bump smithy-go to 1.25.0 to support endpointBdd trait
+* **Dependency Update**: Updated to the latest SDK module versions
+
# v2.7.21 (2026-03-26)
* **Dependency Update**: Updated to the latest SDK module versions
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go
index 03a0b8c0380..1e92900a1e8 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go
@@ -3,4 +3,4 @@
package endpoints
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "2.7.21"
+const goModuleVersion = "2.7.23"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/CHANGELOG.md
deleted file mode 100644
index fdf434a5ebc..00000000000
--- a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/CHANGELOG.md
+++ /dev/null
@@ -1,296 +0,0 @@
-# v1.8.6 (2026-03-13)
-
-* **Bug Fix**: Replace usages of the old ioutil/ package throughout the SDK.
-
-# v1.8.5 (2026-03-03)
-
-* **Bug Fix**: Modernize non codegen files with go fix
-* **Dependency Update**: Bump minimum Go version to 1.24
-
-# v1.8.4 (2025-10-16)
-
-* **Dependency Update**: Bump minimum Go version to 1.23.
-
-# v1.8.3 (2025-02-18)
-
-* **Bug Fix**: Bump go version to 1.22
-
-# v1.8.2 (2025-01-24)
-
-* **Bug Fix**: Refactor filepath.Walk to filepath.WalkDir
-
-# v1.8.1 (2024-08-15)
-
-* **Dependency Update**: Bump minimum Go version to 1.21.
-
-# v1.8.0 (2024-02-13)
-
-* **Feature**: Bump minimum Go version to 1.20 per our language support policy.
-
-# v1.7.3 (2024-01-22)
-
-* **Bug Fix**: Remove invalid escaping of shared config values. All values in the shared config file will now be interpreted literally, save for fully-quoted strings which are unwrapped for legacy reasons.
-
-# v1.7.2 (2023-12-08)
-
-* **Bug Fix**: Correct loading of [services *] sections into shared config.
-
-# v1.7.1 (2023-11-16)
-
-* **Bug Fix**: Fix recognition of trailing comments in shared config properties. # or ; separators that aren't preceded by whitespace at the end of a property value should be considered part of it.
-
-# v1.7.0 (2023-11-13)
-
-* **Feature**: Replace the legacy config parser with a modern, less-strict implementation. Parsing failures within a section will now simply ignore the invalid line rather than silently drop the entire section.
-
-# v1.6.0 (2023-11-09.2)
-
-* **Feature**: BREAKFIX: In order to support subproperty parsing, invalid property definitions must not be ignored
-
-# v1.5.2 (2023-11-09)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.5.1 (2023-11-07)
-
-* **Bug Fix**: Fix subproperty performance regression
-
-# v1.5.0 (2023-11-01)
-
-* **Feature**: Adds support for configured endpoints via environment variables and the AWS shared configuration file.
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.4.0 (2023-10-31)
-
-* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.45 (2023-10-12)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.44 (2023-10-06)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.43 (2023-09-22)
-
-* **Bug Fix**: Fixed a bug where merging `max_attempts` or `duration_seconds` fields across shared config files with invalid values would silently default them to 0.
-* **Bug Fix**: Move type assertion of config values out of the parsing stage, which resolves an issue where the contents of a profile would silently be dropped with certain numeric formats.
-
-# v1.3.42 (2023-08-21)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.41 (2023-08-18)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.40 (2023-08-17)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.39 (2023-08-07)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.38 (2023-07-31)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.37 (2023-07-28)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.36 (2023-07-13)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.35 (2023-06-13)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.34 (2023-04-24)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.33 (2023-04-07)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.32 (2023-03-21)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.31 (2023-03-10)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.30 (2023-02-20)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.29 (2023-02-03)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.28 (2022-12-15)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.27 (2022-12-02)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.26 (2022-10-24)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.25 (2022-10-21)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.24 (2022-09-20)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.23 (2022-09-14)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.22 (2022-09-02)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.21 (2022-08-31)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.20 (2022-08-29)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.19 (2022-08-11)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.18 (2022-08-09)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.17 (2022-08-08)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.16 (2022-08-01)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.15 (2022-07-05)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.14 (2022-06-29)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.13 (2022-06-07)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.12 (2022-05-17)
-
-* **Bug Fix**: Removes the fuzz testing files from the module, as they are invalid and not used.
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.11 (2022-04-25)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.10 (2022-03-30)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.9 (2022-03-24)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.8 (2022-03-23)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.7 (2022-03-08)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.6 (2022-02-24)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.5 (2022-01-28)
-
-* **Bug Fix**: Fixes the SDK's handling of `duration_sections` in the shared credentials file or specified in multiple shared config and shared credentials files under the same profile. [#1568](https://github.com/aws/aws-sdk-go-v2/pull/1568). Thanks to [Amir Szekely](https://github.com/kichik) for help reproduce this bug.
-
-# v1.3.4 (2022-01-14)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.3 (2022-01-07)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.2 (2021-12-02)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.1 (2021-11-19)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.3.0 (2021-11-06)
-
-* **Feature**: The SDK now supports configuration of FIPS and DualStack endpoints using environment variables, shared configuration, or programmatically.
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.2.5 (2021-10-21)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.2.4 (2021-10-11)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.2.3 (2021-09-17)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.2.2 (2021-08-27)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.2.1 (2021-08-19)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.2.0 (2021-08-04)
-
-* **Feature**: adds error handling for defered close calls
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.1.1 (2021-07-15)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.1.0 (2021-07-01)
-
-* **Feature**: Support for `:`, `=`, `[`, `]` being present in expression values.
-
-# v1.0.1 (2021-06-25)
-
-* **Dependency Update**: Updated to the latest SDK module versions
-
-# v1.0.0 (2021-05-20)
-
-* **Release**: The `github.com/aws/aws-sdk-go-v2/internal/ini` package is now a Go Module.
-* **Dependency Update**: Updated to the latest SDK module versions
-
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/CHANGELOG.md
new file mode 100644
index 00000000000..e1e3c23a740
--- /dev/null
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/CHANGELOG.md
@@ -0,0 +1,460 @@
+# v1.4.24 (2026-04-29)
+
+* **Dependency Update**: Update to smithy-go v1.25.1.
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.4.23 (2026-04-17)
+
+* **Dependency Update**: Bump smithy-go to 1.25.0 to support endpointBdd trait
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.4.22 (2026-03-26)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.4.21 (2026-03-13)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.4.20 (2026-03-05)
+
+* **Bug Fix**: Read the correct auth property for SigV4A signing names.
+
+# v1.4.19 (2026-03-03)
+
+* **Bug Fix**: Modernize non codegen files with go fix
+* **Dependency Update**: Bump minimum Go version to 1.24
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.4.18 (2026-02-23)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.4.17 (2026-01-09)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.4.16 (2025-12-08)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.4.15 (2025-12-02)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+* **Dependency Update**: Upgrade to smithy-go v1.24.0. Notably this version of the library reduces the allocation footprint of the middleware system. We observe a ~10% reduction in allocations per SDK call with this change.
+
+# v1.4.14 (2025-11-19.2)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.4.13 (2025-11-04)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+* **Dependency Update**: Upgrade to smithy-go v1.23.2 which should convey some passive reduction of overall allocations, especially when not using the metrics system.
+
+# v1.4.12 (2025-10-30)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.4.11 (2025-10-23)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.4.10 (2025-10-16)
+
+* **Dependency Update**: Bump minimum Go version to 1.23.
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.4.9 (2025-09-26)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.4.8 (2025-09-23)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.4.7 (2025-09-08)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.4.6 (2025-08-29)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.4.5 (2025-08-27)
+
+* **Dependency Update**: Update to smithy-go v1.23.0.
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.4.4 (2025-08-21)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.4.3 (2025-08-11)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.4.2 (2025-08-04)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.4.1 (2025-07-30)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.4.0 (2025-07-28)
+
+* **Feature**: Add support for HTTP interceptors.
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.37 (2025-07-19)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.36 (2025-06-17)
+
+* **Dependency Update**: Update to smithy-go v1.22.4.
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.35 (2025-06-10)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.34 (2025-02-27)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.33 (2025-02-18)
+
+* **Bug Fix**: Bump go version to 1.22
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.32 (2025-02-05)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.31 (2025-01-31)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.30 (2025-01-30)
+
+* **Bug Fix**: Do not sign Transfer-Encoding header in Sigv4[a]. Fixes a signer mismatch issue with S3 Accelerate.
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.29 (2025-01-24)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+* **Dependency Update**: Upgrade to smithy-go v1.22.2.
+
+# v1.3.28 (2025-01-15)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.27 (2025-01-09)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.26 (2024-12-19)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.25 (2024-12-02)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.24 (2024-11-18)
+
+* **Dependency Update**: Update to smithy-go v1.22.1.
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.23 (2024-11-06)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.22 (2024-10-28)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.21 (2024-10-08)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.20 (2024-10-07)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.19 (2024-10-04)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.18 (2024-09-20)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.17 (2024-09-03)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.16 (2024-08-15)
+
+* **Dependency Update**: Bump minimum Go version to 1.21.
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.15 (2024-07-10.2)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.14 (2024-07-10)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.13 (2024-06-28)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.12 (2024-06-19)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.11 (2024-06-18)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.10 (2024-06-17)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.9 (2024-06-07)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.8 (2024-06-03)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.7 (2024-05-16)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.6 (2024-05-15)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.5 (2024-03-29)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.4 (2024-03-18)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.3 (2024-03-07)
+
+* **Bug Fix**: Remove dependency on go-cmp.
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.2 (2024-02-23)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.1 (2024-02-21)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.0 (2024-02-13)
+
+* **Feature**: Bump minimum Go version to 1.20 per our language support policy.
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.2.10 (2024-01-04)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.2.9 (2023-12-07)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.2.8 (2023-12-01)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.2.7 (2023-11-30)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.2.6 (2023-11-29)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.2.5 (2023-11-28.2)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.2.4 (2023-11-20)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.2.3 (2023-11-15)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.2.2 (2023-11-09)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.2.1 (2023-11-01)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.2.0 (2023-10-31)
+
+* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.1.6 (2023-10-12)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.1.5 (2023-10-06)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.1.4 (2023-08-21)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.1.3 (2023-08-18)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.1.2 (2023-08-17)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.1.1 (2023-08-07)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.1.0 (2023-07-31)
+
+* **Feature**: Adds support for smithy-modeled endpoint resolution. A new rules-based endpoint resolution will be added to the SDK which will supercede and deprecate existing endpoint resolution. Specifically, EndpointResolver will be deprecated while BaseEndpoint and EndpointResolverV2 will take its place. For more information, please see the Endpoints section in our Developer Guide.
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.28 (2023-07-28)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.27 (2023-07-13)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.26 (2023-06-13)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.25 (2023-04-24)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.24 (2023-04-07)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.23 (2023-03-21)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.22 (2023-03-10)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.21 (2023-02-20)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.20 (2023-02-14)
+
+* No change notes available for this release.
+
+# v1.0.19 (2023-02-03)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.18 (2022-12-15)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.17 (2022-12-02)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.16 (2022-10-24)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.15 (2022-10-21)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.14 (2022-09-20)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.13 (2022-09-14)
+
+* **Bug Fix**: Fixes an issues where an error from an underlying SigV4 credential provider would not be surfaced from the SigV4a credential provider. Contribution by [sakthipriyan-aqfer](https://github.com/sakthipriyan-aqfer).
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.12 (2022-09-02)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.11 (2022-08-31)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.10 (2022-08-29)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.9 (2022-08-11)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.8 (2022-08-09)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.7 (2022-08-08)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.6 (2022-08-01)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.5 (2022-07-05)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.4 (2022-06-29)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.3 (2022-06-07)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.2 (2022-05-17)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.1 (2022-04-25)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.0 (2022-04-07)
+
+* **Release**: New internal v4a signing module location.
+
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/LICENSE.txt b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/LICENSE.txt
similarity index 100%
rename from vendor/github.com/aws/aws-sdk-go-v2/internal/ini/LICENSE.txt
rename to vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/LICENSE.txt
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/credentials.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/credentials.go
new file mode 100644
index 00000000000..3ae3a019e62
--- /dev/null
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/credentials.go
@@ -0,0 +1,141 @@
+package v4a
+
+import (
+ "context"
+ "crypto/ecdsa"
+ "fmt"
+ "sync"
+ "sync/atomic"
+ "time"
+
+ "github.com/aws/aws-sdk-go-v2/aws"
+ "github.com/aws/aws-sdk-go-v2/internal/sdk"
+)
+
+// Credentials is Context, ECDSA, and Optional Session Token that can be used
+// to sign requests using SigV4a
+type Credentials struct {
+ Context string
+ PrivateKey *ecdsa.PrivateKey
+ SessionToken string
+
+ // Time the credentials will expire.
+ CanExpire bool
+ Expires time.Time
+}
+
+// Expired returns if the credentials have expired.
+func (v Credentials) Expired() bool {
+ if v.CanExpire {
+ return !v.Expires.After(sdk.NowTime())
+ }
+
+ return false
+}
+
+// HasKeys returns if the credentials keys are set.
+func (v Credentials) HasKeys() bool {
+ return len(v.Context) > 0 && v.PrivateKey != nil
+}
+
+// SymmetricCredentialAdaptor wraps a SigV4 AccessKey/SecretKey provider and adapts the credentials
+// to a ECDSA PrivateKey for signing with SiV4a
+type SymmetricCredentialAdaptor struct {
+ SymmetricProvider aws.CredentialsProvider
+
+ asymmetric atomic.Value
+ m sync.Mutex
+}
+
+// Retrieve retrieves symmetric credentials from the underlying provider.
+func (s *SymmetricCredentialAdaptor) Retrieve(ctx context.Context) (aws.Credentials, error) {
+ symCreds, err := s.retrieveFromSymmetricProvider(ctx)
+ if err != nil {
+ return aws.Credentials{}, err
+ }
+
+ if asymCreds := s.getCreds(); asymCreds == nil {
+ return symCreds, nil
+ }
+
+ s.m.Lock()
+ defer s.m.Unlock()
+
+ asymCreds := s.getCreds()
+ if asymCreds == nil {
+ return symCreds, nil
+ }
+
+ // if the context does not match the access key id clear it
+ if asymCreds.Context != symCreds.AccessKeyID {
+ s.asymmetric.Store((*Credentials)(nil))
+ }
+
+ return symCreds, nil
+}
+
+// RetrievePrivateKey returns credentials suitable for SigV4a signing
+func (s *SymmetricCredentialAdaptor) RetrievePrivateKey(ctx context.Context) (Credentials, error) {
+ if asymCreds := s.getCreds(); asymCreds != nil {
+ return *asymCreds, nil
+ }
+
+ s.m.Lock()
+ defer s.m.Unlock()
+
+ if asymCreds := s.getCreds(); asymCreds != nil {
+ return *asymCreds, nil
+ }
+
+ symmetricCreds, err := s.retrieveFromSymmetricProvider(ctx)
+ if err != nil {
+ return Credentials{}, fmt.Errorf("failed to retrieve symmetric credentials: %v", err)
+ }
+
+ privateKey, err := deriveKeyFromAccessKeyPair(symmetricCreds.AccessKeyID, symmetricCreds.SecretAccessKey)
+ if err != nil {
+ return Credentials{}, fmt.Errorf("failed to derive assymetric key from credentials")
+ }
+
+ creds := Credentials{
+ Context: symmetricCreds.AccessKeyID,
+ PrivateKey: privateKey,
+ SessionToken: symmetricCreds.SessionToken,
+ CanExpire: symmetricCreds.CanExpire,
+ Expires: symmetricCreds.Expires,
+ }
+
+ s.asymmetric.Store(&creds)
+
+ return creds, nil
+}
+
+func (s *SymmetricCredentialAdaptor) getCreds() *Credentials {
+ v := s.asymmetric.Load()
+
+ if v == nil {
+ return nil
+ }
+
+ c := v.(*Credentials)
+ if c != nil && c.HasKeys() && !c.Expired() {
+ return c
+ }
+
+ return nil
+}
+
+func (s *SymmetricCredentialAdaptor) retrieveFromSymmetricProvider(ctx context.Context) (aws.Credentials, error) {
+ credentials, err := s.SymmetricProvider.Retrieve(ctx)
+ if err != nil {
+ return aws.Credentials{}, err
+ }
+
+ return credentials, nil
+}
+
+// CredentialsProvider is the interface for a provider to retrieve credentials
+// to sign requests with.
+type CredentialsProvider interface {
+ RetrievePrivateKey(context.Context) (Credentials, error)
+}
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/error.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/error.go
new file mode 100644
index 00000000000..380d1742714
--- /dev/null
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/error.go
@@ -0,0 +1,17 @@
+package v4a
+
+import "fmt"
+
+// SigningError indicates an error condition occurred while performing SigV4a signing
+type SigningError struct {
+ Err error
+}
+
+func (e *SigningError) Error() string {
+ return fmt.Sprintf("failed to sign request: %v", e.Err)
+}
+
+// Unwrap returns the underlying error cause
+func (e *SigningError) Unwrap() error {
+ return e.Err
+}
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/go_module_metadata.go
similarity index 74%
rename from vendor/github.com/aws/aws-sdk-go-v2/internal/ini/go_module_metadata.go
rename to vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/go_module_metadata.go
index 1dc2e12aa8f..455cb74e1a5 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/go_module_metadata.go
@@ -1,6 +1,6 @@
// Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT.
-package ini
+package v4a
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.8.6"
+const goModuleVersion = "1.4.24"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/crypto/compare.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/crypto/compare.go
new file mode 100644
index 00000000000..1d0f25f8c20
--- /dev/null
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/crypto/compare.go
@@ -0,0 +1,30 @@
+package crypto
+
+import "fmt"
+
+// ConstantTimeByteCompare is a constant-time byte comparison of x and y. This function performs an absolute comparison
+// if the two byte slices assuming they represent a big-endian number.
+//
+// error if len(x) != len(y)
+// -1 if x < y
+// 0 if x == y
+// +1 if x > y
+func ConstantTimeByteCompare(x, y []byte) (int, error) {
+ if len(x) != len(y) {
+ return 0, fmt.Errorf("slice lengths do not match")
+ }
+
+ xLarger, yLarger := 0, 0
+
+ for i := 0; i < len(x); i++ {
+ xByte, yByte := int(x[i]), int(y[i])
+
+ x := ((yByte - xByte) >> 8) & 1
+ y := ((xByte - yByte) >> 8) & 1
+
+ xLarger |= x &^ yLarger
+ yLarger |= y &^ xLarger
+ }
+
+ return xLarger - yLarger, nil
+}
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/crypto/ecc.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/crypto/ecc.go
new file mode 100644
index 00000000000..758c73fcb3e
--- /dev/null
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/crypto/ecc.go
@@ -0,0 +1,113 @@
+package crypto
+
+import (
+ "bytes"
+ "crypto/ecdsa"
+ "crypto/elliptic"
+ "crypto/hmac"
+ "encoding/asn1"
+ "encoding/binary"
+ "fmt"
+ "hash"
+ "math"
+ "math/big"
+)
+
+type ecdsaSignature struct {
+ R, S *big.Int
+}
+
+// ECDSAKey takes the given elliptic curve, and private key (d) byte slice
+// and returns the private ECDSA key.
+func ECDSAKey(curve elliptic.Curve, d []byte) *ecdsa.PrivateKey {
+ return ECDSAKeyFromPoint(curve, (&big.Int{}).SetBytes(d))
+}
+
+// ECDSAKeyFromPoint takes the given elliptic curve and point and returns the
+// private and public keypair
+func ECDSAKeyFromPoint(curve elliptic.Curve, d *big.Int) *ecdsa.PrivateKey {
+ pX, pY := curve.ScalarBaseMult(d.Bytes())
+
+ privKey := &ecdsa.PrivateKey{
+ PublicKey: ecdsa.PublicKey{
+ Curve: curve,
+ X: pX,
+ Y: pY,
+ },
+ D: d,
+ }
+
+ return privKey
+}
+
+// ECDSAPublicKey takes the provide curve and (x, y) coordinates and returns
+// *ecdsa.PublicKey. Returns an error if the given points are not on the curve.
+func ECDSAPublicKey(curve elliptic.Curve, x, y []byte) (*ecdsa.PublicKey, error) {
+ xPoint := (&big.Int{}).SetBytes(x)
+ yPoint := (&big.Int{}).SetBytes(y)
+
+ if !curve.IsOnCurve(xPoint, yPoint) {
+ return nil, fmt.Errorf("point(%v, %v) is not on the given curve", xPoint.String(), yPoint.String())
+ }
+
+ return &ecdsa.PublicKey{
+ Curve: curve,
+ X: xPoint,
+ Y: yPoint,
+ }, nil
+}
+
+// VerifySignature takes the provided public key, hash, and asn1 encoded signature and returns
+// whether the given signature is valid.
+func VerifySignature(key *ecdsa.PublicKey, hash []byte, signature []byte) (bool, error) {
+ var ecdsaSignature ecdsaSignature
+
+ _, err := asn1.Unmarshal(signature, &ecdsaSignature)
+ if err != nil {
+ return false, err
+ }
+
+ return ecdsa.Verify(key, hash, ecdsaSignature.R, ecdsaSignature.S), nil
+}
+
+// HMACKeyDerivation provides an implementation of a NIST-800-108 of a KDF (Key Derivation Function) in Counter Mode.
+// For the purposes of this implantation HMAC is used as the PRF (Pseudorandom function), where the value of
+// `r` is defined as a 4 byte counter.
+func HMACKeyDerivation(hash func() hash.Hash, bitLen int, key []byte, label, context []byte) ([]byte, error) {
+ // verify that we won't overflow the counter
+ n := int64(math.Ceil((float64(bitLen) / 8) / float64(hash().Size())))
+ if n > 0x7FFFFFFF {
+ return nil, fmt.Errorf("unable to derive key of size %d using 32-bit counter", bitLen)
+ }
+
+ // verify the requested bit length is not larger then the length encoding size
+ if int64(bitLen) > 0x7FFFFFFF {
+ return nil, fmt.Errorf("bitLen is greater than 32-bits")
+ }
+
+ fixedInput := bytes.NewBuffer(nil)
+ fixedInput.Write(label)
+ fixedInput.WriteByte(0x00)
+ fixedInput.Write(context)
+ if err := binary.Write(fixedInput, binary.BigEndian, int32(bitLen)); err != nil {
+ return nil, fmt.Errorf("failed to write bit length to fixed input string: %v", err)
+ }
+
+ var output []byte
+
+ h := hmac.New(hash, key)
+
+ for i := int64(1); i <= n; i++ {
+ h.Reset()
+ if err := binary.Write(h, binary.BigEndian, int32(i)); err != nil {
+ return nil, err
+ }
+ _, err := h.Write(fixedInput.Bytes())
+ if err != nil {
+ return nil, err
+ }
+ output = append(output, h.Sum(nil)...)
+ }
+
+ return output[:bitLen/8], nil
+}
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/const.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/const.go
new file mode 100644
index 00000000000..89a76e2eaab
--- /dev/null
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/const.go
@@ -0,0 +1,36 @@
+package v4
+
+const (
+ // EmptyStringSHA256 is the hex encoded sha256 value of an empty string
+ EmptyStringSHA256 = `e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855`
+
+ // UnsignedPayload indicates that the request payload body is unsigned
+ UnsignedPayload = "UNSIGNED-PAYLOAD"
+
+ // AmzAlgorithmKey indicates the signing algorithm
+ AmzAlgorithmKey = "X-Amz-Algorithm"
+
+ // AmzSecurityTokenKey indicates the security token to be used with temporary credentials
+ AmzSecurityTokenKey = "X-Amz-Security-Token"
+
+ // AmzDateKey is the UTC timestamp for the request in the format YYYYMMDD'T'HHMMSS'Z'
+ AmzDateKey = "X-Amz-Date"
+
+ // AmzCredentialKey is the access key ID and credential scope
+ AmzCredentialKey = "X-Amz-Credential"
+
+ // AmzSignedHeadersKey is the set of headers signed for the request
+ AmzSignedHeadersKey = "X-Amz-SignedHeaders"
+
+ // AmzSignatureKey is the query parameter to store the SigV4 signature
+ AmzSignatureKey = "X-Amz-Signature"
+
+ // TimeFormat is the time format to be used in the X-Amz-Date header or query parameter
+ TimeFormat = "20060102T150405Z"
+
+ // ShortTimeFormat is the shorten time format used in the credential scope
+ ShortTimeFormat = "20060102"
+
+ // ContentSHAKey is the SHA256 of request body
+ ContentSHAKey = "X-Amz-Content-Sha256"
+)
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/header_rules.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/header_rules.go
new file mode 100644
index 00000000000..a15177e8f3f
--- /dev/null
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/header_rules.go
@@ -0,0 +1,82 @@
+package v4
+
+import (
+ sdkstrings "github.com/aws/aws-sdk-go-v2/internal/strings"
+)
+
+// Rules houses a set of Rule needed for validation of a
+// string value
+type Rules []Rule
+
+// Rule interface allows for more flexible rules and just simply
+// checks whether or not a value adheres to that Rule
+type Rule interface {
+ IsValid(value string) bool
+}
+
+// IsValid will iterate through all rules and see if any rules
+// apply to the value and supports nested rules
+func (r Rules) IsValid(value string) bool {
+ for _, rule := range r {
+ if rule.IsValid(value) {
+ return true
+ }
+ }
+ return false
+}
+
+// MapRule generic Rule for maps
+type MapRule map[string]struct{}
+
+// IsValid for the map Rule satisfies whether it exists in the map
+func (m MapRule) IsValid(value string) bool {
+ _, ok := m[value]
+ return ok
+}
+
+// AllowList is a generic Rule for whitelisting
+type AllowList struct {
+ Rule
+}
+
+// IsValid for AllowList checks if the value is within the AllowList
+func (w AllowList) IsValid(value string) bool {
+ return w.Rule.IsValid(value)
+}
+
+// DenyList is a generic Rule for blacklisting
+type DenyList struct {
+ Rule
+}
+
+// IsValid for AllowList checks if the value is within the AllowList
+func (b DenyList) IsValid(value string) bool {
+ return !b.Rule.IsValid(value)
+}
+
+// Patterns is a list of strings to match against
+type Patterns []string
+
+// IsValid for Patterns checks each pattern and returns if a match has
+// been found
+func (p Patterns) IsValid(value string) bool {
+ for _, pattern := range p {
+ if sdkstrings.HasPrefixFold(value, pattern) {
+ return true
+ }
+ }
+ return false
+}
+
+// InclusiveRules rules allow for rules to depend on one another
+type InclusiveRules []Rule
+
+// IsValid will return true if all rules are true
+func (r InclusiveRules) IsValid(value string) bool {
+ for _, rule := range r {
+ if !rule.IsValid(value) {
+ return false
+ }
+ }
+ return true
+}
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/headers.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/headers.go
new file mode 100644
index 00000000000..688f834742c
--- /dev/null
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/headers.go
@@ -0,0 +1,68 @@
+package v4
+
+// IgnoredHeaders is a list of headers that are ignored during signing
+var IgnoredHeaders = Rules{
+ DenyList{
+ MapRule{
+ "Authorization": struct{}{},
+ "User-Agent": struct{}{},
+ "X-Amzn-Trace-Id": struct{}{},
+ "Transfer-Encoding": struct{}{},
+ },
+ },
+}
+
+// RequiredSignedHeaders is a whitelist for Build canonical headers.
+var RequiredSignedHeaders = Rules{
+ AllowList{
+ MapRule{
+ "Cache-Control": struct{}{},
+ "Content-Disposition": struct{}{},
+ "Content-Encoding": struct{}{},
+ "Content-Language": struct{}{},
+ "Content-Md5": struct{}{},
+ "Content-Type": struct{}{},
+ "Expires": struct{}{},
+ "If-Match": struct{}{},
+ "If-Modified-Since": struct{}{},
+ "If-None-Match": struct{}{},
+ "If-Unmodified-Since": struct{}{},
+ "Range": struct{}{},
+ "X-Amz-Acl": struct{}{},
+ "X-Amz-Copy-Source": struct{}{},
+ "X-Amz-Copy-Source-If-Match": struct{}{},
+ "X-Amz-Copy-Source-If-Modified-Since": struct{}{},
+ "X-Amz-Copy-Source-If-None-Match": struct{}{},
+ "X-Amz-Copy-Source-If-Unmodified-Since": struct{}{},
+ "X-Amz-Copy-Source-Range": struct{}{},
+ "X-Amz-Copy-Source-Server-Side-Encryption-Customer-Algorithm": struct{}{},
+ "X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key": struct{}{},
+ "X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key-Md5": struct{}{},
+ "X-Amz-Grant-Full-control": struct{}{},
+ "X-Amz-Grant-Read": struct{}{},
+ "X-Amz-Grant-Read-Acp": struct{}{},
+ "X-Amz-Grant-Write": struct{}{},
+ "X-Amz-Grant-Write-Acp": struct{}{},
+ "X-Amz-Metadata-Directive": struct{}{},
+ "X-Amz-Mfa": struct{}{},
+ "X-Amz-Request-Payer": struct{}{},
+ "X-Amz-Server-Side-Encryption": struct{}{},
+ "X-Amz-Server-Side-Encryption-Aws-Kms-Key-Id": struct{}{},
+ "X-Amz-Server-Side-Encryption-Customer-Algorithm": struct{}{},
+ "X-Amz-Server-Side-Encryption-Customer-Key": struct{}{},
+ "X-Amz-Server-Side-Encryption-Customer-Key-Md5": struct{}{},
+ "X-Amz-Storage-Class": struct{}{},
+ "X-Amz-Website-Redirect-Location": struct{}{},
+ "X-Amz-Content-Sha256": struct{}{},
+ "X-Amz-Tagging": struct{}{},
+ },
+ },
+ Patterns{"X-Amz-Meta-"},
+}
+
+// AllowedQueryHoisting is a whitelist for Build query headers. The boolean value
+// represents whether or not it is a pattern.
+var AllowedQueryHoisting = InclusiveRules{
+ DenyList{RequiredSignedHeaders},
+ Patterns{"X-Amz-"},
+}
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/hmac.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/hmac.go
new file mode 100644
index 00000000000..e7fa7a1b1e6
--- /dev/null
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/hmac.go
@@ -0,0 +1,13 @@
+package v4
+
+import (
+ "crypto/hmac"
+ "crypto/sha256"
+)
+
+// HMACSHA256 computes a HMAC-SHA256 of data given the provided key.
+func HMACSHA256(key []byte, data []byte) []byte {
+ hash := hmac.New(sha256.New, key)
+ hash.Write(data)
+ return hash.Sum(nil)
+}
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/host.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/host.go
new file mode 100644
index 00000000000..bf93659a43f
--- /dev/null
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/host.go
@@ -0,0 +1,75 @@
+package v4
+
+import (
+ "net/http"
+ "strings"
+)
+
+// SanitizeHostForHeader removes default port from host and updates request.Host
+func SanitizeHostForHeader(r *http.Request) {
+ host := getHost(r)
+ port := portOnly(host)
+ if port != "" && isDefaultPort(r.URL.Scheme, port) {
+ r.Host = stripPort(host)
+ }
+}
+
+// Returns host from request
+func getHost(r *http.Request) string {
+ if r.Host != "" {
+ return r.Host
+ }
+
+ return r.URL.Host
+}
+
+// Hostname returns u.Host, without any port number.
+//
+// If Host is an IPv6 literal with a port number, Hostname returns the
+// IPv6 literal without the square brackets. IPv6 literals may include
+// a zone identifier.
+//
+// Copied from the Go 1.8 standard library (net/url)
+func stripPort(hostport string) string {
+ colon := strings.IndexByte(hostport, ':')
+ if colon == -1 {
+ return hostport
+ }
+ if i := strings.IndexByte(hostport, ']'); i != -1 {
+ return strings.TrimPrefix(hostport[:i], "[")
+ }
+ return hostport[:colon]
+}
+
+// Port returns the port part of u.Host, without the leading colon.
+// If u.Host doesn't contain a port, Port returns an empty string.
+//
+// Copied from the Go 1.8 standard library (net/url)
+func portOnly(hostport string) string {
+ colon := strings.IndexByte(hostport, ':')
+ if colon == -1 {
+ return ""
+ }
+ if i := strings.Index(hostport, "]:"); i != -1 {
+ return hostport[i+len("]:"):]
+ }
+ if strings.Contains(hostport, "]") {
+ return ""
+ }
+ return hostport[colon+len(":"):]
+}
+
+// Returns true if the specified URI is using the standard port
+// (i.e. port 80 for HTTP URIs or 443 for HTTPS URIs)
+func isDefaultPort(scheme, port string) bool {
+ if port == "" {
+ return true
+ }
+
+ lowerCaseScheme := strings.ToLower(scheme)
+ if (lowerCaseScheme == "http" && port == "80") || (lowerCaseScheme == "https" && port == "443") {
+ return true
+ }
+
+ return false
+}
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/time.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/time.go
new file mode 100644
index 00000000000..1de06a765d1
--- /dev/null
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/time.go
@@ -0,0 +1,36 @@
+package v4
+
+import "time"
+
+// SigningTime provides a wrapper around a time.Time which provides cached values for SigV4 signing.
+type SigningTime struct {
+ time.Time
+ timeFormat string
+ shortTimeFormat string
+}
+
+// NewSigningTime creates a new SigningTime given a time.Time
+func NewSigningTime(t time.Time) SigningTime {
+ return SigningTime{
+ Time: t,
+ }
+}
+
+// TimeFormat provides a time formatted in the X-Amz-Date format.
+func (m *SigningTime) TimeFormat() string {
+ return m.format(&m.timeFormat, TimeFormat)
+}
+
+// ShortTimeFormat provides a time formatted of 20060102.
+func (m *SigningTime) ShortTimeFormat() string {
+ return m.format(&m.shortTimeFormat, ShortTimeFormat)
+}
+
+func (m *SigningTime) format(target *string, format string) string {
+ if len(*target) > 0 {
+ return *target
+ }
+ v := m.Time.Format(format)
+ *target = v
+ return v
+}
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/util.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/util.go
new file mode 100644
index 00000000000..741019b5f9d
--- /dev/null
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/util.go
@@ -0,0 +1,64 @@
+package v4
+
+import (
+ "net/url"
+ "strings"
+)
+
+const doubleSpace = " "
+
+// StripExcessSpaces will rewrite the passed in slice's string values to not
+// contain muliple side-by-side spaces.
+func StripExcessSpaces(str string) string {
+ var j, k, l, m, spaces int
+ // Trim trailing spaces
+ for j = len(str) - 1; j >= 0 && str[j] == ' '; j-- {
+ }
+
+ // Trim leading spaces
+ for k = 0; k < j && str[k] == ' '; k++ {
+ }
+ str = str[k : j+1]
+
+ // Strip multiple spaces.
+ j = strings.Index(str, doubleSpace)
+ if j < 0 {
+ return str
+ }
+
+ buf := []byte(str)
+ for k, m, l = j, j, len(buf); k < l; k++ {
+ if buf[k] == ' ' {
+ if spaces == 0 {
+ // First space.
+ buf[m] = buf[k]
+ m++
+ }
+ spaces++
+ } else {
+ // End of multiple spaces.
+ spaces = 0
+ buf[m] = buf[k]
+ m++
+ }
+ }
+
+ return string(buf[:m])
+}
+
+// GetURIPath returns the escaped URI component from the provided URL
+func GetURIPath(u *url.URL) string {
+ var uri string
+
+ if len(u.Opaque) > 0 {
+ uri = "/" + strings.Join(strings.Split(u.Opaque, "/")[3:], "/")
+ } else {
+ uri = u.EscapedPath()
+ }
+
+ if len(uri) == 0 {
+ uri = "/"
+ }
+
+ return uri
+}
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/middleware.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/middleware.go
new file mode 100644
index 00000000000..64b8b4e330e
--- /dev/null
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/middleware.go
@@ -0,0 +1,118 @@
+package v4a
+
+import (
+ "context"
+ "fmt"
+ awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware"
+ v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4"
+ internalauth "github.com/aws/aws-sdk-go-v2/internal/auth"
+ "github.com/aws/smithy-go/middleware"
+ smithyhttp "github.com/aws/smithy-go/transport/http"
+ "net/http"
+ "time"
+)
+
+// HTTPSigner is SigV4a HTTP signer implementation
+type HTTPSigner interface {
+ SignHTTP(ctx context.Context, credentials Credentials, r *http.Request, payloadHash string, service string, regionSet []string, signingTime time.Time, optfns ...func(*SignerOptions)) error
+}
+
+// SignHTTPRequestMiddlewareOptions is the middleware options for constructing a SignHTTPRequestMiddleware.
+type SignHTTPRequestMiddlewareOptions struct {
+ Credentials CredentialsProvider
+ Signer HTTPSigner
+ LogSigning bool
+}
+
+// SignHTTPRequestMiddleware is a middleware for signing an HTTP request using SigV4a.
+type SignHTTPRequestMiddleware struct {
+ credentials CredentialsProvider
+ signer HTTPSigner
+ logSigning bool
+}
+
+// NewSignHTTPRequestMiddleware constructs a SignHTTPRequestMiddleware using the given SignHTTPRequestMiddlewareOptions.
+func NewSignHTTPRequestMiddleware(options SignHTTPRequestMiddlewareOptions) *SignHTTPRequestMiddleware {
+ return &SignHTTPRequestMiddleware{
+ credentials: options.Credentials,
+ signer: options.Signer,
+ logSigning: options.LogSigning,
+ }
+}
+
+// ID the middleware identifier.
+func (s *SignHTTPRequestMiddleware) ID() string {
+ return "Signing"
+}
+
+// HandleFinalize signs an HTTP request using SigV4a.
+func (s *SignHTTPRequestMiddleware) HandleFinalize(
+ ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler,
+) (
+ out middleware.FinalizeOutput, metadata middleware.Metadata, err error,
+) {
+ if !hasCredentialProvider(s.credentials) {
+ return next.HandleFinalize(ctx, in)
+ }
+
+ req, ok := in.Request.(*smithyhttp.Request)
+ if !ok {
+ return out, metadata, fmt.Errorf("unexpected request middleware type %T", in.Request)
+ }
+
+ signingName, signingRegion := awsmiddleware.GetSigningName(ctx), awsmiddleware.GetSigningRegion(ctx)
+ payloadHash := v4.GetPayloadHash(ctx)
+ if len(payloadHash) == 0 {
+ return out, metadata, &SigningError{Err: fmt.Errorf("computed payload hash missing from context")}
+ }
+
+ credentials, err := s.credentials.RetrievePrivateKey(ctx)
+ if err != nil {
+ return out, metadata, &SigningError{Err: fmt.Errorf("failed to retrieve credentials: %w", err)}
+ }
+
+ signerOptions := []func(o *SignerOptions){
+ func(o *SignerOptions) {
+ o.Logger = middleware.GetLogger(ctx)
+ o.LogSigning = s.logSigning
+ },
+ }
+
+ // existing DisableURIPathEscaping is equivalent in purpose
+ // to authentication scheme property DisableDoubleEncoding
+ disableDoubleEncoding, overridden := internalauth.GetDisableDoubleEncoding(ctx)
+ if overridden {
+ signerOptions = append(signerOptions, func(o *SignerOptions) {
+ o.DisableURIPathEscaping = disableDoubleEncoding
+ })
+ }
+
+ err = s.signer.SignHTTP(ctx, credentials, req.Request, payloadHash, signingName, []string{signingRegion}, time.Now().UTC(), signerOptions...)
+ if err != nil {
+ return out, metadata, &SigningError{Err: fmt.Errorf("failed to sign http request, %w", err)}
+ }
+
+ return next.HandleFinalize(ctx, in)
+}
+
+func hasCredentialProvider(p CredentialsProvider) bool {
+ if p == nil {
+ return false
+ }
+
+ return true
+}
+
+// RegisterSigningMiddleware registers the SigV4a signing middleware to the stack. If a signing middleware is already
+// present, this provided middleware will be swapped. Otherwise the middleware will be added at the tail of the
+// finalize step.
+func RegisterSigningMiddleware(stack *middleware.Stack, signingMiddleware *SignHTTPRequestMiddleware) (err error) {
+ const signedID = "Signing"
+ _, present := stack.Finalize.Get(signedID)
+ if present {
+ _, err = stack.Finalize.Swap(signedID, signingMiddleware)
+ } else {
+ err = stack.Finalize.Add(signingMiddleware, middleware.After)
+ }
+ return err
+}
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/presign_middleware.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/presign_middleware.go
new file mode 100644
index 00000000000..951fc415d52
--- /dev/null
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/presign_middleware.go
@@ -0,0 +1,117 @@
+package v4a
+
+import (
+ "context"
+ "fmt"
+ "net/http"
+ "time"
+
+ awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware"
+ v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4"
+ "github.com/aws/aws-sdk-go-v2/internal/sdk"
+ "github.com/aws/smithy-go/middleware"
+ smithyHTTP "github.com/aws/smithy-go/transport/http"
+)
+
+// HTTPPresigner is an interface to a SigV4a signer that can sign create a
+// presigned URL for a HTTP requests.
+type HTTPPresigner interface {
+ PresignHTTP(
+ ctx context.Context, credentials Credentials, r *http.Request,
+ payloadHash string, service string, regionSet []string, signingTime time.Time,
+ optFns ...func(*SignerOptions),
+ ) (url string, signedHeader http.Header, err error)
+}
+
+// PresignHTTPRequestMiddlewareOptions is the options for the PresignHTTPRequestMiddleware middleware.
+type PresignHTTPRequestMiddlewareOptions struct {
+ CredentialsProvider CredentialsProvider
+ Presigner HTTPPresigner
+ LogSigning bool
+}
+
+// PresignHTTPRequestMiddleware provides the Finalize middleware for creating a
+// presigned URL for an HTTP request.
+//
+// Will short circuit the middleware stack and not forward onto the next
+// Finalize handler.
+type PresignHTTPRequestMiddleware struct {
+ credentialsProvider CredentialsProvider
+ presigner HTTPPresigner
+ logSigning bool
+}
+
+// NewPresignHTTPRequestMiddleware returns a new PresignHTTPRequestMiddleware
+// initialized with the presigner.
+func NewPresignHTTPRequestMiddleware(options PresignHTTPRequestMiddlewareOptions) *PresignHTTPRequestMiddleware {
+ return &PresignHTTPRequestMiddleware{
+ credentialsProvider: options.CredentialsProvider,
+ presigner: options.Presigner,
+ logSigning: options.LogSigning,
+ }
+}
+
+// ID provides the middleware ID.
+func (*PresignHTTPRequestMiddleware) ID() string { return "PresignHTTPRequest" }
+
+// HandleFinalize will take the provided input and create a presigned url for
+// the http request using the SigV4 presign authentication scheme.
+func (s *PresignHTTPRequestMiddleware) HandleFinalize(
+ ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler,
+) (
+ out middleware.FinalizeOutput, metadata middleware.Metadata, err error,
+) {
+ req, ok := in.Request.(*smithyHTTP.Request)
+ if !ok {
+ return out, metadata, &SigningError{
+ Err: fmt.Errorf("unexpected request middleware type %T", in.Request),
+ }
+ }
+
+ httpReq := req.Build(ctx)
+ if !hasCredentialProvider(s.credentialsProvider) {
+ out.Result = &v4.PresignedHTTPRequest{
+ URL: httpReq.URL.String(),
+ Method: httpReq.Method,
+ SignedHeader: http.Header{},
+ }
+
+ return out, metadata, nil
+ }
+
+ signingName := awsmiddleware.GetSigningName(ctx)
+ signingRegion := awsmiddleware.GetSigningRegion(ctx)
+ payloadHash := v4.GetPayloadHash(ctx)
+ if len(payloadHash) == 0 {
+ return out, metadata, &SigningError{
+ Err: fmt.Errorf("computed payload hash missing from context"),
+ }
+ }
+
+ credentials, err := s.credentialsProvider.RetrievePrivateKey(ctx)
+ if err != nil {
+ return out, metadata, &SigningError{
+ Err: fmt.Errorf("failed to retrieve credentials: %w", err),
+ }
+ }
+
+ u, h, err := s.presigner.PresignHTTP(ctx, credentials,
+ httpReq, payloadHash, signingName, []string{signingRegion}, sdk.NowTime(),
+ func(o *SignerOptions) {
+ o.Logger = middleware.GetLogger(ctx)
+ o.LogSigning = s.logSigning
+ })
+ if err != nil {
+ return out, metadata, &SigningError{
+ Err: fmt.Errorf("failed to sign http request, %w", err),
+ }
+ }
+
+ out.Result = &v4.PresignedHTTPRequest{
+ URL: u,
+ Method: httpReq.Method,
+ SignedHeader: h,
+ }
+
+ return out, metadata, nil
+}
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/smithy.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/smithy.go
new file mode 100644
index 00000000000..c3b689bace2
--- /dev/null
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/smithy.go
@@ -0,0 +1,92 @@
+package v4a
+
+import (
+ "context"
+ "fmt"
+ "time"
+
+ internalcontext "github.com/aws/aws-sdk-go-v2/internal/context"
+
+ v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4"
+ "github.com/aws/aws-sdk-go-v2/internal/sdk"
+ "github.com/aws/smithy-go"
+ "github.com/aws/smithy-go/auth"
+ "github.com/aws/smithy-go/logging"
+ smithyhttp "github.com/aws/smithy-go/transport/http"
+)
+
+// CredentialsAdapter adapts v4a.Credentials to smithy auth.Identity.
+type CredentialsAdapter struct {
+ Credentials Credentials
+}
+
+var _ auth.Identity = (*CredentialsAdapter)(nil)
+
+// Expiration returns the time of expiration for the credentials.
+func (v *CredentialsAdapter) Expiration() time.Time {
+ return v.Credentials.Expires
+}
+
+// CredentialsProviderAdapter adapts v4a.CredentialsProvider to
+// auth.IdentityResolver.
+type CredentialsProviderAdapter struct {
+ Provider CredentialsProvider
+}
+
+var _ (auth.IdentityResolver) = (*CredentialsProviderAdapter)(nil)
+
+// GetIdentity retrieves v4a credentials using the underlying provider.
+func (v *CredentialsProviderAdapter) GetIdentity(ctx context.Context, _ smithy.Properties) (
+ auth.Identity, error,
+) {
+ creds, err := v.Provider.RetrievePrivateKey(ctx)
+ if err != nil {
+ return nil, fmt.Errorf("get credentials: %w", err)
+ }
+
+ return &CredentialsAdapter{Credentials: creds}, nil
+}
+
+// SignerAdapter adapts v4a.HTTPSigner to smithy http.Signer.
+type SignerAdapter struct {
+ Signer HTTPSigner
+ Logger logging.Logger
+ LogSigning bool
+}
+
+var _ (smithyhttp.Signer) = (*SignerAdapter)(nil)
+
+// SignRequest signs the request with the provided identity.
+func (v *SignerAdapter) SignRequest(ctx context.Context, r *smithyhttp.Request, identity auth.Identity, props smithy.Properties) error {
+ ca, ok := identity.(*CredentialsAdapter)
+ if !ok {
+ return fmt.Errorf("unexpected identity type: %T", identity)
+ }
+
+ name, ok := smithyhttp.GetSigV4ASigningName(&props)
+ if !ok {
+ return fmt.Errorf("sigv4a signing name is required")
+ }
+
+ regions, ok := smithyhttp.GetSigV4ASigningRegions(&props)
+ if !ok {
+ return fmt.Errorf("sigv4a signing region is required")
+ }
+
+ hash := v4.GetPayloadHash(ctx)
+ signingTime := sdk.NowTime()
+ if skew := internalcontext.GetAttemptSkewContext(ctx); skew != 0 {
+ signingTime.Add(skew)
+ }
+ err := v.Signer.SignHTTP(ctx, ca.Credentials, r.Request, hash, name, regions, signingTime, func(o *SignerOptions) {
+ o.DisableURIPathEscaping, _ = smithyhttp.GetDisableDoubleEncoding(&props)
+
+ o.Logger = v.Logger
+ o.LogSigning = v.LogSigning
+ })
+ if err != nil {
+ return fmt.Errorf("sign http: %w", err)
+ }
+
+ return nil
+}
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/v4a.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/v4a.go
new file mode 100644
index 00000000000..f226bcdced3
--- /dev/null
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/v4a.go
@@ -0,0 +1,520 @@
+package v4a
+
+import (
+ "bytes"
+ "context"
+ "crypto"
+ "crypto/ecdsa"
+ "crypto/elliptic"
+ "crypto/rand"
+ "crypto/sha256"
+ "encoding/hex"
+ "fmt"
+ "hash"
+ "math/big"
+ "net/http"
+ "net/textproto"
+ "net/url"
+ "sort"
+ "strconv"
+ "strings"
+ "time"
+
+ signerCrypto "github.com/aws/aws-sdk-go-v2/internal/v4a/internal/crypto"
+ v4Internal "github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4"
+ "github.com/aws/smithy-go/encoding/httpbinding"
+ "github.com/aws/smithy-go/logging"
+)
+
+const (
+ // AmzRegionSetKey represents the region set header used for sigv4a
+ AmzRegionSetKey = "X-Amz-Region-Set"
+ amzAlgorithmKey = v4Internal.AmzAlgorithmKey
+ amzSecurityTokenKey = v4Internal.AmzSecurityTokenKey
+ amzDateKey = v4Internal.AmzDateKey
+ amzCredentialKey = v4Internal.AmzCredentialKey
+ amzSignedHeadersKey = v4Internal.AmzSignedHeadersKey
+ authorizationHeader = "Authorization"
+
+ signingAlgorithm = "AWS4-ECDSA-P256-SHA256"
+
+ timeFormat = "20060102T150405Z"
+ shortTimeFormat = "20060102"
+
+ // EmptyStringSHA256 is a hex encoded SHA-256 hash of an empty string
+ EmptyStringSHA256 = v4Internal.EmptyStringSHA256
+
+ // Version of signing v4a
+ Version = "SigV4A"
+)
+
+var (
+ p256 elliptic.Curve
+ nMinusTwoP256 *big.Int
+
+ one = new(big.Int).SetInt64(1)
+)
+
+func init() {
+ // Ensure the elliptic curve parameters are initialized on package import rather then on first usage
+ p256 = elliptic.P256()
+
+ nMinusTwoP256 = new(big.Int).SetBytes(p256.Params().N.Bytes())
+ nMinusTwoP256 = nMinusTwoP256.Sub(nMinusTwoP256, new(big.Int).SetInt64(2))
+}
+
+// SignerOptions is the SigV4a signing options for constructing a Signer.
+type SignerOptions struct {
+ Logger logging.Logger
+ LogSigning bool
+
+ // Disables the Signer's moving HTTP header key/value pairs from the HTTP
+ // request header to the request's query string. This is most commonly used
+ // with pre-signed requests preventing headers from being added to the
+ // request's query string.
+ DisableHeaderHoisting bool
+
+ // Disables the automatic escaping of the URI path of the request for the
+ // siganture's canonical string's path. For services that do not need additional
+ // escaping then use this to disable the signer escaping the path.
+ //
+ // S3 is an example of a service that does not need additional escaping.
+ //
+ // http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html
+ DisableURIPathEscaping bool
+}
+
+// Signer is a SigV4a HTTP signing implementation
+type Signer struct {
+ options SignerOptions
+}
+
+// NewSigner constructs a SigV4a Signer.
+func NewSigner(optFns ...func(*SignerOptions)) *Signer {
+ options := SignerOptions{}
+
+ for _, fn := range optFns {
+ fn(&options)
+ }
+
+ return &Signer{options: options}
+}
+
+// deriveKeyFromAccessKeyPair derives a NIST P-256 PrivateKey from the given
+// IAM AccessKey and SecretKey pair.
+//
+// Based on FIPS.186-4 Appendix B.4.2
+func deriveKeyFromAccessKeyPair(accessKey, secretKey string) (*ecdsa.PrivateKey, error) {
+ params := p256.Params()
+ bitLen := params.BitSize // Testing random candidates does not require an additional 64 bits
+ counter := 0x01
+
+ buffer := make([]byte, 1+len(accessKey)) // 1 byte counter + len(accessKey)
+ kdfContext := bytes.NewBuffer(buffer)
+
+ inputKey := append([]byte("AWS4A"), []byte(secretKey)...)
+
+ d := new(big.Int)
+ for {
+ kdfContext.Reset()
+ kdfContext.WriteString(accessKey)
+ kdfContext.WriteByte(byte(counter))
+
+ key, err := signerCrypto.HMACKeyDerivation(sha256.New, bitLen, inputKey, []byte(signingAlgorithm), kdfContext.Bytes())
+ if err != nil {
+ return nil, err
+ }
+
+ // Check key first before calling SetBytes if key key is in fact a valid candidate.
+ // This ensures the byte slice is the correct length (32-bytes) to compare in constant-time
+ cmp, err := signerCrypto.ConstantTimeByteCompare(key, nMinusTwoP256.Bytes())
+ if err != nil {
+ return nil, err
+ }
+ if cmp == -1 {
+ d.SetBytes(key)
+ break
+ }
+
+ counter++
+ if counter > 0xFF {
+ return nil, fmt.Errorf("exhausted single byte external counter")
+ }
+ }
+ d = d.Add(d, one)
+
+ priv := new(ecdsa.PrivateKey)
+ priv.PublicKey.Curve = p256
+ priv.D = d
+ priv.PublicKey.X, priv.PublicKey.Y = p256.ScalarBaseMult(d.Bytes())
+
+ return priv, nil
+}
+
+type httpSigner struct {
+ Request *http.Request
+ ServiceName string
+ RegionSet []string
+ Time time.Time
+ Credentials Credentials
+ IsPreSign bool
+
+ Logger logging.Logger
+ Debug bool
+
+ // PayloadHash is the hex encoded SHA-256 hash of the request payload
+ // If len(PayloadHash) == 0 the signer will attempt to send the request
+ // as an unsigned payload. Note: Unsigned payloads only work for a subset of services.
+ PayloadHash string
+
+ DisableHeaderHoisting bool
+ DisableURIPathEscaping bool
+}
+
+// SignHTTP takes the provided http.Request, payload hash, service, regionSet, and time and signs using SigV4a.
+// The passed in request will be modified in place.
+func (s *Signer) SignHTTP(ctx context.Context, credentials Credentials, r *http.Request, payloadHash string, service string, regionSet []string, signingTime time.Time, optFns ...func(*SignerOptions)) error {
+ options := s.options
+ for _, fn := range optFns {
+ fn(&options)
+ }
+
+ signer := &httpSigner{
+ Request: r,
+ PayloadHash: payloadHash,
+ ServiceName: service,
+ RegionSet: regionSet,
+ Credentials: credentials,
+ Time: signingTime.UTC(),
+ DisableHeaderHoisting: options.DisableHeaderHoisting,
+ DisableURIPathEscaping: options.DisableURIPathEscaping,
+ }
+
+ signedRequest, err := signer.Build()
+ if err != nil {
+ return err
+ }
+
+ logHTTPSigningInfo(ctx, options, signedRequest)
+
+ return nil
+}
+
+// PresignHTTP takes the provided http.Request, payload hash, service, regionSet, and time and presigns using SigV4a
+// Returns the presigned URL along with the headers that were signed with the request.
+//
+// PresignHTTP will not set the expires time of the presigned request
+// automatically. To specify the expire duration for a request add the
+// "X-Amz-Expires" query parameter on the request with the value as the
+// duration in seconds the presigned URL should be considered valid for. This
+// parameter is not used by all AWS services, and is most notable used by
+// Amazon S3 APIs.
+func (s *Signer) PresignHTTP(ctx context.Context, credentials Credentials, r *http.Request, payloadHash string, service string, regionSet []string, signingTime time.Time, optFns ...func(*SignerOptions)) (signedURI string, signedHeaders http.Header, err error) {
+ options := s.options
+ for _, fn := range optFns {
+ fn(&options)
+ }
+
+ signer := &httpSigner{
+ Request: r,
+ PayloadHash: payloadHash,
+ ServiceName: service,
+ RegionSet: regionSet,
+ Credentials: credentials,
+ Time: signingTime.UTC(),
+ IsPreSign: true,
+ DisableHeaderHoisting: options.DisableHeaderHoisting,
+ DisableURIPathEscaping: options.DisableURIPathEscaping,
+ }
+
+ signedRequest, err := signer.Build()
+ if err != nil {
+ return "", nil, err
+ }
+
+ logHTTPSigningInfo(ctx, options, signedRequest)
+
+ signedHeaders = make(http.Header)
+
+ // For the signed headers we canonicalize the header keys in the returned map.
+ // This avoids situations where can standard library double headers like host header. For example the standard
+ // library will set the Host header, even if it is present in lower-case form.
+ for k, v := range signedRequest.SignedHeaders {
+ key := textproto.CanonicalMIMEHeaderKey(k)
+ signedHeaders[key] = append(signedHeaders[key], v...)
+ }
+
+ return signedRequest.Request.URL.String(), signedHeaders, nil
+}
+
+func (s *httpSigner) setRequiredSigningFields(headers http.Header, query url.Values) {
+ amzDate := s.Time.Format(timeFormat)
+
+ if s.IsPreSign {
+ query.Set(AmzRegionSetKey, strings.Join(s.RegionSet, ","))
+ query.Set(amzDateKey, amzDate)
+ query.Set(amzAlgorithmKey, signingAlgorithm)
+ if len(s.Credentials.SessionToken) > 0 {
+ query.Set(amzSecurityTokenKey, s.Credentials.SessionToken)
+ }
+ return
+ }
+
+ headers.Set(AmzRegionSetKey, strings.Join(s.RegionSet, ","))
+ headers.Set(amzDateKey, amzDate)
+ if len(s.Credentials.SessionToken) > 0 {
+ headers.Set(amzSecurityTokenKey, s.Credentials.SessionToken)
+ }
+}
+
+func (s *httpSigner) Build() (signedRequest, error) {
+ req := s.Request
+
+ query := req.URL.Query()
+ headers := req.Header
+
+ s.setRequiredSigningFields(headers, query)
+
+ // Sort Each Query Key's Values
+ for key := range query {
+ sort.Strings(query[key])
+ }
+
+ v4Internal.SanitizeHostForHeader(req)
+
+ credentialScope := s.buildCredentialScope()
+ credentialStr := s.Credentials.Context + "/" + credentialScope
+ if s.IsPreSign {
+ query.Set(amzCredentialKey, credentialStr)
+ }
+
+ unsignedHeaders := headers
+ if s.IsPreSign && !s.DisableHeaderHoisting {
+ urlValues := url.Values{}
+ urlValues, unsignedHeaders = buildQuery(v4Internal.AllowedQueryHoisting, unsignedHeaders)
+ for k := range urlValues {
+ query[k] = urlValues[k]
+ }
+ }
+
+ host := req.URL.Host
+ if len(req.Host) > 0 {
+ host = req.Host
+ }
+
+ signedHeaders, signedHeadersStr, canonicalHeaderStr := s.buildCanonicalHeaders(host, v4Internal.IgnoredHeaders, unsignedHeaders, s.Request.ContentLength)
+
+ if s.IsPreSign {
+ query.Set(amzSignedHeadersKey, signedHeadersStr)
+ }
+
+ rawQuery := strings.Replace(query.Encode(), "+", "%20", -1)
+
+ canonicalURI := v4Internal.GetURIPath(req.URL)
+ if !s.DisableURIPathEscaping {
+ canonicalURI = httpbinding.EscapePath(canonicalURI, false)
+ }
+
+ canonicalString := s.buildCanonicalString(
+ req.Method,
+ canonicalURI,
+ rawQuery,
+ signedHeadersStr,
+ canonicalHeaderStr,
+ )
+
+ strToSign := s.buildStringToSign(credentialScope, canonicalString)
+ signingSignature, err := s.buildSignature(strToSign)
+ if err != nil {
+ return signedRequest{}, err
+ }
+
+ if s.IsPreSign {
+ rawQuery += "&X-Amz-Signature=" + signingSignature
+ } else {
+ headers[authorizationHeader] = append(headers[authorizationHeader][:0], buildAuthorizationHeader(credentialStr, signedHeadersStr, signingSignature))
+ }
+
+ req.URL.RawQuery = rawQuery
+
+ return signedRequest{
+ Request: req,
+ SignedHeaders: signedHeaders,
+ CanonicalString: canonicalString,
+ StringToSign: strToSign,
+ PreSigned: s.IsPreSign,
+ }, nil
+}
+
+func buildAuthorizationHeader(credentialStr, signedHeadersStr, signingSignature string) string {
+ const credential = "Credential="
+ const signedHeaders = "SignedHeaders="
+ const signature = "Signature="
+ const commaSpace = ", "
+
+ var parts strings.Builder
+ parts.Grow(len(signingAlgorithm) + 1 +
+ len(credential) + len(credentialStr) + len(commaSpace) +
+ len(signedHeaders) + len(signedHeadersStr) + len(commaSpace) +
+ len(signature) + len(signingSignature),
+ )
+ parts.WriteString(signingAlgorithm)
+ parts.WriteRune(' ')
+ parts.WriteString(credential)
+ parts.WriteString(credentialStr)
+ parts.WriteString(commaSpace)
+ parts.WriteString(signedHeaders)
+ parts.WriteString(signedHeadersStr)
+ parts.WriteString(commaSpace)
+ parts.WriteString(signature)
+ parts.WriteString(signingSignature)
+ return parts.String()
+}
+
+func (s *httpSigner) buildCredentialScope() string {
+ return strings.Join([]string{
+ s.Time.Format(shortTimeFormat),
+ s.ServiceName,
+ "aws4_request",
+ }, "/")
+
+}
+
+func buildQuery(r v4Internal.Rule, header http.Header) (url.Values, http.Header) {
+ query := url.Values{}
+ unsignedHeaders := http.Header{}
+ for k, h := range header {
+ if r.IsValid(k) {
+ query[k] = h
+ } else {
+ unsignedHeaders[k] = h
+ }
+ }
+
+ return query, unsignedHeaders
+}
+
+func (s *httpSigner) buildCanonicalHeaders(host string, rule v4Internal.Rule, header http.Header, length int64) (signed http.Header, signedHeaders, canonicalHeadersStr string) {
+ signed = make(http.Header)
+
+ var headers []string
+ const hostHeader = "host"
+ headers = append(headers, hostHeader)
+ signed[hostHeader] = append(signed[hostHeader], host)
+
+ if length > 0 {
+ const contentLengthHeader = "content-length"
+ headers = append(headers, contentLengthHeader)
+ signed[contentLengthHeader] = append(signed[contentLengthHeader], strconv.FormatInt(length, 10))
+ }
+
+ for k, v := range header {
+ if !rule.IsValid(k) {
+ continue // ignored header
+ }
+
+ lowerCaseKey := strings.ToLower(k)
+ if _, ok := signed[lowerCaseKey]; ok {
+ // include additional values
+ signed[lowerCaseKey] = append(signed[lowerCaseKey], v...)
+ continue
+ }
+
+ headers = append(headers, lowerCaseKey)
+ signed[lowerCaseKey] = v
+ }
+ sort.Strings(headers)
+
+ signedHeaders = strings.Join(headers, ";")
+
+ var canonicalHeaders strings.Builder
+ n := len(headers)
+ const colon = ':'
+ for i := range n {
+ if headers[i] == hostHeader {
+ canonicalHeaders.WriteString(hostHeader)
+ canonicalHeaders.WriteRune(colon)
+ canonicalHeaders.WriteString(v4Internal.StripExcessSpaces(host))
+ } else {
+ canonicalHeaders.WriteString(headers[i])
+ canonicalHeaders.WriteRune(colon)
+ // Trim out leading, trailing, and dedup inner spaces from signed header values.
+ values := signed[headers[i]]
+ for j, v := range values {
+ cleanedValue := strings.TrimSpace(v4Internal.StripExcessSpaces(v))
+ canonicalHeaders.WriteString(cleanedValue)
+ if j < len(values)-1 {
+ canonicalHeaders.WriteRune(',')
+ }
+ }
+ }
+ canonicalHeaders.WriteRune('\n')
+ }
+ canonicalHeadersStr = canonicalHeaders.String()
+
+ return signed, signedHeaders, canonicalHeadersStr
+}
+
+func (s *httpSigner) buildCanonicalString(method, uri, query, signedHeaders, canonicalHeaders string) string {
+ return strings.Join([]string{
+ method,
+ uri,
+ query,
+ canonicalHeaders,
+ signedHeaders,
+ s.PayloadHash,
+ }, "\n")
+}
+
+func (s *httpSigner) buildStringToSign(credentialScope, canonicalRequestString string) string {
+ return strings.Join([]string{
+ signingAlgorithm,
+ s.Time.Format(timeFormat),
+ credentialScope,
+ hex.EncodeToString(makeHash(sha256.New(), []byte(canonicalRequestString))),
+ }, "\n")
+}
+
+func makeHash(hash hash.Hash, b []byte) []byte {
+ hash.Reset()
+ hash.Write(b)
+ return hash.Sum(nil)
+}
+
+func (s *httpSigner) buildSignature(strToSign string) (string, error) {
+ sig, err := s.Credentials.PrivateKey.Sign(rand.Reader, makeHash(sha256.New(), []byte(strToSign)), crypto.SHA256)
+ if err != nil {
+ return "", err
+ }
+ return hex.EncodeToString(sig), nil
+}
+
+const logSignInfoMsg = `Request Signature:
+---[ CANONICAL STRING ]-----------------------------
+%s
+---[ STRING TO SIGN ]--------------------------------
+%s%s
+-----------------------------------------------------`
+const logSignedURLMsg = `
+---[ SIGNED URL ]------------------------------------
+%s`
+
+func logHTTPSigningInfo(ctx context.Context, options SignerOptions, r signedRequest) {
+ if !options.LogSigning {
+ return
+ }
+ signedURLMsg := ""
+ if r.PreSigned {
+ signedURLMsg = fmt.Sprintf(logSignedURLMsg, r.Request.URL.String())
+ }
+ logger := logging.WithContext(ctx, options.Logger)
+ logger.Logf(logging.Debug, logSignInfoMsg, r.CanonicalString, r.StringToSign, signedURLMsg)
+}
+
+type signedRequest struct {
+ Request *http.Request
+ SignedHeaders http.Header
+ CanonicalString string
+ StringToSign string
+ PreSigned bool
+}
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/CHANGELOG.md
index 497d3723041..cf6c5e09116 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/CHANGELOG.md
@@ -1,3 +1,11 @@
+# v1.13.9 (2026-04-29)
+
+* **Dependency Update**: Update to smithy-go v1.25.1.
+
+# v1.13.8 (2026-04-17)
+
+* **Dependency Update**: Bump smithy-go to 1.25.0 to support endpointBdd trait
+
# v1.13.7 (2026-03-13)
* **Bug Fix**: Replace usages of the old ioutil/ package throughout the SDK.
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/go_module_metadata.go
index 5679a2b2b17..e145070706f 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/go_module_metadata.go
@@ -3,4 +3,4 @@
package acceptencoding
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.13.7"
+const goModuleVersion = "1.13.9"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md
index 7c5e13816e8..96adad52610 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md
@@ -1,3 +1,13 @@
+# v1.13.23 (2026-04-29)
+
+* **Dependency Update**: Update to smithy-go v1.25.1.
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.13.22 (2026-04-17)
+
+* **Dependency Update**: Bump smithy-go to 1.25.0 to support endpointBdd trait
+* **Dependency Update**: Updated to the latest SDK module versions
+
# v1.13.21 (2026-03-26)
* **Dependency Update**: Updated to the latest SDK module versions
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go
index 456855e8852..5737e9c0c1b 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go
@@ -3,4 +3,4 @@
package presignedurl
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.13.21"
+const goModuleVersion = "1.13.23"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/CHANGELOG.md
index d93bf5e7cc4..253e0359678 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/CHANGELOG.md
@@ -1,3 +1,13 @@
+# v1.0.11 (2026-04-29)
+
+* **Dependency Update**: Update to smithy-go v1.25.1.
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.0.10 (2026-04-17)
+
+* **Dependency Update**: Bump smithy-go to 1.25.0 to support endpointBdd trait
+* **Dependency Update**: Updated to the latest SDK module versions
+
# v1.0.9 (2026-03-26)
* **Bug Fix**: Fix a bug where a recorded clock skew could persist on the client even if the client and server clock ended up realigning.
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/go_module_metadata.go
index c922e7adfbe..eba7ad77743 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/go_module_metadata.go
@@ -3,4 +3,4 @@
package signin
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.0.9"
+const goModuleVersion = "1.0.11"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md
index 697dce1a2e6..26c80a2c233 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md
@@ -1,3 +1,17 @@
+# v1.30.17 (2026-04-29)
+
+* **Dependency Update**: Update to smithy-go v1.25.1.
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.30.16 (2026-04-17)
+
+* **Dependency Update**: Bump smithy-go to 1.25.0 to support endpointBdd trait
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.30.15 (2026-04-02)
+
+* No change notes available for this release.
+
# v1.30.14 (2026-03-26)
* **Bug Fix**: Fix a bug where a recorded clock skew could persist on the client even if the client and server clock ended up realigning.
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go
index 9674e4957b1..9d12dd55bc3 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go
@@ -3,4 +3,4 @@
package sso
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.30.14"
+const goModuleVersion = "1.30.17"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints/endpoints.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints/endpoints.go
index 9f550c3f1bb..871275a6bfc 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints/endpoints.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints/endpoints.go
@@ -482,6 +482,11 @@ var defaultPartitions = endpoints.Partitions{
},
RegionRegex: partitionRegexp.AwsEusc,
IsRegionalized: true,
+ Endpoints: endpoints.Endpoints{
+ endpoints.EndpointKey{
+ Region: "eusc-de-east-1",
+ }: endpoints.Endpoint{},
+ },
},
{
ID: "aws-iso",
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md
index 2bb4cd8fbb7..33082c0e541 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md
@@ -1,3 +1,21 @@
+# v1.36.0 (2026-05-22)
+
+* **Feature**: Adding new BDD representation of endpoint ruleset
+
+# v1.35.21 (2026-04-29)
+
+* **Dependency Update**: Update to smithy-go v1.25.1.
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.35.20 (2026-04-17)
+
+* **Dependency Update**: Bump smithy-go to 1.25.0 to support endpointBdd trait
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.35.19 (2026-04-02)
+
+* No change notes available for this release.
+
# v1.35.18 (2026-03-26)
* **Bug Fix**: Fix a bug where a recorded clock skew could persist on the client even if the client and server clock ended up realigning.
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/endpoints.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/endpoints.go
index 884983eb4d0..0834533561e 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/endpoints.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/endpoints.go
@@ -14,6 +14,7 @@ import (
internalendpoints "github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints"
smithyauth "github.com/aws/smithy-go/auth"
smithyendpoints "github.com/aws/smithy-go/endpoints"
+ "github.com/aws/smithy-go/endpoints/private/bdd"
"github.com/aws/smithy-go/endpoints/private/rulesfn"
"github.com/aws/smithy-go/middleware"
"github.com/aws/smithy-go/ptr"
@@ -294,21 +295,157 @@ func (p EndpointParameters) WithDefaults() EndpointParameters {
return p
}
-type stringSlice []string
+const bddRoot int32 = 2
-func (s stringSlice) Get(i int) *string {
- if i < 0 || i >= len(s) {
- return nil
- }
+var bddNodes = [42]int32{
+ -1, 1, -1, 0, 13, 3, 1, 4, 100000012, 2, 5, 100000012, 3, 8, 6, 4, 7, 100000011, 5, 100000009, 100000010, 4, 11, 9, 6, 10, 100000008, 7, 100000006, 100000007, 5, 12, 100000005, 6, 100000004, 100000005, 3, 100000001, 14, 4, 100000002, 100000003}
+
+type conditionContext struct {
+ PartitionResult *awsrulesfn.PartitionConfig
+}
- v := s[i]
- return &v
+func evalCondition(idx int, params *EndpointParameters, c *conditionContext) bool {
+ switch idx {
+ case 0:
+ return params.Endpoint != nil
+ case 1:
+ return params.Region != nil
+ case 2:
+ if v := awsrulesfn.GetPartition(*params.Region); v != nil {
+ c.PartitionResult = v
+ return true
+ }
+ return false
+ case 3:
+ return *params.UseFIPS == true
+ case 4:
+ return *params.UseDualStack == true
+ case 5:
+ return c.PartitionResult.SupportsDualStack == true
+ case 6:
+ return c.PartitionResult.SupportsFIPS == true
+ case 7:
+ return c.PartitionResult.Name == "aws-us-gov"
+ }
+ return false
+}
+
+func resolveResult(idx int32, params *EndpointParameters, c *conditionContext) (smithyendpoints.Endpoint, error) {
+ switch idx {
+ case 0:
+ return smithyendpoints.Endpoint{}, fmt.Errorf("endpoint resolution failed: no matching rule")
+ case 1:
+ return smithyendpoints.Endpoint{}, fmt.Errorf("endpoint rule error, %s", "Invalid Configuration: FIPS and custom endpoint are not supported")
+ case 2:
+ return smithyendpoints.Endpoint{}, fmt.Errorf("endpoint rule error, %s", "Invalid Configuration: Dualstack and custom endpoint are not supported")
+ case 3:
+ uriString := *params.Endpoint
+ uri, err := url.Parse(uriString)
+ if err != nil {
+ return smithyendpoints.Endpoint{}, fmt.Errorf("Failed to parse uri: %s", uriString)
+ }
+ return smithyendpoints.Endpoint{
+ URI: *uri,
+ Headers: http.Header{},
+ }, nil
+ case 4:
+ uriString := func() string {
+ var out strings.Builder
+ out.WriteString("https://oidc-fips.")
+ out.WriteString(*params.Region)
+ out.WriteString(".")
+ out.WriteString(c.PartitionResult.DualStackDnsSuffix)
+ return out.String()
+ }()
+ uri, err := url.Parse(uriString)
+ if err != nil {
+ return smithyendpoints.Endpoint{}, fmt.Errorf("Failed to parse uri: %s", uriString)
+ }
+ return smithyendpoints.Endpoint{
+ URI: *uri,
+ Headers: http.Header{},
+ }, nil
+ case 5:
+ return smithyendpoints.Endpoint{}, fmt.Errorf("endpoint rule error, %s", "FIPS and DualStack are enabled, but this partition does not support one or both")
+ case 6:
+ uriString := func() string {
+ var out strings.Builder
+ out.WriteString("https://oidc.")
+ out.WriteString(*params.Region)
+ out.WriteString(".amazonaws.com")
+ return out.String()
+ }()
+ uri, err := url.Parse(uriString)
+ if err != nil {
+ return smithyendpoints.Endpoint{}, fmt.Errorf("Failed to parse uri: %s", uriString)
+ }
+ return smithyendpoints.Endpoint{
+ URI: *uri,
+ Headers: http.Header{},
+ }, nil
+ case 7:
+ uriString := func() string {
+ var out strings.Builder
+ out.WriteString("https://oidc-fips.")
+ out.WriteString(*params.Region)
+ out.WriteString(".")
+ out.WriteString(c.PartitionResult.DnsSuffix)
+ return out.String()
+ }()
+ uri, err := url.Parse(uriString)
+ if err != nil {
+ return smithyendpoints.Endpoint{}, fmt.Errorf("Failed to parse uri: %s", uriString)
+ }
+ return smithyendpoints.Endpoint{
+ URI: *uri,
+ Headers: http.Header{},
+ }, nil
+ case 8:
+ return smithyendpoints.Endpoint{}, fmt.Errorf("endpoint rule error, %s", "FIPS is enabled but this partition does not support FIPS")
+ case 9:
+ uriString := func() string {
+ var out strings.Builder
+ out.WriteString("https://oidc.")
+ out.WriteString(*params.Region)
+ out.WriteString(".")
+ out.WriteString(c.PartitionResult.DualStackDnsSuffix)
+ return out.String()
+ }()
+ uri, err := url.Parse(uriString)
+ if err != nil {
+ return smithyendpoints.Endpoint{}, fmt.Errorf("Failed to parse uri: %s", uriString)
+ }
+ return smithyendpoints.Endpoint{
+ URI: *uri,
+ Headers: http.Header{},
+ }, nil
+ case 10:
+ return smithyendpoints.Endpoint{}, fmt.Errorf("endpoint rule error, %s", "DualStack is enabled but this partition does not support DualStack")
+ case 11:
+ uriString := func() string {
+ var out strings.Builder
+ out.WriteString("https://oidc.")
+ out.WriteString(*params.Region)
+ out.WriteString(".")
+ out.WriteString(c.PartitionResult.DnsSuffix)
+ return out.String()
+ }()
+ uri, err := url.Parse(uriString)
+ if err != nil {
+ return smithyendpoints.Endpoint{}, fmt.Errorf("Failed to parse uri: %s", uriString)
+ }
+ return smithyendpoints.Endpoint{
+ URI: *uri,
+ Headers: http.Header{},
+ }, nil
+ case 12:
+ return smithyendpoints.Endpoint{}, fmt.Errorf("endpoint rule error, %s", "Invalid Configuration: Missing Region")
+ }
+ return smithyendpoints.Endpoint{}, fmt.Errorf("endpoint rule error, invalid result index: %d", idx)
}
// EndpointResolverV2 provides the interface for resolving service endpoints.
type EndpointResolverV2 interface {
- // ResolveEndpoint attempts to resolve the endpoint with the provided options,
- // returning the endpoint if found. Otherwise an error is returned.
ResolveEndpoint(ctx context.Context, params EndpointParameters) (
smithyendpoints.Endpoint, error,
)
@@ -332,152 +469,12 @@ func (r *resolver) ResolveEndpoint(
if err = params.ValidateRequired(); err != nil {
return endpoint, fmt.Errorf("endpoint parameters are not valid, %w", err)
}
- _UseDualStack := *params.UseDualStack
- _ = _UseDualStack
- _UseFIPS := *params.UseFIPS
- _ = _UseFIPS
-
- if exprVal := params.Endpoint; exprVal != nil {
- _Endpoint := *exprVal
- _ = _Endpoint
- if _UseFIPS == true {
- return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid Configuration: FIPS and custom endpoint are not supported")
- }
- if _UseDualStack == true {
- return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid Configuration: Dualstack and custom endpoint are not supported")
- }
- uriString := _Endpoint
-
- uri, err := url.Parse(uriString)
- if err != nil {
- return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString)
- }
-
- return smithyendpoints.Endpoint{
- URI: *uri,
- Headers: http.Header{},
- }, nil
- }
- if exprVal := params.Region; exprVal != nil {
- _Region := *exprVal
- _ = _Region
- if exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil {
- _PartitionResult := *exprVal
- _ = _PartitionResult
- if _UseFIPS == true {
- if _UseDualStack == true {
- if true == _PartitionResult.SupportsFIPS {
- if true == _PartitionResult.SupportsDualStack {
- uriString := func() string {
- var out strings.Builder
- out.WriteString("https://oidc-fips.")
- out.WriteString(_Region)
- out.WriteString(".")
- out.WriteString(_PartitionResult.DualStackDnsSuffix)
- return out.String()
- }()
-
- uri, err := url.Parse(uriString)
- if err != nil {
- return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString)
- }
-
- return smithyendpoints.Endpoint{
- URI: *uri,
- Headers: http.Header{},
- }, nil
- }
- }
- return endpoint, fmt.Errorf("endpoint rule error, %s", "FIPS and DualStack are enabled, but this partition does not support one or both")
- }
- }
- if _UseFIPS == true {
- if _PartitionResult.SupportsFIPS == true {
- if _PartitionResult.Name == "aws-us-gov" {
- uriString := func() string {
- var out strings.Builder
- out.WriteString("https://oidc.")
- out.WriteString(_Region)
- out.WriteString(".amazonaws.com")
- return out.String()
- }()
-
- uri, err := url.Parse(uriString)
- if err != nil {
- return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString)
- }
-
- return smithyendpoints.Endpoint{
- URI: *uri,
- Headers: http.Header{},
- }, nil
- }
- uriString := func() string {
- var out strings.Builder
- out.WriteString("https://oidc-fips.")
- out.WriteString(_Region)
- out.WriteString(".")
- out.WriteString(_PartitionResult.DnsSuffix)
- return out.String()
- }()
-
- uri, err := url.Parse(uriString)
- if err != nil {
- return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString)
- }
-
- return smithyendpoints.Endpoint{
- URI: *uri,
- Headers: http.Header{},
- }, nil
- }
- return endpoint, fmt.Errorf("endpoint rule error, %s", "FIPS is enabled but this partition does not support FIPS")
- }
- if _UseDualStack == true {
- if true == _PartitionResult.SupportsDualStack {
- uriString := func() string {
- var out strings.Builder
- out.WriteString("https://oidc.")
- out.WriteString(_Region)
- out.WriteString(".")
- out.WriteString(_PartitionResult.DualStackDnsSuffix)
- return out.String()
- }()
-
- uri, err := url.Parse(uriString)
- if err != nil {
- return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString)
- }
-
- return smithyendpoints.Endpoint{
- URI: *uri,
- Headers: http.Header{},
- }, nil
- }
- return endpoint, fmt.Errorf("endpoint rule error, %s", "DualStack is enabled but this partition does not support DualStack")
- }
- uriString := func() string {
- var out strings.Builder
- out.WriteString("https://oidc.")
- out.WriteString(_Region)
- out.WriteString(".")
- out.WriteString(_PartitionResult.DnsSuffix)
- return out.String()
- }()
-
- uri, err := url.Parse(uriString)
- if err != nil {
- return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString)
- }
- return smithyendpoints.Endpoint{
- URI: *uri,
- Headers: http.Header{},
- }, nil
- }
- return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.")
- }
- return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid Configuration: Missing Region")
+ c := &conditionContext{}
+ ref := bdd.Evaluate(bddNodes[:], bddRoot, func(idx int) bool {
+ return evalCondition(idx, ¶ms, c)
+ })
+ return resolveResult(ref, ¶ms, c)
}
type endpointParamsBinder interface {
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go
index 2ae8e4e3b8d..f94dbeb9b58 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go
@@ -3,4 +3,4 @@
package ssooidc
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.35.18"
+const goModuleVersion = "1.36.0"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints/endpoints.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints/endpoints.go
index b7c58e2f24e..4ab58f60bd6 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints/endpoints.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints/endpoints.go
@@ -482,6 +482,11 @@ var defaultPartitions = endpoints.Partitions{
},
RegionRegex: partitionRegexp.AwsEusc,
IsRegionalized: true,
+ Endpoints: endpoints.Endpoints{
+ endpoints.EndpointKey{
+ Region: "eusc-de-east-1",
+ }: endpoints.Endpoint{},
+ },
},
{
ID: "aws-iso",
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md
index c0090863816..199f7a79ce8 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md
@@ -1,3 +1,14 @@
+# v1.42.1 (2026-04-29)
+
+* **Dependency Update**: Update to smithy-go v1.25.1.
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.42.0 (2026-04-17)
+
+* **Feature**: The STS client now supports configuring SigV4a through the auth scheme preference setting. SigV4a uses asymmetric cryptography, enabling customers using long-term IAM credentials to continue making STS API calls even when a region is isolated from the partition leader.
+* **Dependency Update**: Bump smithy-go to 1.25.0 to support endpointBdd trait
+* **Dependency Update**: Updated to the latest SDK module versions
+
# v1.41.10 (2026-03-26)
* **Bug Fix**: Fix a bug where a recorded clock skew could persist on the client even if the client and server clock ended up realigning.
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_client.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_client.go
index c0c6af3a15f..958c83c1a89 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_client.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_client.go
@@ -16,6 +16,7 @@ import (
internalauth "github.com/aws/aws-sdk-go-v2/internal/auth"
internalauthsmithy "github.com/aws/aws-sdk-go-v2/internal/auth/smithy"
internalConfig "github.com/aws/aws-sdk-go-v2/internal/configsources"
+ "github.com/aws/aws-sdk-go-v2/internal/v4a"
acceptencodingcust "github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding"
presignedurlcust "github.com/aws/aws-sdk-go-v2/service/internal/presigned-url"
smithy "github.com/aws/smithy-go"
@@ -207,6 +208,8 @@ func New(options Options, optFns ...func(*Options)) *Client {
resolveEndpointResolverV2(&options)
+ resolveHTTPSignerV4a(&options)
+
resolveTracerProvider(&options)
resolveMeterProvider(&options)
@@ -381,6 +384,11 @@ func resolveAuthSchemes(options *Options) {
Logger: options.Logger,
LogSigning: options.ClientLogMode.IsSigning(),
}),
+ internalauth.NewHTTPAuthScheme("aws.auth#sigv4a", &v4a.SignerAdapter{
+ Signer: options.httpSignerV4a,
+ Logger: options.Logger,
+ LogSigning: options.ClientLogMode.IsSigning(),
+ }),
}
}
}
@@ -758,6 +766,26 @@ func resolveUseFIPSEndpoint(cfg aws.Config, o *Options) error {
return nil
}
+type httpSignerV4a interface {
+ SignHTTP(ctx context.Context, credentials v4a.Credentials, r *http.Request, payloadHash,
+ service string, regionSet []string, signingTime time.Time,
+ optFns ...func(*v4a.SignerOptions)) error
+}
+
+func resolveHTTPSignerV4a(o *Options) {
+ if o.httpSignerV4a != nil {
+ return
+ }
+ o.httpSignerV4a = newDefaultV4aSigner(*o)
+}
+
+func newDefaultV4aSigner(o Options) *v4a.Signer {
+ return v4a.NewSigner(func(so *v4a.SignerOptions) {
+ so.Logger = o.Logger
+ so.LogSigning = o.ClientLogMode.IsSigning()
+ })
+}
+
func initializeTimeOffsetResolver(c *Client) {
c.timeOffset = new(atomic.Int64)
}
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/auth.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/auth.go
index 4db5a51f938..71c5db38b76 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/auth.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/auth.go
@@ -149,6 +149,16 @@ func serviceAuthOptions(params *AuthResolverParameters) []*smithyauth.Option {
return props
}(),
},
+
+ {
+ SchemeID: smithyauth.SchemeIDSigV4A,
+ SignerProperties: func() smithy.Properties {
+ var props smithy.Properties
+ smithyhttp.SetSigV4ASigningName(&props, "sts")
+ smithyhttp.SetSigV4ASigningRegions(&props, []string{params.Region})
+ return props
+ }(),
+ },
}
}
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/generated.json b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/generated.json
index b5556cbfbfe..2fc7b400f7c 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/generated.json
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/generated.json
@@ -3,6 +3,7 @@
"github.com/aws/aws-sdk-go-v2": "v1.4.0",
"github.com/aws/aws-sdk-go-v2/internal/configsources": "v0.0.0-00010101000000-000000000000",
"github.com/aws/aws-sdk-go-v2/internal/endpoints/v2": "v2.0.0-00010101000000-000000000000",
+ "github.com/aws/aws-sdk-go-v2/internal/v4a": "v0.0.0-00010101000000-000000000000",
"github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding": "v1.0.5",
"github.com/aws/aws-sdk-go-v2/service/internal/presigned-url": "v1.0.7",
"github.com/aws/smithy-go": "v1.4.0"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go
index 317746f0fd8..bdd6a15d8f0 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go
@@ -3,4 +3,4 @@
package sts
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.41.10"
+const goModuleVersion = "1.42.1"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/options.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/options.go
index c66e69a8d94..a9f2361fd32 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/options.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/options.go
@@ -4,9 +4,11 @@ package sts
import (
"context"
+ "fmt"
"github.com/aws/aws-sdk-go-v2/aws"
awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware"
internalauthsmithy "github.com/aws/aws-sdk-go-v2/internal/auth/smithy"
+ "github.com/aws/aws-sdk-go-v2/internal/v4a"
smithyauth "github.com/aws/smithy-go/auth"
"github.com/aws/smithy-go/logging"
"github.com/aws/smithy-go/metrics"
@@ -107,6 +109,9 @@ type Options struct {
// The client tracer provider.
TracerProvider tracing.TracerProvider
+ // Signature Version 4a (SigV4a) Signer
+ httpSignerV4a httpSignerV4a
+
// The initial DefaultsMode used when the client options were constructed. If the
// DefaultsMode was set to aws.DefaultsModeAuto this will store what the resolved
// value was at that point in time.
@@ -146,6 +151,9 @@ func (o Options) GetIdentityResolver(schemeID string) smithyauth.IdentityResolve
if schemeID == "aws.auth#sigv4" {
return getSigV4IdentityResolver(o)
}
+ if schemeID == "aws.auth#sigv4a" {
+ return getSigV4AIdentityResolver(o)
+ }
if schemeID == "smithy.api#noAuth" {
return &smithyauth.AnonymousIdentityResolver{}
}
@@ -231,6 +239,46 @@ func WithSigV4SigningRegion(region string) func(*Options) {
}
}
+func getSigV4AIdentityResolver(o Options) smithyauth.IdentityResolver {
+ if o.Credentials != nil {
+ return &v4a.CredentialsProviderAdapter{
+ Provider: &v4a.SymmetricCredentialAdaptor{
+ SymmetricProvider: o.Credentials,
+ },
+ }
+ }
+ return nil
+}
+
+// WithSigV4ASigningRegions applies an override to the authentication workflow to
+// use the given signing region set for SigV4A-authenticated operations.
+//
+// This is an advanced setting. The value here is FINAL, taking precedence over
+// the resolved signing region set from both auth scheme resolution and endpoint
+// resolution.
+func WithSigV4ASigningRegions(regions []string) func(*Options) {
+ fn := func(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (
+ out middleware.FinalizeOutput, metadata middleware.Metadata, err error,
+ ) {
+ rscheme := getResolvedAuthScheme(ctx)
+ if rscheme == nil {
+ return out, metadata, fmt.Errorf("no resolved auth scheme")
+ }
+
+ smithyhttp.SetSigV4ASigningRegions(&rscheme.SignerProperties, regions)
+ return next.HandleFinalize(ctx, in)
+ }
+ return func(o *Options) {
+ o.APIOptions = append(o.APIOptions, func(s *middleware.Stack) error {
+ return s.Finalize.Insert(
+ middleware.FinalizeMiddlewareFunc("withSigV4ASigningRegions", fn),
+ "Signing",
+ middleware.Before,
+ )
+ })
+ }
+}
+
func ignoreAnonymousAuth(options *Options) {
if aws.IsCredentialsProvider(options.Credentials, (*aws.AnonymousCredentials)(nil)) {
options.Credentials = nil
diff --git a/vendor/github.com/aws/smithy-go/AGENTS.md b/vendor/github.com/aws/smithy-go/AGENTS.md
new file mode 100644
index 00000000000..e2a75b8ea19
--- /dev/null
+++ b/vendor/github.com/aws/smithy-go/AGENTS.md
@@ -0,0 +1,172 @@
+# AGENTS.md
+
+## Project overview
+
+smithy-go is the Go code generator and runtime for [Smithy](https://smithy.io/).
+It has two major components:
+
+1. **Codegen** (`codegen/`) — A Smithy build plugin written in Java that
+ generates Go client/server/shape code from Smithy models.
+2. **Runtime** (`./`, top-level Go module) — The Go packages that generated
+ code depends on at runtime.
+
+The primary downstream consumer is
+[aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2).
+
+## Repository layout
+
+```
+. # Root Go module (github.com/aws/smithy-go)
+├── auth/ # Auth identity + scheme interfaces
+│ └── bearer/ # Bearer token auth
+├── aws-http-auth/ # Separate module: AWS SigV4/SigV4A HTTP signing
+├── codegen/ # Java/Gradle: Smithy code generator
+│ ├── smithy-go-codegen/ # Main codegen source (Java)
+│ └── smithy-go-codegen-test/ # Codegen integration tests
+├── container/ # Generic container types
+├── context/ # Context helpers
+├── document/ # Smithy document type abstraction
+│ └── json/ # JSON document codec
+├── encoding/ # Wire format encoders/decoders
+│ ├── cbor/ # CBOR (used by rpcv2Cbor)
+│ ├── httpbinding/ # HTTP binding serde helpers
+│ ├── json/ # JSON encoder/decoder
+│ └── xml/ # XML encoder/decoder
+├── endpoints/ # Endpoint resolution types
+├── internal/ # Internal utilities (singleflight, etc.)
+├── io/ # I/O helpers
+├── logging/ # Logging interfaces
+├── metrics/ # Metrics interfaces
+│ └── smithyotelmetrics/ # Separate module: OpenTelemetry metrics adapter
+├── middleware/ # Middleware stack (the core of the operation pipeline)
+├── ptr/ # Pointer-to/from-value helpers
+├── testing/ # Test assertion helpers for generated protocol tests
+│ └── xml/ # XML comparison utilities
+├── time/ # Smithy timestamp format helpers
+├── tracing/ # Tracing interfaces
+│ └── smithyoteltracing/ # Separate module: OpenTelemetry tracing adapter
+└── transport/
+ └── http/ # HTTP request/response types and middleware
+```
+
+## Building and testing
+
+### Runtime (Go)
+
+```bash
+# Run unit tests
+make unit
+```
+
+### Codegen (Java)
+
+```bash
+# Build and test codegen
+cd codegen && ./gradlew build
+
+# Publish to local Maven for downstream use
+cd codegen && ./gradlew publishToMavenLocal
+```
+
+The codegen artifact version is fixed at `0.1.0` and is not published to
+Maven Central — you **MUST** `publishToMavenLocal`.
+
+## Runtime architecture
+
+### Middleware stack
+
+The operation pipeline is built on a middleware stack defined in `middleware/`.
+Steps execute in order: Initialize → Serialize → Build → Finalize →
+Deserialize. Each step is a `middleware.Step` that holds an ordered list of
+middleware. The codegen generates middleware registrations for each operation.
+
+### Encoding packages
+
+Each wire format has its own encoder/decoder under `encoding/`. These are
+low-level — they produce/consume raw tokens or values, not full Smithy shapes.
+Generated serde code calls into these packages.
+
+## Codegen: GoWriter and template system
+
+GoWriter extends Smithy's `SymbolWriter` and is the primary mechanism for
+generating Go source. It has **two distinct writing styles** that must not be
+confused.
+
+### Style 1: Positional args (`writer.write` / `writer.openBlock`)
+
+Inherited from `SymbolWriter`. Arguments are positional and referenced with
+`$`-prefixed format characters. Each `$X` consumes the next argument in order.
+
+Format characters:
+- `$L` — Literal (toString). Strings, names, anything that should be inserted
+ verbatim.
+- `$S` — String, quoted. Wraps the value in Go double-quotes.
+- `$T` — Type (Symbol). Inserts the symbol name and auto-adds its import.
+- `$P` — Pointable type (Symbol). Like `$T` but prepends `*` if the symbol is
+ marked pointable.
+- `$W` — Writable. Evaluates a `Writable` (lambda/closure) inline.
+- `$D` — Dependency. Adds a `GoDependency` import, expands to empty string.
+
+Numbered variants (`$1L`, `$2T`, etc.) allow reusing the same argument
+multiple times. The number is 1-indexed and refers to the position in the
+argument list:
+
+```java
+// $1L is used twice, $2L once — only 2 args needed
+writer.write("type $1L struct{}\nvar _ $2L = (*$1L)(nil)",
+ DEFAULT_NAME, INTERFACE_NAME);
+```
+
+`openBlock`/`closeBlock` manage indentation for braced blocks. Arguments are
+positional:
+
+```java
+writer.openBlock("func (c $P) $T(ctx $T) ($P, error) {", "}",
+ serviceSymbol, operationSymbol, contextSymbol, outputSymbol,
+ () -> {
+ writer.write("return nil, nil");
+ });
+```
+
+### Style 2: Named template args (`goTemplate` / `writeGoTemplate`)
+
+Uses `$name:X` syntax where `name` is a key in a `Map` and `X`
+is the format character. Arguments are passed as one or more maps. This is the
+**preferred style for new code** — it is more readable and less error-prone
+than positional args.
+
+```java
+return goTemplate("""
+ func $name:L(v $cborValue:T) ($type:T, error) {
+ return $coercer:T(v)
+ }
+ """,
+ Map.of(
+ "name", getDeserializerName(shape),
+ "cborValue", SmithyGoTypes.Encoding.Cbor.Value,
+ "type", symbolProvider.toSymbol(shape),
+ "coercer", coercer
+ ));
+```
+
+Rules:
+- `goTemplate(String, Map...)` is a **static** method that returns a
+ `Writable` (a `Consumer` lambda). It does NOT write immediately.
+- `writeGoTemplate(String, Map...)` is an **instance** method that writes
+ immediately to the writer.
+- Maps are merged into the writer's context scope for the duration of the
+ template. Multiple maps can be passed and are applied in order.
+- The writer pre-populates common symbols in context: `fmt.Sprintf`,
+ `fmt.Errorf`, `errors.As`, `context.Context`, `time.Now`.
+
+### Composing writables
+
+- `ChainWritable` — Collects multiple `Writable`s and composes them with
+ newlines between each. Use `.compose()` (with newlines) or
+ `.compose(false)` (without).
+
+### Symbol constants
+
+For symbols, use `SmithyGoDependency.*.valueSymbol("Name")` or
+`SmithyGoDependency.*.pointableSymbol("Name")`.
+
diff --git a/vendor/github.com/aws/smithy-go/CHANGELOG.md b/vendor/github.com/aws/smithy-go/CHANGELOG.md
index 27fc881232a..7fc37ff89ee 100644
--- a/vendor/github.com/aws/smithy-go/CHANGELOG.md
+++ b/vendor/github.com/aws/smithy-go/CHANGELOG.md
@@ -1,8 +1,46 @@
-# Release (2026-02-27)
+# Release (2026-05-27)
+
+## General Highlights
+* **Dependency Update**: Updated to the latest SDK module versions
+
+## Module Highlights
+* `github.com/aws/smithy-go`: v1.26.0
+ * **Feature**: Add StringSlice to endpoint rulesfn.
+
+# Release (2026-04-23)
+
+## General Highlights
+* **Dependency Update**: Updated to the latest SDK module versions
+
+## Module Highlights
+* `github.com/aws/smithy-go`: v1.25.1
+ * **Bug Fix**: Fixed a memory leak in the LRU cache implementation used by some AWS services.
+
+# Release (2026-04-15)
## General Highlights
* **Dependency Update**: Updated to the latest SDK module versions
+## Module Highlights
+* `github.com/aws/smithy-go`: v1.25.0
+ * **Feature**: Add support for endpointBdd trait
+
+# Release (2026-04-02)
+
+## General Highlights
+* **Dependency Update**: Updated to the latest SDK module versions
+
+## Module Highlights
+* `github.com/aws/smithy-go`: v1.24.3
+ * **Bug Fix**: Add additional sigv4 configuration.
+* `github.com/aws/smithy-go/aws-http-auth`: [v1.1.3](aws-http-auth/CHANGELOG.md#v113-2026-04-02)
+ * **Bug Fix**: Add additional sigv4 configuration.
+
+# Release (2026-02-27)
+
+## General Highlights
+* **Dependency Update**: Bump minimum go version to 1.24.
+
# Release (2026-02-20)
## General Highlights
diff --git a/vendor/github.com/aws/smithy-go/endpoints/private/bdd/evaluate.go b/vendor/github.com/aws/smithy-go/endpoints/private/bdd/evaluate.go
new file mode 100644
index 00000000000..ae0fb7fdad7
--- /dev/null
+++ b/vendor/github.com/aws/smithy-go/endpoints/private/bdd/evaluate.go
@@ -0,0 +1,35 @@
+package bdd
+
+const resultOffset int32 = 100_000_000
+const intsPerNode = 3
+
+// Evaluate traverses a compiled BDD node array and returns the result index.
+// nodes is a flat array of [condIdx, hi, lo] triples (1-indexed).
+// root is the root node reference. evalCond returns true/false for condition index.
+func Evaluate(nodes []int32, root int32, evalCond func(int) bool) int32 {
+ ref := root
+ for {
+ if ref >= resultOffset {
+ return ref - resultOffset
+ }
+ if ref == 1 || ref == -1 {
+ return 0 // NoMatchRule
+ }
+
+ complement := ref < 0
+ nodeIdx := ref
+ if complement {
+ nodeIdx = -ref
+ }
+ base := (nodeIdx - 1) * intsPerNode
+ condIdx := nodes[base]
+ hi := nodes[base+1]
+ lo := nodes[base+2]
+
+ if complement != evalCond(int(condIdx)) {
+ ref = hi
+ } else {
+ ref = lo
+ }
+ }
+}
diff --git a/vendor/github.com/aws/smithy-go/endpoints/private/rulesfn/split.go b/vendor/github.com/aws/smithy-go/endpoints/private/rulesfn/split.go
new file mode 100644
index 00000000000..f8b30789a01
--- /dev/null
+++ b/vendor/github.com/aws/smithy-go/endpoints/private/rulesfn/split.go
@@ -0,0 +1,16 @@
+package rulesfn
+
+import "strings"
+
+// Split splits the input string by the delimiter and returns the resulting
+// parts. If limit is > 0, at most limit substrings are returned.
+// Returns a slice with a single empty string if the input is empty.
+func Split(input, delimiter string, limit int) []string {
+ if len(input) == 0 {
+ return []string{""}
+ }
+ if limit > 0 {
+ return strings.SplitN(input, delimiter, limit)
+ }
+ return strings.Split(input, delimiter)
+}
diff --git a/vendor/github.com/aws/smithy-go/endpoints/private/rulesfn/string_slice.go b/vendor/github.com/aws/smithy-go/endpoints/private/rulesfn/string_slice.go
new file mode 100644
index 00000000000..7a82fcd94ed
--- /dev/null
+++ b/vendor/github.com/aws/smithy-go/endpoints/private/rulesfn/string_slice.go
@@ -0,0 +1,18 @@
+package rulesfn
+
+// StringSlice is a string slice with a negative-index-aware Get method for use
+// in endpoint rule evaluation.
+type StringSlice []string
+
+// Get returns a pointer to the string at index i, or nil if the index is out
+// of bounds. Negative indices count from the end of the slice.
+func (s StringSlice) Get(i int) *string {
+ if i < 0 {
+ i = len(s) + i
+ }
+ if i < 0 || i >= len(s) {
+ return nil
+ }
+ v := s[i]
+ return &v
+}
diff --git a/vendor/github.com/aws/smithy-go/go_module_metadata.go b/vendor/github.com/aws/smithy-go/go_module_metadata.go
index dc9dfd0d86d..bf309b96ccb 100644
--- a/vendor/github.com/aws/smithy-go/go_module_metadata.go
+++ b/vendor/github.com/aws/smithy-go/go_module_metadata.go
@@ -3,4 +3,4 @@
package smithy
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.24.2"
+const goModuleVersion = "1.26.0"
diff --git a/vendor/github.com/cenkalti/backoff/v4/.gitignore b/vendor/github.com/cenkalti/backoff/v4/.gitignore
new file mode 100644
index 00000000000..50d95c548b6
--- /dev/null
+++ b/vendor/github.com/cenkalti/backoff/v4/.gitignore
@@ -0,0 +1,25 @@
+# Compiled Object files, Static and Dynamic libs (Shared Objects)
+*.o
+*.a
+*.so
+
+# Folders
+_obj
+_test
+
+# Architecture specific extensions/prefixes
+*.[568vq]
+[568vq].out
+
+*.cgo1.go
+*.cgo2.c
+_cgo_defun.c
+_cgo_gotypes.go
+_cgo_export.*
+
+_testmain.go
+
+*.exe
+
+# IDEs
+.idea/
diff --git a/vendor/github.com/cenkalti/backoff/v4/LICENSE b/vendor/github.com/cenkalti/backoff/v4/LICENSE
new file mode 100644
index 00000000000..89b81799655
--- /dev/null
+++ b/vendor/github.com/cenkalti/backoff/v4/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Cenk Altı
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vendor/github.com/cenkalti/backoff/v4/README.md b/vendor/github.com/cenkalti/backoff/v4/README.md
new file mode 100644
index 00000000000..9433004a280
--- /dev/null
+++ b/vendor/github.com/cenkalti/backoff/v4/README.md
@@ -0,0 +1,30 @@
+# Exponential Backoff [![GoDoc][godoc image]][godoc] [![Coverage Status][coveralls image]][coveralls]
+
+This is a Go port of the exponential backoff algorithm from [Google's HTTP Client Library for Java][google-http-java-client].
+
+[Exponential backoff][exponential backoff wiki]
+is an algorithm that uses feedback to multiplicatively decrease the rate of some process,
+in order to gradually find an acceptable rate.
+The retries exponentially increase and stop increasing when a certain threshold is met.
+
+## Usage
+
+Import path is `github.com/cenkalti/backoff/v4`. Please note the version part at the end.
+
+Use https://pkg.go.dev/github.com/cenkalti/backoff/v4 to view the documentation.
+
+## Contributing
+
+* I would like to keep this library as small as possible.
+* Please don't send a PR without opening an issue and discussing it first.
+* If proposed change is not a common use case, I will probably not accept it.
+
+[godoc]: https://pkg.go.dev/github.com/cenkalti/backoff/v4
+[godoc image]: https://godoc.org/github.com/cenkalti/backoff?status.png
+[coveralls]: https://coveralls.io/github/cenkalti/backoff?branch=master
+[coveralls image]: https://coveralls.io/repos/github/cenkalti/backoff/badge.svg?branch=master
+
+[google-http-java-client]: https://github.com/google/google-http-java-client/blob/da1aa993e90285ec18579f1553339b00e19b3ab5/google-http-client/src/main/java/com/google/api/client/util/ExponentialBackOff.java
+[exponential backoff wiki]: http://en.wikipedia.org/wiki/Exponential_backoff
+
+[advanced example]: https://pkg.go.dev/github.com/cenkalti/backoff/v4?tab=doc#pkg-examples
diff --git a/vendor/github.com/cenkalti/backoff/v4/backoff.go b/vendor/github.com/cenkalti/backoff/v4/backoff.go
new file mode 100644
index 00000000000..3676ee405d8
--- /dev/null
+++ b/vendor/github.com/cenkalti/backoff/v4/backoff.go
@@ -0,0 +1,66 @@
+// Package backoff implements backoff algorithms for retrying operations.
+//
+// Use Retry function for retrying operations that may fail.
+// If Retry does not meet your needs,
+// copy/paste the function into your project and modify as you wish.
+//
+// There is also Ticker type similar to time.Ticker.
+// You can use it if you need to work with channels.
+//
+// See Examples section below for usage examples.
+package backoff
+
+import "time"
+
+// BackOff is a backoff policy for retrying an operation.
+type BackOff interface {
+ // NextBackOff returns the duration to wait before retrying the operation,
+ // or backoff. Stop to indicate that no more retries should be made.
+ //
+ // Example usage:
+ //
+ // duration := backoff.NextBackOff();
+ // if (duration == backoff.Stop) {
+ // // Do not retry operation.
+ // } else {
+ // // Sleep for duration and retry operation.
+ // }
+ //
+ NextBackOff() time.Duration
+
+ // Reset to initial state.
+ Reset()
+}
+
+// Stop indicates that no more retries should be made for use in NextBackOff().
+const Stop time.Duration = -1
+
+// ZeroBackOff is a fixed backoff policy whose backoff time is always zero,
+// meaning that the operation is retried immediately without waiting, indefinitely.
+type ZeroBackOff struct{}
+
+func (b *ZeroBackOff) Reset() {}
+
+func (b *ZeroBackOff) NextBackOff() time.Duration { return 0 }
+
+// StopBackOff is a fixed backoff policy that always returns backoff.Stop for
+// NextBackOff(), meaning that the operation should never be retried.
+type StopBackOff struct{}
+
+func (b *StopBackOff) Reset() {}
+
+func (b *StopBackOff) NextBackOff() time.Duration { return Stop }
+
+// ConstantBackOff is a backoff policy that always returns the same backoff delay.
+// This is in contrast to an exponential backoff policy,
+// which returns a delay that grows longer as you call NextBackOff() over and over again.
+type ConstantBackOff struct {
+ Interval time.Duration
+}
+
+func (b *ConstantBackOff) Reset() {}
+func (b *ConstantBackOff) NextBackOff() time.Duration { return b.Interval }
+
+func NewConstantBackOff(d time.Duration) *ConstantBackOff {
+ return &ConstantBackOff{Interval: d}
+}
diff --git a/vendor/github.com/cenkalti/backoff/v4/context.go b/vendor/github.com/cenkalti/backoff/v4/context.go
new file mode 100644
index 00000000000..48482330eb7
--- /dev/null
+++ b/vendor/github.com/cenkalti/backoff/v4/context.go
@@ -0,0 +1,62 @@
+package backoff
+
+import (
+ "context"
+ "time"
+)
+
+// BackOffContext is a backoff policy that stops retrying after the context
+// is canceled.
+type BackOffContext interface { // nolint: golint
+ BackOff
+ Context() context.Context
+}
+
+type backOffContext struct {
+ BackOff
+ ctx context.Context
+}
+
+// WithContext returns a BackOffContext with context ctx
+//
+// ctx must not be nil
+func WithContext(b BackOff, ctx context.Context) BackOffContext { // nolint: golint
+ if ctx == nil {
+ panic("nil context")
+ }
+
+ if b, ok := b.(*backOffContext); ok {
+ return &backOffContext{
+ BackOff: b.BackOff,
+ ctx: ctx,
+ }
+ }
+
+ return &backOffContext{
+ BackOff: b,
+ ctx: ctx,
+ }
+}
+
+func getContext(b BackOff) context.Context {
+ if cb, ok := b.(BackOffContext); ok {
+ return cb.Context()
+ }
+ if tb, ok := b.(*backOffTries); ok {
+ return getContext(tb.delegate)
+ }
+ return context.Background()
+}
+
+func (b *backOffContext) Context() context.Context {
+ return b.ctx
+}
+
+func (b *backOffContext) NextBackOff() time.Duration {
+ select {
+ case <-b.ctx.Done():
+ return Stop
+ default:
+ return b.BackOff.NextBackOff()
+ }
+}
diff --git a/vendor/github.com/cenkalti/backoff/v4/exponential.go b/vendor/github.com/cenkalti/backoff/v4/exponential.go
new file mode 100644
index 00000000000..aac99f196ad
--- /dev/null
+++ b/vendor/github.com/cenkalti/backoff/v4/exponential.go
@@ -0,0 +1,216 @@
+package backoff
+
+import (
+ "math/rand"
+ "time"
+)
+
+/*
+ExponentialBackOff is a backoff implementation that increases the backoff
+period for each retry attempt using a randomization function that grows exponentially.
+
+NextBackOff() is calculated using the following formula:
+
+ randomized interval =
+ RetryInterval * (random value in range [1 - RandomizationFactor, 1 + RandomizationFactor])
+
+In other words NextBackOff() will range between the randomization factor
+percentage below and above the retry interval.
+
+For example, given the following parameters:
+
+ RetryInterval = 2
+ RandomizationFactor = 0.5
+ Multiplier = 2
+
+the actual backoff period used in the next retry attempt will range between 1 and 3 seconds,
+multiplied by the exponential, that is, between 2 and 6 seconds.
+
+Note: MaxInterval caps the RetryInterval and not the randomized interval.
+
+If the time elapsed since an ExponentialBackOff instance is created goes past the
+MaxElapsedTime, then the method NextBackOff() starts returning backoff.Stop.
+
+The elapsed time can be reset by calling Reset().
+
+Example: Given the following default arguments, for 10 tries the sequence will be,
+and assuming we go over the MaxElapsedTime on the 10th try:
+
+ Request # RetryInterval (seconds) Randomized Interval (seconds)
+
+ 1 0.5 [0.25, 0.75]
+ 2 0.75 [0.375, 1.125]
+ 3 1.125 [0.562, 1.687]
+ 4 1.687 [0.8435, 2.53]
+ 5 2.53 [1.265, 3.795]
+ 6 3.795 [1.897, 5.692]
+ 7 5.692 [2.846, 8.538]
+ 8 8.538 [4.269, 12.807]
+ 9 12.807 [6.403, 19.210]
+ 10 19.210 backoff.Stop
+
+Note: Implementation is not thread-safe.
+*/
+type ExponentialBackOff struct {
+ InitialInterval time.Duration
+ RandomizationFactor float64
+ Multiplier float64
+ MaxInterval time.Duration
+ // After MaxElapsedTime the ExponentialBackOff returns Stop.
+ // It never stops if MaxElapsedTime == 0.
+ MaxElapsedTime time.Duration
+ Stop time.Duration
+ Clock Clock
+
+ currentInterval time.Duration
+ startTime time.Time
+}
+
+// Clock is an interface that returns current time for BackOff.
+type Clock interface {
+ Now() time.Time
+}
+
+// ExponentialBackOffOpts is a function type used to configure ExponentialBackOff options.
+type ExponentialBackOffOpts func(*ExponentialBackOff)
+
+// Default values for ExponentialBackOff.
+const (
+ DefaultInitialInterval = 500 * time.Millisecond
+ DefaultRandomizationFactor = 0.5
+ DefaultMultiplier = 1.5
+ DefaultMaxInterval = 60 * time.Second
+ DefaultMaxElapsedTime = 15 * time.Minute
+)
+
+// NewExponentialBackOff creates an instance of ExponentialBackOff using default values.
+func NewExponentialBackOff(opts ...ExponentialBackOffOpts) *ExponentialBackOff {
+ b := &ExponentialBackOff{
+ InitialInterval: DefaultInitialInterval,
+ RandomizationFactor: DefaultRandomizationFactor,
+ Multiplier: DefaultMultiplier,
+ MaxInterval: DefaultMaxInterval,
+ MaxElapsedTime: DefaultMaxElapsedTime,
+ Stop: Stop,
+ Clock: SystemClock,
+ }
+ for _, fn := range opts {
+ fn(b)
+ }
+ b.Reset()
+ return b
+}
+
+// WithInitialInterval sets the initial interval between retries.
+func WithInitialInterval(duration time.Duration) ExponentialBackOffOpts {
+ return func(ebo *ExponentialBackOff) {
+ ebo.InitialInterval = duration
+ }
+}
+
+// WithRandomizationFactor sets the randomization factor to add jitter to intervals.
+func WithRandomizationFactor(randomizationFactor float64) ExponentialBackOffOpts {
+ return func(ebo *ExponentialBackOff) {
+ ebo.RandomizationFactor = randomizationFactor
+ }
+}
+
+// WithMultiplier sets the multiplier for increasing the interval after each retry.
+func WithMultiplier(multiplier float64) ExponentialBackOffOpts {
+ return func(ebo *ExponentialBackOff) {
+ ebo.Multiplier = multiplier
+ }
+}
+
+// WithMaxInterval sets the maximum interval between retries.
+func WithMaxInterval(duration time.Duration) ExponentialBackOffOpts {
+ return func(ebo *ExponentialBackOff) {
+ ebo.MaxInterval = duration
+ }
+}
+
+// WithMaxElapsedTime sets the maximum total time for retries.
+func WithMaxElapsedTime(duration time.Duration) ExponentialBackOffOpts {
+ return func(ebo *ExponentialBackOff) {
+ ebo.MaxElapsedTime = duration
+ }
+}
+
+// WithRetryStopDuration sets the duration after which retries should stop.
+func WithRetryStopDuration(duration time.Duration) ExponentialBackOffOpts {
+ return func(ebo *ExponentialBackOff) {
+ ebo.Stop = duration
+ }
+}
+
+// WithClockProvider sets the clock used to measure time.
+func WithClockProvider(clock Clock) ExponentialBackOffOpts {
+ return func(ebo *ExponentialBackOff) {
+ ebo.Clock = clock
+ }
+}
+
+type systemClock struct{}
+
+func (t systemClock) Now() time.Time {
+ return time.Now()
+}
+
+// SystemClock implements Clock interface that uses time.Now().
+var SystemClock = systemClock{}
+
+// Reset the interval back to the initial retry interval and restarts the timer.
+// Reset must be called before using b.
+func (b *ExponentialBackOff) Reset() {
+ b.currentInterval = b.InitialInterval
+ b.startTime = b.Clock.Now()
+}
+
+// NextBackOff calculates the next backoff interval using the formula:
+// Randomized interval = RetryInterval * (1 ± RandomizationFactor)
+func (b *ExponentialBackOff) NextBackOff() time.Duration {
+ // Make sure we have not gone over the maximum elapsed time.
+ elapsed := b.GetElapsedTime()
+ next := getRandomValueFromInterval(b.RandomizationFactor, rand.Float64(), b.currentInterval)
+ b.incrementCurrentInterval()
+ if b.MaxElapsedTime != 0 && elapsed+next > b.MaxElapsedTime {
+ return b.Stop
+ }
+ return next
+}
+
+// GetElapsedTime returns the elapsed time since an ExponentialBackOff instance
+// is created and is reset when Reset() is called.
+//
+// The elapsed time is computed using time.Now().UnixNano(). It is
+// safe to call even while the backoff policy is used by a running
+// ticker.
+func (b *ExponentialBackOff) GetElapsedTime() time.Duration {
+ return b.Clock.Now().Sub(b.startTime)
+}
+
+// Increments the current interval by multiplying it with the multiplier.
+func (b *ExponentialBackOff) incrementCurrentInterval() {
+ // Check for overflow, if overflow is detected set the current interval to the max interval.
+ if float64(b.currentInterval) >= float64(b.MaxInterval)/b.Multiplier {
+ b.currentInterval = b.MaxInterval
+ } else {
+ b.currentInterval = time.Duration(float64(b.currentInterval) * b.Multiplier)
+ }
+}
+
+// Returns a random value from the following interval:
+// [currentInterval - randomizationFactor * currentInterval, currentInterval + randomizationFactor * currentInterval].
+func getRandomValueFromInterval(randomizationFactor, random float64, currentInterval time.Duration) time.Duration {
+ if randomizationFactor == 0 {
+ return currentInterval // make sure no randomness is used when randomizationFactor is 0.
+ }
+ var delta = randomizationFactor * float64(currentInterval)
+ var minInterval = float64(currentInterval) - delta
+ var maxInterval = float64(currentInterval) + delta
+
+ // Get a random value from the range [minInterval, maxInterval].
+ // The formula used below has a +1 because if the minInterval is 1 and the maxInterval is 3 then
+ // we want a 33% chance for selecting either 1, 2 or 3.
+ return time.Duration(minInterval + (random * (maxInterval - minInterval + 1)))
+}
diff --git a/vendor/github.com/cenkalti/backoff/v4/retry.go b/vendor/github.com/cenkalti/backoff/v4/retry.go
new file mode 100644
index 00000000000..b9c0c51cd75
--- /dev/null
+++ b/vendor/github.com/cenkalti/backoff/v4/retry.go
@@ -0,0 +1,146 @@
+package backoff
+
+import (
+ "errors"
+ "time"
+)
+
+// An OperationWithData is executing by RetryWithData() or RetryNotifyWithData().
+// The operation will be retried using a backoff policy if it returns an error.
+type OperationWithData[T any] func() (T, error)
+
+// An Operation is executing by Retry() or RetryNotify().
+// The operation will be retried using a backoff policy if it returns an error.
+type Operation func() error
+
+func (o Operation) withEmptyData() OperationWithData[struct{}] {
+ return func() (struct{}, error) {
+ return struct{}{}, o()
+ }
+}
+
+// Notify is a notify-on-error function. It receives an operation error and
+// backoff delay if the operation failed (with an error).
+//
+// NOTE that if the backoff policy stated to stop retrying,
+// the notify function isn't called.
+type Notify func(error, time.Duration)
+
+// Retry the operation o until it does not return error or BackOff stops.
+// o is guaranteed to be run at least once.
+//
+// If o returns a *PermanentError, the operation is not retried, and the
+// wrapped error is returned.
+//
+// Retry sleeps the goroutine for the duration returned by BackOff after a
+// failed operation returns.
+func Retry(o Operation, b BackOff) error {
+ return RetryNotify(o, b, nil)
+}
+
+// RetryWithData is like Retry but returns data in the response too.
+func RetryWithData[T any](o OperationWithData[T], b BackOff) (T, error) {
+ return RetryNotifyWithData(o, b, nil)
+}
+
+// RetryNotify calls notify function with the error and wait duration
+// for each failed attempt before sleep.
+func RetryNotify(operation Operation, b BackOff, notify Notify) error {
+ return RetryNotifyWithTimer(operation, b, notify, nil)
+}
+
+// RetryNotifyWithData is like RetryNotify but returns data in the response too.
+func RetryNotifyWithData[T any](operation OperationWithData[T], b BackOff, notify Notify) (T, error) {
+ return doRetryNotify(operation, b, notify, nil)
+}
+
+// RetryNotifyWithTimer calls notify function with the error and wait duration using the given Timer
+// for each failed attempt before sleep.
+// A default timer that uses system timer is used when nil is passed.
+func RetryNotifyWithTimer(operation Operation, b BackOff, notify Notify, t Timer) error {
+ _, err := doRetryNotify(operation.withEmptyData(), b, notify, t)
+ return err
+}
+
+// RetryNotifyWithTimerAndData is like RetryNotifyWithTimer but returns data in the response too.
+func RetryNotifyWithTimerAndData[T any](operation OperationWithData[T], b BackOff, notify Notify, t Timer) (T, error) {
+ return doRetryNotify(operation, b, notify, t)
+}
+
+func doRetryNotify[T any](operation OperationWithData[T], b BackOff, notify Notify, t Timer) (T, error) {
+ var (
+ err error
+ next time.Duration
+ res T
+ )
+ if t == nil {
+ t = &defaultTimer{}
+ }
+
+ defer func() {
+ t.Stop()
+ }()
+
+ ctx := getContext(b)
+
+ b.Reset()
+ for {
+ res, err = operation()
+ if err == nil {
+ return res, nil
+ }
+
+ var permanent *PermanentError
+ if errors.As(err, &permanent) {
+ return res, permanent.Err
+ }
+
+ if next = b.NextBackOff(); next == Stop {
+ if cerr := ctx.Err(); cerr != nil {
+ return res, cerr
+ }
+
+ return res, err
+ }
+
+ if notify != nil {
+ notify(err, next)
+ }
+
+ t.Start(next)
+
+ select {
+ case <-ctx.Done():
+ return res, ctx.Err()
+ case <-t.C():
+ }
+ }
+}
+
+// PermanentError signals that the operation should not be retried.
+type PermanentError struct {
+ Err error
+}
+
+func (e *PermanentError) Error() string {
+ return e.Err.Error()
+}
+
+func (e *PermanentError) Unwrap() error {
+ return e.Err
+}
+
+func (e *PermanentError) Is(target error) bool {
+ _, ok := target.(*PermanentError)
+ return ok
+}
+
+// Permanent wraps the given err in a *PermanentError.
+func Permanent(err error) error {
+ if err == nil {
+ return nil
+ }
+ return &PermanentError{
+ Err: err,
+ }
+}
diff --git a/vendor/github.com/cenkalti/backoff/v4/ticker.go b/vendor/github.com/cenkalti/backoff/v4/ticker.go
new file mode 100644
index 00000000000..df9d68bce52
--- /dev/null
+++ b/vendor/github.com/cenkalti/backoff/v4/ticker.go
@@ -0,0 +1,97 @@
+package backoff
+
+import (
+ "context"
+ "sync"
+ "time"
+)
+
+// Ticker holds a channel that delivers `ticks' of a clock at times reported by a BackOff.
+//
+// Ticks will continue to arrive when the previous operation is still running,
+// so operations that take a while to fail could run in quick succession.
+type Ticker struct {
+ C <-chan time.Time
+ c chan time.Time
+ b BackOff
+ ctx context.Context
+ timer Timer
+ stop chan struct{}
+ stopOnce sync.Once
+}
+
+// NewTicker returns a new Ticker containing a channel that will send
+// the time at times specified by the BackOff argument. Ticker is
+// guaranteed to tick at least once. The channel is closed when Stop
+// method is called or BackOff stops. It is not safe to manipulate the
+// provided backoff policy (notably calling NextBackOff or Reset)
+// while the ticker is running.
+func NewTicker(b BackOff) *Ticker {
+ return NewTickerWithTimer(b, &defaultTimer{})
+}
+
+// NewTickerWithTimer returns a new Ticker with a custom timer.
+// A default timer that uses system timer is used when nil is passed.
+func NewTickerWithTimer(b BackOff, timer Timer) *Ticker {
+ if timer == nil {
+ timer = &defaultTimer{}
+ }
+ c := make(chan time.Time)
+ t := &Ticker{
+ C: c,
+ c: c,
+ b: b,
+ ctx: getContext(b),
+ timer: timer,
+ stop: make(chan struct{}),
+ }
+ t.b.Reset()
+ go t.run()
+ return t
+}
+
+// Stop turns off a ticker. After Stop, no more ticks will be sent.
+func (t *Ticker) Stop() {
+ t.stopOnce.Do(func() { close(t.stop) })
+}
+
+func (t *Ticker) run() {
+ c := t.c
+ defer close(c)
+
+ // Ticker is guaranteed to tick at least once.
+ afterC := t.send(time.Now())
+
+ for {
+ if afterC == nil {
+ return
+ }
+
+ select {
+ case tick := <-afterC:
+ afterC = t.send(tick)
+ case <-t.stop:
+ t.c = nil // Prevent future ticks from being sent to the channel.
+ return
+ case <-t.ctx.Done():
+ return
+ }
+ }
+}
+
+func (t *Ticker) send(tick time.Time) <-chan time.Time {
+ select {
+ case t.c <- tick:
+ case <-t.stop:
+ return nil
+ }
+
+ next := t.b.NextBackOff()
+ if next == Stop {
+ t.Stop()
+ return nil
+ }
+
+ t.timer.Start(next)
+ return t.timer.C()
+}
diff --git a/vendor/github.com/cenkalti/backoff/v4/timer.go b/vendor/github.com/cenkalti/backoff/v4/timer.go
new file mode 100644
index 00000000000..8120d0213c5
--- /dev/null
+++ b/vendor/github.com/cenkalti/backoff/v4/timer.go
@@ -0,0 +1,35 @@
+package backoff
+
+import "time"
+
+type Timer interface {
+ Start(duration time.Duration)
+ Stop()
+ C() <-chan time.Time
+}
+
+// defaultTimer implements Timer interface using time.Timer
+type defaultTimer struct {
+ timer *time.Timer
+}
+
+// C returns the timers channel which receives the current time when the timer fires.
+func (t *defaultTimer) C() <-chan time.Time {
+ return t.timer.C
+}
+
+// Start starts the timer to fire after the given duration
+func (t *defaultTimer) Start(duration time.Duration) {
+ if t.timer == nil {
+ t.timer = time.NewTimer(duration)
+ } else {
+ t.timer.Reset(duration)
+ }
+}
+
+// Stop is called when the timer is not used anymore and resources may be freed.
+func (t *defaultTimer) Stop() {
+ if t.timer != nil {
+ t.timer.Stop()
+ }
+}
diff --git a/vendor/github.com/cenkalti/backoff/v4/tries.go b/vendor/github.com/cenkalti/backoff/v4/tries.go
new file mode 100644
index 00000000000..28d58ca37c6
--- /dev/null
+++ b/vendor/github.com/cenkalti/backoff/v4/tries.go
@@ -0,0 +1,38 @@
+package backoff
+
+import "time"
+
+/*
+WithMaxRetries creates a wrapper around another BackOff, which will
+return Stop if NextBackOff() has been called too many times since
+the last time Reset() was called
+
+Note: Implementation is not thread-safe.
+*/
+func WithMaxRetries(b BackOff, max uint64) BackOff {
+ return &backOffTries{delegate: b, maxTries: max}
+}
+
+type backOffTries struct {
+ delegate BackOff
+ maxTries uint64
+ numTries uint64
+}
+
+func (b *backOffTries) NextBackOff() time.Duration {
+ if b.maxTries == 0 {
+ return Stop
+ }
+ if b.maxTries > 0 {
+ if b.maxTries <= b.numTries {
+ return Stop
+ }
+ b.numTries++
+ }
+ return b.delegate.NextBackOff()
+}
+
+func (b *backOffTries) Reset() {
+ b.numTries = 0
+ b.delegate.Reset()
+}
diff --git a/vendor/github.com/coder/quartz/.gitignore b/vendor/github.com/coder/quartz/.gitignore
new file mode 100644
index 00000000000..62c893550ad
--- /dev/null
+++ b/vendor/github.com/coder/quartz/.gitignore
@@ -0,0 +1 @@
+.idea/
\ No newline at end of file
diff --git a/vendor/github.com/coder/quartz/LICENSE b/vendor/github.com/coder/quartz/LICENSE
new file mode 100644
index 00000000000..aee8c1d627f
--- /dev/null
+++ b/vendor/github.com/coder/quartz/LICENSE
@@ -0,0 +1,18 @@
+MIT No Attribution
+
+Copyright (c) Coder Technologies, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/github.com/coder/quartz/README.md b/vendor/github.com/coder/quartz/README.md
new file mode 100644
index 00000000000..b0da401ec4f
--- /dev/null
+++ b/vendor/github.com/coder/quartz/README.md
@@ -0,0 +1,632 @@
+# Quartz
+
+A Go time testing library for writing deterministic unit tests
+
+Our high level goal is to write unit tests that
+
+1. execute quickly
+2. don't flake
+3. are straightforward to write and understand
+
+For tests to execute quickly without flakes, we want to focus on _determinism_: the test should run
+the same each time, and it should be easy to force the system into a known state (no races) before
+executing test assertions. `time.Sleep`, `runtime.Gosched()`, and
+polling/[Eventually](https://pkg.go.dev/github.com/stretchr/testify/assert#Eventually) are all
+symptoms of an inability to do this easily.
+
+## Usage
+
+### `Clock` interface
+
+In your application code, maintain a reference to a `quartz.Clock` instance to start timers and
+tickers, instead of the bare `time` standard library.
+
+```go
+import "github.com/coder/quartz"
+
+type Component struct {
+ ...
+
+ // for testing
+ clock quartz.Clock
+}
+```
+
+Whenever you would call into `time` to start a timer or ticker, call `Component`'s `clock` instead.
+
+In production, set this clock to `quartz.NewReal()` to create a clock that just transparently passes
+through to the standard `time` library.
+
+### Mocking
+
+In your tests, you can use a `*Mock` to control the tickers and timers your code under test gets.
+
+```go
+import (
+ "testing"
+ "github.com/coder/quartz"
+)
+
+func TestComponent(t *testing.T) {
+ mClock := quartz.NewMock(t)
+ comp := &Component{
+ ...
+ clock: mClock,
+ }
+}
+```
+
+The `*Mock` clock starts at Jan 1, 2024, 00:00 UTC by default, but you can set any start time you'd like prior to your test.
+
+```go
+mClock := quartz.NewMock(t)
+mClock.Set(time.Date(2021, 6, 18, 12, 0, 0, 0, time.UTC)) // June 18, 2021 @ 12pm UTC
+```
+
+#### Advancing the clock
+
+Once you begin setting timers or tickers, you cannot change the time backward, only advance it
+forward. You may continue to use `Set()`, but it is often easier and clearer to use `Advance()`.
+
+For example, with a timer:
+
+```go
+fired := false
+
+tmr := mClock.AfterFunc(time.Second, func() {
+ fired = true
+})
+mClock.Advance(time.Second)
+```
+
+When you call `Advance()` it immediately moves the clock forward the given amount, and triggers any
+tickers or timers that are scheduled to happen at that time. Any triggered events happen on separate
+goroutines, so _do not_ immediately assert the results:
+
+```go
+fired := false
+
+tmr := mClock.AfterFunc(time.Second, func() {
+ fired = true
+})
+mClock.Advance(time.Second)
+
+// RACE CONDITION, DO NOT DO THIS!
+if !fired {
+ t.Fatal("didn't fire")
+}
+```
+
+`Advance()` (and `Set()` for that matter) return an `AdvanceWaiter` object you can use to wait for
+all triggered events to complete.
+
+```go
+fired := false
+// set a test timeout so we don't wait the default `go test` timeout for a failure
+ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+
+tmr := mClock.AfterFunc(time.Second, func() {
+ fired = true
+})
+
+w := mClock.Advance(time.Second)
+err := w.Wait(ctx)
+if err != nil {
+ t.Fatal("AfterFunc f never completed")
+}
+if !fired {
+ t.Fatal("didn't fire")
+}
+```
+
+The construction of waiting for the triggered events and failing the test if they don't complete is
+very common, so there is a shorthand:
+
+```go
+w := mClock.Advance(time.Second)
+err := w.Wait(ctx)
+if err != nil {
+ t.Fatal("AfterFunc f never completed")
+}
+```
+
+is equivalent to:
+
+```go
+w := mClock.Advance(time.Second)
+w.MustWait(ctx)
+```
+
+or even more briefly:
+
+```go
+mClock.Advance(time.Second).MustWait(ctx)
+```
+
+### Advance only to the next event
+
+One important restriction on advancing the clock is that you may only advance forward to the next
+timer or ticker event and no further. The following will result in a test failure:
+
+```go
+func TestAdvanceTooFar(t *testing.T) {
+ ctx, cancel := context.WithTimeout(10*time.Second)
+ defer cancel()
+ mClock := quartz.NewMock(t)
+ var firedAt time.Time
+ mClock.AfterFunc(time.Second, func() {
+ firedAt := mClock.Now()
+ })
+ mClock.Advance(2*time.Second).MustWait(ctx)
+}
+```
+
+This is a deliberate design decision to allow `Advance()` to immediately and synchronously move the
+clock forward (even without calling `Wait()` on returned waiter). This helps meet Quartz's design
+goals of writing deterministic and easy to understand unit tests. It also allows the clock to be
+advanced, deterministically _during_ the execution of a tick or timer function, as explained in the
+next sections on Traps.
+
+Advancing multiple events can be accomplished via looping. E.g. if you have a 1-second ticker
+
+```go
+for i := 0; i < 10; i++ {
+ mClock.Advance(time.Second).MustWait(ctx)
+}
+```
+
+will advance 10 ticks.
+
+If you don't know or don't want to compute the time to the next event, you can use `AdvanceNext()`.
+
+```go
+d, w := mClock.AdvanceNext()
+w.MustWait(ctx)
+// d contains the duration we advanced
+```
+
+`d, ok := Peek()` returns the duration until the next event, if any (`ok` is `true`). You can use
+this to advance a specific time, regardless of the tickers and timer events:
+
+```go
+desired := time.Minute // time to advance
+for desired > 0 {
+ p, ok := mClock.Peek()
+ if !ok || p > desired {
+ mClock.Advance(desired).MustWait(ctx)
+ break
+ }
+ mClock.Advance(p).MustWait(ctx)
+ desired -= p
+}
+```
+
+### Traps
+
+A trap allows you to match specific calls into the library while mocking, block their return,
+inspect their arguments, then release them to allow them to return. They help you write
+deterministic unit tests even when the code under test executes asynchronously from the test.
+
+You set your traps prior to executing code under test, and then wait for them to be triggered.
+
+```go
+func TestTrap(t *testing.T) {
+ ctx, cancel := context.WithTimeout(10*time.Second)
+ defer cancel()
+ mClock := quartz.NewMock(t)
+ trap := mClock.Trap().AfterFunc()
+ defer trap.Close() // stop trapping AfterFunc calls
+
+ count := 0
+ go mClock.AfterFunc(time.Hour, func(){
+ count++
+ })
+ call := trap.MustWait(ctx)
+ call.MustRelease(ctx)
+ if call.Duration != time.Hour {
+ t.Fatal("wrong duration")
+ }
+
+ // Now that the async call to AfterFunc has occurred, we can advance the clock to trigger it
+ mClock.Advance(call.Duration).MustWait(ctx)
+ if count != 1 {
+ t.Fatal("wrong count")
+ }
+}
+```
+
+In this test, the trap serves 2 purposes. Firstly, it allows us to capture and assert the duration
+passed to the `AfterFunc` call. Secondly, it prevents a race between setting the timer and advancing
+it. Since these things happen on different goroutines, if `Advance()` completes before
+`AfterFunc()` is called, then the timer never pops in this test.
+
+Any untrapped calls immediately complete using the current time, and calling `Close()` on a trap
+causes the mock clock to stop trapping those calls.
+
+You may also `Advance()` the clock between trapping a call and releasing it. The call uses the
+current (mocked) time at the moment it is released.
+
+```go
+func TestTrap2(t *testing.T) {
+ ctx, cancel := context.WithTimeout(10*time.Second)
+ defer cancel()
+ mClock := quartz.NewMock(t)
+ trap := mClock.Trap().Now()
+ defer trap.Close() // stop trapping AfterFunc calls
+
+ var logs []string
+ done := make(chan struct{})
+ go func(clk quartz.Clock){
+ defer close(done)
+ start := clk.Now()
+ phase1()
+ p1end := clk.Now()
+ logs = append(fmt.Sprintf("Phase 1 took %s", p1end.Sub(start).String()))
+ phase2()
+ p2end := clk.Now()
+ logs = append(fmt.Sprintf("Phase 2 took %s", p2end.Sub(p1end).String()))
+ }(mClock)
+
+ // start
+ trap.MustWait(ctx).MustRelease(ctx)
+ // phase 1
+ call := trap.MustWait(ctx)
+ mClock.Advance(3*time.Second).MustWait(ctx)
+ call.MustRelease(ctx)
+ // phase 2
+ call = trap.MustWait(ctx)
+ mClock.Advance(5*time.Second).MustWait(ctx)
+ call.MustRelease(ctx)
+
+ <-done
+ // Now logs contains []string{"Phase 1 took 3s", "Phase 2 took 5s"}
+}
+```
+
+### Tags
+
+When multiple goroutines in the code under test call into the Clock, you can use `tags` to
+distinguish them in your traps.
+
+```go
+trap := mClock.Trap.Now("foo") // traps any calls that contain "foo"
+defer trap.Close()
+
+foo := make(chan time.Time)
+go func(){
+ foo <- mClock.Now("foo", "bar")
+}()
+baz := make(chan time.Time)
+go func(){
+ baz <- mClock.Now("baz")
+}()
+call := trap.MustWait(ctx)
+mClock.Advance(time.Second).MustWait(ctx)
+call.MustRelease(ctx)
+// call.Tags contains []string{"foo", "bar"}
+
+gotFoo := <-foo // 1s after start
+gotBaz := <-baz // ?? never trapped, so races with Advance()
+```
+
+Tags appear as an optional suffix on all `Clock` methods (type `...string`) and are ignored entirely
+by the real clock. They also appear on all methods on returned timers and tickers.
+
+## Recommended Patterns
+
+### Options
+
+We use the Option pattern to inject the mock clock for testing, keeping the call signature in
+production clean. The option pattern is compatible with other optional fields as well.
+
+```go
+type Option func(*Thing)
+
+// WithTestClock is used in tests to inject a mock Clock
+func WithTestClock(clk quartz.Clock) Option {
+ return func(t *Thing) {
+ t.clock = clk
+ }
+}
+
+func NewThing(, opts ...Option) *Thing {
+ t := &Thing{
+ ...
+ clock: quartz.NewReal()
+ }
+ for _, o := range opts {
+ o(t)
+ }
+ return t
+}
+```
+
+In tests, this becomes
+
+```go
+func TestThing(t *testing.T) {
+ mClock := quartz.NewMock(t)
+ thing := NewThing(, WithTestClock(mClock))
+ ...
+}
+```
+
+### Tagging convention
+
+Tag your `Clock` method calls as:
+
+```go
+func (c *Component) Method() {
+ now := c.clock.Now("Component", "Method")
+}
+```
+
+or
+
+```go
+func (c *Component) Method() {
+ start := c.clock.Now("Component", "Method", "start")
+ ...
+ end := c.clock.Now("Component", "Method", "end")
+}
+```
+
+This makes it much less likely that code changes that introduce new components or methods will spoil
+existing unit tests.
+
+## Why another time testing library?
+
+Writing good unit tests for components and functions that use the `time` package is difficult, even
+though several open source libraries exist. In building Quartz, we took some inspiration from
+
+- [github.com/benbjohnson/clock](https://github.com/benbjohnson/clock)
+- Tailscale's [tstest.Clock](https://github.com/coder/tailscale/blob/main/tstest/clock.go)
+- [github.com/aspenmesh/tock](https://github.com/aspenmesh/tock)
+
+Quartz shares the high level design of a `Clock` interface that closely resembles the functions in
+the `time` standard library, and a "real" clock passes thru to the standard library in production,
+while a mock clock gives precise control in testing.
+
+As mentioned in our introduction, our high level goal is to write unit tests that
+
+1. execute quickly
+2. don't flake
+3. are straightforward to write and understand
+
+For several reasons, this is a tall order when it comes to code that depends on time, and we found
+the existing libraries insufficient for our goals.
+
+### Preventing test flakes
+
+The following example comes from the README from benbjohnson/clock:
+
+```go
+mock := clock.NewMock()
+count := 0
+
+// Kick off a timer to increment every 1 mock second.
+go func() {
+ ticker := mock.Ticker(1 * time.Second)
+ for {
+ <-ticker.C
+ count++
+ }
+}()
+runtime.Gosched()
+
+// Move the clock forward 10 seconds.
+mock.Add(10 * time.Second)
+
+// This prints 10.
+fmt.Println(count)
+```
+
+The first race condition is fairly obvious: moving the clock forward 10 seconds may generate 10
+ticks on the `ticker.C` channel, but there is no guarantee that `count++` executes before
+`fmt.Println(count)`.
+
+The second race condition is more subtle, but `runtime.Gosched()` is the tell. Since the ticker
+is started on a separate goroutine, there is no guarantee that `mock.Ticker()` executes before
+`mock.Add()`. `runtime.Gosched()` is an attempt to get this to happen, but it makes no hard
+promises. On a busy system, especially when running tests in parallel, this can flake, advance the
+time 10 seconds first, then start the ticker and never generate a tick.
+
+Let's talk about how Quartz tackles these problems.
+
+In our experience, an extremely common use case is creating a ticker then doing a 2-arm `select`
+with ticks in one and context expiring in another, i.e.
+
+```go
+t := time.NewTicker(duration)
+for {
+ select {
+ case <-ctx.Done():
+ return ctx.Err()
+ case <-t.C:
+ err := do()
+ if err != nil {
+ return err
+ }
+ }
+}
+```
+
+In Quartz, we refactor this to be more compact and testing friendly:
+
+```go
+t := clock.TickerFunc(ctx, duration, do)
+return t.Wait()
+```
+
+This affords the mock `Clock` the ability to explicitly know when processing of a tick is finished
+because it's wrapped in the function passed to `TickerFunc` (`do()` in this example).
+
+In Quartz, when you advance the clock, you are returned an object you can `Wait()` on to ensure all
+ticks and timers triggered are finished. This solves the first race condition in the example.
+
+(As an aside, we still support a traditional standard library-style `Ticker`. You may find it useful
+if you want to keep your code as close as possible to the standard library, or if you need to use
+the channel in a larger `select` block. In that case, you'll have to find some other mechanism to
+sync tick processing to your test code.)
+
+To prevent race conditions related to the starting of the ticker, Quartz allows you to set "traps"
+for calls that access the clock.
+
+```go
+func TestTicker(t *testing.T) {
+ mClock := quartz.NewMock(t)
+ trap := mClock.Trap().TickerFunc()
+ defer trap.Close() // stop trapping at end
+ go runMyTicker(mClock) // async calls TickerFunc()
+ call := trap.MustWait(context.Background()) // waits for a call and blocks its return
+ call.MustRelease(ctx) // allow the TickerFunc() call to return
+ // optionally check the duration using call.Duration
+ // Move the clock forward 1 tick
+ mClock.Advance(time.Second).MustWait(context.Background())
+ // assert results of the tick
+}
+```
+
+Trapping and then releasing the call to `TickerFunc()` ensures the ticker is started at a
+deterministic time, so our calls to `Advance()` will have a predictable effect.
+
+Take a look at `TestExampleTickerFunc` in `example_test.go` for a complete worked example.
+
+### Complex time dependence
+
+Another difficult issue to handle when unit testing is when some code under test makes multiple
+calls that depend on the time, and you want to simulate some time passing between them.
+
+A very basic example is measuring how long something took:
+
+```go
+var measurement time.Duration
+go func(clock quartz.Clock) {
+ start := clock.Now()
+ doSomething()
+ measurement = clock.Since(start)
+}(mClock)
+
+// how to get measurement to be, say, 5 seconds?
+```
+
+The two calls into the clock happen asynchronously, so we need to be able to advance the clock after
+the first call to `Now()` but before the call to `Since()`. Doing this with the libraries we
+mentioned above means that you have to be able to mock out or otherwise block the completion of
+`doSomething()`.
+
+But, with the trap functionality we mentioned in the previous section, you can deterministically
+control the time each call sees.
+
+```go
+trap := mClock.Trap().Since()
+var measurement time.Duration
+go func(clock quartz.Clock) {
+ start := clock.Now()
+ doSomething()
+ measurement = clock.Since(start)
+}(mClock)
+
+c := trap.MustWait(ctx)
+mClock.Advance(5*time.Second)
+c.MustRelease(ctx)
+```
+
+We wait until we trap the `clock.Since()` call, which implies that `clock.Now()` has completed, then
+advance the mock clock 5 seconds. Finally, we release the `clock.Since()` call. Any changes to the
+clock that happen _before_ we release the call will be included in the time used for the
+`clock.Since()` call.
+
+As a more involved example, consider an inactivity timeout: we want something to happen if there is
+no activity recorded for some period, say 10 minutes in the following example:
+
+```go
+type InactivityTimer struct {
+ mu sync.Mutex
+ activity time.Time
+ clock quartz.Clock
+}
+
+func (i *InactivityTimer) Start() {
+ i.mu.Lock()
+ defer i.mu.Unlock()
+ next := i.clock.Until(i.activity.Add(10*time.Minute))
+ t := i.clock.AfterFunc(next, func() {
+ i.mu.Lock()
+ defer i.mu.Unlock()
+ next := i.clock.Until(i.activity.Add(10*time.Minute))
+ if next == 0 {
+ i.timeoutLocked()
+ return
+ }
+ t.Reset(next)
+ })
+}
+```
+
+The actual contents of `timeoutLocked()` doesn't matter for this example, and assume there are other
+functions that record the latest `activity`.
+
+We found that some time testing libraries hold a lock on the mock clock while calling the function
+passed to `AfterFunc`, resulting in a deadlock if you made clock calls from within.
+
+Others allow this sort of thing, but don't have the flexibility to test edge cases. There is a
+subtle bug in our `Start()` function. The timer may pop a little late, and/or some measurable real
+time may elapse before `Until()` gets called inside the `AfterFunc`. If there hasn't been activity,
+`next` might be negative.
+
+To test this in Quartz, we'll use a trap. We only want to trap the inner `Until()` call, not the
+initial one, so to make testing easier we can "tag" the call we want. Like this:
+
+```go
+func (i *InactivityTimer) Start() {
+ i.mu.Lock()
+ defer i.mu.Unlock()
+ next := i.clock.Until(i.activity.Add(10*time.Minute))
+ t := i.clock.AfterFunc(next, func() {
+ i.mu.Lock()
+ defer i.mu.Unlock()
+ next := i.clock.Until(i.activity.Add(10*time.Minute), "inner")
+ if next == 0 {
+ i.timeoutLocked()
+ return
+ }
+ t.Reset(next)
+ })
+}
+```
+
+All Quartz `Clock` functions, and functions on returned timers and tickers support zero or more
+string tags that allow traps to match on them.
+
+```go
+func TestInactivityTimer_Late(t *testing.T) {
+ // set a timeout on the test itself, so that if Wait functions get blocked, we don't have to
+ // wait for the default test timeout of 10 minutes.
+ ctx, cancel := context.WithTimeout(10*time.Second)
+ defer cancel()
+ mClock := quartz.NewMock(t)
+ trap := mClock.Trap.Until("inner")
+ defer trap.Close()
+
+ it := &InactivityTimer{
+ activity: mClock.Now(),
+ clock: mClock,
+ }
+ it.Start()
+
+ // Trigger the AfterFunc
+ w := mClock.Advance(10*time.Minute)
+ c := trap.MustWait(ctx)
+ // Advance the clock a few ms to simulate a busy system
+ mClock.Advance(3*time.Millisecond)
+ c.MustRelease(ctx) // Until() returns
+ w.MustWait(ctx) // Wait for the AfterFunc to wrap up
+
+ // Assert that the timeoutLocked() function was called
+}
+```
+
+This test case will fail with our bugged implementation, since the triggered AfterFunc won't call
+`timeoutLocked()` and instead will reset the timer with a negative number. The fix is easy, use
+`next <= 0` as the comparison.
diff --git a/vendor/github.com/coder/quartz/clock.go b/vendor/github.com/coder/quartz/clock.go
new file mode 100644
index 00000000000..729edfa5623
--- /dev/null
+++ b/vendor/github.com/coder/quartz/clock.go
@@ -0,0 +1,43 @@
+// Package quartz is a library for testing time related code. It exports an interface Clock that
+// mimics the standard library time package functions. In production, an implementation that calls
+// thru to the standard library is used. In testing, a Mock clock is used to precisely control and
+// intercept time functions.
+package quartz
+
+import (
+ "context"
+ "time"
+)
+
+type Clock interface {
+ // NewTicker returns a new Ticker containing a channel that will send the current time on the
+ // channel after each tick. The period of the ticks is specified by the duration argument. The
+ // ticker will adjust the time interval or drop ticks to make up for slow receivers. The
+ // duration d must be greater than zero; if not, NewTicker will panic. Stop the ticker to
+ // release associated resources.
+ NewTicker(d time.Duration, tags ...string) *Ticker
+ // TickerFunc is a convenience function that calls f on the interval d until either the given
+ // context expires or f returns an error. Callers may call Wait() on the returned Waiter to
+ // wait until this happens and obtain the error. The duration d must be greater than zero; if
+ // not, TickerFunc will panic.
+ TickerFunc(ctx context.Context, d time.Duration, f func() error, tags ...string) Waiter
+ // NewTimer creates a new Timer that will send the current time on its channel after at least
+ // duration d.
+ NewTimer(d time.Duration, tags ...string) *Timer
+ // AfterFunc waits for the duration to elapse and then calls f in its own goroutine. It returns
+ // a Timer that can be used to cancel the call using its Stop method. The returned Timer's C
+ // field is not used and will be nil.
+ AfterFunc(d time.Duration, f func(), tags ...string) *Timer
+
+ // Now returns the current local time.
+ Now(tags ...string) time.Time
+ // Since returns the time elapsed since t. It is shorthand for Clock.Now().Sub(t).
+ Since(t time.Time, tags ...string) time.Duration
+ // Until returns the duration until t. It is shorthand for t.Sub(Clock.Now()).
+ Until(t time.Time, tags ...string) time.Duration
+}
+
+// Waiter can be waited on for an error.
+type Waiter interface {
+ Wait(tags ...string) error
+}
diff --git a/vendor/github.com/coder/quartz/mock.go b/vendor/github.com/coder/quartz/mock.go
new file mode 100644
index 00000000000..7255aff99bd
--- /dev/null
+++ b/vendor/github.com/coder/quartz/mock.go
@@ -0,0 +1,851 @@
+package quartz
+
+import (
+ "context"
+ "errors"
+ "fmt"
+ "slices"
+ "sync"
+ "time"
+)
+
+// TestingT is the minimal interface required from a testing framework for the Mock.
+type TestingT interface {
+ Helper()
+
+ Log(...any)
+ Logf(string, ...any)
+ Error(...any)
+ Errorf(string, ...any)
+ Fatal(...any)
+ Fatalf(string, ...any)
+
+ Cleanup(func())
+}
+
+// Mock is the testing implementation of Clock. It tracks a time that monotonically increases
+// during a test, triggering any timers or tickers automatically.
+type Mock struct {
+ tb TestingT
+ logger Logger
+ mu sync.Mutex
+ testOver bool
+
+ // cur is the current time
+ cur time.Time
+
+ all []event
+ nextTime time.Time
+ nextEvents []event
+ traps []*Trap
+}
+
+type event interface {
+ next() time.Time
+ fire(t time.Time)
+}
+
+func (m *Mock) TickerFunc(ctx context.Context, d time.Duration, f func() error, tags ...string) Waiter {
+ if d <= 0 {
+ panic("TickerFunc called with negative or zero duration")
+ }
+ m.mu.Lock()
+ defer m.mu.Unlock()
+ c := newCall(clockFunctionTickerFunc, tags, withDuration(d))
+ m.matchCallLocked(c)
+ defer close(c.complete)
+ t := &mockTickerFunc{
+ ctx: ctx,
+ d: d,
+ f: f,
+ nxt: m.cur.Add(d),
+ mock: m,
+ cond: sync.NewCond(&m.mu),
+ }
+ m.all = append(m.all, t)
+ m.recomputeNextLocked()
+ go t.waitForCtx()
+ return t
+}
+
+// NewTicker creates a mocked ticker attached to this Mock. Note that it will cease sending ticks on its channel at the
+// end of the test, to avoid leaking any goroutines. Ticks are suppressed even if the mock clock is advanced after the
+// test completes. Best practice is to only manipulate the mock time in the main goroutine of the test.
+func (m *Mock) NewTicker(d time.Duration, tags ...string) *Ticker {
+ if d <= 0 {
+ panic("NewTicker called with negative or zero duration")
+ }
+ m.mu.Lock()
+ defer m.mu.Unlock()
+ c := newCall(clockFunctionNewTicker, tags, withDuration(d))
+ m.matchCallLocked(c)
+ defer close(c.complete)
+ return newMockTickerLocked(m, d)
+}
+
+func (m *Mock) NewTimer(d time.Duration, tags ...string) *Timer {
+ m.mu.Lock()
+ defer m.mu.Unlock()
+ c := newCall(clockFunctionNewTimer, tags, withDuration(d))
+ defer close(c.complete)
+ m.matchCallLocked(c)
+ ch := make(chan time.Time)
+ t := &Timer{
+ C: ch,
+ c: ch,
+ nxt: m.cur.Add(d),
+ mock: m,
+ }
+ if d <= 0 {
+ // zero or negative duration timer means we should immediately fire
+ // it, rather than add it.
+ go t.fire(t.mock.cur)
+ return t
+ }
+ m.addEventLocked(t)
+ return t
+}
+
+func (m *Mock) AfterFunc(d time.Duration, f func(), tags ...string) *Timer {
+ m.mu.Lock()
+ defer m.mu.Unlock()
+ c := newCall(clockFunctionAfterFunc, tags, withDuration(d))
+ defer close(c.complete)
+ m.matchCallLocked(c)
+ t := &Timer{
+ nxt: m.cur.Add(d),
+ fn: f,
+ mock: m,
+ }
+ if d <= 0 {
+ // zero or negative duration timer means we should immediately fire
+ // it, rather than add it.
+ go t.fire(t.mock.cur)
+ return t
+ }
+ m.addEventLocked(t)
+ return t
+}
+
+func (m *Mock) Now(tags ...string) time.Time {
+ m.mu.Lock()
+ defer m.mu.Unlock()
+ c := newCall(clockFunctionNow, tags)
+ defer close(c.complete)
+ m.matchCallLocked(c)
+ return m.cur
+}
+
+func (m *Mock) Since(t time.Time, tags ...string) time.Duration {
+ m.mu.Lock()
+ defer m.mu.Unlock()
+ c := newCall(clockFunctionSince, tags, withTime(t))
+ defer close(c.complete)
+ m.matchCallLocked(c)
+ return m.cur.Sub(t)
+}
+
+func (m *Mock) Until(t time.Time, tags ...string) time.Duration {
+ m.mu.Lock()
+ defer m.mu.Unlock()
+ c := newCall(clockFunctionUntil, tags, withTime(t))
+ defer close(c.complete)
+ m.matchCallLocked(c)
+ return t.Sub(m.cur)
+}
+
+func (m *Mock) addEventLocked(e event) {
+ m.all = append(m.all, e)
+ m.recomputeNextLocked()
+}
+
+func (m *Mock) recomputeNextLocked() {
+ var best time.Time
+ var events []event
+ for _, e := range m.all {
+ if best.IsZero() || e.next().Before(best) {
+ best = e.next()
+ events = []event{e}
+ continue
+ }
+ if e.next().Equal(best) {
+ events = append(events, e)
+ continue
+ }
+ }
+ m.nextTime = best
+ m.nextEvents = events
+}
+
+func (m *Mock) removeTimer(t *Timer) {
+ m.mu.Lock()
+ defer m.mu.Unlock()
+ m.removeTimerLocked(t)
+}
+
+func (m *Mock) removeTimerLocked(t *Timer) {
+ t.stopped = true
+ m.removeEventLocked(t)
+}
+
+func (m *Mock) removeEventLocked(e event) {
+ defer m.recomputeNextLocked()
+ for i := range m.all {
+ if m.all[i] == e {
+ m.all = append(m.all[:i], m.all[i+1:]...)
+ return
+ }
+ }
+}
+
+func (m *Mock) matchCallLocked(c *apiCall) {
+ var traps []*Trap
+ for _, t := range m.traps {
+ if t.matches(c) {
+ traps = append(traps, t)
+ }
+ }
+ if !m.testOver {
+ m.logger.Logf("Mock Clock - %s call, matched %d traps", c, len(traps))
+ }
+ if len(traps) == 0 {
+ return
+ }
+ c.releases.Add(len(traps))
+ m.mu.Unlock()
+ for _, t := range traps {
+ go t.catch(c)
+ }
+ c.releases.Wait()
+ m.mu.Lock()
+}
+
+// AdvanceWaiter is returned from Advance and Set calls and allows you to wait for ticks and timers
+// to complete. In the case of functions passed to AfterFunc or TickerFunc, it waits for the
+// functions to return. For other ticks & timers, it just waits for the tick to be delivered to
+// the channel.
+//
+// If multiple timers or tickers trigger simultaneously, they are all run on separate
+// go routines.
+type AdvanceWaiter struct {
+ tb TestingT
+ ch chan struct{}
+}
+
+// Wait for all timers and ticks to complete, or until context expires.
+func (w AdvanceWaiter) Wait(ctx context.Context) error {
+ select {
+ case <-w.ch:
+ return nil
+ case <-ctx.Done():
+ return ctx.Err()
+ }
+}
+
+// MustWait waits for all timers and ticks to complete, and fails the test immediately if the
+// context completes first. MustWait must be called from the goroutine running the test or
+// benchmark, similar to `t.FailNow()`.
+func (w AdvanceWaiter) MustWait(ctx context.Context) {
+ w.tb.Helper()
+ select {
+ case <-w.ch:
+ return
+ case <-ctx.Done():
+ w.tb.Fatalf("context expired while waiting for clock to advance: %s", ctx.Err())
+ }
+}
+
+// Done returns a channel that is closed when all timers and ticks complete.
+func (w AdvanceWaiter) Done() <-chan struct{} {
+ return w.ch
+}
+
+// Advance moves the clock forward by d, triggering any timers or tickers. The returned value can
+// be used to wait for all timers and ticks to complete. Advance sets the clock forward before
+// returning, and can only advance up to the next timer or tick event. It will fail the test if you
+// attempt to advance beyond.
+//
+// If you need to advance exactly to the next event, and don't know or don't wish to calculate it,
+// consider AdvanceNext().
+func (m *Mock) Advance(d time.Duration) AdvanceWaiter {
+ m.tb.Helper()
+ w := AdvanceWaiter{tb: m.tb, ch: make(chan struct{})}
+ m.mu.Lock()
+ if !m.testOver {
+ m.logger.Logf("Mock Clock - Advance(%s)", d)
+ }
+ fin := m.cur.Add(d)
+ // nextTime.IsZero implies no events scheduled.
+ if m.nextTime.IsZero() || fin.Before(m.nextTime) {
+ m.cur = fin
+ m.mu.Unlock()
+ close(w.ch)
+ return w
+ }
+ if fin.After(m.nextTime) {
+ m.tb.Errorf("cannot advance %s which is beyond next timer/ticker event in %s",
+ d.String(), m.nextTime.Sub(m.cur))
+ m.mu.Unlock()
+ close(w.ch)
+ return w
+ }
+
+ m.cur = m.nextTime
+ go m.advanceLocked(w)
+ return w
+}
+
+func (m *Mock) advanceLocked(w AdvanceWaiter) {
+ defer close(w.ch)
+ wg := sync.WaitGroup{}
+ for i := range m.nextEvents {
+ e := m.nextEvents[i]
+ t := m.cur
+ wg.Add(1)
+ go func() {
+ e.fire(t)
+ wg.Done()
+ }()
+ }
+ // release the lock and let the events resolve. This allows them to call back into the
+ // Mock to query the time or set new timers. Each event should remove or reschedule
+ // itself from nextEvents.
+ m.mu.Unlock()
+ wg.Wait()
+}
+
+// Set the time to t. If the time is after the current mocked time, then this is equivalent to
+// Advance() with the difference. You may only Set the time earlier than the current time before
+// starting tickers and timers (e.g. at the start of your test case).
+func (m *Mock) Set(t time.Time) AdvanceWaiter {
+ m.tb.Helper()
+ w := AdvanceWaiter{tb: m.tb, ch: make(chan struct{})}
+ m.mu.Lock()
+ if !m.testOver {
+ m.logger.Logf("Mock Clock - Set(%s)", t)
+ }
+ if t.Before(m.cur) {
+ defer close(w.ch)
+ defer m.mu.Unlock()
+ // past
+ if !m.nextTime.IsZero() {
+ m.tb.Error("Set mock clock to the past after timers/tickers started")
+ }
+ m.cur = t
+ return w
+ }
+ // future
+ // nextTime.IsZero implies no events scheduled.
+ if m.nextTime.IsZero() || t.Before(m.nextTime) {
+ defer close(w.ch)
+ defer m.mu.Unlock()
+ m.cur = t
+ return w
+ }
+ if t.After(m.nextTime) {
+ defer close(w.ch)
+ defer m.mu.Unlock()
+ m.tb.Errorf("cannot Set time to %s which is beyond next timer/ticker event at %s",
+ t.String(), m.nextTime)
+ return w
+ }
+
+ m.cur = m.nextTime
+ go m.advanceLocked(w)
+ return w
+}
+
+// AdvanceNext advances the clock to the next timer or tick event. It fails the test if there are
+// none scheduled. It returns the duration the clock was advanced and a waiter that can be used to
+// wait for the timer/tick event(s) to finish.
+func (m *Mock) AdvanceNext() (time.Duration, AdvanceWaiter) {
+ m.mu.Lock()
+ if !m.testOver {
+ m.logger.Logf("Mock Clock - AdvanceNext()")
+ }
+ m.tb.Helper()
+ w := AdvanceWaiter{tb: m.tb, ch: make(chan struct{})}
+ if m.nextTime.IsZero() {
+ defer close(w.ch)
+ defer m.mu.Unlock()
+ m.tb.Error("cannot AdvanceNext because there are no timers or tickers running")
+ return 0, w
+ }
+ d := m.nextTime.Sub(m.cur)
+ m.cur = m.nextTime
+ go m.advanceLocked(w)
+ return d, w
+}
+
+// Peek returns the duration until the next ticker or timer event and the value
+// true, or, if there are no running tickers or timers, it returns zero and
+// false.
+func (m *Mock) Peek() (d time.Duration, ok bool) {
+ m.mu.Lock()
+ defer m.mu.Unlock()
+ if m.nextTime.IsZero() {
+ return 0, false
+ }
+ return m.nextTime.Sub(m.cur), true
+}
+
+// Trapper allows the creation of Traps
+type Trapper struct {
+ // mock is the underlying Mock. This is a thin wrapper around Mock so that
+ // we can have our interface look like mClock.Trap().NewTimer("foo")
+ mock *Mock
+}
+
+func (t Trapper) NewTimer(tags ...string) *Trap {
+ return t.mock.newTrap(clockFunctionNewTimer, tags)
+}
+
+func (t Trapper) AfterFunc(tags ...string) *Trap {
+ return t.mock.newTrap(clockFunctionAfterFunc, tags)
+}
+
+func (t Trapper) TimerStop(tags ...string) *Trap {
+ return t.mock.newTrap(clockFunctionTimerStop, tags)
+}
+
+func (t Trapper) TimerReset(tags ...string) *Trap {
+ return t.mock.newTrap(clockFunctionTimerReset, tags)
+}
+
+func (t Trapper) TickerFunc(tags ...string) *Trap {
+ return t.mock.newTrap(clockFunctionTickerFunc, tags)
+}
+
+func (t Trapper) TickerFuncWait(tags ...string) *Trap {
+ return t.mock.newTrap(clockFunctionTickerFuncWait, tags)
+}
+
+func (t Trapper) NewTicker(tags ...string) *Trap {
+ return t.mock.newTrap(clockFunctionNewTicker, tags)
+}
+
+func (t Trapper) TickerStop(tags ...string) *Trap {
+ return t.mock.newTrap(clockFunctionTickerStop, tags)
+}
+
+func (t Trapper) TickerReset(tags ...string) *Trap {
+ return t.mock.newTrap(clockFunctionTickerReset, tags)
+}
+
+func (t Trapper) Now(tags ...string) *Trap {
+ return t.mock.newTrap(clockFunctionNow, tags)
+}
+
+func (t Trapper) Since(tags ...string) *Trap {
+ return t.mock.newTrap(clockFunctionSince, tags)
+}
+
+func (t Trapper) Until(tags ...string) *Trap {
+ return t.mock.newTrap(clockFunctionUntil, tags)
+}
+
+func (m *Mock) Trap() Trapper {
+ return Trapper{m}
+}
+
+func (m *Mock) newTrap(fn clockFunction, tags []string) *Trap {
+ m.mu.Lock()
+ defer m.mu.Unlock()
+ if !m.testOver {
+ m.logger.Logf("Mock Clock - Trap %s(..., %v)", fn, tags)
+ }
+ tr := &Trap{
+ fn: fn,
+ tags: tags,
+ mock: m,
+ calls: make(chan *apiCall),
+ done: make(chan struct{}),
+ }
+ m.traps = append(m.traps, tr)
+ return tr
+}
+
+// WithLogger replaces the default testing logger with a custom one.
+//
+// This can be used to discard log messages with:
+//
+// quartz.NewMock(t).WithLogger(quartz.NoOpLogger)
+func (m *Mock) WithLogger(l Logger) *Mock {
+ m.mu.Lock()
+ defer m.mu.Unlock()
+ m.logger = l
+ return m
+}
+
+// NewMock creates a new Mock with the time set to midnight UTC on Jan 1, 2024.
+// You may re-set the time earlier than this, but only before timers or tickers
+// are created.
+func NewMock(tb TestingT) *Mock {
+ cur, err := time.Parse(time.RFC3339, "2024-01-01T00:00:00Z")
+ if err != nil {
+ panic(err)
+ }
+ m := &Mock{
+ tb: tb,
+ logger: tb,
+ cur: cur,
+ }
+ tb.Cleanup(func() {
+ m.mu.Lock()
+ defer m.mu.Unlock()
+ m.testOver = true
+ m.logger.Logf("Mock Clock - test cleanup; will no longer log clock events")
+ })
+ return m
+}
+
+var _ Clock = &Mock{}
+
+type mockTickerFunc struct {
+ ctx context.Context
+ d time.Duration
+ f func() error
+ nxt time.Time
+ mock *Mock
+
+ // cond is a condition Locked on the main Mock.mu
+ cond *sync.Cond
+ // inProgress is true when we are actively calling f
+ inProgress bool
+ // done is true when the ticker exits
+ done bool
+ // err holds the error when the ticker exits
+ err error
+}
+
+func (m *mockTickerFunc) next() time.Time {
+ return m.nxt
+}
+
+func (m *mockTickerFunc) fire(_ time.Time) {
+ m.mock.mu.Lock()
+ if m.done {
+ m.mock.mu.Unlock()
+ return
+ }
+ m.nxt = m.nxt.Add(m.d)
+ m.mock.recomputeNextLocked()
+ // we need this check to happen after we've computed the next tick,
+ // otherwise it will be immediately rescheduled.
+ if m.inProgress {
+ m.mock.mu.Unlock()
+ return
+ }
+
+ m.inProgress = true
+ m.mock.mu.Unlock()
+ err := m.f()
+ m.mock.mu.Lock()
+ defer m.mock.mu.Unlock()
+ m.inProgress = false
+ m.cond.Broadcast() // wake up anything waiting for f to finish
+ if err != nil {
+ m.exitLocked(err)
+ }
+}
+
+func (m *mockTickerFunc) exitLocked(err error) {
+ if m.done {
+ return
+ }
+ m.done = true
+ m.err = err
+ m.mock.removeEventLocked(m)
+ m.cond.Broadcast()
+}
+
+func (m *mockTickerFunc) waitForCtx() {
+ <-m.ctx.Done()
+ m.mock.mu.Lock()
+ defer m.mock.mu.Unlock()
+ for m.inProgress {
+ m.cond.Wait()
+ }
+ m.exitLocked(m.ctx.Err())
+}
+
+func (m *mockTickerFunc) Wait(tags ...string) error {
+ m.mock.mu.Lock()
+ defer m.mock.mu.Unlock()
+ c := newCall(clockFunctionTickerFuncWait, tags)
+ m.mock.matchCallLocked(c)
+ defer close(c.complete)
+ for !m.done {
+ m.cond.Wait()
+ }
+ return m.err
+}
+
+var _ Waiter = &mockTickerFunc{}
+
+type clockFunction int
+
+const (
+ clockFunctionNewTimer clockFunction = iota
+ clockFunctionAfterFunc
+ clockFunctionTimerStop
+ clockFunctionTimerReset
+ clockFunctionTickerFunc
+ clockFunctionTickerFuncWait
+ clockFunctionNewTicker
+ clockFunctionTickerReset
+ clockFunctionTickerStop
+ clockFunctionNow
+ clockFunctionSince
+ clockFunctionUntil
+)
+
+func (c clockFunction) String() string {
+ switch c {
+ case clockFunctionNewTimer:
+ return "NewTimer"
+ case clockFunctionAfterFunc:
+ return "AfterFunc"
+ case clockFunctionTimerStop:
+ return "Timer.Stop"
+ case clockFunctionTimerReset:
+ return "Timer.Reset"
+ case clockFunctionTickerFunc:
+ return "TickerFunc"
+ case clockFunctionTickerFuncWait:
+ return "TickerFunc.Wait"
+ case clockFunctionNewTicker:
+ return "NewTicker"
+ case clockFunctionTickerReset:
+ return "Ticker.Reset"
+ case clockFunctionTickerStop:
+ return "Ticker.Stop"
+ case clockFunctionNow:
+ return "Now"
+ case clockFunctionSince:
+ return "Since"
+ case clockFunctionUntil:
+ return "Until"
+ default:
+ return fmt.Sprintf("Unknown clockFunction(%d)", c)
+ }
+}
+
+type callArg func(c *apiCall)
+
+// apiCall represents a single call to one of the Clock APIs.
+type apiCall struct {
+ Time time.Time
+ Duration time.Duration
+ Tags []string
+
+ fn clockFunction
+ releases sync.WaitGroup
+ complete chan struct{}
+}
+
+func (a *apiCall) String() string {
+ switch a.fn {
+ case clockFunctionNewTimer:
+ return fmt.Sprintf("NewTimer(%s, %v)", a.Duration, a.Tags)
+ case clockFunctionAfterFunc:
+ return fmt.Sprintf("AfterFunc(%s, , %v)", a.Duration, a.Tags)
+ case clockFunctionTimerStop:
+ return fmt.Sprintf("Timer.Stop(%v)", a.Tags)
+ case clockFunctionTimerReset:
+ return fmt.Sprintf("Timer.Reset(%s, %v)", a.Duration, a.Tags)
+ case clockFunctionTickerFunc:
+ return fmt.Sprintf("TickerFunc(, %s, , %s)", a.Duration, a.Tags)
+ case clockFunctionTickerFuncWait:
+ return fmt.Sprintf("TickerFunc.Wait(%v)", a.Tags)
+ case clockFunctionNewTicker:
+ return fmt.Sprintf("NewTicker(%s, %v)", a.Duration, a.Tags)
+ case clockFunctionTickerReset:
+ return fmt.Sprintf("Ticker.Reset(%s, %v)", a.Duration, a.Tags)
+ case clockFunctionTickerStop:
+ return fmt.Sprintf("Ticker.Stop(%v)", a.Tags)
+ case clockFunctionNow:
+ return fmt.Sprintf("Now(%v)", a.Tags)
+ case clockFunctionSince:
+ return fmt.Sprintf("Since(%s, %v)", a.Time, a.Tags)
+ case clockFunctionUntil:
+ return fmt.Sprintf("Until(%s, %v)", a.Time, a.Tags)
+ default:
+ return fmt.Sprintf("Unknown clockFunction(%d)", a.fn)
+ }
+}
+
+// Call represents an apiCall that has been trapped.
+type Call struct {
+ Time time.Time
+ Duration time.Duration
+ Tags []string
+
+ tb TestingT
+ apiCall *apiCall
+ trap *Trap
+}
+
+// Release the call and wait for it to complete. If the provided context expires before the call completes, it returns
+// an error.
+//
+// IMPORTANT: If a call is trapped by more than one trap, they all must release the call before it can complete, and
+// they must do so from different goroutines.
+func (c *Call) Release(ctx context.Context) error {
+ c.apiCall.releases.Done()
+ select {
+ case <-ctx.Done():
+ return fmt.Errorf("timed out waiting for release; did more than one trap capture the call?: %w", ctx.Err())
+ case <-c.apiCall.complete:
+ // OK
+ }
+ c.trap.callReleased()
+ return nil
+}
+
+// MustRelease releases the call and waits for it to complete. If the provided context expires before the call
+// completes, it fails the test.
+//
+// IMPORTANT: If a call is trapped by more than one trap, they all must release the call before it can complete, and
+// they must do so from different goroutines.
+func (c *Call) MustRelease(ctx context.Context) {
+ if err := c.Release(ctx); err != nil {
+ c.tb.Helper()
+ c.tb.Fatal(err.Error())
+ }
+}
+
+func withTime(t time.Time) callArg {
+ return func(c *apiCall) {
+ c.Time = t
+ }
+}
+
+func withDuration(d time.Duration) callArg {
+ return func(c *apiCall) {
+ c.Duration = d
+ }
+}
+
+func newCall(fn clockFunction, tags []string, args ...callArg) *apiCall {
+ c := &apiCall{
+ fn: fn,
+ Tags: tags,
+ complete: make(chan struct{}),
+ }
+ for _, a := range args {
+ a(c)
+ }
+ return c
+}
+
+type Trap struct {
+ fn clockFunction
+ tags []string
+ mock *Mock
+ calls chan *apiCall
+ done chan struct{}
+
+ // mu protects the unreleasedCalls count
+ mu sync.Mutex
+ unreleasedCalls int
+}
+
+func (t *Trap) String() string {
+ return fmt.Sprintf("Trap %s(..., %v)", t.fn.String(), t.tags)
+}
+
+func (t *Trap) catch(c *apiCall) {
+ select {
+ case t.calls <- c:
+ case <-t.done:
+ c.releases.Done()
+ }
+}
+
+func (t *Trap) matches(c *apiCall) bool {
+ if t.fn != c.fn {
+ return false
+ }
+ for _, tag := range t.tags {
+ if !slices.Contains(c.Tags, tag) {
+ return false
+ }
+ }
+ return true
+}
+
+func (t *Trap) Close() {
+ t.mock.mu.Lock()
+ defer t.mock.mu.Unlock()
+ select {
+ case <-t.done:
+ t.mock.tb.Logf("%s already Closed()", t)
+ return // already closed
+ default:
+ }
+ if t.unreleasedCalls != 0 {
+ t.mock.tb.Helper()
+ t.mock.tb.Errorf("%s Closed() with %d unreleased calls", t, t.unreleasedCalls)
+ }
+ for i, tr := range t.mock.traps {
+ if t == tr {
+ t.mock.traps = append(t.mock.traps[:i], t.mock.traps[i+1:]...)
+ }
+ }
+ close(t.done)
+}
+
+func (t *Trap) callReleased() {
+ t.mu.Lock()
+ defer t.mu.Unlock()
+ t.unreleasedCalls--
+}
+
+var ErrTrapClosed = errors.New("trap closed")
+
+func (t *Trap) Wait(ctx context.Context) (*Call, error) {
+ select {
+ case <-ctx.Done():
+ return nil, ctx.Err()
+ case <-t.done:
+ return nil, ErrTrapClosed
+ case a := <-t.calls:
+ c := &Call{
+ Time: a.Time,
+ Duration: a.Duration,
+ Tags: a.Tags,
+ apiCall: a,
+ trap: t,
+ tb: t.mock.tb,
+ }
+ t.mu.Lock()
+ defer t.mu.Unlock()
+ t.unreleasedCalls++
+ return c, nil
+ }
+}
+
+// MustWait calls Wait() and then if there is an error, immediately fails the
+// test via tb.Fatalf()
+func (t *Trap) MustWait(ctx context.Context) *Call {
+ t.mock.tb.Helper()
+ c, err := t.Wait(ctx)
+ if err != nil {
+ t.mock.tb.Fatalf("context expired while waiting for %s: %s", t, err.Error())
+ }
+ return c
+}
+
+type Logger interface {
+ Log(args ...any)
+ Logf(format string, args ...any)
+}
+
+// NoOpLogger is a Logger that discards all log messages.
+var NoOpLogger Logger = noOpLogger{}
+
+type noOpLogger struct{}
+
+func (noOpLogger) Log(args ...any) {}
+func (noOpLogger) Logf(format string, args ...any) {}
diff --git a/vendor/github.com/coder/quartz/real.go b/vendor/github.com/coder/quartz/real.go
new file mode 100644
index 00000000000..f39fb1163e8
--- /dev/null
+++ b/vendor/github.com/coder/quartz/real.go
@@ -0,0 +1,80 @@
+package quartz
+
+import (
+ "context"
+ "time"
+)
+
+type realClock struct{}
+
+func NewReal() Clock {
+ return realClock{}
+}
+
+func (realClock) NewTicker(d time.Duration, _ ...string) *Ticker {
+ tkr := time.NewTicker(d)
+ return &Ticker{ticker: tkr, C: tkr.C}
+}
+
+func (realClock) TickerFunc(ctx context.Context, d time.Duration, f func() error, _ ...string) Waiter {
+ ct := &realContextTicker{
+ ctx: ctx,
+ tkr: time.NewTicker(d),
+ f: f,
+ err: make(chan error, 1),
+ }
+ go ct.run()
+ return ct
+}
+
+type realContextTicker struct {
+ ctx context.Context
+ tkr *time.Ticker
+ f func() error
+ err chan error
+}
+
+func (t *realContextTicker) Wait(_ ...string) error {
+ return <-t.err
+}
+
+func (t *realContextTicker) run() {
+ defer t.tkr.Stop()
+ for {
+ select {
+ case <-t.ctx.Done():
+ t.err <- t.ctx.Err()
+ return
+ case <-t.tkr.C:
+ err := t.f()
+ if err != nil {
+ t.err <- err
+ return
+ }
+ }
+ }
+}
+
+func (realClock) NewTimer(d time.Duration, _ ...string) *Timer {
+ rt := time.NewTimer(d)
+ return &Timer{C: rt.C, timer: rt}
+}
+
+func (realClock) AfterFunc(d time.Duration, f func(), _ ...string) *Timer {
+ rt := time.AfterFunc(d, f)
+ return &Timer{C: rt.C, timer: rt}
+}
+
+func (realClock) Now(_ ...string) time.Time {
+ return time.Now()
+}
+
+func (realClock) Since(t time.Time, _ ...string) time.Duration {
+ return time.Since(t)
+}
+
+func (realClock) Until(t time.Time, _ ...string) time.Duration {
+ return time.Until(t)
+}
+
+var _ Clock = realClock{}
diff --git a/vendor/github.com/coder/quartz/ticker.go b/vendor/github.com/coder/quartz/ticker.go
new file mode 100644
index 00000000000..f4a4b066502
--- /dev/null
+++ b/vendor/github.com/coder/quartz/ticker.go
@@ -0,0 +1,151 @@
+package quartz
+
+import "time"
+
+// A Ticker holds a channel that delivers “ticks” of a clock at intervals.
+type Ticker struct {
+ C <-chan time.Time
+ //nolint: revive
+ c chan time.Time
+ ticker *time.Ticker // realtime impl, if set
+ d time.Duration // period, if set
+ nxt time.Time // next tick time
+ mock *Mock // mock clock, if set
+ stopped bool // true if the ticker is not running
+ internalTicks chan time.Time // used to deliver ticks to the runLoop goroutine
+
+ // As of Go 1.23, ticker channels are unbuffered and guaranteed to block forever after a call to stop.
+ //
+ // When a mocked ticker fires, we don't want to block on a channel write, because it's fine for the code under test
+ // not to be reading. That means we need to start a new goroutine to do the channel write (runLoop) if we are a
+ // channel-based ticker.
+ //
+ // They also are not supposed to leak even if they are never read or stopped (Go runtime can garbage collect them).
+ // We can't garbage-collect because we can't check if any other code besides the mock references, but we can ensure
+ // that we don't leak goroutines so that the garbage collector can do its job when the mock is no longer
+ // referenced. The channels below allow us to interrupt the runLoop goroutine.
+ interrupt chan struct{}
+}
+
+func (t *Ticker) fire(tt time.Time) {
+ t.mock.mu.Lock()
+ defer t.mock.mu.Unlock()
+ if t.stopped {
+ return
+ }
+ for !t.nxt.After(t.mock.cur) {
+ t.nxt = t.nxt.Add(t.d)
+ }
+ t.mock.recomputeNextLocked()
+ if t.interrupt != nil { // implies runLoop is still going.
+ t.internalTicks <- tt
+ }
+}
+
+func (t *Ticker) next() time.Time {
+ return t.nxt
+}
+
+// Stop turns off a ticker. After Stop, no more ticks will be sent. Stop does
+// not close the channel, to prevent a concurrent goroutine reading from the
+// channel from seeing an erroneous "tick".
+func (t *Ticker) Stop(tags ...string) {
+ if t.ticker != nil {
+ t.ticker.Stop()
+ return
+ }
+ t.mock.mu.Lock()
+ defer t.mock.mu.Unlock()
+ c := newCall(clockFunctionTickerStop, tags)
+ t.mock.matchCallLocked(c)
+ defer close(c.complete)
+ t.mock.removeEventLocked(t)
+ t.stopped = true
+ // check if we've already fired, and if so, interrupt it.
+ if t.interrupt != nil {
+ <-t.interrupt
+ t.interrupt = nil
+ }
+}
+
+// Reset stops a ticker and resets its period to the specified duration. The
+// next tick will arrive after the new period elapses. The duration d must be
+// greater than zero; if not, Reset will panic.
+func (t *Ticker) Reset(d time.Duration, tags ...string) {
+ if t.ticker != nil {
+ t.ticker.Reset(d)
+ return
+ }
+ t.mock.mu.Lock()
+ defer t.mock.mu.Unlock()
+ c := newCall(clockFunctionTickerReset, tags, withDuration(d))
+ t.mock.matchCallLocked(c)
+ defer close(c.complete)
+ t.nxt = t.mock.cur.Add(d)
+ t.d = d
+ if t.stopped {
+ t.stopped = false
+ t.mock.addEventLocked(t)
+ } else {
+ t.mock.recomputeNextLocked()
+ }
+ if t.interrupt == nil {
+ t.startRunLoopLocked()
+ }
+}
+
+func (t *Ticker) runLoop(interrupt chan struct{}) {
+ defer close(interrupt)
+outer:
+ for {
+ select {
+ case tt := <-t.internalTicks:
+ for {
+ select {
+ case t.c <- tt:
+ continue outer
+ case <-t.internalTicks:
+ // Discard future ticks until we can send this one.
+ case interrupt <- struct{}{}:
+ return
+ }
+ }
+ case interrupt <- struct{}{}:
+ return
+ }
+ }
+}
+
+func (t *Ticker) startRunLoopLocked() {
+ // assert some assumptions. If these fire, it is a bug in Quartz itself.
+ if t.interrupt != nil {
+ t.mock.tb.Error("called startRunLoopLocked when interrupt suggests we are already running")
+ }
+ interrupt := make(chan struct{})
+ t.interrupt = interrupt
+ go t.runLoop(interrupt)
+}
+
+func newMockTickerLocked(m *Mock, d time.Duration) *Ticker {
+ // no buffer follows Go 1.23+ behavior
+ ticks := make(chan time.Time)
+ t := &Ticker{
+ C: ticks,
+ c: ticks,
+ d: d,
+ nxt: m.cur.Add(d),
+ mock: m,
+ internalTicks: make(chan time.Time),
+ }
+ m.addEventLocked(t)
+ m.tb.Cleanup(func() {
+ m.mu.Lock()
+ defer m.mu.Unlock()
+ if t.interrupt != nil {
+ <-t.interrupt
+ t.interrupt = nil
+ }
+ })
+ t.startRunLoopLocked()
+ return t
+}
diff --git a/vendor/github.com/coder/quartz/timer.go b/vendor/github.com/coder/quartz/timer.go
new file mode 100644
index 00000000000..8f571eb0dc6
--- /dev/null
+++ b/vendor/github.com/coder/quartz/timer.go
@@ -0,0 +1,118 @@
+package quartz
+
+import (
+ "time"
+)
+
+// The Timer type represents a single event. When the Timer expires, the current time will be sent
+// on C, unless the Timer was created by AfterFunc. A Timer must be created with NewTimer or
+// AfterFunc.
+type Timer struct {
+ C <-chan time.Time
+ //nolint: revive
+ c chan time.Time
+ timer *time.Timer // realtime impl, if set
+ nxt time.Time // next tick time
+ mock *Mock // mock clock, if set
+ fn func() // AfterFunc function, if set
+ stopped bool // True if stopped, false if running
+
+ // As of Go 1.23, timer channels are unbuffered and guaranteed to block forever after a call to stop.
+ //
+ // When a mocked timer fires, we don't want to block on a channel write, because it's fine for the code under test
+ // not to be reading. That means we need to start a new goroutine to do the channel write if we are a channel-based
+ // timer.
+ //
+ // They also are not supposed to leak even if they are never read or stopped (Go runtime can garbage collect them).
+ // We can't garbage-collect because we can't check if any other code besides the mock references, but we can ensure
+ // that we don't leak goroutines so that the garbage collector can do its job when the mock is no longer
+ // referenced. The channels below allow us to interrupt the channel write goroutine.
+ interrupt chan struct{}
+}
+
+func (t *Timer) fire(tt time.Time) {
+ t.mock.mu.Lock()
+ t.mock.removeTimerLocked(t)
+ if t.fn != nil {
+ t.mock.mu.Unlock()
+ t.fn()
+ return
+ } else {
+ interrupt := make(chan struct{})
+ // Prevents the goroutine from leaking beyond the test. Side effect is that timer channels cannot be read
+ // after the test exits.
+ t.mock.tb.Cleanup(func() {
+ <-interrupt
+ })
+ t.interrupt = interrupt
+ t.mock.mu.Unlock()
+ go func() {
+ defer close(interrupt)
+ select {
+ case t.c <- tt:
+ case interrupt <- struct{}{}:
+ }
+ }()
+ }
+}
+
+func (t *Timer) next() time.Time {
+ return t.nxt
+}
+
+// Stop prevents the Timer from firing. It returns true if the call stops the timer, false if the
+// timer has already expired or been stopped. Stop does not close the channel, to prevent a read
+// from the channel succeeding incorrectly.
+//
+// See https://pkg.go.dev/time#Timer.Stop for more information.
+func (t *Timer) Stop(tags ...string) bool {
+ if t.timer != nil {
+ return t.timer.Stop()
+ }
+ t.mock.mu.Lock()
+ defer t.mock.mu.Unlock()
+ c := newCall(clockFunctionTimerStop, tags)
+ t.mock.matchCallLocked(c)
+ defer close(c.complete)
+ result := !t.stopped
+ t.mock.removeTimerLocked(t)
+ // check if we've already fired, and if so, interrupt it.
+ if t.interrupt != nil {
+ <-t.interrupt
+ t.interrupt = nil
+ }
+ return result
+}
+
+// Reset changes the timer to expire after duration d. It returns true if the timer had been active,
+// false if the timer had expired or been stopped.
+//
+// See https://pkg.go.dev/time#Timer.Reset for more information.
+func (t *Timer) Reset(d time.Duration, tags ...string) bool {
+ if t.timer != nil {
+ return t.timer.Reset(d)
+ }
+ t.mock.mu.Lock()
+ defer t.mock.mu.Unlock()
+ c := newCall(clockFunctionTimerReset, tags, withDuration(d))
+ t.mock.matchCallLocked(c)
+ defer close(c.complete)
+ result := !t.stopped
+ // check if we've already fired, and if so, interrupt it.
+ if t.interrupt != nil {
+ <-t.interrupt
+ t.interrupt = nil
+ }
+ if d <= 0 {
+ // zero or negative duration timer means we should immediately re-fire
+ // it, rather than remove and re-add it.
+ t.stopped = false
+ go t.fire(t.mock.cur)
+ return result
+ }
+ t.mock.removeTimerLocked(t)
+ t.stopped = false
+ t.nxt = t.mock.cur.Add(d)
+ t.mock.addEventLocked(t)
+ return result
+}
diff --git a/vendor/github.com/edsrzf/mmap-go/mmap_unix.go b/vendor/github.com/edsrzf/mmap-go/mmap_unix.go
index 25b13e51fdf..0f956faff92 100644
--- a/vendor/github.com/edsrzf/mmap-go/mmap_unix.go
+++ b/vendor/github.com/edsrzf/mmap-go/mmap_unix.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build darwin dragonfly freebsd linux openbsd solaris netbsd
+// +build darwin dragonfly freebsd linux openbsd solaris netbsd aix
package mmap
diff --git a/vendor/github.com/felixge/httpsnoop/capture_metrics.go b/vendor/github.com/felixge/httpsnoop/capture_metrics.go
index bec7b71b39c..97f0a51de31 100644
--- a/vendor/github.com/felixge/httpsnoop/capture_metrics.go
+++ b/vendor/github.com/felixge/httpsnoop/capture_metrics.go
@@ -69,6 +69,16 @@ func (m *Metrics) CaptureMetrics(w http.ResponseWriter, fn func(http.ResponseWri
}
},
+ WriteString: func(next WriteStringFunc) WriteStringFunc {
+ return func(s string) (int, error) {
+ n, err := next(s)
+
+ m.Written += int64(n)
+ headerWritten = true
+ return n, err
+ }
+ },
+
ReadFrom: func(next ReadFromFunc) ReadFromFunc {
return func(src io.Reader) (int64, error) {
n, err := next(src)
@@ -81,6 +91,31 @@ func (m *Metrics) CaptureMetrics(w http.ResponseWriter, fn func(http.ResponseWri
}
)
+ // defer to ensure duration is updated even if the handler panics
+ defer func() {
+ m.Duration += time.Since(start)
+ }()
fn(Wrap(w, hooks))
- m.Duration += time.Since(start)
+}
+
+// deadliner defines two methods introduced in go 1.20. The standard library
+// seems not to provide an interface we can import, hence its definition here.
+type deadliner interface {
+ SetReadDeadline(deadline time.Time) error
+ SetWriteDeadline(deadline time.Time) error
+}
+
+// fullDuplexEnabler defines a method introduced in go 1.21. The standard
+// library seems not to provide an interface we can import, hence its definition
+// here.
+type fullDuplexEnabler interface {
+ EnableFullDuplex() error
+}
+
+// httpFlushError defines a method introduced in go 1.20. The standard
+// library seems not to provide an interface we can import, hence its definition
+// here.
+// See https://github.com/golang/go/blob/go1.20/src/net/http/responsecontroller.go#L50
+type httpFlushError interface {
+ FlushError() error
}
diff --git a/vendor/github.com/felixge/httpsnoop/wrap_generated.go b/vendor/github.com/felixge/httpsnoop/wrap_generated.go
new file mode 100644
index 00000000000..b6549ba982b
--- /dev/null
+++ b/vendor/github.com/felixge/httpsnoop/wrap_generated.go
@@ -0,0 +1,16179 @@
+// Code generated by "httpsnoop/codegen"; DO NOT EDIT.
+
+package httpsnoop
+
+import (
+ "bufio"
+ "io"
+ "net"
+ "net/http"
+ "time"
+)
+
+// HeaderFunc is part of the http.ResponseWriter interface.
+type HeaderFunc func() http.Header
+
+// WriteHeaderFunc is part of the http.ResponseWriter interface.
+type WriteHeaderFunc func(code int)
+
+// WriteFunc is part of the http.ResponseWriter interface.
+type WriteFunc func(b []byte) (int, error)
+
+// FlushFunc is part of the http.Flusher interface.
+type FlushFunc func()
+
+// FlushErrorFunc is part of the httpFlushError interface.
+type FlushErrorFunc func() error
+
+// CloseNotifyFunc is part of the http.CloseNotifier interface.
+type CloseNotifyFunc func() <-chan bool
+
+// HijackFunc is part of the http.Hijacker interface.
+type HijackFunc func() (net.Conn, *bufio.ReadWriter, error)
+
+// ReadFromFunc is part of the io.ReaderFrom interface.
+type ReadFromFunc func(src io.Reader) (int64, error)
+
+// SetReadDeadlineFunc is part of the deadliner interface.
+type SetReadDeadlineFunc func(deadline time.Time) error
+
+// SetWriteDeadlineFunc is part of the deadliner interface.
+type SetWriteDeadlineFunc func(deadline time.Time) error
+
+// EnableFullDuplexFunc is part of the fullDuplexEnabler interface.
+type EnableFullDuplexFunc func() error
+
+// PushFunc is part of the http.Pusher interface.
+type PushFunc func(target string, opts *http.PushOptions) error
+
+// WriteStringFunc is part of the io.StringWriter interface.
+type WriteStringFunc func(s string) (int, error)
+
+// Hooks defines a set of method interceptors for methods included in
+// http.ResponseWriter as well as some others. You can think of them as
+// middleware for the function calls they target. See Wrap for more details.
+//
+// For each method, the exact matching hook takes precedence. For example,
+// WriteString calls the WriteString hook when it is configured, even if a
+// Write hook is also configured. If the exact hook is not configured, most
+// methods call through to the underlying ResponseWriter directly.
+//
+// Two compatibility fallbacks preserve the behavior users had before Wrap
+// learned about newer optional interfaces:
+// - If the underlying ResponseWriter implements io.StringWriter and
+// WriteString is called, but only the Write hook is configured, WriteString
+// is routed through the Write hook with []byte(s). If neither hook is
+// configured, WriteString calls the underlying WriteString method directly.
+// - If the underlying ResponseWriter implements both http.Flusher and
+// FlushError, and FlushError is called, but only the Flush hook is
+// configured, FlushError is routed through the Flush hook while preserving
+// the error returned by the underlying FlushError method. If neither hook is
+// configured, FlushError calls the underlying FlushError method directly.
+type Hooks struct {
+ Header func(HeaderFunc) HeaderFunc
+ WriteHeader func(WriteHeaderFunc) WriteHeaderFunc
+ Write func(WriteFunc) WriteFunc
+ Flush func(FlushFunc) FlushFunc
+ FlushError func(FlushErrorFunc) FlushErrorFunc
+ CloseNotify func(CloseNotifyFunc) CloseNotifyFunc
+ Hijack func(HijackFunc) HijackFunc
+ ReadFrom func(ReadFromFunc) ReadFromFunc
+ SetReadDeadline func(SetReadDeadlineFunc) SetReadDeadlineFunc
+ SetWriteDeadline func(SetWriteDeadlineFunc) SetWriteDeadlineFunc
+ EnableFullDuplex func(EnableFullDuplexFunc) EnableFullDuplexFunc
+ Push func(PushFunc) PushFunc
+ WriteString func(WriteStringFunc) WriteStringFunc
+}
+
+// Wrap returns a wrapped version of w that provides the exact same interface
+// as w. Specifically if w implements any combination of:
+//
+// - http.Flusher
+// - httpFlushError
+// - http.CloseNotifier
+// - http.Hijacker
+// - io.ReaderFrom
+// - deadliner
+// - fullDuplexEnabler
+// - http.Pusher
+// - io.StringWriter
+//
+// The wrapped version will implement the exact same combination. If no hooks
+// are set, the wrapped version also behaves exactly as w. Hooks targeting
+// methods not supported by w are ignored. Any other hooks will intercept the
+// method they target and may modify the call's arguments and/or return values.
+// The CaptureMetrics implementation serves as a working example for how the
+// hooks can be used.
+func Wrap(w http.ResponseWriter, hooks Hooks) http.ResponseWriter {
+ state := &rwState{w: w}
+ var combo uint16
+ if hooks.Header != nil {
+ state.header = hooks.Header(w.Header)
+ }
+ if hooks.WriteHeader != nil {
+ state.writeHeader = hooks.WriteHeader(w.WriteHeader)
+ }
+ if hooks.Write != nil {
+ state.write = hooks.Write(w.Write)
+ }
+ if t0, i0 := w.(http.Flusher); i0 {
+ combo |= 1 << 8
+ if hooks.Flush != nil {
+ state.flush = hooks.Flush(t0.Flush)
+ }
+ }
+ if t1, i1 := w.(httpFlushError); i1 {
+ combo |= 1 << 7
+ if hooks.FlushError != nil {
+ state.flushError = hooks.FlushError(t1.FlushError)
+ } else if state.flush != nil {
+ state.flushError = func() (err error) { hooks.Flush(func() { err = t1.FlushError() })(); return err }
+ }
+ }
+ if t2, i2 := w.(http.CloseNotifier); i2 {
+ combo |= 1 << 6
+ if hooks.CloseNotify != nil {
+ state.closeNotify = hooks.CloseNotify(t2.CloseNotify)
+ }
+ }
+ if t3, i3 := w.(http.Hijacker); i3 {
+ combo |= 1 << 5
+ if hooks.Hijack != nil {
+ state.hijack = hooks.Hijack(t3.Hijack)
+ }
+ }
+ if t4, i4 := w.(io.ReaderFrom); i4 {
+ combo |= 1 << 4
+ if hooks.ReadFrom != nil {
+ state.readFrom = hooks.ReadFrom(t4.ReadFrom)
+ }
+ }
+ if t5, i5 := w.(deadliner); i5 {
+ combo |= 1 << 3
+ if hooks.SetReadDeadline != nil {
+ state.setReadDeadline = hooks.SetReadDeadline(t5.SetReadDeadline)
+ }
+ if hooks.SetWriteDeadline != nil {
+ state.setWriteDeadline = hooks.SetWriteDeadline(t5.SetWriteDeadline)
+ }
+ }
+ if t6, i6 := w.(fullDuplexEnabler); i6 {
+ combo |= 1 << 2
+ if hooks.EnableFullDuplex != nil {
+ state.enableFullDuplex = hooks.EnableFullDuplex(t6.EnableFullDuplex)
+ }
+ }
+ if t7, i7 := w.(http.Pusher); i7 {
+ combo |= 1 << 1
+ if hooks.Push != nil {
+ state.push = hooks.Push(t7.Push)
+ }
+ }
+ if t8, i8 := w.(io.StringWriter); i8 {
+ combo |= 1 << 0
+ if hooks.WriteString != nil {
+ state.writeString = hooks.WriteString(t8.WriteString)
+ } else if state.write != nil {
+ state.writeString = func(s string) (int, error) { return state.write([]byte(s)) }
+ }
+ }
+ switch combo {
+ case 0:
+ return (*rw0)(state)
+ case 1:
+ return (*rw1)(state)
+ case 2:
+ return (*rw2)(state)
+ case 3:
+ return (*rw3)(state)
+ case 4:
+ return (*rw4)(state)
+ case 5:
+ return (*rw5)(state)
+ case 6:
+ return (*rw6)(state)
+ case 7:
+ return (*rw7)(state)
+ case 8:
+ return (*rw8)(state)
+ case 9:
+ return (*rw9)(state)
+ case 10:
+ return (*rw10)(state)
+ case 11:
+ return (*rw11)(state)
+ case 12:
+ return (*rw12)(state)
+ case 13:
+ return (*rw13)(state)
+ case 14:
+ return (*rw14)(state)
+ case 15:
+ return (*rw15)(state)
+ case 16:
+ return (*rw16)(state)
+ case 17:
+ return (*rw17)(state)
+ case 18:
+ return (*rw18)(state)
+ case 19:
+ return (*rw19)(state)
+ case 20:
+ return (*rw20)(state)
+ case 21:
+ return (*rw21)(state)
+ case 22:
+ return (*rw22)(state)
+ case 23:
+ return (*rw23)(state)
+ case 24:
+ return (*rw24)(state)
+ case 25:
+ return (*rw25)(state)
+ case 26:
+ return (*rw26)(state)
+ case 27:
+ return (*rw27)(state)
+ case 28:
+ return (*rw28)(state)
+ case 29:
+ return (*rw29)(state)
+ case 30:
+ return (*rw30)(state)
+ case 31:
+ return (*rw31)(state)
+ case 32:
+ return (*rw32)(state)
+ case 33:
+ return (*rw33)(state)
+ case 34:
+ return (*rw34)(state)
+ case 35:
+ return (*rw35)(state)
+ case 36:
+ return (*rw36)(state)
+ case 37:
+ return (*rw37)(state)
+ case 38:
+ return (*rw38)(state)
+ case 39:
+ return (*rw39)(state)
+ case 40:
+ return (*rw40)(state)
+ case 41:
+ return (*rw41)(state)
+ case 42:
+ return (*rw42)(state)
+ case 43:
+ return (*rw43)(state)
+ case 44:
+ return (*rw44)(state)
+ case 45:
+ return (*rw45)(state)
+ case 46:
+ return (*rw46)(state)
+ case 47:
+ return (*rw47)(state)
+ case 48:
+ return (*rw48)(state)
+ case 49:
+ return (*rw49)(state)
+ case 50:
+ return (*rw50)(state)
+ case 51:
+ return (*rw51)(state)
+ case 52:
+ return (*rw52)(state)
+ case 53:
+ return (*rw53)(state)
+ case 54:
+ return (*rw54)(state)
+ case 55:
+ return (*rw55)(state)
+ case 56:
+ return (*rw56)(state)
+ case 57:
+ return (*rw57)(state)
+ case 58:
+ return (*rw58)(state)
+ case 59:
+ return (*rw59)(state)
+ case 60:
+ return (*rw60)(state)
+ case 61:
+ return (*rw61)(state)
+ case 62:
+ return (*rw62)(state)
+ case 63:
+ return (*rw63)(state)
+ case 64:
+ return (*rw64)(state)
+ case 65:
+ return (*rw65)(state)
+ case 66:
+ return (*rw66)(state)
+ case 67:
+ return (*rw67)(state)
+ case 68:
+ return (*rw68)(state)
+ case 69:
+ return (*rw69)(state)
+ case 70:
+ return (*rw70)(state)
+ case 71:
+ return (*rw71)(state)
+ case 72:
+ return (*rw72)(state)
+ case 73:
+ return (*rw73)(state)
+ case 74:
+ return (*rw74)(state)
+ case 75:
+ return (*rw75)(state)
+ case 76:
+ return (*rw76)(state)
+ case 77:
+ return (*rw77)(state)
+ case 78:
+ return (*rw78)(state)
+ case 79:
+ return (*rw79)(state)
+ case 80:
+ return (*rw80)(state)
+ case 81:
+ return (*rw81)(state)
+ case 82:
+ return (*rw82)(state)
+ case 83:
+ return (*rw83)(state)
+ case 84:
+ return (*rw84)(state)
+ case 85:
+ return (*rw85)(state)
+ case 86:
+ return (*rw86)(state)
+ case 87:
+ return (*rw87)(state)
+ case 88:
+ return (*rw88)(state)
+ case 89:
+ return (*rw89)(state)
+ case 90:
+ return (*rw90)(state)
+ case 91:
+ return (*rw91)(state)
+ case 92:
+ return (*rw92)(state)
+ case 93:
+ return (*rw93)(state)
+ case 94:
+ return (*rw94)(state)
+ case 95:
+ return (*rw95)(state)
+ case 96:
+ return (*rw96)(state)
+ case 97:
+ return (*rw97)(state)
+ case 98:
+ return (*rw98)(state)
+ case 99:
+ return (*rw99)(state)
+ case 100:
+ return (*rw100)(state)
+ case 101:
+ return (*rw101)(state)
+ case 102:
+ return (*rw102)(state)
+ case 103:
+ return (*rw103)(state)
+ case 104:
+ return (*rw104)(state)
+ case 105:
+ return (*rw105)(state)
+ case 106:
+ return (*rw106)(state)
+ case 107:
+ return (*rw107)(state)
+ case 108:
+ return (*rw108)(state)
+ case 109:
+ return (*rw109)(state)
+ case 110:
+ return (*rw110)(state)
+ case 111:
+ return (*rw111)(state)
+ case 112:
+ return (*rw112)(state)
+ case 113:
+ return (*rw113)(state)
+ case 114:
+ return (*rw114)(state)
+ case 115:
+ return (*rw115)(state)
+ case 116:
+ return (*rw116)(state)
+ case 117:
+ return (*rw117)(state)
+ case 118:
+ return (*rw118)(state)
+ case 119:
+ return (*rw119)(state)
+ case 120:
+ return (*rw120)(state)
+ case 121:
+ return (*rw121)(state)
+ case 122:
+ return (*rw122)(state)
+ case 123:
+ return (*rw123)(state)
+ case 124:
+ return (*rw124)(state)
+ case 125:
+ return (*rw125)(state)
+ case 126:
+ return (*rw126)(state)
+ case 127:
+ return (*rw127)(state)
+ case 128:
+ return (*rw128)(state)
+ case 129:
+ return (*rw129)(state)
+ case 130:
+ return (*rw130)(state)
+ case 131:
+ return (*rw131)(state)
+ case 132:
+ return (*rw132)(state)
+ case 133:
+ return (*rw133)(state)
+ case 134:
+ return (*rw134)(state)
+ case 135:
+ return (*rw135)(state)
+ case 136:
+ return (*rw136)(state)
+ case 137:
+ return (*rw137)(state)
+ case 138:
+ return (*rw138)(state)
+ case 139:
+ return (*rw139)(state)
+ case 140:
+ return (*rw140)(state)
+ case 141:
+ return (*rw141)(state)
+ case 142:
+ return (*rw142)(state)
+ case 143:
+ return (*rw143)(state)
+ case 144:
+ return (*rw144)(state)
+ case 145:
+ return (*rw145)(state)
+ case 146:
+ return (*rw146)(state)
+ case 147:
+ return (*rw147)(state)
+ case 148:
+ return (*rw148)(state)
+ case 149:
+ return (*rw149)(state)
+ case 150:
+ return (*rw150)(state)
+ case 151:
+ return (*rw151)(state)
+ case 152:
+ return (*rw152)(state)
+ case 153:
+ return (*rw153)(state)
+ case 154:
+ return (*rw154)(state)
+ case 155:
+ return (*rw155)(state)
+ case 156:
+ return (*rw156)(state)
+ case 157:
+ return (*rw157)(state)
+ case 158:
+ return (*rw158)(state)
+ case 159:
+ return (*rw159)(state)
+ case 160:
+ return (*rw160)(state)
+ case 161:
+ return (*rw161)(state)
+ case 162:
+ return (*rw162)(state)
+ case 163:
+ return (*rw163)(state)
+ case 164:
+ return (*rw164)(state)
+ case 165:
+ return (*rw165)(state)
+ case 166:
+ return (*rw166)(state)
+ case 167:
+ return (*rw167)(state)
+ case 168:
+ return (*rw168)(state)
+ case 169:
+ return (*rw169)(state)
+ case 170:
+ return (*rw170)(state)
+ case 171:
+ return (*rw171)(state)
+ case 172:
+ return (*rw172)(state)
+ case 173:
+ return (*rw173)(state)
+ case 174:
+ return (*rw174)(state)
+ case 175:
+ return (*rw175)(state)
+ case 176:
+ return (*rw176)(state)
+ case 177:
+ return (*rw177)(state)
+ case 178:
+ return (*rw178)(state)
+ case 179:
+ return (*rw179)(state)
+ case 180:
+ return (*rw180)(state)
+ case 181:
+ return (*rw181)(state)
+ case 182:
+ return (*rw182)(state)
+ case 183:
+ return (*rw183)(state)
+ case 184:
+ return (*rw184)(state)
+ case 185:
+ return (*rw185)(state)
+ case 186:
+ return (*rw186)(state)
+ case 187:
+ return (*rw187)(state)
+ case 188:
+ return (*rw188)(state)
+ case 189:
+ return (*rw189)(state)
+ case 190:
+ return (*rw190)(state)
+ case 191:
+ return (*rw191)(state)
+ case 192:
+ return (*rw192)(state)
+ case 193:
+ return (*rw193)(state)
+ case 194:
+ return (*rw194)(state)
+ case 195:
+ return (*rw195)(state)
+ case 196:
+ return (*rw196)(state)
+ case 197:
+ return (*rw197)(state)
+ case 198:
+ return (*rw198)(state)
+ case 199:
+ return (*rw199)(state)
+ case 200:
+ return (*rw200)(state)
+ case 201:
+ return (*rw201)(state)
+ case 202:
+ return (*rw202)(state)
+ case 203:
+ return (*rw203)(state)
+ case 204:
+ return (*rw204)(state)
+ case 205:
+ return (*rw205)(state)
+ case 206:
+ return (*rw206)(state)
+ case 207:
+ return (*rw207)(state)
+ case 208:
+ return (*rw208)(state)
+ case 209:
+ return (*rw209)(state)
+ case 210:
+ return (*rw210)(state)
+ case 211:
+ return (*rw211)(state)
+ case 212:
+ return (*rw212)(state)
+ case 213:
+ return (*rw213)(state)
+ case 214:
+ return (*rw214)(state)
+ case 215:
+ return (*rw215)(state)
+ case 216:
+ return (*rw216)(state)
+ case 217:
+ return (*rw217)(state)
+ case 218:
+ return (*rw218)(state)
+ case 219:
+ return (*rw219)(state)
+ case 220:
+ return (*rw220)(state)
+ case 221:
+ return (*rw221)(state)
+ case 222:
+ return (*rw222)(state)
+ case 223:
+ return (*rw223)(state)
+ case 224:
+ return (*rw224)(state)
+ case 225:
+ return (*rw225)(state)
+ case 226:
+ return (*rw226)(state)
+ case 227:
+ return (*rw227)(state)
+ case 228:
+ return (*rw228)(state)
+ case 229:
+ return (*rw229)(state)
+ case 230:
+ return (*rw230)(state)
+ case 231:
+ return (*rw231)(state)
+ case 232:
+ return (*rw232)(state)
+ case 233:
+ return (*rw233)(state)
+ case 234:
+ return (*rw234)(state)
+ case 235:
+ return (*rw235)(state)
+ case 236:
+ return (*rw236)(state)
+ case 237:
+ return (*rw237)(state)
+ case 238:
+ return (*rw238)(state)
+ case 239:
+ return (*rw239)(state)
+ case 240:
+ return (*rw240)(state)
+ case 241:
+ return (*rw241)(state)
+ case 242:
+ return (*rw242)(state)
+ case 243:
+ return (*rw243)(state)
+ case 244:
+ return (*rw244)(state)
+ case 245:
+ return (*rw245)(state)
+ case 246:
+ return (*rw246)(state)
+ case 247:
+ return (*rw247)(state)
+ case 248:
+ return (*rw248)(state)
+ case 249:
+ return (*rw249)(state)
+ case 250:
+ return (*rw250)(state)
+ case 251:
+ return (*rw251)(state)
+ case 252:
+ return (*rw252)(state)
+ case 253:
+ return (*rw253)(state)
+ case 254:
+ return (*rw254)(state)
+ case 255:
+ return (*rw255)(state)
+ case 256:
+ return (*rw256)(state)
+ case 257:
+ return (*rw257)(state)
+ case 258:
+ return (*rw258)(state)
+ case 259:
+ return (*rw259)(state)
+ case 260:
+ return (*rw260)(state)
+ case 261:
+ return (*rw261)(state)
+ case 262:
+ return (*rw262)(state)
+ case 263:
+ return (*rw263)(state)
+ case 264:
+ return (*rw264)(state)
+ case 265:
+ return (*rw265)(state)
+ case 266:
+ return (*rw266)(state)
+ case 267:
+ return (*rw267)(state)
+ case 268:
+ return (*rw268)(state)
+ case 269:
+ return (*rw269)(state)
+ case 270:
+ return (*rw270)(state)
+ case 271:
+ return (*rw271)(state)
+ case 272:
+ return (*rw272)(state)
+ case 273:
+ return (*rw273)(state)
+ case 274:
+ return (*rw274)(state)
+ case 275:
+ return (*rw275)(state)
+ case 276:
+ return (*rw276)(state)
+ case 277:
+ return (*rw277)(state)
+ case 278:
+ return (*rw278)(state)
+ case 279:
+ return (*rw279)(state)
+ case 280:
+ return (*rw280)(state)
+ case 281:
+ return (*rw281)(state)
+ case 282:
+ return (*rw282)(state)
+ case 283:
+ return (*rw283)(state)
+ case 284:
+ return (*rw284)(state)
+ case 285:
+ return (*rw285)(state)
+ case 286:
+ return (*rw286)(state)
+ case 287:
+ return (*rw287)(state)
+ case 288:
+ return (*rw288)(state)
+ case 289:
+ return (*rw289)(state)
+ case 290:
+ return (*rw290)(state)
+ case 291:
+ return (*rw291)(state)
+ case 292:
+ return (*rw292)(state)
+ case 293:
+ return (*rw293)(state)
+ case 294:
+ return (*rw294)(state)
+ case 295:
+ return (*rw295)(state)
+ case 296:
+ return (*rw296)(state)
+ case 297:
+ return (*rw297)(state)
+ case 298:
+ return (*rw298)(state)
+ case 299:
+ return (*rw299)(state)
+ case 300:
+ return (*rw300)(state)
+ case 301:
+ return (*rw301)(state)
+ case 302:
+ return (*rw302)(state)
+ case 303:
+ return (*rw303)(state)
+ case 304:
+ return (*rw304)(state)
+ case 305:
+ return (*rw305)(state)
+ case 306:
+ return (*rw306)(state)
+ case 307:
+ return (*rw307)(state)
+ case 308:
+ return (*rw308)(state)
+ case 309:
+ return (*rw309)(state)
+ case 310:
+ return (*rw310)(state)
+ case 311:
+ return (*rw311)(state)
+ case 312:
+ return (*rw312)(state)
+ case 313:
+ return (*rw313)(state)
+ case 314:
+ return (*rw314)(state)
+ case 315:
+ return (*rw315)(state)
+ case 316:
+ return (*rw316)(state)
+ case 317:
+ return (*rw317)(state)
+ case 318:
+ return (*rw318)(state)
+ case 319:
+ return (*rw319)(state)
+ case 320:
+ return (*rw320)(state)
+ case 321:
+ return (*rw321)(state)
+ case 322:
+ return (*rw322)(state)
+ case 323:
+ return (*rw323)(state)
+ case 324:
+ return (*rw324)(state)
+ case 325:
+ return (*rw325)(state)
+ case 326:
+ return (*rw326)(state)
+ case 327:
+ return (*rw327)(state)
+ case 328:
+ return (*rw328)(state)
+ case 329:
+ return (*rw329)(state)
+ case 330:
+ return (*rw330)(state)
+ case 331:
+ return (*rw331)(state)
+ case 332:
+ return (*rw332)(state)
+ case 333:
+ return (*rw333)(state)
+ case 334:
+ return (*rw334)(state)
+ case 335:
+ return (*rw335)(state)
+ case 336:
+ return (*rw336)(state)
+ case 337:
+ return (*rw337)(state)
+ case 338:
+ return (*rw338)(state)
+ case 339:
+ return (*rw339)(state)
+ case 340:
+ return (*rw340)(state)
+ case 341:
+ return (*rw341)(state)
+ case 342:
+ return (*rw342)(state)
+ case 343:
+ return (*rw343)(state)
+ case 344:
+ return (*rw344)(state)
+ case 345:
+ return (*rw345)(state)
+ case 346:
+ return (*rw346)(state)
+ case 347:
+ return (*rw347)(state)
+ case 348:
+ return (*rw348)(state)
+ case 349:
+ return (*rw349)(state)
+ case 350:
+ return (*rw350)(state)
+ case 351:
+ return (*rw351)(state)
+ case 352:
+ return (*rw352)(state)
+ case 353:
+ return (*rw353)(state)
+ case 354:
+ return (*rw354)(state)
+ case 355:
+ return (*rw355)(state)
+ case 356:
+ return (*rw356)(state)
+ case 357:
+ return (*rw357)(state)
+ case 358:
+ return (*rw358)(state)
+ case 359:
+ return (*rw359)(state)
+ case 360:
+ return (*rw360)(state)
+ case 361:
+ return (*rw361)(state)
+ case 362:
+ return (*rw362)(state)
+ case 363:
+ return (*rw363)(state)
+ case 364:
+ return (*rw364)(state)
+ case 365:
+ return (*rw365)(state)
+ case 366:
+ return (*rw366)(state)
+ case 367:
+ return (*rw367)(state)
+ case 368:
+ return (*rw368)(state)
+ case 369:
+ return (*rw369)(state)
+ case 370:
+ return (*rw370)(state)
+ case 371:
+ return (*rw371)(state)
+ case 372:
+ return (*rw372)(state)
+ case 373:
+ return (*rw373)(state)
+ case 374:
+ return (*rw374)(state)
+ case 375:
+ return (*rw375)(state)
+ case 376:
+ return (*rw376)(state)
+ case 377:
+ return (*rw377)(state)
+ case 378:
+ return (*rw378)(state)
+ case 379:
+ return (*rw379)(state)
+ case 380:
+ return (*rw380)(state)
+ case 381:
+ return (*rw381)(state)
+ case 382:
+ return (*rw382)(state)
+ case 383:
+ return (*rw383)(state)
+ case 384:
+ return (*rw384)(state)
+ case 385:
+ return (*rw385)(state)
+ case 386:
+ return (*rw386)(state)
+ case 387:
+ return (*rw387)(state)
+ case 388:
+ return (*rw388)(state)
+ case 389:
+ return (*rw389)(state)
+ case 390:
+ return (*rw390)(state)
+ case 391:
+ return (*rw391)(state)
+ case 392:
+ return (*rw392)(state)
+ case 393:
+ return (*rw393)(state)
+ case 394:
+ return (*rw394)(state)
+ case 395:
+ return (*rw395)(state)
+ case 396:
+ return (*rw396)(state)
+ case 397:
+ return (*rw397)(state)
+ case 398:
+ return (*rw398)(state)
+ case 399:
+ return (*rw399)(state)
+ case 400:
+ return (*rw400)(state)
+ case 401:
+ return (*rw401)(state)
+ case 402:
+ return (*rw402)(state)
+ case 403:
+ return (*rw403)(state)
+ case 404:
+ return (*rw404)(state)
+ case 405:
+ return (*rw405)(state)
+ case 406:
+ return (*rw406)(state)
+ case 407:
+ return (*rw407)(state)
+ case 408:
+ return (*rw408)(state)
+ case 409:
+ return (*rw409)(state)
+ case 410:
+ return (*rw410)(state)
+ case 411:
+ return (*rw411)(state)
+ case 412:
+ return (*rw412)(state)
+ case 413:
+ return (*rw413)(state)
+ case 414:
+ return (*rw414)(state)
+ case 415:
+ return (*rw415)(state)
+ case 416:
+ return (*rw416)(state)
+ case 417:
+ return (*rw417)(state)
+ case 418:
+ return (*rw418)(state)
+ case 419:
+ return (*rw419)(state)
+ case 420:
+ return (*rw420)(state)
+ case 421:
+ return (*rw421)(state)
+ case 422:
+ return (*rw422)(state)
+ case 423:
+ return (*rw423)(state)
+ case 424:
+ return (*rw424)(state)
+ case 425:
+ return (*rw425)(state)
+ case 426:
+ return (*rw426)(state)
+ case 427:
+ return (*rw427)(state)
+ case 428:
+ return (*rw428)(state)
+ case 429:
+ return (*rw429)(state)
+ case 430:
+ return (*rw430)(state)
+ case 431:
+ return (*rw431)(state)
+ case 432:
+ return (*rw432)(state)
+ case 433:
+ return (*rw433)(state)
+ case 434:
+ return (*rw434)(state)
+ case 435:
+ return (*rw435)(state)
+ case 436:
+ return (*rw436)(state)
+ case 437:
+ return (*rw437)(state)
+ case 438:
+ return (*rw438)(state)
+ case 439:
+ return (*rw439)(state)
+ case 440:
+ return (*rw440)(state)
+ case 441:
+ return (*rw441)(state)
+ case 442:
+ return (*rw442)(state)
+ case 443:
+ return (*rw443)(state)
+ case 444:
+ return (*rw444)(state)
+ case 445:
+ return (*rw445)(state)
+ case 446:
+ return (*rw446)(state)
+ case 447:
+ return (*rw447)(state)
+ case 448:
+ return (*rw448)(state)
+ case 449:
+ return (*rw449)(state)
+ case 450:
+ return (*rw450)(state)
+ case 451:
+ return (*rw451)(state)
+ case 452:
+ return (*rw452)(state)
+ case 453:
+ return (*rw453)(state)
+ case 454:
+ return (*rw454)(state)
+ case 455:
+ return (*rw455)(state)
+ case 456:
+ return (*rw456)(state)
+ case 457:
+ return (*rw457)(state)
+ case 458:
+ return (*rw458)(state)
+ case 459:
+ return (*rw459)(state)
+ case 460:
+ return (*rw460)(state)
+ case 461:
+ return (*rw461)(state)
+ case 462:
+ return (*rw462)(state)
+ case 463:
+ return (*rw463)(state)
+ case 464:
+ return (*rw464)(state)
+ case 465:
+ return (*rw465)(state)
+ case 466:
+ return (*rw466)(state)
+ case 467:
+ return (*rw467)(state)
+ case 468:
+ return (*rw468)(state)
+ case 469:
+ return (*rw469)(state)
+ case 470:
+ return (*rw470)(state)
+ case 471:
+ return (*rw471)(state)
+ case 472:
+ return (*rw472)(state)
+ case 473:
+ return (*rw473)(state)
+ case 474:
+ return (*rw474)(state)
+ case 475:
+ return (*rw475)(state)
+ case 476:
+ return (*rw476)(state)
+ case 477:
+ return (*rw477)(state)
+ case 478:
+ return (*rw478)(state)
+ case 479:
+ return (*rw479)(state)
+ case 480:
+ return (*rw480)(state)
+ case 481:
+ return (*rw481)(state)
+ case 482:
+ return (*rw482)(state)
+ case 483:
+ return (*rw483)(state)
+ case 484:
+ return (*rw484)(state)
+ case 485:
+ return (*rw485)(state)
+ case 486:
+ return (*rw486)(state)
+ case 487:
+ return (*rw487)(state)
+ case 488:
+ return (*rw488)(state)
+ case 489:
+ return (*rw489)(state)
+ case 490:
+ return (*rw490)(state)
+ case 491:
+ return (*rw491)(state)
+ case 492:
+ return (*rw492)(state)
+ case 493:
+ return (*rw493)(state)
+ case 494:
+ return (*rw494)(state)
+ case 495:
+ return (*rw495)(state)
+ case 496:
+ return (*rw496)(state)
+ case 497:
+ return (*rw497)(state)
+ case 498:
+ return (*rw498)(state)
+ case 499:
+ return (*rw499)(state)
+ case 500:
+ return (*rw500)(state)
+ case 501:
+ return (*rw501)(state)
+ case 502:
+ return (*rw502)(state)
+ case 503:
+ return (*rw503)(state)
+ case 504:
+ return (*rw504)(state)
+ case 505:
+ return (*rw505)(state)
+ case 506:
+ return (*rw506)(state)
+ case 507:
+ return (*rw507)(state)
+ case 508:
+ return (*rw508)(state)
+ case 509:
+ return (*rw509)(state)
+ case 510:
+ return (*rw510)(state)
+ case 511:
+ return (*rw511)(state)
+ }
+ panic("unreachable")
+}
+
+type rwState struct {
+ w http.ResponseWriter
+ header HeaderFunc
+ writeHeader WriteHeaderFunc
+ write WriteFunc
+ flush FlushFunc
+ flushError FlushErrorFunc
+ closeNotify CloseNotifyFunc
+ hijack HijackFunc
+ readFrom ReadFromFunc
+ setReadDeadline SetReadDeadlineFunc
+ setWriteDeadline SetWriteDeadlineFunc
+ enableFullDuplex EnableFullDuplexFunc
+ push PushFunc
+ writeString WriteStringFunc
+}
+
+func (r *rwState) doHeader() http.Header {
+ if r.header != nil {
+ return r.header()
+ }
+ return r.w.Header()
+}
+
+func (r *rwState) doWriteHeader(code int) {
+ if r.writeHeader != nil {
+ r.writeHeader(code)
+ return
+ }
+ r.w.WriteHeader(code)
+}
+
+func (r *rwState) doWrite(b []byte) (int, error) {
+ if r.write != nil {
+ return r.write(b)
+ }
+ return r.w.Write(b)
+}
+
+func (r *rwState) doFlush() {
+ if r.flush != nil {
+ r.flush()
+ return
+ }
+ r.w.(http.Flusher).Flush()
+}
+
+func (r *rwState) doFlushError() error {
+ if r.flushError != nil {
+ return r.flushError()
+ }
+ return r.w.(httpFlushError).FlushError()
+}
+
+func (r *rwState) doCloseNotify() <-chan bool {
+ if r.closeNotify != nil {
+ return r.closeNotify()
+ }
+ return r.w.(http.CloseNotifier).CloseNotify()
+}
+
+func (r *rwState) doHijack() (net.Conn, *bufio.ReadWriter, error) {
+ if r.hijack != nil {
+ return r.hijack()
+ }
+ return r.w.(http.Hijacker).Hijack()
+}
+
+func (r *rwState) doReadFrom(src io.Reader) (int64, error) {
+ if r.readFrom != nil {
+ return r.readFrom(src)
+ }
+ return r.w.(io.ReaderFrom).ReadFrom(src)
+}
+
+func (r *rwState) doSetReadDeadline(deadline time.Time) error {
+ if r.setReadDeadline != nil {
+ return r.setReadDeadline(deadline)
+ }
+ return r.w.(deadliner).SetReadDeadline(deadline)
+}
+
+func (r *rwState) doSetWriteDeadline(deadline time.Time) error {
+ if r.setWriteDeadline != nil {
+ return r.setWriteDeadline(deadline)
+ }
+ return r.w.(deadliner).SetWriteDeadline(deadline)
+}
+
+func (r *rwState) doEnableFullDuplex() error {
+ if r.enableFullDuplex != nil {
+ return r.enableFullDuplex()
+ }
+ return r.w.(fullDuplexEnabler).EnableFullDuplex()
+}
+
+func (r *rwState) doPush(target string, opts *http.PushOptions) error {
+ if r.push != nil {
+ return r.push(target, opts)
+ }
+ return r.w.(http.Pusher).Push(target, opts)
+}
+
+func (r *rwState) doWriteString(s string) (int, error) {
+ if r.writeString != nil {
+ return r.writeString(s)
+ }
+ return r.w.(io.StringWriter).WriteString(s)
+}
+
+// combination 1/512: http.ResponseWriter
+type rw0 rwState
+
+func (w *rw0) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw0) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw0) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw0) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+
+// combination 2/512: http.ResponseWriter, io.StringWriter
+type rw1 rwState
+
+func (w *rw1) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw1) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw1) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw1) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw1) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 3/512: http.ResponseWriter, http.Pusher
+type rw2 rwState
+
+func (w *rw2) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw2) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw2) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw2) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw2) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 4/512: http.ResponseWriter, http.Pusher, io.StringWriter
+type rw3 rwState
+
+func (w *rw3) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw3) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw3) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw3) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw3) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw3) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 5/512: http.ResponseWriter, fullDuplexEnabler
+type rw4 rwState
+
+func (w *rw4) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw4) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw4) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw4) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw4) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 6/512: http.ResponseWriter, fullDuplexEnabler, io.StringWriter
+type rw5 rwState
+
+func (w *rw5) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw5) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw5) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw5) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw5) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw5) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 7/512: http.ResponseWriter, fullDuplexEnabler, http.Pusher
+type rw6 rwState
+
+func (w *rw6) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw6) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw6) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw6) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw6) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw6) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 8/512: http.ResponseWriter, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw7 rwState
+
+func (w *rw7) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw7) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw7) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw7) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw7) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw7) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw7) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 9/512: http.ResponseWriter, deadliner
+type rw8 rwState
+
+func (w *rw8) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw8) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw8) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw8) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw8) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw8) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 10/512: http.ResponseWriter, deadliner, io.StringWriter
+type rw9 rwState
+
+func (w *rw9) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw9) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw9) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw9) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw9) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw9) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw9) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 11/512: http.ResponseWriter, deadliner, http.Pusher
+type rw10 rwState
+
+func (w *rw10) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw10) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw10) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw10) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw10) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw10) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw10) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 12/512: http.ResponseWriter, deadliner, http.Pusher, io.StringWriter
+type rw11 rwState
+
+func (w *rw11) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw11) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw11) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw11) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw11) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw11) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw11) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw11) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 13/512: http.ResponseWriter, deadliner, fullDuplexEnabler
+type rw12 rwState
+
+func (w *rw12) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw12) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw12) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw12) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw12) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw12) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw12) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 14/512: http.ResponseWriter, deadliner, fullDuplexEnabler, io.StringWriter
+type rw13 rwState
+
+func (w *rw13) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw13) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw13) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw13) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw13) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw13) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw13) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw13) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 15/512: http.ResponseWriter, deadliner, fullDuplexEnabler, http.Pusher
+type rw14 rwState
+
+func (w *rw14) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw14) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw14) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw14) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw14) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw14) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw14) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw14) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 16/512: http.ResponseWriter, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw15 rwState
+
+func (w *rw15) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw15) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw15) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw15) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw15) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw15) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw15) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw15) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw15) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 17/512: http.ResponseWriter, io.ReaderFrom
+type rw16 rwState
+
+func (w *rw16) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw16) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw16) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw16) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw16) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+
+// combination 18/512: http.ResponseWriter, io.ReaderFrom, io.StringWriter
+type rw17 rwState
+
+func (w *rw17) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw17) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw17) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw17) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw17) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw17) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 19/512: http.ResponseWriter, io.ReaderFrom, http.Pusher
+type rw18 rwState
+
+func (w *rw18) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw18) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw18) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw18) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw18) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw18) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 20/512: http.ResponseWriter, io.ReaderFrom, http.Pusher, io.StringWriter
+type rw19 rwState
+
+func (w *rw19) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw19) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw19) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw19) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw19) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw19) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw19) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 21/512: http.ResponseWriter, io.ReaderFrom, fullDuplexEnabler
+type rw20 rwState
+
+func (w *rw20) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw20) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw20) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw20) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw20) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw20) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 22/512: http.ResponseWriter, io.ReaderFrom, fullDuplexEnabler, io.StringWriter
+type rw21 rwState
+
+func (w *rw21) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw21) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw21) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw21) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw21) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw21) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw21) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 23/512: http.ResponseWriter, io.ReaderFrom, fullDuplexEnabler, http.Pusher
+type rw22 rwState
+
+func (w *rw22) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw22) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw22) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw22) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw22) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw22) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw22) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 24/512: http.ResponseWriter, io.ReaderFrom, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw23 rwState
+
+func (w *rw23) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw23) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw23) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw23) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw23) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw23) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw23) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw23) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 25/512: http.ResponseWriter, io.ReaderFrom, deadliner
+type rw24 rwState
+
+func (w *rw24) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw24) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw24) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw24) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw24) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw24) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw24) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 26/512: http.ResponseWriter, io.ReaderFrom, deadliner, io.StringWriter
+type rw25 rwState
+
+func (w *rw25) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw25) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw25) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw25) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw25) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw25) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw25) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw25) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 27/512: http.ResponseWriter, io.ReaderFrom, deadliner, http.Pusher
+type rw26 rwState
+
+func (w *rw26) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw26) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw26) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw26) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw26) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw26) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw26) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw26) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 28/512: http.ResponseWriter, io.ReaderFrom, deadliner, http.Pusher, io.StringWriter
+type rw27 rwState
+
+func (w *rw27) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw27) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw27) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw27) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw27) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw27) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw27) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw27) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw27) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 29/512: http.ResponseWriter, io.ReaderFrom, deadliner, fullDuplexEnabler
+type rw28 rwState
+
+func (w *rw28) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw28) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw28) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw28) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw28) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw28) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw28) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw28) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 30/512: http.ResponseWriter, io.ReaderFrom, deadliner, fullDuplexEnabler, io.StringWriter
+type rw29 rwState
+
+func (w *rw29) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw29) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw29) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw29) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw29) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw29) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw29) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw29) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw29) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 31/512: http.ResponseWriter, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher
+type rw30 rwState
+
+func (w *rw30) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw30) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw30) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw30) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw30) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw30) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw30) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw30) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw30) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 32/512: http.ResponseWriter, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw31 rwState
+
+func (w *rw31) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw31) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw31) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw31) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw31) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw31) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw31) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw31) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw31) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw31) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 33/512: http.ResponseWriter, http.Hijacker
+type rw32 rwState
+
+func (w *rw32) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw32) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw32) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw32) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw32) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+
+// combination 34/512: http.ResponseWriter, http.Hijacker, io.StringWriter
+type rw33 rwState
+
+func (w *rw33) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw33) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw33) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw33) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw33) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw33) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 35/512: http.ResponseWriter, http.Hijacker, http.Pusher
+type rw34 rwState
+
+func (w *rw34) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw34) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw34) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw34) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw34) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw34) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 36/512: http.ResponseWriter, http.Hijacker, http.Pusher, io.StringWriter
+type rw35 rwState
+
+func (w *rw35) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw35) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw35) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw35) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw35) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw35) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw35) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 37/512: http.ResponseWriter, http.Hijacker, fullDuplexEnabler
+type rw36 rwState
+
+func (w *rw36) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw36) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw36) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw36) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw36) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw36) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 38/512: http.ResponseWriter, http.Hijacker, fullDuplexEnabler, io.StringWriter
+type rw37 rwState
+
+func (w *rw37) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw37) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw37) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw37) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw37) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw37) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw37) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 39/512: http.ResponseWriter, http.Hijacker, fullDuplexEnabler, http.Pusher
+type rw38 rwState
+
+func (w *rw38) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw38) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw38) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw38) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw38) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw38) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw38) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 40/512: http.ResponseWriter, http.Hijacker, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw39 rwState
+
+func (w *rw39) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw39) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw39) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw39) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw39) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw39) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw39) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw39) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 41/512: http.ResponseWriter, http.Hijacker, deadliner
+type rw40 rwState
+
+func (w *rw40) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw40) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw40) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw40) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw40) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw40) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw40) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 42/512: http.ResponseWriter, http.Hijacker, deadliner, io.StringWriter
+type rw41 rwState
+
+func (w *rw41) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw41) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw41) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw41) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw41) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw41) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw41) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw41) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 43/512: http.ResponseWriter, http.Hijacker, deadliner, http.Pusher
+type rw42 rwState
+
+func (w *rw42) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw42) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw42) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw42) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw42) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw42) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw42) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw42) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 44/512: http.ResponseWriter, http.Hijacker, deadliner, http.Pusher, io.StringWriter
+type rw43 rwState
+
+func (w *rw43) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw43) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw43) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw43) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw43) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw43) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw43) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw43) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw43) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 45/512: http.ResponseWriter, http.Hijacker, deadliner, fullDuplexEnabler
+type rw44 rwState
+
+func (w *rw44) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw44) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw44) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw44) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw44) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw44) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw44) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw44) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 46/512: http.ResponseWriter, http.Hijacker, deadliner, fullDuplexEnabler, io.StringWriter
+type rw45 rwState
+
+func (w *rw45) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw45) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw45) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw45) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw45) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw45) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw45) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw45) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw45) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 47/512: http.ResponseWriter, http.Hijacker, deadliner, fullDuplexEnabler, http.Pusher
+type rw46 rwState
+
+func (w *rw46) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw46) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw46) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw46) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw46) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw46) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw46) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw46) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw46) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 48/512: http.ResponseWriter, http.Hijacker, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw47 rwState
+
+func (w *rw47) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw47) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw47) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw47) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw47) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw47) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw47) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw47) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw47) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw47) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 49/512: http.ResponseWriter, http.Hijacker, io.ReaderFrom
+type rw48 rwState
+
+func (w *rw48) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw48) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw48) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw48) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw48) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw48) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+
+// combination 50/512: http.ResponseWriter, http.Hijacker, io.ReaderFrom, io.StringWriter
+type rw49 rwState
+
+func (w *rw49) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw49) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw49) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw49) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw49) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw49) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw49) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 51/512: http.ResponseWriter, http.Hijacker, io.ReaderFrom, http.Pusher
+type rw50 rwState
+
+func (w *rw50) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw50) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw50) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw50) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw50) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw50) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw50) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 52/512: http.ResponseWriter, http.Hijacker, io.ReaderFrom, http.Pusher, io.StringWriter
+type rw51 rwState
+
+func (w *rw51) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw51) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw51) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw51) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw51) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw51) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw51) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw51) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 53/512: http.ResponseWriter, http.Hijacker, io.ReaderFrom, fullDuplexEnabler
+type rw52 rwState
+
+func (w *rw52) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw52) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw52) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw52) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw52) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw52) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw52) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 54/512: http.ResponseWriter, http.Hijacker, io.ReaderFrom, fullDuplexEnabler, io.StringWriter
+type rw53 rwState
+
+func (w *rw53) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw53) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw53) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw53) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw53) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw53) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw53) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw53) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 55/512: http.ResponseWriter, http.Hijacker, io.ReaderFrom, fullDuplexEnabler, http.Pusher
+type rw54 rwState
+
+func (w *rw54) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw54) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw54) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw54) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw54) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw54) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw54) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw54) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 56/512: http.ResponseWriter, http.Hijacker, io.ReaderFrom, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw55 rwState
+
+func (w *rw55) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw55) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw55) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw55) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw55) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw55) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw55) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw55) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw55) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 57/512: http.ResponseWriter, http.Hijacker, io.ReaderFrom, deadliner
+type rw56 rwState
+
+func (w *rw56) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw56) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw56) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw56) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw56) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw56) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw56) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw56) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 58/512: http.ResponseWriter, http.Hijacker, io.ReaderFrom, deadliner, io.StringWriter
+type rw57 rwState
+
+func (w *rw57) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw57) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw57) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw57) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw57) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw57) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw57) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw57) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw57) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 59/512: http.ResponseWriter, http.Hijacker, io.ReaderFrom, deadliner, http.Pusher
+type rw58 rwState
+
+func (w *rw58) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw58) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw58) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw58) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw58) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw58) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw58) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw58) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw58) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 60/512: http.ResponseWriter, http.Hijacker, io.ReaderFrom, deadliner, http.Pusher, io.StringWriter
+type rw59 rwState
+
+func (w *rw59) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw59) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw59) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw59) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw59) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw59) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw59) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw59) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw59) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw59) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 61/512: http.ResponseWriter, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler
+type rw60 rwState
+
+func (w *rw60) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw60) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw60) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw60) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw60) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw60) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw60) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw60) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw60) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 62/512: http.ResponseWriter, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler, io.StringWriter
+type rw61 rwState
+
+func (w *rw61) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw61) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw61) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw61) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw61) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw61) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw61) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw61) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw61) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw61) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 63/512: http.ResponseWriter, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher
+type rw62 rwState
+
+func (w *rw62) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw62) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw62) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw62) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw62) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw62) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw62) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw62) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw62) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw62) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 64/512: http.ResponseWriter, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw63 rwState
+
+func (w *rw63) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw63) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw63) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw63) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw63) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw63) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw63) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw63) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw63) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw63) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw63) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 65/512: http.ResponseWriter, http.CloseNotifier
+type rw64 rwState
+
+func (w *rw64) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw64) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw64) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw64) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw64) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+
+// combination 66/512: http.ResponseWriter, http.CloseNotifier, io.StringWriter
+type rw65 rwState
+
+func (w *rw65) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw65) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw65) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw65) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw65) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw65) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 67/512: http.ResponseWriter, http.CloseNotifier, http.Pusher
+type rw66 rwState
+
+func (w *rw66) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw66) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw66) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw66) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw66) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw66) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 68/512: http.ResponseWriter, http.CloseNotifier, http.Pusher, io.StringWriter
+type rw67 rwState
+
+func (w *rw67) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw67) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw67) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw67) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw67) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw67) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw67) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 69/512: http.ResponseWriter, http.CloseNotifier, fullDuplexEnabler
+type rw68 rwState
+
+func (w *rw68) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw68) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw68) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw68) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw68) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw68) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 70/512: http.ResponseWriter, http.CloseNotifier, fullDuplexEnabler, io.StringWriter
+type rw69 rwState
+
+func (w *rw69) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw69) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw69) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw69) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw69) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw69) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw69) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 71/512: http.ResponseWriter, http.CloseNotifier, fullDuplexEnabler, http.Pusher
+type rw70 rwState
+
+func (w *rw70) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw70) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw70) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw70) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw70) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw70) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw70) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 72/512: http.ResponseWriter, http.CloseNotifier, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw71 rwState
+
+func (w *rw71) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw71) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw71) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw71) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw71) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw71) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw71) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw71) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 73/512: http.ResponseWriter, http.CloseNotifier, deadliner
+type rw72 rwState
+
+func (w *rw72) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw72) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw72) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw72) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw72) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw72) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw72) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 74/512: http.ResponseWriter, http.CloseNotifier, deadliner, io.StringWriter
+type rw73 rwState
+
+func (w *rw73) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw73) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw73) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw73) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw73) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw73) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw73) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw73) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 75/512: http.ResponseWriter, http.CloseNotifier, deadliner, http.Pusher
+type rw74 rwState
+
+func (w *rw74) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw74) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw74) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw74) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw74) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw74) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw74) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw74) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 76/512: http.ResponseWriter, http.CloseNotifier, deadliner, http.Pusher, io.StringWriter
+type rw75 rwState
+
+func (w *rw75) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw75) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw75) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw75) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw75) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw75) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw75) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw75) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw75) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 77/512: http.ResponseWriter, http.CloseNotifier, deadliner, fullDuplexEnabler
+type rw76 rwState
+
+func (w *rw76) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw76) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw76) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw76) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw76) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw76) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw76) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw76) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 78/512: http.ResponseWriter, http.CloseNotifier, deadliner, fullDuplexEnabler, io.StringWriter
+type rw77 rwState
+
+func (w *rw77) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw77) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw77) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw77) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw77) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw77) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw77) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw77) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw77) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 79/512: http.ResponseWriter, http.CloseNotifier, deadliner, fullDuplexEnabler, http.Pusher
+type rw78 rwState
+
+func (w *rw78) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw78) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw78) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw78) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw78) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw78) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw78) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw78) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw78) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 80/512: http.ResponseWriter, http.CloseNotifier, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw79 rwState
+
+func (w *rw79) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw79) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw79) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw79) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw79) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw79) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw79) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw79) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw79) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw79) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 81/512: http.ResponseWriter, http.CloseNotifier, io.ReaderFrom
+type rw80 rwState
+
+func (w *rw80) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw80) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw80) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw80) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw80) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw80) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+
+// combination 82/512: http.ResponseWriter, http.CloseNotifier, io.ReaderFrom, io.StringWriter
+type rw81 rwState
+
+func (w *rw81) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw81) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw81) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw81) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw81) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw81) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw81) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 83/512: http.ResponseWriter, http.CloseNotifier, io.ReaderFrom, http.Pusher
+type rw82 rwState
+
+func (w *rw82) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw82) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw82) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw82) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw82) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw82) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw82) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 84/512: http.ResponseWriter, http.CloseNotifier, io.ReaderFrom, http.Pusher, io.StringWriter
+type rw83 rwState
+
+func (w *rw83) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw83) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw83) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw83) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw83) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw83) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw83) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw83) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 85/512: http.ResponseWriter, http.CloseNotifier, io.ReaderFrom, fullDuplexEnabler
+type rw84 rwState
+
+func (w *rw84) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw84) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw84) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw84) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw84) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw84) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw84) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 86/512: http.ResponseWriter, http.CloseNotifier, io.ReaderFrom, fullDuplexEnabler, io.StringWriter
+type rw85 rwState
+
+func (w *rw85) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw85) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw85) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw85) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw85) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw85) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw85) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw85) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 87/512: http.ResponseWriter, http.CloseNotifier, io.ReaderFrom, fullDuplexEnabler, http.Pusher
+type rw86 rwState
+
+func (w *rw86) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw86) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw86) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw86) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw86) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw86) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw86) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw86) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 88/512: http.ResponseWriter, http.CloseNotifier, io.ReaderFrom, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw87 rwState
+
+func (w *rw87) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw87) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw87) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw87) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw87) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw87) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw87) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw87) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw87) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 89/512: http.ResponseWriter, http.CloseNotifier, io.ReaderFrom, deadliner
+type rw88 rwState
+
+func (w *rw88) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw88) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw88) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw88) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw88) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw88) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw88) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw88) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 90/512: http.ResponseWriter, http.CloseNotifier, io.ReaderFrom, deadliner, io.StringWriter
+type rw89 rwState
+
+func (w *rw89) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw89) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw89) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw89) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw89) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw89) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw89) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw89) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw89) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 91/512: http.ResponseWriter, http.CloseNotifier, io.ReaderFrom, deadliner, http.Pusher
+type rw90 rwState
+
+func (w *rw90) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw90) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw90) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw90) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw90) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw90) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw90) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw90) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw90) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 92/512: http.ResponseWriter, http.CloseNotifier, io.ReaderFrom, deadliner, http.Pusher, io.StringWriter
+type rw91 rwState
+
+func (w *rw91) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw91) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw91) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw91) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw91) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw91) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw91) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw91) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw91) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw91) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 93/512: http.ResponseWriter, http.CloseNotifier, io.ReaderFrom, deadliner, fullDuplexEnabler
+type rw92 rwState
+
+func (w *rw92) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw92) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw92) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw92) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw92) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw92) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw92) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw92) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw92) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 94/512: http.ResponseWriter, http.CloseNotifier, io.ReaderFrom, deadliner, fullDuplexEnabler, io.StringWriter
+type rw93 rwState
+
+func (w *rw93) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw93) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw93) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw93) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw93) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw93) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw93) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw93) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw93) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw93) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 95/512: http.ResponseWriter, http.CloseNotifier, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher
+type rw94 rwState
+
+func (w *rw94) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw94) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw94) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw94) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw94) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw94) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw94) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw94) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw94) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw94) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 96/512: http.ResponseWriter, http.CloseNotifier, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw95 rwState
+
+func (w *rw95) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw95) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw95) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw95) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw95) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw95) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw95) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw95) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw95) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw95) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw95) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 97/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker
+type rw96 rwState
+
+func (w *rw96) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw96) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw96) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw96) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw96) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw96) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+
+// combination 98/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, io.StringWriter
+type rw97 rwState
+
+func (w *rw97) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw97) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw97) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw97) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw97) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw97) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw97) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 99/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, http.Pusher
+type rw98 rwState
+
+func (w *rw98) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw98) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw98) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw98) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw98) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw98) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw98) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 100/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, http.Pusher, io.StringWriter
+type rw99 rwState
+
+func (w *rw99) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw99) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw99) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw99) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw99) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw99) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw99) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw99) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 101/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, fullDuplexEnabler
+type rw100 rwState
+
+func (w *rw100) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw100) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw100) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw100) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw100) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw100) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw100) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 102/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, fullDuplexEnabler, io.StringWriter
+type rw101 rwState
+
+func (w *rw101) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw101) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw101) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw101) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw101) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw101) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw101) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw101) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 103/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, fullDuplexEnabler, http.Pusher
+type rw102 rwState
+
+func (w *rw102) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw102) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw102) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw102) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw102) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw102) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw102) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw102) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 104/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw103 rwState
+
+func (w *rw103) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw103) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw103) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw103) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw103) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw103) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw103) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw103) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw103) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 105/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, deadliner
+type rw104 rwState
+
+func (w *rw104) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw104) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw104) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw104) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw104) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw104) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw104) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw104) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 106/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, deadliner, io.StringWriter
+type rw105 rwState
+
+func (w *rw105) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw105) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw105) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw105) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw105) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw105) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw105) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw105) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw105) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 107/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, deadliner, http.Pusher
+type rw106 rwState
+
+func (w *rw106) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw106) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw106) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw106) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw106) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw106) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw106) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw106) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw106) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 108/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, deadliner, http.Pusher, io.StringWriter
+type rw107 rwState
+
+func (w *rw107) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw107) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw107) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw107) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw107) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw107) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw107) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw107) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw107) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw107) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 109/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, deadliner, fullDuplexEnabler
+type rw108 rwState
+
+func (w *rw108) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw108) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw108) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw108) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw108) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw108) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw108) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw108) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw108) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 110/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, deadliner, fullDuplexEnabler, io.StringWriter
+type rw109 rwState
+
+func (w *rw109) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw109) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw109) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw109) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw109) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw109) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw109) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw109) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw109) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw109) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 111/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, deadliner, fullDuplexEnabler, http.Pusher
+type rw110 rwState
+
+func (w *rw110) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw110) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw110) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw110) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw110) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw110) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw110) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw110) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw110) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw110) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 112/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw111 rwState
+
+func (w *rw111) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw111) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw111) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw111) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw111) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw111) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw111) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw111) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw111) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw111) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw111) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 113/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, io.ReaderFrom
+type rw112 rwState
+
+func (w *rw112) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw112) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw112) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw112) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw112) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw112) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw112) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+
+// combination 114/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, io.ReaderFrom, io.StringWriter
+type rw113 rwState
+
+func (w *rw113) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw113) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw113) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw113) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw113) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw113) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw113) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw113) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 115/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, io.ReaderFrom, http.Pusher
+type rw114 rwState
+
+func (w *rw114) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw114) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw114) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw114) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw114) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw114) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw114) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw114) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 116/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, io.ReaderFrom, http.Pusher, io.StringWriter
+type rw115 rwState
+
+func (w *rw115) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw115) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw115) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw115) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw115) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw115) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw115) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw115) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw115) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 117/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, io.ReaderFrom, fullDuplexEnabler
+type rw116 rwState
+
+func (w *rw116) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw116) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw116) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw116) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw116) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw116) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw116) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw116) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 118/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, io.ReaderFrom, fullDuplexEnabler, io.StringWriter
+type rw117 rwState
+
+func (w *rw117) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw117) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw117) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw117) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw117) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw117) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw117) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw117) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw117) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 119/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, io.ReaderFrom, fullDuplexEnabler, http.Pusher
+type rw118 rwState
+
+func (w *rw118) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw118) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw118) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw118) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw118) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw118) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw118) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw118) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw118) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 120/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, io.ReaderFrom, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw119 rwState
+
+func (w *rw119) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw119) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw119) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw119) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw119) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw119) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw119) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw119) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw119) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw119) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 121/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner
+type rw120 rwState
+
+func (w *rw120) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw120) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw120) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw120) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw120) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw120) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw120) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw120) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw120) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 122/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, io.StringWriter
+type rw121 rwState
+
+func (w *rw121) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw121) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw121) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw121) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw121) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw121) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw121) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw121) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw121) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw121) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 123/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, http.Pusher
+type rw122 rwState
+
+func (w *rw122) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw122) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw122) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw122) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw122) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw122) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw122) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw122) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw122) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw122) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 124/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, http.Pusher, io.StringWriter
+type rw123 rwState
+
+func (w *rw123) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw123) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw123) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw123) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw123) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw123) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw123) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw123) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw123) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw123) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw123) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 125/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler
+type rw124 rwState
+
+func (w *rw124) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw124) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw124) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw124) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw124) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw124) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw124) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw124) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw124) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw124) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 126/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler, io.StringWriter
+type rw125 rwState
+
+func (w *rw125) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw125) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw125) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw125) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw125) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw125) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw125) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw125) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw125) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw125) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw125) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 127/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher
+type rw126 rwState
+
+func (w *rw126) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw126) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw126) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw126) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw126) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw126) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw126) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw126) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw126) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw126) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw126) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 128/512: http.ResponseWriter, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw127 rwState
+
+func (w *rw127) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw127) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw127) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw127) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw127) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw127) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw127) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw127) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw127) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw127) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw127) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw127) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 129/512: http.ResponseWriter, httpFlushError
+type rw128 rwState
+
+func (w *rw128) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw128) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw128) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw128) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw128) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+
+// combination 130/512: http.ResponseWriter, httpFlushError, io.StringWriter
+type rw129 rwState
+
+func (w *rw129) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw129) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw129) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw129) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw129) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw129) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 131/512: http.ResponseWriter, httpFlushError, http.Pusher
+type rw130 rwState
+
+func (w *rw130) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw130) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw130) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw130) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw130) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw130) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 132/512: http.ResponseWriter, httpFlushError, http.Pusher, io.StringWriter
+type rw131 rwState
+
+func (w *rw131) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw131) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw131) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw131) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw131) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw131) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw131) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 133/512: http.ResponseWriter, httpFlushError, fullDuplexEnabler
+type rw132 rwState
+
+func (w *rw132) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw132) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw132) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw132) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw132) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw132) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 134/512: http.ResponseWriter, httpFlushError, fullDuplexEnabler, io.StringWriter
+type rw133 rwState
+
+func (w *rw133) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw133) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw133) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw133) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw133) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw133) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw133) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 135/512: http.ResponseWriter, httpFlushError, fullDuplexEnabler, http.Pusher
+type rw134 rwState
+
+func (w *rw134) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw134) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw134) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw134) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw134) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw134) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw134) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 136/512: http.ResponseWriter, httpFlushError, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw135 rwState
+
+func (w *rw135) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw135) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw135) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw135) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw135) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw135) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw135) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw135) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 137/512: http.ResponseWriter, httpFlushError, deadliner
+type rw136 rwState
+
+func (w *rw136) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw136) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw136) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw136) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw136) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw136) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw136) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 138/512: http.ResponseWriter, httpFlushError, deadliner, io.StringWriter
+type rw137 rwState
+
+func (w *rw137) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw137) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw137) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw137) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw137) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw137) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw137) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw137) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 139/512: http.ResponseWriter, httpFlushError, deadliner, http.Pusher
+type rw138 rwState
+
+func (w *rw138) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw138) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw138) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw138) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw138) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw138) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw138) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw138) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 140/512: http.ResponseWriter, httpFlushError, deadliner, http.Pusher, io.StringWriter
+type rw139 rwState
+
+func (w *rw139) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw139) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw139) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw139) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw139) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw139) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw139) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw139) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw139) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 141/512: http.ResponseWriter, httpFlushError, deadliner, fullDuplexEnabler
+type rw140 rwState
+
+func (w *rw140) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw140) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw140) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw140) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw140) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw140) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw140) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw140) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 142/512: http.ResponseWriter, httpFlushError, deadliner, fullDuplexEnabler, io.StringWriter
+type rw141 rwState
+
+func (w *rw141) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw141) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw141) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw141) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw141) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw141) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw141) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw141) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw141) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 143/512: http.ResponseWriter, httpFlushError, deadliner, fullDuplexEnabler, http.Pusher
+type rw142 rwState
+
+func (w *rw142) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw142) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw142) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw142) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw142) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw142) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw142) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw142) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw142) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 144/512: http.ResponseWriter, httpFlushError, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw143 rwState
+
+func (w *rw143) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw143) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw143) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw143) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw143) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw143) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw143) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw143) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw143) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw143) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 145/512: http.ResponseWriter, httpFlushError, io.ReaderFrom
+type rw144 rwState
+
+func (w *rw144) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw144) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw144) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw144) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw144) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw144) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+
+// combination 146/512: http.ResponseWriter, httpFlushError, io.ReaderFrom, io.StringWriter
+type rw145 rwState
+
+func (w *rw145) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw145) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw145) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw145) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw145) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw145) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw145) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 147/512: http.ResponseWriter, httpFlushError, io.ReaderFrom, http.Pusher
+type rw146 rwState
+
+func (w *rw146) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw146) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw146) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw146) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw146) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw146) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw146) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 148/512: http.ResponseWriter, httpFlushError, io.ReaderFrom, http.Pusher, io.StringWriter
+type rw147 rwState
+
+func (w *rw147) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw147) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw147) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw147) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw147) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw147) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw147) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw147) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 149/512: http.ResponseWriter, httpFlushError, io.ReaderFrom, fullDuplexEnabler
+type rw148 rwState
+
+func (w *rw148) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw148) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw148) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw148) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw148) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw148) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw148) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 150/512: http.ResponseWriter, httpFlushError, io.ReaderFrom, fullDuplexEnabler, io.StringWriter
+type rw149 rwState
+
+func (w *rw149) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw149) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw149) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw149) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw149) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw149) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw149) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw149) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 151/512: http.ResponseWriter, httpFlushError, io.ReaderFrom, fullDuplexEnabler, http.Pusher
+type rw150 rwState
+
+func (w *rw150) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw150) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw150) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw150) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw150) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw150) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw150) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw150) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 152/512: http.ResponseWriter, httpFlushError, io.ReaderFrom, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw151 rwState
+
+func (w *rw151) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw151) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw151) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw151) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw151) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw151) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw151) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw151) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw151) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 153/512: http.ResponseWriter, httpFlushError, io.ReaderFrom, deadliner
+type rw152 rwState
+
+func (w *rw152) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw152) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw152) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw152) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw152) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw152) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw152) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw152) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 154/512: http.ResponseWriter, httpFlushError, io.ReaderFrom, deadliner, io.StringWriter
+type rw153 rwState
+
+func (w *rw153) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw153) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw153) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw153) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw153) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw153) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw153) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw153) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw153) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 155/512: http.ResponseWriter, httpFlushError, io.ReaderFrom, deadliner, http.Pusher
+type rw154 rwState
+
+func (w *rw154) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw154) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw154) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw154) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw154) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw154) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw154) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw154) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw154) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 156/512: http.ResponseWriter, httpFlushError, io.ReaderFrom, deadliner, http.Pusher, io.StringWriter
+type rw155 rwState
+
+func (w *rw155) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw155) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw155) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw155) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw155) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw155) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw155) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw155) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw155) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw155) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 157/512: http.ResponseWriter, httpFlushError, io.ReaderFrom, deadliner, fullDuplexEnabler
+type rw156 rwState
+
+func (w *rw156) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw156) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw156) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw156) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw156) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw156) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw156) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw156) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw156) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 158/512: http.ResponseWriter, httpFlushError, io.ReaderFrom, deadliner, fullDuplexEnabler, io.StringWriter
+type rw157 rwState
+
+func (w *rw157) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw157) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw157) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw157) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw157) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw157) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw157) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw157) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw157) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw157) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 159/512: http.ResponseWriter, httpFlushError, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher
+type rw158 rwState
+
+func (w *rw158) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw158) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw158) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw158) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw158) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw158) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw158) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw158) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw158) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw158) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 160/512: http.ResponseWriter, httpFlushError, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw159 rwState
+
+func (w *rw159) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw159) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw159) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw159) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw159) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw159) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw159) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw159) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw159) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw159) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw159) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 161/512: http.ResponseWriter, httpFlushError, http.Hijacker
+type rw160 rwState
+
+func (w *rw160) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw160) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw160) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw160) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw160) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw160) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+
+// combination 162/512: http.ResponseWriter, httpFlushError, http.Hijacker, io.StringWriter
+type rw161 rwState
+
+func (w *rw161) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw161) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw161) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw161) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw161) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw161) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw161) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 163/512: http.ResponseWriter, httpFlushError, http.Hijacker, http.Pusher
+type rw162 rwState
+
+func (w *rw162) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw162) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw162) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw162) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw162) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw162) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw162) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 164/512: http.ResponseWriter, httpFlushError, http.Hijacker, http.Pusher, io.StringWriter
+type rw163 rwState
+
+func (w *rw163) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw163) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw163) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw163) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw163) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw163) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw163) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw163) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 165/512: http.ResponseWriter, httpFlushError, http.Hijacker, fullDuplexEnabler
+type rw164 rwState
+
+func (w *rw164) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw164) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw164) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw164) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw164) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw164) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw164) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 166/512: http.ResponseWriter, httpFlushError, http.Hijacker, fullDuplexEnabler, io.StringWriter
+type rw165 rwState
+
+func (w *rw165) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw165) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw165) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw165) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw165) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw165) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw165) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw165) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 167/512: http.ResponseWriter, httpFlushError, http.Hijacker, fullDuplexEnabler, http.Pusher
+type rw166 rwState
+
+func (w *rw166) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw166) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw166) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw166) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw166) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw166) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw166) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw166) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 168/512: http.ResponseWriter, httpFlushError, http.Hijacker, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw167 rwState
+
+func (w *rw167) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw167) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw167) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw167) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw167) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw167) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw167) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw167) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw167) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 169/512: http.ResponseWriter, httpFlushError, http.Hijacker, deadliner
+type rw168 rwState
+
+func (w *rw168) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw168) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw168) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw168) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw168) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw168) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw168) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw168) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 170/512: http.ResponseWriter, httpFlushError, http.Hijacker, deadliner, io.StringWriter
+type rw169 rwState
+
+func (w *rw169) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw169) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw169) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw169) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw169) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw169) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw169) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw169) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw169) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 171/512: http.ResponseWriter, httpFlushError, http.Hijacker, deadliner, http.Pusher
+type rw170 rwState
+
+func (w *rw170) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw170) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw170) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw170) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw170) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw170) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw170) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw170) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw170) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 172/512: http.ResponseWriter, httpFlushError, http.Hijacker, deadliner, http.Pusher, io.StringWriter
+type rw171 rwState
+
+func (w *rw171) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw171) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw171) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw171) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw171) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw171) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw171) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw171) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw171) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw171) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 173/512: http.ResponseWriter, httpFlushError, http.Hijacker, deadliner, fullDuplexEnabler
+type rw172 rwState
+
+func (w *rw172) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw172) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw172) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw172) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw172) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw172) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw172) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw172) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw172) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 174/512: http.ResponseWriter, httpFlushError, http.Hijacker, deadliner, fullDuplexEnabler, io.StringWriter
+type rw173 rwState
+
+func (w *rw173) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw173) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw173) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw173) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw173) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw173) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw173) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw173) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw173) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw173) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 175/512: http.ResponseWriter, httpFlushError, http.Hijacker, deadliner, fullDuplexEnabler, http.Pusher
+type rw174 rwState
+
+func (w *rw174) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw174) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw174) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw174) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw174) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw174) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw174) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw174) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw174) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw174) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 176/512: http.ResponseWriter, httpFlushError, http.Hijacker, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw175 rwState
+
+func (w *rw175) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw175) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw175) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw175) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw175) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw175) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw175) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw175) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw175) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw175) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw175) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 177/512: http.ResponseWriter, httpFlushError, http.Hijacker, io.ReaderFrom
+type rw176 rwState
+
+func (w *rw176) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw176) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw176) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw176) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw176) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw176) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw176) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+
+// combination 178/512: http.ResponseWriter, httpFlushError, http.Hijacker, io.ReaderFrom, io.StringWriter
+type rw177 rwState
+
+func (w *rw177) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw177) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw177) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw177) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw177) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw177) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw177) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw177) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 179/512: http.ResponseWriter, httpFlushError, http.Hijacker, io.ReaderFrom, http.Pusher
+type rw178 rwState
+
+func (w *rw178) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw178) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw178) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw178) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw178) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw178) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw178) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw178) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 180/512: http.ResponseWriter, httpFlushError, http.Hijacker, io.ReaderFrom, http.Pusher, io.StringWriter
+type rw179 rwState
+
+func (w *rw179) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw179) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw179) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw179) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw179) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw179) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw179) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw179) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw179) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 181/512: http.ResponseWriter, httpFlushError, http.Hijacker, io.ReaderFrom, fullDuplexEnabler
+type rw180 rwState
+
+func (w *rw180) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw180) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw180) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw180) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw180) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw180) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw180) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw180) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 182/512: http.ResponseWriter, httpFlushError, http.Hijacker, io.ReaderFrom, fullDuplexEnabler, io.StringWriter
+type rw181 rwState
+
+func (w *rw181) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw181) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw181) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw181) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw181) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw181) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw181) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw181) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw181) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 183/512: http.ResponseWriter, httpFlushError, http.Hijacker, io.ReaderFrom, fullDuplexEnabler, http.Pusher
+type rw182 rwState
+
+func (w *rw182) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw182) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw182) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw182) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw182) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw182) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw182) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw182) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw182) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 184/512: http.ResponseWriter, httpFlushError, http.Hijacker, io.ReaderFrom, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw183 rwState
+
+func (w *rw183) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw183) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw183) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw183) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw183) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw183) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw183) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw183) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw183) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw183) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 185/512: http.ResponseWriter, httpFlushError, http.Hijacker, io.ReaderFrom, deadliner
+type rw184 rwState
+
+func (w *rw184) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw184) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw184) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw184) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw184) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw184) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw184) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw184) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw184) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 186/512: http.ResponseWriter, httpFlushError, http.Hijacker, io.ReaderFrom, deadliner, io.StringWriter
+type rw185 rwState
+
+func (w *rw185) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw185) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw185) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw185) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw185) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw185) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw185) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw185) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw185) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw185) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 187/512: http.ResponseWriter, httpFlushError, http.Hijacker, io.ReaderFrom, deadliner, http.Pusher
+type rw186 rwState
+
+func (w *rw186) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw186) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw186) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw186) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw186) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw186) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw186) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw186) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw186) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw186) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 188/512: http.ResponseWriter, httpFlushError, http.Hijacker, io.ReaderFrom, deadliner, http.Pusher, io.StringWriter
+type rw187 rwState
+
+func (w *rw187) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw187) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw187) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw187) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw187) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw187) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw187) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw187) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw187) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw187) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw187) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 189/512: http.ResponseWriter, httpFlushError, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler
+type rw188 rwState
+
+func (w *rw188) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw188) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw188) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw188) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw188) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw188) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw188) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw188) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw188) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw188) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 190/512: http.ResponseWriter, httpFlushError, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler, io.StringWriter
+type rw189 rwState
+
+func (w *rw189) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw189) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw189) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw189) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw189) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw189) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw189) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw189) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw189) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw189) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw189) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 191/512: http.ResponseWriter, httpFlushError, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher
+type rw190 rwState
+
+func (w *rw190) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw190) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw190) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw190) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw190) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw190) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw190) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw190) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw190) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw190) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw190) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 192/512: http.ResponseWriter, httpFlushError, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw191 rwState
+
+func (w *rw191) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw191) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw191) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw191) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw191) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw191) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw191) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw191) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw191) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw191) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw191) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw191) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 193/512: http.ResponseWriter, httpFlushError, http.CloseNotifier
+type rw192 rwState
+
+func (w *rw192) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw192) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw192) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw192) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw192) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw192) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+
+// combination 194/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, io.StringWriter
+type rw193 rwState
+
+func (w *rw193) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw193) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw193) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw193) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw193) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw193) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw193) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 195/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Pusher
+type rw194 rwState
+
+func (w *rw194) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw194) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw194) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw194) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw194) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw194) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw194) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 196/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Pusher, io.StringWriter
+type rw195 rwState
+
+func (w *rw195) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw195) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw195) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw195) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw195) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw195) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw195) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw195) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 197/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, fullDuplexEnabler
+type rw196 rwState
+
+func (w *rw196) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw196) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw196) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw196) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw196) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw196) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw196) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 198/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, fullDuplexEnabler, io.StringWriter
+type rw197 rwState
+
+func (w *rw197) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw197) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw197) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw197) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw197) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw197) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw197) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw197) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 199/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, fullDuplexEnabler, http.Pusher
+type rw198 rwState
+
+func (w *rw198) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw198) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw198) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw198) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw198) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw198) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw198) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw198) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 200/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw199 rwState
+
+func (w *rw199) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw199) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw199) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw199) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw199) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw199) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw199) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw199) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw199) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 201/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, deadliner
+type rw200 rwState
+
+func (w *rw200) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw200) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw200) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw200) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw200) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw200) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw200) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw200) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 202/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, deadliner, io.StringWriter
+type rw201 rwState
+
+func (w *rw201) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw201) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw201) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw201) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw201) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw201) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw201) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw201) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw201) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 203/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, deadliner, http.Pusher
+type rw202 rwState
+
+func (w *rw202) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw202) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw202) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw202) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw202) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw202) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw202) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw202) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw202) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 204/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, deadliner, http.Pusher, io.StringWriter
+type rw203 rwState
+
+func (w *rw203) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw203) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw203) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw203) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw203) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw203) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw203) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw203) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw203) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw203) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 205/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, deadliner, fullDuplexEnabler
+type rw204 rwState
+
+func (w *rw204) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw204) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw204) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw204) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw204) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw204) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw204) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw204) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw204) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 206/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, deadliner, fullDuplexEnabler, io.StringWriter
+type rw205 rwState
+
+func (w *rw205) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw205) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw205) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw205) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw205) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw205) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw205) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw205) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw205) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw205) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 207/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, deadliner, fullDuplexEnabler, http.Pusher
+type rw206 rwState
+
+func (w *rw206) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw206) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw206) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw206) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw206) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw206) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw206) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw206) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw206) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw206) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 208/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw207 rwState
+
+func (w *rw207) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw207) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw207) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw207) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw207) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw207) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw207) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw207) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw207) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw207) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw207) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 209/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, io.ReaderFrom
+type rw208 rwState
+
+func (w *rw208) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw208) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw208) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw208) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw208) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw208) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw208) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+
+// combination 210/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, io.ReaderFrom, io.StringWriter
+type rw209 rwState
+
+func (w *rw209) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw209) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw209) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw209) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw209) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw209) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw209) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw209) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 211/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, io.ReaderFrom, http.Pusher
+type rw210 rwState
+
+func (w *rw210) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw210) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw210) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw210) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw210) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw210) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw210) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw210) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 212/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, io.ReaderFrom, http.Pusher, io.StringWriter
+type rw211 rwState
+
+func (w *rw211) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw211) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw211) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw211) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw211) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw211) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw211) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw211) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw211) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 213/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, io.ReaderFrom, fullDuplexEnabler
+type rw212 rwState
+
+func (w *rw212) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw212) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw212) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw212) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw212) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw212) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw212) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw212) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 214/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, io.ReaderFrom, fullDuplexEnabler, io.StringWriter
+type rw213 rwState
+
+func (w *rw213) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw213) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw213) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw213) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw213) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw213) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw213) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw213) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw213) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 215/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, io.ReaderFrom, fullDuplexEnabler, http.Pusher
+type rw214 rwState
+
+func (w *rw214) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw214) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw214) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw214) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw214) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw214) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw214) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw214) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw214) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 216/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, io.ReaderFrom, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw215 rwState
+
+func (w *rw215) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw215) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw215) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw215) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw215) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw215) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw215) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw215) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw215) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw215) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 217/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, io.ReaderFrom, deadliner
+type rw216 rwState
+
+func (w *rw216) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw216) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw216) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw216) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw216) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw216) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw216) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw216) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw216) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 218/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, io.ReaderFrom, deadliner, io.StringWriter
+type rw217 rwState
+
+func (w *rw217) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw217) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw217) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw217) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw217) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw217) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw217) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw217) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw217) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw217) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 219/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, io.ReaderFrom, deadliner, http.Pusher
+type rw218 rwState
+
+func (w *rw218) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw218) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw218) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw218) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw218) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw218) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw218) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw218) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw218) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw218) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 220/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, io.ReaderFrom, deadliner, http.Pusher, io.StringWriter
+type rw219 rwState
+
+func (w *rw219) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw219) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw219) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw219) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw219) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw219) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw219) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw219) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw219) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw219) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw219) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 221/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, io.ReaderFrom, deadliner, fullDuplexEnabler
+type rw220 rwState
+
+func (w *rw220) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw220) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw220) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw220) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw220) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw220) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw220) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw220) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw220) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw220) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 222/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, io.ReaderFrom, deadliner, fullDuplexEnabler, io.StringWriter
+type rw221 rwState
+
+func (w *rw221) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw221) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw221) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw221) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw221) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw221) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw221) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw221) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw221) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw221) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw221) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 223/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher
+type rw222 rwState
+
+func (w *rw222) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw222) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw222) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw222) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw222) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw222) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw222) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw222) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw222) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw222) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw222) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 224/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw223 rwState
+
+func (w *rw223) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw223) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw223) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw223) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw223) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw223) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw223) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw223) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw223) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw223) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw223) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw223) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 225/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker
+type rw224 rwState
+
+func (w *rw224) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw224) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw224) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw224) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw224) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw224) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw224) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+
+// combination 226/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, io.StringWriter
+type rw225 rwState
+
+func (w *rw225) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw225) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw225) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw225) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw225) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw225) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw225) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw225) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 227/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, http.Pusher
+type rw226 rwState
+
+func (w *rw226) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw226) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw226) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw226) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw226) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw226) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw226) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw226) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 228/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, http.Pusher, io.StringWriter
+type rw227 rwState
+
+func (w *rw227) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw227) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw227) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw227) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw227) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw227) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw227) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw227) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw227) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 229/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, fullDuplexEnabler
+type rw228 rwState
+
+func (w *rw228) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw228) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw228) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw228) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw228) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw228) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw228) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw228) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 230/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, fullDuplexEnabler, io.StringWriter
+type rw229 rwState
+
+func (w *rw229) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw229) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw229) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw229) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw229) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw229) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw229) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw229) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw229) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 231/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, fullDuplexEnabler, http.Pusher
+type rw230 rwState
+
+func (w *rw230) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw230) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw230) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw230) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw230) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw230) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw230) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw230) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw230) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 232/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw231 rwState
+
+func (w *rw231) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw231) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw231) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw231) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw231) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw231) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw231) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw231) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw231) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw231) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 233/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, deadliner
+type rw232 rwState
+
+func (w *rw232) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw232) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw232) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw232) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw232) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw232) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw232) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw232) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw232) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 234/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, deadliner, io.StringWriter
+type rw233 rwState
+
+func (w *rw233) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw233) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw233) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw233) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw233) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw233) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw233) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw233) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw233) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw233) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 235/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, deadliner, http.Pusher
+type rw234 rwState
+
+func (w *rw234) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw234) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw234) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw234) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw234) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw234) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw234) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw234) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw234) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw234) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 236/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, deadliner, http.Pusher, io.StringWriter
+type rw235 rwState
+
+func (w *rw235) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw235) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw235) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw235) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw235) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw235) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw235) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw235) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw235) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw235) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw235) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 237/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, deadliner, fullDuplexEnabler
+type rw236 rwState
+
+func (w *rw236) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw236) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw236) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw236) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw236) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw236) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw236) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw236) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw236) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw236) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 238/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, deadliner, fullDuplexEnabler, io.StringWriter
+type rw237 rwState
+
+func (w *rw237) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw237) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw237) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw237) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw237) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw237) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw237) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw237) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw237) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw237) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw237) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 239/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, deadliner, fullDuplexEnabler, http.Pusher
+type rw238 rwState
+
+func (w *rw238) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw238) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw238) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw238) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw238) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw238) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw238) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw238) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw238) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw238) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw238) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 240/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw239 rwState
+
+func (w *rw239) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw239) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw239) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw239) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw239) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw239) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw239) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw239) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw239) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw239) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw239) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw239) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 241/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom
+type rw240 rwState
+
+func (w *rw240) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw240) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw240) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw240) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw240) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw240) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw240) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw240) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+
+// combination 242/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, io.StringWriter
+type rw241 rwState
+
+func (w *rw241) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw241) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw241) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw241) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw241) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw241) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw241) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw241) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw241) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 243/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, http.Pusher
+type rw242 rwState
+
+func (w *rw242) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw242) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw242) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw242) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw242) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw242) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw242) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw242) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw242) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 244/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, http.Pusher, io.StringWriter
+type rw243 rwState
+
+func (w *rw243) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw243) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw243) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw243) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw243) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw243) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw243) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw243) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw243) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw243) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 245/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, fullDuplexEnabler
+type rw244 rwState
+
+func (w *rw244) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw244) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw244) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw244) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw244) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw244) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw244) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw244) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw244) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 246/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, fullDuplexEnabler, io.StringWriter
+type rw245 rwState
+
+func (w *rw245) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw245) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw245) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw245) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw245) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw245) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw245) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw245) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw245) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw245) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 247/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, fullDuplexEnabler, http.Pusher
+type rw246 rwState
+
+func (w *rw246) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw246) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw246) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw246) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw246) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw246) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw246) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw246) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw246) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw246) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 248/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw247 rwState
+
+func (w *rw247) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw247) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw247) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw247) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw247) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw247) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw247) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw247) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw247) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw247) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw247) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 249/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner
+type rw248 rwState
+
+func (w *rw248) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw248) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw248) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw248) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw248) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw248) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw248) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw248) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw248) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw248) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 250/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, io.StringWriter
+type rw249 rwState
+
+func (w *rw249) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw249) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw249) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw249) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw249) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw249) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw249) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw249) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw249) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw249) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw249) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 251/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, http.Pusher
+type rw250 rwState
+
+func (w *rw250) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw250) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw250) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw250) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw250) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw250) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw250) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw250) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw250) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw250) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw250) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 252/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, http.Pusher, io.StringWriter
+type rw251 rwState
+
+func (w *rw251) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw251) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw251) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw251) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw251) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw251) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw251) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw251) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw251) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw251) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw251) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw251) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 253/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler
+type rw252 rwState
+
+func (w *rw252) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw252) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw252) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw252) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw252) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw252) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw252) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw252) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw252) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw252) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw252) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 254/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler, io.StringWriter
+type rw253 rwState
+
+func (w *rw253) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw253) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw253) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw253) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw253) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw253) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw253) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw253) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw253) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw253) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw253) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw253) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 255/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher
+type rw254 rwState
+
+func (w *rw254) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw254) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw254) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw254) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw254) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw254) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw254) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw254) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw254) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw254) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw254) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw254) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 256/512: http.ResponseWriter, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw255 rwState
+
+func (w *rw255) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw255) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw255) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw255) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw255) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw255) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw255) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw255) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw255) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw255) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw255) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw255) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw255) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 257/512: http.ResponseWriter, http.Flusher
+type rw256 rwState
+
+func (w *rw256) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw256) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw256) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw256) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw256) Flush() {
+ (*rwState)(w).doFlush()
+}
+
+// combination 258/512: http.ResponseWriter, http.Flusher, io.StringWriter
+type rw257 rwState
+
+func (w *rw257) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw257) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw257) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw257) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw257) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw257) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 259/512: http.ResponseWriter, http.Flusher, http.Pusher
+type rw258 rwState
+
+func (w *rw258) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw258) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw258) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw258) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw258) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw258) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 260/512: http.ResponseWriter, http.Flusher, http.Pusher, io.StringWriter
+type rw259 rwState
+
+func (w *rw259) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw259) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw259) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw259) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw259) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw259) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw259) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 261/512: http.ResponseWriter, http.Flusher, fullDuplexEnabler
+type rw260 rwState
+
+func (w *rw260) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw260) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw260) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw260) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw260) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw260) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 262/512: http.ResponseWriter, http.Flusher, fullDuplexEnabler, io.StringWriter
+type rw261 rwState
+
+func (w *rw261) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw261) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw261) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw261) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw261) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw261) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw261) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 263/512: http.ResponseWriter, http.Flusher, fullDuplexEnabler, http.Pusher
+type rw262 rwState
+
+func (w *rw262) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw262) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw262) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw262) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw262) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw262) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw262) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 264/512: http.ResponseWriter, http.Flusher, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw263 rwState
+
+func (w *rw263) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw263) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw263) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw263) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw263) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw263) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw263) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw263) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 265/512: http.ResponseWriter, http.Flusher, deadliner
+type rw264 rwState
+
+func (w *rw264) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw264) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw264) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw264) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw264) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw264) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw264) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 266/512: http.ResponseWriter, http.Flusher, deadliner, io.StringWriter
+type rw265 rwState
+
+func (w *rw265) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw265) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw265) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw265) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw265) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw265) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw265) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw265) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 267/512: http.ResponseWriter, http.Flusher, deadliner, http.Pusher
+type rw266 rwState
+
+func (w *rw266) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw266) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw266) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw266) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw266) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw266) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw266) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw266) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 268/512: http.ResponseWriter, http.Flusher, deadliner, http.Pusher, io.StringWriter
+type rw267 rwState
+
+func (w *rw267) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw267) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw267) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw267) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw267) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw267) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw267) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw267) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw267) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 269/512: http.ResponseWriter, http.Flusher, deadliner, fullDuplexEnabler
+type rw268 rwState
+
+func (w *rw268) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw268) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw268) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw268) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw268) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw268) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw268) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw268) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 270/512: http.ResponseWriter, http.Flusher, deadliner, fullDuplexEnabler, io.StringWriter
+type rw269 rwState
+
+func (w *rw269) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw269) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw269) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw269) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw269) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw269) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw269) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw269) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw269) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 271/512: http.ResponseWriter, http.Flusher, deadliner, fullDuplexEnabler, http.Pusher
+type rw270 rwState
+
+func (w *rw270) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw270) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw270) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw270) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw270) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw270) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw270) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw270) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw270) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 272/512: http.ResponseWriter, http.Flusher, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw271 rwState
+
+func (w *rw271) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw271) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw271) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw271) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw271) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw271) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw271) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw271) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw271) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw271) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 273/512: http.ResponseWriter, http.Flusher, io.ReaderFrom
+type rw272 rwState
+
+func (w *rw272) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw272) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw272) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw272) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw272) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw272) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+
+// combination 274/512: http.ResponseWriter, http.Flusher, io.ReaderFrom, io.StringWriter
+type rw273 rwState
+
+func (w *rw273) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw273) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw273) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw273) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw273) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw273) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw273) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 275/512: http.ResponseWriter, http.Flusher, io.ReaderFrom, http.Pusher
+type rw274 rwState
+
+func (w *rw274) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw274) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw274) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw274) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw274) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw274) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw274) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 276/512: http.ResponseWriter, http.Flusher, io.ReaderFrom, http.Pusher, io.StringWriter
+type rw275 rwState
+
+func (w *rw275) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw275) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw275) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw275) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw275) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw275) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw275) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw275) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 277/512: http.ResponseWriter, http.Flusher, io.ReaderFrom, fullDuplexEnabler
+type rw276 rwState
+
+func (w *rw276) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw276) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw276) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw276) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw276) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw276) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw276) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 278/512: http.ResponseWriter, http.Flusher, io.ReaderFrom, fullDuplexEnabler, io.StringWriter
+type rw277 rwState
+
+func (w *rw277) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw277) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw277) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw277) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw277) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw277) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw277) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw277) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 279/512: http.ResponseWriter, http.Flusher, io.ReaderFrom, fullDuplexEnabler, http.Pusher
+type rw278 rwState
+
+func (w *rw278) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw278) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw278) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw278) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw278) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw278) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw278) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw278) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 280/512: http.ResponseWriter, http.Flusher, io.ReaderFrom, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw279 rwState
+
+func (w *rw279) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw279) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw279) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw279) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw279) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw279) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw279) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw279) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw279) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 281/512: http.ResponseWriter, http.Flusher, io.ReaderFrom, deadliner
+type rw280 rwState
+
+func (w *rw280) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw280) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw280) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw280) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw280) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw280) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw280) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw280) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 282/512: http.ResponseWriter, http.Flusher, io.ReaderFrom, deadliner, io.StringWriter
+type rw281 rwState
+
+func (w *rw281) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw281) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw281) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw281) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw281) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw281) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw281) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw281) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw281) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 283/512: http.ResponseWriter, http.Flusher, io.ReaderFrom, deadliner, http.Pusher
+type rw282 rwState
+
+func (w *rw282) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw282) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw282) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw282) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw282) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw282) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw282) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw282) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw282) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 284/512: http.ResponseWriter, http.Flusher, io.ReaderFrom, deadliner, http.Pusher, io.StringWriter
+type rw283 rwState
+
+func (w *rw283) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw283) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw283) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw283) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw283) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw283) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw283) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw283) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw283) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw283) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 285/512: http.ResponseWriter, http.Flusher, io.ReaderFrom, deadliner, fullDuplexEnabler
+type rw284 rwState
+
+func (w *rw284) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw284) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw284) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw284) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw284) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw284) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw284) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw284) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw284) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 286/512: http.ResponseWriter, http.Flusher, io.ReaderFrom, deadliner, fullDuplexEnabler, io.StringWriter
+type rw285 rwState
+
+func (w *rw285) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw285) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw285) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw285) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw285) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw285) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw285) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw285) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw285) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw285) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 287/512: http.ResponseWriter, http.Flusher, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher
+type rw286 rwState
+
+func (w *rw286) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw286) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw286) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw286) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw286) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw286) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw286) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw286) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw286) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw286) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 288/512: http.ResponseWriter, http.Flusher, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw287 rwState
+
+func (w *rw287) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw287) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw287) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw287) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw287) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw287) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw287) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw287) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw287) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw287) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw287) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 289/512: http.ResponseWriter, http.Flusher, http.Hijacker
+type rw288 rwState
+
+func (w *rw288) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw288) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw288) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw288) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw288) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw288) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+
+// combination 290/512: http.ResponseWriter, http.Flusher, http.Hijacker, io.StringWriter
+type rw289 rwState
+
+func (w *rw289) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw289) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw289) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw289) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw289) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw289) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw289) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 291/512: http.ResponseWriter, http.Flusher, http.Hijacker, http.Pusher
+type rw290 rwState
+
+func (w *rw290) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw290) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw290) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw290) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw290) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw290) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw290) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 292/512: http.ResponseWriter, http.Flusher, http.Hijacker, http.Pusher, io.StringWriter
+type rw291 rwState
+
+func (w *rw291) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw291) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw291) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw291) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw291) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw291) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw291) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw291) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 293/512: http.ResponseWriter, http.Flusher, http.Hijacker, fullDuplexEnabler
+type rw292 rwState
+
+func (w *rw292) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw292) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw292) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw292) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw292) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw292) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw292) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 294/512: http.ResponseWriter, http.Flusher, http.Hijacker, fullDuplexEnabler, io.StringWriter
+type rw293 rwState
+
+func (w *rw293) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw293) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw293) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw293) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw293) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw293) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw293) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw293) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 295/512: http.ResponseWriter, http.Flusher, http.Hijacker, fullDuplexEnabler, http.Pusher
+type rw294 rwState
+
+func (w *rw294) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw294) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw294) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw294) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw294) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw294) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw294) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw294) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 296/512: http.ResponseWriter, http.Flusher, http.Hijacker, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw295 rwState
+
+func (w *rw295) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw295) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw295) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw295) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw295) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw295) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw295) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw295) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw295) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 297/512: http.ResponseWriter, http.Flusher, http.Hijacker, deadliner
+type rw296 rwState
+
+func (w *rw296) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw296) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw296) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw296) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw296) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw296) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw296) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw296) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 298/512: http.ResponseWriter, http.Flusher, http.Hijacker, deadliner, io.StringWriter
+type rw297 rwState
+
+func (w *rw297) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw297) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw297) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw297) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw297) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw297) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw297) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw297) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw297) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 299/512: http.ResponseWriter, http.Flusher, http.Hijacker, deadliner, http.Pusher
+type rw298 rwState
+
+func (w *rw298) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw298) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw298) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw298) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw298) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw298) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw298) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw298) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw298) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 300/512: http.ResponseWriter, http.Flusher, http.Hijacker, deadliner, http.Pusher, io.StringWriter
+type rw299 rwState
+
+func (w *rw299) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw299) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw299) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw299) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw299) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw299) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw299) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw299) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw299) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw299) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 301/512: http.ResponseWriter, http.Flusher, http.Hijacker, deadliner, fullDuplexEnabler
+type rw300 rwState
+
+func (w *rw300) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw300) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw300) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw300) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw300) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw300) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw300) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw300) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw300) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 302/512: http.ResponseWriter, http.Flusher, http.Hijacker, deadliner, fullDuplexEnabler, io.StringWriter
+type rw301 rwState
+
+func (w *rw301) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw301) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw301) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw301) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw301) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw301) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw301) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw301) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw301) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw301) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 303/512: http.ResponseWriter, http.Flusher, http.Hijacker, deadliner, fullDuplexEnabler, http.Pusher
+type rw302 rwState
+
+func (w *rw302) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw302) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw302) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw302) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw302) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw302) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw302) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw302) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw302) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw302) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 304/512: http.ResponseWriter, http.Flusher, http.Hijacker, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw303 rwState
+
+func (w *rw303) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw303) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw303) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw303) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw303) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw303) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw303) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw303) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw303) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw303) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw303) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 305/512: http.ResponseWriter, http.Flusher, http.Hijacker, io.ReaderFrom
+type rw304 rwState
+
+func (w *rw304) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw304) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw304) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw304) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw304) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw304) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw304) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+
+// combination 306/512: http.ResponseWriter, http.Flusher, http.Hijacker, io.ReaderFrom, io.StringWriter
+type rw305 rwState
+
+func (w *rw305) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw305) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw305) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw305) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw305) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw305) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw305) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw305) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 307/512: http.ResponseWriter, http.Flusher, http.Hijacker, io.ReaderFrom, http.Pusher
+type rw306 rwState
+
+func (w *rw306) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw306) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw306) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw306) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw306) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw306) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw306) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw306) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 308/512: http.ResponseWriter, http.Flusher, http.Hijacker, io.ReaderFrom, http.Pusher, io.StringWriter
+type rw307 rwState
+
+func (w *rw307) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw307) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw307) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw307) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw307) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw307) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw307) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw307) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw307) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 309/512: http.ResponseWriter, http.Flusher, http.Hijacker, io.ReaderFrom, fullDuplexEnabler
+type rw308 rwState
+
+func (w *rw308) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw308) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw308) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw308) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw308) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw308) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw308) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw308) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 310/512: http.ResponseWriter, http.Flusher, http.Hijacker, io.ReaderFrom, fullDuplexEnabler, io.StringWriter
+type rw309 rwState
+
+func (w *rw309) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw309) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw309) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw309) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw309) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw309) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw309) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw309) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw309) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 311/512: http.ResponseWriter, http.Flusher, http.Hijacker, io.ReaderFrom, fullDuplexEnabler, http.Pusher
+type rw310 rwState
+
+func (w *rw310) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw310) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw310) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw310) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw310) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw310) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw310) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw310) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw310) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 312/512: http.ResponseWriter, http.Flusher, http.Hijacker, io.ReaderFrom, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw311 rwState
+
+func (w *rw311) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw311) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw311) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw311) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw311) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw311) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw311) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw311) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw311) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw311) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 313/512: http.ResponseWriter, http.Flusher, http.Hijacker, io.ReaderFrom, deadliner
+type rw312 rwState
+
+func (w *rw312) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw312) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw312) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw312) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw312) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw312) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw312) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw312) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw312) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 314/512: http.ResponseWriter, http.Flusher, http.Hijacker, io.ReaderFrom, deadliner, io.StringWriter
+type rw313 rwState
+
+func (w *rw313) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw313) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw313) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw313) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw313) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw313) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw313) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw313) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw313) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw313) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 315/512: http.ResponseWriter, http.Flusher, http.Hijacker, io.ReaderFrom, deadliner, http.Pusher
+type rw314 rwState
+
+func (w *rw314) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw314) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw314) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw314) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw314) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw314) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw314) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw314) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw314) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw314) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 316/512: http.ResponseWriter, http.Flusher, http.Hijacker, io.ReaderFrom, deadliner, http.Pusher, io.StringWriter
+type rw315 rwState
+
+func (w *rw315) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw315) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw315) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw315) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw315) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw315) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw315) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw315) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw315) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw315) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw315) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 317/512: http.ResponseWriter, http.Flusher, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler
+type rw316 rwState
+
+func (w *rw316) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw316) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw316) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw316) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw316) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw316) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw316) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw316) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw316) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw316) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 318/512: http.ResponseWriter, http.Flusher, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler, io.StringWriter
+type rw317 rwState
+
+func (w *rw317) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw317) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw317) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw317) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw317) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw317) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw317) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw317) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw317) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw317) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw317) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 319/512: http.ResponseWriter, http.Flusher, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher
+type rw318 rwState
+
+func (w *rw318) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw318) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw318) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw318) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw318) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw318) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw318) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw318) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw318) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw318) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw318) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 320/512: http.ResponseWriter, http.Flusher, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw319 rwState
+
+func (w *rw319) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw319) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw319) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw319) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw319) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw319) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw319) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw319) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw319) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw319) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw319) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw319) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 321/512: http.ResponseWriter, http.Flusher, http.CloseNotifier
+type rw320 rwState
+
+func (w *rw320) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw320) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw320) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw320) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw320) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw320) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+
+// combination 322/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, io.StringWriter
+type rw321 rwState
+
+func (w *rw321) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw321) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw321) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw321) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw321) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw321) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw321) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 323/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Pusher
+type rw322 rwState
+
+func (w *rw322) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw322) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw322) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw322) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw322) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw322) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw322) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 324/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Pusher, io.StringWriter
+type rw323 rwState
+
+func (w *rw323) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw323) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw323) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw323) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw323) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw323) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw323) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw323) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 325/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, fullDuplexEnabler
+type rw324 rwState
+
+func (w *rw324) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw324) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw324) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw324) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw324) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw324) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw324) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 326/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, fullDuplexEnabler, io.StringWriter
+type rw325 rwState
+
+func (w *rw325) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw325) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw325) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw325) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw325) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw325) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw325) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw325) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 327/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, fullDuplexEnabler, http.Pusher
+type rw326 rwState
+
+func (w *rw326) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw326) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw326) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw326) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw326) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw326) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw326) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw326) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 328/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw327 rwState
+
+func (w *rw327) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw327) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw327) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw327) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw327) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw327) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw327) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw327) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw327) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 329/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, deadliner
+type rw328 rwState
+
+func (w *rw328) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw328) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw328) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw328) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw328) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw328) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw328) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw328) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 330/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, deadliner, io.StringWriter
+type rw329 rwState
+
+func (w *rw329) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw329) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw329) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw329) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw329) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw329) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw329) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw329) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw329) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 331/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, deadliner, http.Pusher
+type rw330 rwState
+
+func (w *rw330) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw330) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw330) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw330) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw330) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw330) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw330) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw330) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw330) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 332/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, deadliner, http.Pusher, io.StringWriter
+type rw331 rwState
+
+func (w *rw331) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw331) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw331) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw331) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw331) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw331) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw331) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw331) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw331) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw331) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 333/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, deadliner, fullDuplexEnabler
+type rw332 rwState
+
+func (w *rw332) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw332) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw332) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw332) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw332) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw332) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw332) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw332) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw332) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 334/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, deadliner, fullDuplexEnabler, io.StringWriter
+type rw333 rwState
+
+func (w *rw333) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw333) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw333) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw333) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw333) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw333) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw333) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw333) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw333) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw333) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 335/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, deadliner, fullDuplexEnabler, http.Pusher
+type rw334 rwState
+
+func (w *rw334) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw334) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw334) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw334) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw334) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw334) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw334) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw334) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw334) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw334) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 336/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw335 rwState
+
+func (w *rw335) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw335) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw335) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw335) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw335) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw335) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw335) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw335) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw335) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw335) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw335) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 337/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, io.ReaderFrom
+type rw336 rwState
+
+func (w *rw336) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw336) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw336) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw336) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw336) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw336) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw336) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+
+// combination 338/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, io.ReaderFrom, io.StringWriter
+type rw337 rwState
+
+func (w *rw337) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw337) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw337) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw337) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw337) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw337) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw337) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw337) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 339/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, io.ReaderFrom, http.Pusher
+type rw338 rwState
+
+func (w *rw338) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw338) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw338) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw338) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw338) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw338) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw338) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw338) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 340/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, io.ReaderFrom, http.Pusher, io.StringWriter
+type rw339 rwState
+
+func (w *rw339) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw339) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw339) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw339) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw339) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw339) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw339) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw339) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw339) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 341/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, io.ReaderFrom, fullDuplexEnabler
+type rw340 rwState
+
+func (w *rw340) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw340) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw340) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw340) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw340) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw340) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw340) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw340) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 342/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, io.ReaderFrom, fullDuplexEnabler, io.StringWriter
+type rw341 rwState
+
+func (w *rw341) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw341) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw341) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw341) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw341) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw341) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw341) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw341) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw341) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 343/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, io.ReaderFrom, fullDuplexEnabler, http.Pusher
+type rw342 rwState
+
+func (w *rw342) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw342) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw342) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw342) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw342) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw342) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw342) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw342) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw342) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 344/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, io.ReaderFrom, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw343 rwState
+
+func (w *rw343) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw343) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw343) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw343) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw343) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw343) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw343) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw343) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw343) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw343) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 345/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, io.ReaderFrom, deadliner
+type rw344 rwState
+
+func (w *rw344) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw344) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw344) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw344) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw344) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw344) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw344) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw344) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw344) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 346/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, io.ReaderFrom, deadliner, io.StringWriter
+type rw345 rwState
+
+func (w *rw345) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw345) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw345) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw345) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw345) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw345) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw345) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw345) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw345) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw345) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 347/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, io.ReaderFrom, deadliner, http.Pusher
+type rw346 rwState
+
+func (w *rw346) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw346) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw346) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw346) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw346) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw346) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw346) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw346) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw346) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw346) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 348/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, io.ReaderFrom, deadliner, http.Pusher, io.StringWriter
+type rw347 rwState
+
+func (w *rw347) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw347) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw347) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw347) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw347) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw347) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw347) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw347) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw347) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw347) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw347) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 349/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, io.ReaderFrom, deadliner, fullDuplexEnabler
+type rw348 rwState
+
+func (w *rw348) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw348) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw348) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw348) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw348) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw348) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw348) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw348) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw348) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw348) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 350/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, io.ReaderFrom, deadliner, fullDuplexEnabler, io.StringWriter
+type rw349 rwState
+
+func (w *rw349) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw349) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw349) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw349) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw349) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw349) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw349) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw349) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw349) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw349) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw349) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 351/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher
+type rw350 rwState
+
+func (w *rw350) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw350) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw350) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw350) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw350) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw350) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw350) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw350) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw350) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw350) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw350) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 352/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw351 rwState
+
+func (w *rw351) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw351) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw351) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw351) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw351) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw351) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw351) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw351) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw351) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw351) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw351) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw351) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 353/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker
+type rw352 rwState
+
+func (w *rw352) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw352) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw352) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw352) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw352) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw352) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw352) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+
+// combination 354/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, io.StringWriter
+type rw353 rwState
+
+func (w *rw353) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw353) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw353) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw353) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw353) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw353) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw353) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw353) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 355/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, http.Pusher
+type rw354 rwState
+
+func (w *rw354) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw354) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw354) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw354) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw354) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw354) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw354) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw354) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 356/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, http.Pusher, io.StringWriter
+type rw355 rwState
+
+func (w *rw355) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw355) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw355) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw355) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw355) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw355) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw355) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw355) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw355) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 357/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, fullDuplexEnabler
+type rw356 rwState
+
+func (w *rw356) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw356) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw356) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw356) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw356) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw356) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw356) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw356) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 358/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, fullDuplexEnabler, io.StringWriter
+type rw357 rwState
+
+func (w *rw357) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw357) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw357) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw357) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw357) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw357) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw357) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw357) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw357) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 359/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, fullDuplexEnabler, http.Pusher
+type rw358 rwState
+
+func (w *rw358) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw358) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw358) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw358) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw358) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw358) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw358) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw358) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw358) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 360/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw359 rwState
+
+func (w *rw359) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw359) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw359) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw359) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw359) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw359) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw359) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw359) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw359) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw359) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 361/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, deadliner
+type rw360 rwState
+
+func (w *rw360) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw360) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw360) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw360) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw360) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw360) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw360) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw360) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw360) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 362/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, deadliner, io.StringWriter
+type rw361 rwState
+
+func (w *rw361) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw361) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw361) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw361) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw361) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw361) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw361) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw361) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw361) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw361) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 363/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, deadliner, http.Pusher
+type rw362 rwState
+
+func (w *rw362) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw362) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw362) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw362) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw362) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw362) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw362) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw362) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw362) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw362) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 364/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, deadliner, http.Pusher, io.StringWriter
+type rw363 rwState
+
+func (w *rw363) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw363) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw363) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw363) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw363) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw363) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw363) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw363) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw363) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw363) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw363) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 365/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, deadliner, fullDuplexEnabler
+type rw364 rwState
+
+func (w *rw364) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw364) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw364) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw364) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw364) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw364) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw364) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw364) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw364) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw364) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 366/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, deadliner, fullDuplexEnabler, io.StringWriter
+type rw365 rwState
+
+func (w *rw365) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw365) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw365) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw365) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw365) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw365) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw365) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw365) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw365) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw365) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw365) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 367/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, deadliner, fullDuplexEnabler, http.Pusher
+type rw366 rwState
+
+func (w *rw366) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw366) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw366) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw366) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw366) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw366) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw366) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw366) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw366) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw366) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw366) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 368/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw367 rwState
+
+func (w *rw367) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw367) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw367) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw367) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw367) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw367) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw367) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw367) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw367) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw367) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw367) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw367) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 369/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, io.ReaderFrom
+type rw368 rwState
+
+func (w *rw368) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw368) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw368) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw368) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw368) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw368) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw368) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw368) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+
+// combination 370/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, io.ReaderFrom, io.StringWriter
+type rw369 rwState
+
+func (w *rw369) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw369) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw369) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw369) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw369) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw369) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw369) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw369) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw369) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 371/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, io.ReaderFrom, http.Pusher
+type rw370 rwState
+
+func (w *rw370) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw370) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw370) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw370) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw370) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw370) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw370) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw370) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw370) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 372/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, io.ReaderFrom, http.Pusher, io.StringWriter
+type rw371 rwState
+
+func (w *rw371) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw371) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw371) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw371) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw371) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw371) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw371) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw371) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw371) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw371) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 373/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, io.ReaderFrom, fullDuplexEnabler
+type rw372 rwState
+
+func (w *rw372) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw372) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw372) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw372) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw372) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw372) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw372) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw372) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw372) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 374/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, io.ReaderFrom, fullDuplexEnabler, io.StringWriter
+type rw373 rwState
+
+func (w *rw373) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw373) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw373) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw373) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw373) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw373) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw373) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw373) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw373) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw373) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 375/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, io.ReaderFrom, fullDuplexEnabler, http.Pusher
+type rw374 rwState
+
+func (w *rw374) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw374) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw374) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw374) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw374) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw374) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw374) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw374) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw374) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw374) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 376/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, io.ReaderFrom, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw375 rwState
+
+func (w *rw375) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw375) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw375) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw375) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw375) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw375) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw375) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw375) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw375) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw375) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw375) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 377/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner
+type rw376 rwState
+
+func (w *rw376) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw376) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw376) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw376) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw376) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw376) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw376) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw376) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw376) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw376) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 378/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, io.StringWriter
+type rw377 rwState
+
+func (w *rw377) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw377) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw377) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw377) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw377) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw377) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw377) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw377) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw377) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw377) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw377) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 379/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, http.Pusher
+type rw378 rwState
+
+func (w *rw378) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw378) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw378) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw378) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw378) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw378) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw378) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw378) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw378) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw378) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw378) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 380/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, http.Pusher, io.StringWriter
+type rw379 rwState
+
+func (w *rw379) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw379) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw379) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw379) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw379) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw379) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw379) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw379) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw379) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw379) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw379) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw379) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 381/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler
+type rw380 rwState
+
+func (w *rw380) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw380) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw380) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw380) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw380) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw380) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw380) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw380) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw380) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw380) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw380) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 382/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler, io.StringWriter
+type rw381 rwState
+
+func (w *rw381) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw381) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw381) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw381) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw381) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw381) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw381) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw381) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw381) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw381) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw381) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw381) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 383/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher
+type rw382 rwState
+
+func (w *rw382) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw382) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw382) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw382) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw382) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw382) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw382) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw382) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw382) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw382) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw382) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw382) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 384/512: http.ResponseWriter, http.Flusher, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw383 rwState
+
+func (w *rw383) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw383) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw383) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw383) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw383) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw383) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw383) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw383) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw383) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw383) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw383) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw383) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw383) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 385/512: http.ResponseWriter, http.Flusher, httpFlushError
+type rw384 rwState
+
+func (w *rw384) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw384) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw384) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw384) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw384) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw384) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+
+// combination 386/512: http.ResponseWriter, http.Flusher, httpFlushError, io.StringWriter
+type rw385 rwState
+
+func (w *rw385) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw385) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw385) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw385) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw385) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw385) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw385) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 387/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Pusher
+type rw386 rwState
+
+func (w *rw386) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw386) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw386) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw386) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw386) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw386) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw386) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 388/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Pusher, io.StringWriter
+type rw387 rwState
+
+func (w *rw387) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw387) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw387) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw387) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw387) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw387) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw387) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw387) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 389/512: http.ResponseWriter, http.Flusher, httpFlushError, fullDuplexEnabler
+type rw388 rwState
+
+func (w *rw388) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw388) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw388) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw388) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw388) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw388) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw388) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 390/512: http.ResponseWriter, http.Flusher, httpFlushError, fullDuplexEnabler, io.StringWriter
+type rw389 rwState
+
+func (w *rw389) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw389) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw389) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw389) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw389) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw389) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw389) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw389) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 391/512: http.ResponseWriter, http.Flusher, httpFlushError, fullDuplexEnabler, http.Pusher
+type rw390 rwState
+
+func (w *rw390) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw390) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw390) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw390) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw390) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw390) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw390) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw390) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 392/512: http.ResponseWriter, http.Flusher, httpFlushError, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw391 rwState
+
+func (w *rw391) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw391) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw391) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw391) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw391) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw391) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw391) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw391) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw391) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 393/512: http.ResponseWriter, http.Flusher, httpFlushError, deadliner
+type rw392 rwState
+
+func (w *rw392) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw392) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw392) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw392) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw392) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw392) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw392) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw392) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 394/512: http.ResponseWriter, http.Flusher, httpFlushError, deadliner, io.StringWriter
+type rw393 rwState
+
+func (w *rw393) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw393) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw393) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw393) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw393) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw393) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw393) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw393) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw393) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 395/512: http.ResponseWriter, http.Flusher, httpFlushError, deadliner, http.Pusher
+type rw394 rwState
+
+func (w *rw394) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw394) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw394) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw394) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw394) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw394) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw394) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw394) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw394) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 396/512: http.ResponseWriter, http.Flusher, httpFlushError, deadliner, http.Pusher, io.StringWriter
+type rw395 rwState
+
+func (w *rw395) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw395) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw395) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw395) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw395) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw395) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw395) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw395) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw395) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw395) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 397/512: http.ResponseWriter, http.Flusher, httpFlushError, deadliner, fullDuplexEnabler
+type rw396 rwState
+
+func (w *rw396) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw396) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw396) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw396) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw396) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw396) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw396) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw396) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw396) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 398/512: http.ResponseWriter, http.Flusher, httpFlushError, deadliner, fullDuplexEnabler, io.StringWriter
+type rw397 rwState
+
+func (w *rw397) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw397) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw397) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw397) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw397) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw397) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw397) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw397) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw397) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw397) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 399/512: http.ResponseWriter, http.Flusher, httpFlushError, deadliner, fullDuplexEnabler, http.Pusher
+type rw398 rwState
+
+func (w *rw398) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw398) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw398) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw398) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw398) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw398) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw398) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw398) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw398) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw398) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 400/512: http.ResponseWriter, http.Flusher, httpFlushError, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw399 rwState
+
+func (w *rw399) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw399) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw399) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw399) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw399) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw399) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw399) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw399) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw399) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw399) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw399) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 401/512: http.ResponseWriter, http.Flusher, httpFlushError, io.ReaderFrom
+type rw400 rwState
+
+func (w *rw400) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw400) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw400) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw400) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw400) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw400) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw400) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+
+// combination 402/512: http.ResponseWriter, http.Flusher, httpFlushError, io.ReaderFrom, io.StringWriter
+type rw401 rwState
+
+func (w *rw401) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw401) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw401) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw401) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw401) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw401) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw401) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw401) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 403/512: http.ResponseWriter, http.Flusher, httpFlushError, io.ReaderFrom, http.Pusher
+type rw402 rwState
+
+func (w *rw402) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw402) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw402) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw402) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw402) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw402) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw402) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw402) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 404/512: http.ResponseWriter, http.Flusher, httpFlushError, io.ReaderFrom, http.Pusher, io.StringWriter
+type rw403 rwState
+
+func (w *rw403) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw403) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw403) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw403) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw403) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw403) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw403) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw403) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw403) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 405/512: http.ResponseWriter, http.Flusher, httpFlushError, io.ReaderFrom, fullDuplexEnabler
+type rw404 rwState
+
+func (w *rw404) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw404) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw404) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw404) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw404) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw404) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw404) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw404) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 406/512: http.ResponseWriter, http.Flusher, httpFlushError, io.ReaderFrom, fullDuplexEnabler, io.StringWriter
+type rw405 rwState
+
+func (w *rw405) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw405) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw405) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw405) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw405) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw405) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw405) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw405) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw405) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 407/512: http.ResponseWriter, http.Flusher, httpFlushError, io.ReaderFrom, fullDuplexEnabler, http.Pusher
+type rw406 rwState
+
+func (w *rw406) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw406) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw406) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw406) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw406) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw406) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw406) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw406) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw406) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 408/512: http.ResponseWriter, http.Flusher, httpFlushError, io.ReaderFrom, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw407 rwState
+
+func (w *rw407) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw407) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw407) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw407) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw407) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw407) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw407) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw407) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw407) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw407) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 409/512: http.ResponseWriter, http.Flusher, httpFlushError, io.ReaderFrom, deadliner
+type rw408 rwState
+
+func (w *rw408) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw408) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw408) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw408) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw408) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw408) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw408) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw408) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw408) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 410/512: http.ResponseWriter, http.Flusher, httpFlushError, io.ReaderFrom, deadliner, io.StringWriter
+type rw409 rwState
+
+func (w *rw409) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw409) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw409) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw409) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw409) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw409) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw409) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw409) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw409) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw409) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 411/512: http.ResponseWriter, http.Flusher, httpFlushError, io.ReaderFrom, deadliner, http.Pusher
+type rw410 rwState
+
+func (w *rw410) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw410) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw410) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw410) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw410) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw410) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw410) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw410) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw410) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw410) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 412/512: http.ResponseWriter, http.Flusher, httpFlushError, io.ReaderFrom, deadliner, http.Pusher, io.StringWriter
+type rw411 rwState
+
+func (w *rw411) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw411) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw411) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw411) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw411) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw411) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw411) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw411) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw411) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw411) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw411) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 413/512: http.ResponseWriter, http.Flusher, httpFlushError, io.ReaderFrom, deadliner, fullDuplexEnabler
+type rw412 rwState
+
+func (w *rw412) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw412) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw412) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw412) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw412) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw412) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw412) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw412) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw412) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw412) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 414/512: http.ResponseWriter, http.Flusher, httpFlushError, io.ReaderFrom, deadliner, fullDuplexEnabler, io.StringWriter
+type rw413 rwState
+
+func (w *rw413) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw413) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw413) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw413) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw413) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw413) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw413) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw413) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw413) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw413) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw413) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 415/512: http.ResponseWriter, http.Flusher, httpFlushError, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher
+type rw414 rwState
+
+func (w *rw414) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw414) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw414) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw414) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw414) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw414) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw414) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw414) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw414) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw414) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw414) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 416/512: http.ResponseWriter, http.Flusher, httpFlushError, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw415 rwState
+
+func (w *rw415) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw415) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw415) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw415) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw415) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw415) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw415) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw415) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw415) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw415) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw415) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw415) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 417/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker
+type rw416 rwState
+
+func (w *rw416) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw416) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw416) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw416) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw416) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw416) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw416) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+
+// combination 418/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, io.StringWriter
+type rw417 rwState
+
+func (w *rw417) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw417) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw417) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw417) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw417) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw417) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw417) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw417) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 419/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, http.Pusher
+type rw418 rwState
+
+func (w *rw418) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw418) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw418) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw418) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw418) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw418) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw418) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw418) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 420/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, http.Pusher, io.StringWriter
+type rw419 rwState
+
+func (w *rw419) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw419) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw419) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw419) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw419) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw419) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw419) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw419) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw419) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 421/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, fullDuplexEnabler
+type rw420 rwState
+
+func (w *rw420) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw420) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw420) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw420) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw420) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw420) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw420) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw420) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 422/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, fullDuplexEnabler, io.StringWriter
+type rw421 rwState
+
+func (w *rw421) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw421) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw421) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw421) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw421) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw421) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw421) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw421) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw421) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 423/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, fullDuplexEnabler, http.Pusher
+type rw422 rwState
+
+func (w *rw422) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw422) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw422) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw422) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw422) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw422) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw422) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw422) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw422) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 424/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw423 rwState
+
+func (w *rw423) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw423) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw423) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw423) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw423) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw423) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw423) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw423) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw423) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw423) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 425/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, deadliner
+type rw424 rwState
+
+func (w *rw424) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw424) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw424) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw424) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw424) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw424) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw424) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw424) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw424) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 426/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, deadliner, io.StringWriter
+type rw425 rwState
+
+func (w *rw425) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw425) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw425) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw425) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw425) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw425) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw425) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw425) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw425) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw425) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 427/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, deadliner, http.Pusher
+type rw426 rwState
+
+func (w *rw426) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw426) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw426) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw426) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw426) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw426) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw426) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw426) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw426) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw426) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 428/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, deadliner, http.Pusher, io.StringWriter
+type rw427 rwState
+
+func (w *rw427) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw427) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw427) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw427) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw427) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw427) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw427) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw427) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw427) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw427) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw427) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 429/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, deadliner, fullDuplexEnabler
+type rw428 rwState
+
+func (w *rw428) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw428) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw428) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw428) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw428) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw428) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw428) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw428) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw428) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw428) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 430/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, deadliner, fullDuplexEnabler, io.StringWriter
+type rw429 rwState
+
+func (w *rw429) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw429) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw429) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw429) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw429) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw429) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw429) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw429) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw429) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw429) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw429) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 431/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, deadliner, fullDuplexEnabler, http.Pusher
+type rw430 rwState
+
+func (w *rw430) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw430) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw430) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw430) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw430) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw430) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw430) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw430) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw430) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw430) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw430) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 432/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw431 rwState
+
+func (w *rw431) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw431) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw431) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw431) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw431) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw431) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw431) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw431) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw431) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw431) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw431) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw431) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 433/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, io.ReaderFrom
+type rw432 rwState
+
+func (w *rw432) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw432) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw432) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw432) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw432) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw432) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw432) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw432) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+
+// combination 434/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, io.ReaderFrom, io.StringWriter
+type rw433 rwState
+
+func (w *rw433) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw433) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw433) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw433) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw433) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw433) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw433) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw433) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw433) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 435/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, io.ReaderFrom, http.Pusher
+type rw434 rwState
+
+func (w *rw434) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw434) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw434) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw434) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw434) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw434) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw434) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw434) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw434) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 436/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, io.ReaderFrom, http.Pusher, io.StringWriter
+type rw435 rwState
+
+func (w *rw435) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw435) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw435) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw435) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw435) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw435) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw435) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw435) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw435) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw435) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 437/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, io.ReaderFrom, fullDuplexEnabler
+type rw436 rwState
+
+func (w *rw436) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw436) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw436) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw436) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw436) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw436) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw436) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw436) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw436) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 438/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, io.ReaderFrom, fullDuplexEnabler, io.StringWriter
+type rw437 rwState
+
+func (w *rw437) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw437) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw437) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw437) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw437) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw437) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw437) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw437) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw437) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw437) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 439/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, io.ReaderFrom, fullDuplexEnabler, http.Pusher
+type rw438 rwState
+
+func (w *rw438) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw438) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw438) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw438) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw438) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw438) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw438) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw438) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw438) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw438) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 440/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, io.ReaderFrom, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw439 rwState
+
+func (w *rw439) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw439) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw439) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw439) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw439) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw439) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw439) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw439) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw439) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw439) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw439) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 441/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, io.ReaderFrom, deadliner
+type rw440 rwState
+
+func (w *rw440) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw440) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw440) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw440) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw440) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw440) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw440) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw440) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw440) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw440) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 442/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, io.ReaderFrom, deadliner, io.StringWriter
+type rw441 rwState
+
+func (w *rw441) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw441) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw441) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw441) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw441) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw441) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw441) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw441) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw441) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw441) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw441) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 443/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, io.ReaderFrom, deadliner, http.Pusher
+type rw442 rwState
+
+func (w *rw442) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw442) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw442) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw442) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw442) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw442) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw442) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw442) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw442) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw442) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw442) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 444/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, io.ReaderFrom, deadliner, http.Pusher, io.StringWriter
+type rw443 rwState
+
+func (w *rw443) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw443) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw443) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw443) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw443) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw443) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw443) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw443) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw443) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw443) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw443) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw443) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 445/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler
+type rw444 rwState
+
+func (w *rw444) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw444) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw444) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw444) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw444) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw444) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw444) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw444) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw444) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw444) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw444) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 446/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler, io.StringWriter
+type rw445 rwState
+
+func (w *rw445) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw445) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw445) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw445) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw445) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw445) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw445) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw445) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw445) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw445) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw445) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw445) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 447/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher
+type rw446 rwState
+
+func (w *rw446) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw446) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw446) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw446) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw446) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw446) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw446) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw446) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw446) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw446) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw446) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw446) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 448/512: http.ResponseWriter, http.Flusher, httpFlushError, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw447 rwState
+
+func (w *rw447) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw447) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw447) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw447) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw447) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw447) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw447) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw447) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw447) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw447) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw447) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw447) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw447) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 449/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier
+type rw448 rwState
+
+func (w *rw448) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw448) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw448) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw448) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw448) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw448) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw448) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+
+// combination 450/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, io.StringWriter
+type rw449 rwState
+
+func (w *rw449) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw449) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw449) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw449) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw449) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw449) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw449) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw449) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 451/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Pusher
+type rw450 rwState
+
+func (w *rw450) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw450) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw450) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw450) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw450) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw450) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw450) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw450) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 452/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Pusher, io.StringWriter
+type rw451 rwState
+
+func (w *rw451) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw451) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw451) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw451) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw451) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw451) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw451) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw451) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw451) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 453/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, fullDuplexEnabler
+type rw452 rwState
+
+func (w *rw452) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw452) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw452) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw452) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw452) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw452) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw452) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw452) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 454/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, fullDuplexEnabler, io.StringWriter
+type rw453 rwState
+
+func (w *rw453) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw453) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw453) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw453) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw453) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw453) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw453) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw453) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw453) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 455/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, fullDuplexEnabler, http.Pusher
+type rw454 rwState
+
+func (w *rw454) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw454) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw454) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw454) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw454) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw454) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw454) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw454) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw454) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 456/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw455 rwState
+
+func (w *rw455) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw455) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw455) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw455) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw455) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw455) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw455) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw455) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw455) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw455) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 457/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, deadliner
+type rw456 rwState
+
+func (w *rw456) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw456) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw456) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw456) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw456) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw456) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw456) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw456) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw456) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 458/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, deadliner, io.StringWriter
+type rw457 rwState
+
+func (w *rw457) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw457) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw457) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw457) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw457) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw457) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw457) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw457) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw457) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw457) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 459/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, deadliner, http.Pusher
+type rw458 rwState
+
+func (w *rw458) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw458) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw458) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw458) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw458) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw458) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw458) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw458) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw458) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw458) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 460/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, deadliner, http.Pusher, io.StringWriter
+type rw459 rwState
+
+func (w *rw459) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw459) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw459) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw459) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw459) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw459) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw459) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw459) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw459) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw459) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw459) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 461/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, deadliner, fullDuplexEnabler
+type rw460 rwState
+
+func (w *rw460) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw460) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw460) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw460) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw460) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw460) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw460) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw460) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw460) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw460) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 462/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, deadliner, fullDuplexEnabler, io.StringWriter
+type rw461 rwState
+
+func (w *rw461) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw461) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw461) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw461) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw461) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw461) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw461) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw461) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw461) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw461) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw461) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 463/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, deadliner, fullDuplexEnabler, http.Pusher
+type rw462 rwState
+
+func (w *rw462) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw462) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw462) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw462) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw462) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw462) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw462) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw462) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw462) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw462) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw462) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 464/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw463 rwState
+
+func (w *rw463) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw463) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw463) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw463) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw463) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw463) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw463) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw463) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw463) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw463) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw463) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw463) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 465/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, io.ReaderFrom
+type rw464 rwState
+
+func (w *rw464) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw464) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw464) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw464) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw464) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw464) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw464) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw464) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+
+// combination 466/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, io.ReaderFrom, io.StringWriter
+type rw465 rwState
+
+func (w *rw465) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw465) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw465) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw465) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw465) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw465) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw465) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw465) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw465) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 467/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, io.ReaderFrom, http.Pusher
+type rw466 rwState
+
+func (w *rw466) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw466) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw466) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw466) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw466) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw466) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw466) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw466) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw466) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 468/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, io.ReaderFrom, http.Pusher, io.StringWriter
+type rw467 rwState
+
+func (w *rw467) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw467) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw467) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw467) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw467) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw467) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw467) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw467) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw467) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw467) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 469/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, io.ReaderFrom, fullDuplexEnabler
+type rw468 rwState
+
+func (w *rw468) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw468) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw468) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw468) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw468) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw468) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw468) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw468) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw468) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 470/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, io.ReaderFrom, fullDuplexEnabler, io.StringWriter
+type rw469 rwState
+
+func (w *rw469) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw469) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw469) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw469) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw469) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw469) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw469) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw469) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw469) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw469) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 471/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, io.ReaderFrom, fullDuplexEnabler, http.Pusher
+type rw470 rwState
+
+func (w *rw470) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw470) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw470) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw470) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw470) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw470) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw470) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw470) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw470) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw470) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 472/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, io.ReaderFrom, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw471 rwState
+
+func (w *rw471) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw471) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw471) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw471) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw471) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw471) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw471) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw471) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw471) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw471) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw471) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 473/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, io.ReaderFrom, deadliner
+type rw472 rwState
+
+func (w *rw472) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw472) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw472) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw472) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw472) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw472) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw472) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw472) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw472) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw472) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 474/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, io.ReaderFrom, deadliner, io.StringWriter
+type rw473 rwState
+
+func (w *rw473) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw473) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw473) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw473) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw473) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw473) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw473) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw473) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw473) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw473) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw473) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 475/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, io.ReaderFrom, deadliner, http.Pusher
+type rw474 rwState
+
+func (w *rw474) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw474) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw474) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw474) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw474) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw474) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw474) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw474) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw474) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw474) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw474) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 476/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, io.ReaderFrom, deadliner, http.Pusher, io.StringWriter
+type rw475 rwState
+
+func (w *rw475) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw475) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw475) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw475) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw475) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw475) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw475) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw475) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw475) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw475) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw475) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw475) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 477/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, io.ReaderFrom, deadliner, fullDuplexEnabler
+type rw476 rwState
+
+func (w *rw476) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw476) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw476) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw476) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw476) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw476) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw476) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw476) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw476) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw476) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw476) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 478/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, io.ReaderFrom, deadliner, fullDuplexEnabler, io.StringWriter
+type rw477 rwState
+
+func (w *rw477) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw477) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw477) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw477) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw477) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw477) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw477) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw477) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw477) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw477) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw477) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw477) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 479/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher
+type rw478 rwState
+
+func (w *rw478) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw478) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw478) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw478) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw478) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw478) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw478) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw478) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw478) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw478) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw478) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw478) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 480/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw479 rwState
+
+func (w *rw479) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw479) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw479) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw479) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw479) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw479) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw479) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw479) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw479) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw479) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw479) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw479) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw479) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 481/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker
+type rw480 rwState
+
+func (w *rw480) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw480) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw480) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw480) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw480) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw480) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw480) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw480) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+
+// combination 482/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, io.StringWriter
+type rw481 rwState
+
+func (w *rw481) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw481) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw481) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw481) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw481) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw481) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw481) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw481) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw481) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 483/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, http.Pusher
+type rw482 rwState
+
+func (w *rw482) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw482) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw482) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw482) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw482) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw482) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw482) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw482) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw482) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 484/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, http.Pusher, io.StringWriter
+type rw483 rwState
+
+func (w *rw483) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw483) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw483) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw483) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw483) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw483) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw483) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw483) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw483) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw483) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 485/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, fullDuplexEnabler
+type rw484 rwState
+
+func (w *rw484) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw484) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw484) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw484) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw484) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw484) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw484) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw484) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw484) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 486/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, fullDuplexEnabler, io.StringWriter
+type rw485 rwState
+
+func (w *rw485) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw485) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw485) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw485) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw485) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw485) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw485) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw485) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw485) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw485) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 487/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, fullDuplexEnabler, http.Pusher
+type rw486 rwState
+
+func (w *rw486) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw486) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw486) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw486) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw486) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw486) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw486) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw486) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw486) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw486) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 488/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw487 rwState
+
+func (w *rw487) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw487) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw487) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw487) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw487) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw487) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw487) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw487) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw487) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw487) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw487) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 489/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, deadliner
+type rw488 rwState
+
+func (w *rw488) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw488) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw488) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw488) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw488) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw488) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw488) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw488) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw488) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw488) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 490/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, deadliner, io.StringWriter
+type rw489 rwState
+
+func (w *rw489) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw489) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw489) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw489) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw489) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw489) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw489) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw489) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw489) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw489) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw489) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 491/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, deadliner, http.Pusher
+type rw490 rwState
+
+func (w *rw490) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw490) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw490) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw490) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw490) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw490) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw490) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw490) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw490) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw490) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw490) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 492/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, deadliner, http.Pusher, io.StringWriter
+type rw491 rwState
+
+func (w *rw491) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw491) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw491) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw491) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw491) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw491) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw491) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw491) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw491) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw491) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw491) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw491) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 493/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, deadliner, fullDuplexEnabler
+type rw492 rwState
+
+func (w *rw492) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw492) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw492) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw492) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw492) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw492) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw492) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw492) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw492) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw492) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw492) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 494/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, deadliner, fullDuplexEnabler, io.StringWriter
+type rw493 rwState
+
+func (w *rw493) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw493) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw493) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw493) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw493) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw493) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw493) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw493) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw493) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw493) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw493) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw493) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 495/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, deadliner, fullDuplexEnabler, http.Pusher
+type rw494 rwState
+
+func (w *rw494) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw494) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw494) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw494) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw494) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw494) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw494) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw494) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw494) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw494) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw494) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw494) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 496/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw495 rwState
+
+func (w *rw495) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw495) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw495) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw495) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw495) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw495) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw495) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw495) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw495) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw495) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw495) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw495) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw495) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 497/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom
+type rw496 rwState
+
+func (w *rw496) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw496) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw496) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw496) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw496) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw496) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw496) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw496) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw496) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+
+// combination 498/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, io.StringWriter
+type rw497 rwState
+
+func (w *rw497) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw497) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw497) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw497) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw497) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw497) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw497) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw497) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw497) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw497) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 499/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, http.Pusher
+type rw498 rwState
+
+func (w *rw498) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw498) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw498) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw498) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw498) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw498) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw498) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw498) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw498) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw498) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 500/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, http.Pusher, io.StringWriter
+type rw499 rwState
+
+func (w *rw499) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw499) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw499) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw499) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw499) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw499) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw499) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw499) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw499) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw499) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw499) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 501/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, fullDuplexEnabler
+type rw500 rwState
+
+func (w *rw500) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw500) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw500) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw500) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw500) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw500) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw500) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw500) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw500) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw500) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 502/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, fullDuplexEnabler, io.StringWriter
+type rw501 rwState
+
+func (w *rw501) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw501) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw501) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw501) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw501) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw501) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw501) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw501) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw501) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw501) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw501) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 503/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, fullDuplexEnabler, http.Pusher
+type rw502 rwState
+
+func (w *rw502) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw502) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw502) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw502) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw502) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw502) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw502) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw502) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw502) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw502) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw502) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 504/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw503 rwState
+
+func (w *rw503) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw503) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw503) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw503) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw503) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw503) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw503) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw503) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw503) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw503) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw503) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw503) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 505/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner
+type rw504 rwState
+
+func (w *rw504) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw504) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw504) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw504) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw504) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw504) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw504) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw504) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw504) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw504) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw504) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+
+// combination 506/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, io.StringWriter
+type rw505 rwState
+
+func (w *rw505) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw505) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw505) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw505) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw505) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw505) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw505) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw505) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw505) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw505) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw505) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw505) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 507/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, http.Pusher
+type rw506 rwState
+
+func (w *rw506) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw506) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw506) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw506) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw506) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw506) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw506) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw506) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw506) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw506) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw506) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw506) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 508/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, http.Pusher, io.StringWriter
+type rw507 rwState
+
+func (w *rw507) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw507) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw507) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw507) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw507) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw507) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw507) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw507) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw507) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw507) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw507) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw507) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw507) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 509/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler
+type rw508 rwState
+
+func (w *rw508) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw508) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw508) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw508) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw508) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw508) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw508) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw508) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw508) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw508) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw508) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw508) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+
+// combination 510/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler, io.StringWriter
+type rw509 rwState
+
+func (w *rw509) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw509) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw509) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw509) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw509) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw509) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw509) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw509) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw509) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw509) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw509) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw509) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw509) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+// combination 511/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher
+type rw510 rwState
+
+func (w *rw510) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw510) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw510) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw510) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw510) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw510) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw510) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw510) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw510) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw510) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw510) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw510) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw510) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+
+// combination 512/512: http.ResponseWriter, http.Flusher, httpFlushError, http.CloseNotifier, http.Hijacker, io.ReaderFrom, deadliner, fullDuplexEnabler, http.Pusher, io.StringWriter
+type rw511 rwState
+
+func (w *rw511) Unwrap() http.ResponseWriter { return w.w }
+func (w *rw511) Header() http.Header {
+ return (*rwState)(w).doHeader()
+}
+func (w *rw511) WriteHeader(code int) {
+ (*rwState)(w).doWriteHeader(code)
+}
+func (w *rw511) Write(b []byte) (int, error) {
+ return (*rwState)(w).doWrite(b)
+}
+func (w *rw511) Flush() {
+ (*rwState)(w).doFlush()
+}
+func (w *rw511) FlushError() error {
+ return (*rwState)(w).doFlushError()
+}
+func (w *rw511) CloseNotify() <-chan bool {
+ return (*rwState)(w).doCloseNotify()
+}
+func (w *rw511) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ return (*rwState)(w).doHijack()
+}
+func (w *rw511) ReadFrom(src io.Reader) (int64, error) {
+ return (*rwState)(w).doReadFrom(src)
+}
+func (w *rw511) SetReadDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetReadDeadline(deadline)
+}
+func (w *rw511) SetWriteDeadline(deadline time.Time) error {
+ return (*rwState)(w).doSetWriteDeadline(deadline)
+}
+func (w *rw511) EnableFullDuplex() error {
+ return (*rwState)(w).doEnableFullDuplex()
+}
+func (w *rw511) Push(target string, opts *http.PushOptions) error {
+ return (*rwState)(w).doPush(target, opts)
+}
+func (w *rw511) WriteString(s string) (int, error) {
+ return (*rwState)(w).doWriteString(s)
+}
+
+type Unwrapper interface {
+ Unwrap() http.ResponseWriter
+}
+
+// Unwrap returns the underlying http.ResponseWriter from within zero or more
+// layers of httpsnoop wrappers.
+func Unwrap(w http.ResponseWriter) http.ResponseWriter {
+ if rw, ok := w.(Unwrapper); ok {
+ // recurse until rw.Unwrap() returns a non-Unwrapper
+ return Unwrap(rw.Unwrap())
+ }
+ return w
+}
diff --git a/vendor/github.com/felixge/httpsnoop/wrap_generated_gteq_1.8.go b/vendor/github.com/felixge/httpsnoop/wrap_generated_gteq_1.8.go
deleted file mode 100644
index 101cedde674..00000000000
--- a/vendor/github.com/felixge/httpsnoop/wrap_generated_gteq_1.8.go
+++ /dev/null
@@ -1,436 +0,0 @@
-// +build go1.8
-// Code generated by "httpsnoop/codegen"; DO NOT EDIT.
-
-package httpsnoop
-
-import (
- "bufio"
- "io"
- "net"
- "net/http"
-)
-
-// HeaderFunc is part of the http.ResponseWriter interface.
-type HeaderFunc func() http.Header
-
-// WriteHeaderFunc is part of the http.ResponseWriter interface.
-type WriteHeaderFunc func(code int)
-
-// WriteFunc is part of the http.ResponseWriter interface.
-type WriteFunc func(b []byte) (int, error)
-
-// FlushFunc is part of the http.Flusher interface.
-type FlushFunc func()
-
-// CloseNotifyFunc is part of the http.CloseNotifier interface.
-type CloseNotifyFunc func() <-chan bool
-
-// HijackFunc is part of the http.Hijacker interface.
-type HijackFunc func() (net.Conn, *bufio.ReadWriter, error)
-
-// ReadFromFunc is part of the io.ReaderFrom interface.
-type ReadFromFunc func(src io.Reader) (int64, error)
-
-// PushFunc is part of the http.Pusher interface.
-type PushFunc func(target string, opts *http.PushOptions) error
-
-// Hooks defines a set of method interceptors for methods included in
-// http.ResponseWriter as well as some others. You can think of them as
-// middleware for the function calls they target. See Wrap for more details.
-type Hooks struct {
- Header func(HeaderFunc) HeaderFunc
- WriteHeader func(WriteHeaderFunc) WriteHeaderFunc
- Write func(WriteFunc) WriteFunc
- Flush func(FlushFunc) FlushFunc
- CloseNotify func(CloseNotifyFunc) CloseNotifyFunc
- Hijack func(HijackFunc) HijackFunc
- ReadFrom func(ReadFromFunc) ReadFromFunc
- Push func(PushFunc) PushFunc
-}
-
-// Wrap returns a wrapped version of w that provides the exact same interface
-// as w. Specifically if w implements any combination of:
-//
-// - http.Flusher
-// - http.CloseNotifier
-// - http.Hijacker
-// - io.ReaderFrom
-// - http.Pusher
-//
-// The wrapped version will implement the exact same combination. If no hooks
-// are set, the wrapped version also behaves exactly as w. Hooks targeting
-// methods not supported by w are ignored. Any other hooks will intercept the
-// method they target and may modify the call's arguments and/or return values.
-// The CaptureMetrics implementation serves as a working example for how the
-// hooks can be used.
-func Wrap(w http.ResponseWriter, hooks Hooks) http.ResponseWriter {
- rw := &rw{w: w, h: hooks}
- _, i0 := w.(http.Flusher)
- _, i1 := w.(http.CloseNotifier)
- _, i2 := w.(http.Hijacker)
- _, i3 := w.(io.ReaderFrom)
- _, i4 := w.(http.Pusher)
- switch {
- // combination 1/32
- case !i0 && !i1 && !i2 && !i3 && !i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- }{rw, rw}
- // combination 2/32
- case !i0 && !i1 && !i2 && !i3 && i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Pusher
- }{rw, rw, rw}
- // combination 3/32
- case !i0 && !i1 && !i2 && i3 && !i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- io.ReaderFrom
- }{rw, rw, rw}
- // combination 4/32
- case !i0 && !i1 && !i2 && i3 && i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- io.ReaderFrom
- http.Pusher
- }{rw, rw, rw, rw}
- // combination 5/32
- case !i0 && !i1 && i2 && !i3 && !i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Hijacker
- }{rw, rw, rw}
- // combination 6/32
- case !i0 && !i1 && i2 && !i3 && i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Hijacker
- http.Pusher
- }{rw, rw, rw, rw}
- // combination 7/32
- case !i0 && !i1 && i2 && i3 && !i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Hijacker
- io.ReaderFrom
- }{rw, rw, rw, rw}
- // combination 8/32
- case !i0 && !i1 && i2 && i3 && i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Hijacker
- io.ReaderFrom
- http.Pusher
- }{rw, rw, rw, rw, rw}
- // combination 9/32
- case !i0 && i1 && !i2 && !i3 && !i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.CloseNotifier
- }{rw, rw, rw}
- // combination 10/32
- case !i0 && i1 && !i2 && !i3 && i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.CloseNotifier
- http.Pusher
- }{rw, rw, rw, rw}
- // combination 11/32
- case !i0 && i1 && !i2 && i3 && !i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.CloseNotifier
- io.ReaderFrom
- }{rw, rw, rw, rw}
- // combination 12/32
- case !i0 && i1 && !i2 && i3 && i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.CloseNotifier
- io.ReaderFrom
- http.Pusher
- }{rw, rw, rw, rw, rw}
- // combination 13/32
- case !i0 && i1 && i2 && !i3 && !i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.CloseNotifier
- http.Hijacker
- }{rw, rw, rw, rw}
- // combination 14/32
- case !i0 && i1 && i2 && !i3 && i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.CloseNotifier
- http.Hijacker
- http.Pusher
- }{rw, rw, rw, rw, rw}
- // combination 15/32
- case !i0 && i1 && i2 && i3 && !i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.CloseNotifier
- http.Hijacker
- io.ReaderFrom
- }{rw, rw, rw, rw, rw}
- // combination 16/32
- case !i0 && i1 && i2 && i3 && i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.CloseNotifier
- http.Hijacker
- io.ReaderFrom
- http.Pusher
- }{rw, rw, rw, rw, rw, rw}
- // combination 17/32
- case i0 && !i1 && !i2 && !i3 && !i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Flusher
- }{rw, rw, rw}
- // combination 18/32
- case i0 && !i1 && !i2 && !i3 && i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Flusher
- http.Pusher
- }{rw, rw, rw, rw}
- // combination 19/32
- case i0 && !i1 && !i2 && i3 && !i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Flusher
- io.ReaderFrom
- }{rw, rw, rw, rw}
- // combination 20/32
- case i0 && !i1 && !i2 && i3 && i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Flusher
- io.ReaderFrom
- http.Pusher
- }{rw, rw, rw, rw, rw}
- // combination 21/32
- case i0 && !i1 && i2 && !i3 && !i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Flusher
- http.Hijacker
- }{rw, rw, rw, rw}
- // combination 22/32
- case i0 && !i1 && i2 && !i3 && i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Flusher
- http.Hijacker
- http.Pusher
- }{rw, rw, rw, rw, rw}
- // combination 23/32
- case i0 && !i1 && i2 && i3 && !i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Flusher
- http.Hijacker
- io.ReaderFrom
- }{rw, rw, rw, rw, rw}
- // combination 24/32
- case i0 && !i1 && i2 && i3 && i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Flusher
- http.Hijacker
- io.ReaderFrom
- http.Pusher
- }{rw, rw, rw, rw, rw, rw}
- // combination 25/32
- case i0 && i1 && !i2 && !i3 && !i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Flusher
- http.CloseNotifier
- }{rw, rw, rw, rw}
- // combination 26/32
- case i0 && i1 && !i2 && !i3 && i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Flusher
- http.CloseNotifier
- http.Pusher
- }{rw, rw, rw, rw, rw}
- // combination 27/32
- case i0 && i1 && !i2 && i3 && !i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Flusher
- http.CloseNotifier
- io.ReaderFrom
- }{rw, rw, rw, rw, rw}
- // combination 28/32
- case i0 && i1 && !i2 && i3 && i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Flusher
- http.CloseNotifier
- io.ReaderFrom
- http.Pusher
- }{rw, rw, rw, rw, rw, rw}
- // combination 29/32
- case i0 && i1 && i2 && !i3 && !i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Flusher
- http.CloseNotifier
- http.Hijacker
- }{rw, rw, rw, rw, rw}
- // combination 30/32
- case i0 && i1 && i2 && !i3 && i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Flusher
- http.CloseNotifier
- http.Hijacker
- http.Pusher
- }{rw, rw, rw, rw, rw, rw}
- // combination 31/32
- case i0 && i1 && i2 && i3 && !i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Flusher
- http.CloseNotifier
- http.Hijacker
- io.ReaderFrom
- }{rw, rw, rw, rw, rw, rw}
- // combination 32/32
- case i0 && i1 && i2 && i3 && i4:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Flusher
- http.CloseNotifier
- http.Hijacker
- io.ReaderFrom
- http.Pusher
- }{rw, rw, rw, rw, rw, rw, rw}
- }
- panic("unreachable")
-}
-
-type rw struct {
- w http.ResponseWriter
- h Hooks
-}
-
-func (w *rw) Unwrap() http.ResponseWriter {
- return w.w
-}
-
-func (w *rw) Header() http.Header {
- f := w.w.(http.ResponseWriter).Header
- if w.h.Header != nil {
- f = w.h.Header(f)
- }
- return f()
-}
-
-func (w *rw) WriteHeader(code int) {
- f := w.w.(http.ResponseWriter).WriteHeader
- if w.h.WriteHeader != nil {
- f = w.h.WriteHeader(f)
- }
- f(code)
-}
-
-func (w *rw) Write(b []byte) (int, error) {
- f := w.w.(http.ResponseWriter).Write
- if w.h.Write != nil {
- f = w.h.Write(f)
- }
- return f(b)
-}
-
-func (w *rw) Flush() {
- f := w.w.(http.Flusher).Flush
- if w.h.Flush != nil {
- f = w.h.Flush(f)
- }
- f()
-}
-
-func (w *rw) CloseNotify() <-chan bool {
- f := w.w.(http.CloseNotifier).CloseNotify
- if w.h.CloseNotify != nil {
- f = w.h.CloseNotify(f)
- }
- return f()
-}
-
-func (w *rw) Hijack() (net.Conn, *bufio.ReadWriter, error) {
- f := w.w.(http.Hijacker).Hijack
- if w.h.Hijack != nil {
- f = w.h.Hijack(f)
- }
- return f()
-}
-
-func (w *rw) ReadFrom(src io.Reader) (int64, error) {
- f := w.w.(io.ReaderFrom).ReadFrom
- if w.h.ReadFrom != nil {
- f = w.h.ReadFrom(f)
- }
- return f(src)
-}
-
-func (w *rw) Push(target string, opts *http.PushOptions) error {
- f := w.w.(http.Pusher).Push
- if w.h.Push != nil {
- f = w.h.Push(f)
- }
- return f(target, opts)
-}
-
-type Unwrapper interface {
- Unwrap() http.ResponseWriter
-}
-
-// Unwrap returns the underlying http.ResponseWriter from within zero or more
-// layers of httpsnoop wrappers.
-func Unwrap(w http.ResponseWriter) http.ResponseWriter {
- if rw, ok := w.(Unwrapper); ok {
- // recurse until rw.Unwrap() returns a non-Unwrapper
- return Unwrap(rw.Unwrap())
- } else {
- return w
- }
-}
diff --git a/vendor/github.com/felixge/httpsnoop/wrap_generated_lt_1.8.go b/vendor/github.com/felixge/httpsnoop/wrap_generated_lt_1.8.go
deleted file mode 100644
index e0951df1527..00000000000
--- a/vendor/github.com/felixge/httpsnoop/wrap_generated_lt_1.8.go
+++ /dev/null
@@ -1,278 +0,0 @@
-// +build !go1.8
-// Code generated by "httpsnoop/codegen"; DO NOT EDIT.
-
-package httpsnoop
-
-import (
- "bufio"
- "io"
- "net"
- "net/http"
-)
-
-// HeaderFunc is part of the http.ResponseWriter interface.
-type HeaderFunc func() http.Header
-
-// WriteHeaderFunc is part of the http.ResponseWriter interface.
-type WriteHeaderFunc func(code int)
-
-// WriteFunc is part of the http.ResponseWriter interface.
-type WriteFunc func(b []byte) (int, error)
-
-// FlushFunc is part of the http.Flusher interface.
-type FlushFunc func()
-
-// CloseNotifyFunc is part of the http.CloseNotifier interface.
-type CloseNotifyFunc func() <-chan bool
-
-// HijackFunc is part of the http.Hijacker interface.
-type HijackFunc func() (net.Conn, *bufio.ReadWriter, error)
-
-// ReadFromFunc is part of the io.ReaderFrom interface.
-type ReadFromFunc func(src io.Reader) (int64, error)
-
-// Hooks defines a set of method interceptors for methods included in
-// http.ResponseWriter as well as some others. You can think of them as
-// middleware for the function calls they target. See Wrap for more details.
-type Hooks struct {
- Header func(HeaderFunc) HeaderFunc
- WriteHeader func(WriteHeaderFunc) WriteHeaderFunc
- Write func(WriteFunc) WriteFunc
- Flush func(FlushFunc) FlushFunc
- CloseNotify func(CloseNotifyFunc) CloseNotifyFunc
- Hijack func(HijackFunc) HijackFunc
- ReadFrom func(ReadFromFunc) ReadFromFunc
-}
-
-// Wrap returns a wrapped version of w that provides the exact same interface
-// as w. Specifically if w implements any combination of:
-//
-// - http.Flusher
-// - http.CloseNotifier
-// - http.Hijacker
-// - io.ReaderFrom
-//
-// The wrapped version will implement the exact same combination. If no hooks
-// are set, the wrapped version also behaves exactly as w. Hooks targeting
-// methods not supported by w are ignored. Any other hooks will intercept the
-// method they target and may modify the call's arguments and/or return values.
-// The CaptureMetrics implementation serves as a working example for how the
-// hooks can be used.
-func Wrap(w http.ResponseWriter, hooks Hooks) http.ResponseWriter {
- rw := &rw{w: w, h: hooks}
- _, i0 := w.(http.Flusher)
- _, i1 := w.(http.CloseNotifier)
- _, i2 := w.(http.Hijacker)
- _, i3 := w.(io.ReaderFrom)
- switch {
- // combination 1/16
- case !i0 && !i1 && !i2 && !i3:
- return struct {
- Unwrapper
- http.ResponseWriter
- }{rw, rw}
- // combination 2/16
- case !i0 && !i1 && !i2 && i3:
- return struct {
- Unwrapper
- http.ResponseWriter
- io.ReaderFrom
- }{rw, rw, rw}
- // combination 3/16
- case !i0 && !i1 && i2 && !i3:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Hijacker
- }{rw, rw, rw}
- // combination 4/16
- case !i0 && !i1 && i2 && i3:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Hijacker
- io.ReaderFrom
- }{rw, rw, rw, rw}
- // combination 5/16
- case !i0 && i1 && !i2 && !i3:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.CloseNotifier
- }{rw, rw, rw}
- // combination 6/16
- case !i0 && i1 && !i2 && i3:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.CloseNotifier
- io.ReaderFrom
- }{rw, rw, rw, rw}
- // combination 7/16
- case !i0 && i1 && i2 && !i3:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.CloseNotifier
- http.Hijacker
- }{rw, rw, rw, rw}
- // combination 8/16
- case !i0 && i1 && i2 && i3:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.CloseNotifier
- http.Hijacker
- io.ReaderFrom
- }{rw, rw, rw, rw, rw}
- // combination 9/16
- case i0 && !i1 && !i2 && !i3:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Flusher
- }{rw, rw, rw}
- // combination 10/16
- case i0 && !i1 && !i2 && i3:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Flusher
- io.ReaderFrom
- }{rw, rw, rw, rw}
- // combination 11/16
- case i0 && !i1 && i2 && !i3:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Flusher
- http.Hijacker
- }{rw, rw, rw, rw}
- // combination 12/16
- case i0 && !i1 && i2 && i3:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Flusher
- http.Hijacker
- io.ReaderFrom
- }{rw, rw, rw, rw, rw}
- // combination 13/16
- case i0 && i1 && !i2 && !i3:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Flusher
- http.CloseNotifier
- }{rw, rw, rw, rw}
- // combination 14/16
- case i0 && i1 && !i2 && i3:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Flusher
- http.CloseNotifier
- io.ReaderFrom
- }{rw, rw, rw, rw, rw}
- // combination 15/16
- case i0 && i1 && i2 && !i3:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Flusher
- http.CloseNotifier
- http.Hijacker
- }{rw, rw, rw, rw, rw}
- // combination 16/16
- case i0 && i1 && i2 && i3:
- return struct {
- Unwrapper
- http.ResponseWriter
- http.Flusher
- http.CloseNotifier
- http.Hijacker
- io.ReaderFrom
- }{rw, rw, rw, rw, rw, rw}
- }
- panic("unreachable")
-}
-
-type rw struct {
- w http.ResponseWriter
- h Hooks
-}
-
-func (w *rw) Unwrap() http.ResponseWriter {
- return w.w
-}
-
-func (w *rw) Header() http.Header {
- f := w.w.(http.ResponseWriter).Header
- if w.h.Header != nil {
- f = w.h.Header(f)
- }
- return f()
-}
-
-func (w *rw) WriteHeader(code int) {
- f := w.w.(http.ResponseWriter).WriteHeader
- if w.h.WriteHeader != nil {
- f = w.h.WriteHeader(f)
- }
- f(code)
-}
-
-func (w *rw) Write(b []byte) (int, error) {
- f := w.w.(http.ResponseWriter).Write
- if w.h.Write != nil {
- f = w.h.Write(f)
- }
- return f(b)
-}
-
-func (w *rw) Flush() {
- f := w.w.(http.Flusher).Flush
- if w.h.Flush != nil {
- f = w.h.Flush(f)
- }
- f()
-}
-
-func (w *rw) CloseNotify() <-chan bool {
- f := w.w.(http.CloseNotifier).CloseNotify
- if w.h.CloseNotify != nil {
- f = w.h.CloseNotify(f)
- }
- return f()
-}
-
-func (w *rw) Hijack() (net.Conn, *bufio.ReadWriter, error) {
- f := w.w.(http.Hijacker).Hijack
- if w.h.Hijack != nil {
- f = w.h.Hijack(f)
- }
- return f()
-}
-
-func (w *rw) ReadFrom(src io.Reader) (int64, error) {
- f := w.w.(io.ReaderFrom).ReadFrom
- if w.h.ReadFrom != nil {
- f = w.h.ReadFrom(f)
- }
- return f(src)
-}
-
-type Unwrapper interface {
- Unwrap() http.ResponseWriter
-}
-
-// Unwrap returns the underlying http.ResponseWriter from within zero or more
-// layers of httpsnoop wrappers.
-func Unwrap(w http.ResponseWriter) http.ResponseWriter {
- if rw, ok := w.(Unwrapper); ok {
- // recurse until rw.Unwrap() returns a non-Unwrapper
- return Unwrap(rw.Unwrap())
- } else {
- return w
- }
-}
diff --git a/vendor/github.com/fsnotify/fsnotify/.cirrus.yml b/vendor/github.com/fsnotify/fsnotify/.cirrus.yml
deleted file mode 100644
index 7f257e99ac9..00000000000
--- a/vendor/github.com/fsnotify/fsnotify/.cirrus.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-freebsd_task:
- name: 'FreeBSD'
- freebsd_instance:
- image_family: freebsd-14-2
- install_script:
- - pkg update -f
- - pkg install -y go
- test_script:
- # run tests as user "cirrus" instead of root
- - pw useradd cirrus -m
- - chown -R cirrus:cirrus .
- - FSNOTIFY_BUFFER=4096 sudo --preserve-env=FSNOTIFY_BUFFER -u cirrus go test -parallel 1 -race ./...
- - sudo --preserve-env=FSNOTIFY_BUFFER -u cirrus go test -parallel 1 -race ./...
- - FSNOTIFY_DEBUG=1 sudo --preserve-env=FSNOTIFY_BUFFER -u cirrus go test -parallel 1 -race -v ./...
diff --git a/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md b/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md
index 6468d2cf400..3027f3c67a2 100644
--- a/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md
+++ b/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md
@@ -1,5 +1,54 @@
# Changelog
+1.10.1 2026-05-04
+-----------------
+
+### Changes and fixes
+
+- inotify: don't remove sibling watches sharing a path prefix ([#754])
+
+- inotify, windows: don't rename sibling watches sharing a path prefix
+ ([#755])
+
+
+[#754]: https://github.com/fsnotify/fsnotify/pull/754
+[#755]: https://github.com/fsnotify/fsnotify/pull/755
+
+
+1.10.0 2026-04-30
+-----------------
+This version of fsnotify needs Go 1.23.
+
+### Changes and fixes
+
+- inotify: improve initialization error message ([#731])
+
+- inotify: send Rename event if recursive watch is renamed ([#696])
+
+- inotify: avoid copying event buffers when reading names ([#741])
+
+- kqueue: skip dangling symlinks (ENOENT) in watchDirectoryFiles, so a
+ bad entry no longer aborts Watcher.Add for the whole directory ([#748])
+
+- kqueue: drop watches directly in Close() to fix a file descriptor leak
+ when recycling watchers ([#740])
+
+- windows: fix nil pointer dereference in remWatch ([#736])
+
+- windows: lock watch field updates against concurrent WatchList to fix
+ a race introduced in v1.9.0 ([#709], [#749])
+
+
+[#696]: https://github.com/fsnotify/fsnotify/pull/696
+[#709]: https://github.com/fsnotify/fsnotify/pull/709
+[#731]: https://github.com/fsnotify/fsnotify/pull/731
+[#736]: https://github.com/fsnotify/fsnotify/pull/736
+[#740]: https://github.com/fsnotify/fsnotify/pull/740
+[#741]: https://github.com/fsnotify/fsnotify/pull/741
+[#748]: https://github.com/fsnotify/fsnotify/pull/748
+[#749]: https://github.com/fsnotify/fsnotify/pull/749
+
+
1.9.0 2024-04-04
----------------
diff --git a/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md b/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md
index 4cc40fa597d..cd0ee612da6 100644
--- a/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md
+++ b/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md
@@ -77,6 +77,8 @@ End-of-line escapes with `\` are not supported.
debug [yes/no] # Enable/disable FSNOTIFY_DEBUG (tests are run in
parallel by default, so -parallel=1 is probably a good
idea).
+ state # Print internal state to stderr (exact output differs
+ # per backend).
print [any strings] # Print text to stdout; for debugging.
touch path
diff --git a/vendor/github.com/fsnotify/fsnotify/README.md b/vendor/github.com/fsnotify/fsnotify/README.md
index 1f4eb583d50..2e56ef4c9a5 100644
--- a/vendor/github.com/fsnotify/fsnotify/README.md
+++ b/vendor/github.com/fsnotify/fsnotify/README.md
@@ -1,7 +1,7 @@
fsnotify is a Go library to provide cross-platform filesystem notifications on
Windows, Linux, macOS, BSD, and illumos.
-Go 1.17 or newer is required; the full documentation is at
+Go 1.23 or newer is required; the full documentation is at
https://pkg.go.dev/github.com/fsnotify/fsnotify
---
@@ -12,7 +12,7 @@ Platform support:
| :-------------------- | :--------- | :------------------------------------------------------------------------ |
| inotify | Linux | Supported |
| kqueue | BSD, macOS | Supported |
-| ReadDirectoryChangesW | Windows | Supported |
+| ReadDirectoryChangesW | Windows | Supported ([excluding `Chmod` operations][#487]) |
| FEN | illumos | Supported |
| fanotify | Linux 5.9+ | [Not yet](https://github.com/fsnotify/fsnotify/issues/114) |
| FSEvents | macOS | [Needs support in x/sys/unix][fsevents] |
@@ -22,6 +22,7 @@ Platform support:
Linux and illumos should include Android and Solaris, but these are currently
untested.
+[#487]: https://github.com/fsnotify/fsnotify/issues/487
[fsevents]: https://github.com/fsnotify/fsnotify/issues/11#issuecomment-1279133120
[usn]: https://github.com/fsnotify/fsnotify/issues/53#issuecomment-1279829847
@@ -126,7 +127,7 @@ settings* until we have a native FSEvents implementation (see [#11]).
### Watching a file doesn't work well
Watching individual files (rather than directories) is generally not recommended
as many programs (especially editors) update files atomically: it will write to
-a temporary file which is then moved to to destination, overwriting the original
+a temporary file which is then moved to a destination, overwriting the original
(or some variant thereof). The watcher on the original file is now lost, as that
no longer exists.
@@ -151,26 +152,57 @@ This is the event that inotify sends, so not much can be changed about this.
The `fs.inotify.max_user_watches` sysctl variable specifies the upper limit for
the number of watches per user, and `fs.inotify.max_user_instances` specifies
the maximum number of inotify instances per user. Every Watcher you create is an
-"instance", and every path you add is a "watch".
+"instance", and every path you add is a "watch". Reaching the limit will result
+in a "no space left on device" or "too many open files" error.
These are also exposed in `/proc` as `/proc/sys/fs/inotify/max_user_watches` and
-`/proc/sys/fs/inotify/max_user_instances`
+`/proc/sys/fs/inotify/max_user_instances`. The default values differ per distro
+and available memory.
To increase them you can use `sysctl` or write the value to proc file:
- # The default values on Linux 5.18
- sysctl fs.inotify.max_user_watches=124983
- sysctl fs.inotify.max_user_instances=128
+ sysctl fs.inotify.max_user_watches=200000
+ sysctl fs.inotify.max_user_instances=256
To make the changes persist on reboot edit `/etc/sysctl.conf` or
`/usr/lib/sysctl.d/50-default.conf` (details differ per Linux distro; check your
distro's documentation):
- fs.inotify.max_user_watches=124983
- fs.inotify.max_user_instances=128
+ fs.inotify.max_user_watches=200000
+ fs.inotify.max_user_instances=256
+
+### Windows
+Recursive watching is not currently enabled through fsnotify's public API
+(see the FAQ "Are subdirectories watched?" above). The notes below
+describe Windows backend behavior observed when recursive watching is
+enabled internally (for example, in fsnotify's own tests). They are kept
+here as a reference for maintainers and contributors who encounter the
+behavior, since the recursive code path still exists in the backend.
+
+When recursive watching is enabled and you watch a directory, you may
+receive a `Write` event for an intermediate directory whenever a child
+entry inside it is created, renamed, or removed. For example, with a
+recursive watch on `/a` and a new file `/a/b/c`, you will receive
+`Create /a/b/c` and may also receive `Write /a/b`.
+
+This happens because, on NTFS-backed volumes, modifying the entries of a
+directory updates that directory's last-write time, and the Windows
+backend requests `FILE_NOTIFY_CHANGE_LAST_WRITE` to support `Write` events
+on files. The same `Write` filter therefore picks up the directory's
+metadata update.
+
+kqueue has the same "directory `Write` = directory contents changed"
+semantics, so portable code that treats `Write` on a directory as
+"something inside it changed" works on Windows and BSD/macOS, but not on
+Linux (inotify uses `Write` only for file-content changes). If you only
+care about file content, filter out `Write` events whose path refers to a
+directory.
+
+Whether the directory `Write` is actually delivered alongside the child
+events is not guaranteed: it depends on `ReadDirectoryChangesW` buffering,
+NTFS metadata update timing, and event coalescing, none of which fsnotify
+controls.
-Reaching the limit will result in a "no space left on device" or "too many open
-files" error.
### kqueue (macOS, all BSD systems)
kqueue requires opening a file descriptor for every file that's being watched;
diff --git a/vendor/github.com/fsnotify/fsnotify/backend_fen.go b/vendor/github.com/fsnotify/fsnotify/backend_fen.go
index 57fc6928484..e43c6d088cc 100644
--- a/vendor/github.com/fsnotify/fsnotify/backend_fen.go
+++ b/vendor/github.com/fsnotify/fsnotify/backend_fen.go
@@ -158,7 +158,9 @@ func (w *fen) readEvents() {
pevents := make([]unix.PortEvent, 8)
for {
- count, err := w.port.Get(pevents, 1, nil)
+ count, err := internal.IgnoringEINTR(func() (int, error) {
+ return w.port.Get(pevents, 1, nil)
+ })
if err != nil && err != unix.ETIME {
// Interrupted system call (count should be 0) ignore and continue
if errors.Is(err, unix.EINTR) && count == 0 {
diff --git a/vendor/github.com/fsnotify/fsnotify/backend_inotify.go b/vendor/github.com/fsnotify/fsnotify/backend_inotify.go
index a36cb89d736..4c3f6f7c283 100644
--- a/vendor/github.com/fsnotify/fsnotify/backend_inotify.go
+++ b/vendor/github.com/fsnotify/fsnotify/backend_inotify.go
@@ -55,10 +55,10 @@ type (
path map[string]uint32 // pathname → wd
}
watch struct {
- wd uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall)
- flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags)
- path string // Watch path.
- recurse bool // Recursion with ./...?
+ wd uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall)
+ flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags)
+ path string // Watch path.
+ watchFlags watchFlag
}
koekje struct {
cookie uint32
@@ -66,6 +66,9 @@ type (
}
)
+func (w watch) byUser() bool { return w.watchFlags&flagByUser != 0 }
+func (w watch) recurse() bool { return w.watchFlags&flagRecurse != 0 }
+
func newWatches() *watches {
return &watches{
wd: make(map[uint32]*watch),
@@ -79,6 +82,13 @@ func (w *watches) len() int { return len(w.wd) }
func (w *watches) add(ww *watch) { w.wd[ww.wd] = ww; w.path[ww.path] = ww.wd }
func (w *watches) remove(watch *watch) { delete(w.path, watch.path); delete(w.wd, watch.wd) }
+func isSameOrDescendantPath(path, root string) bool {
+ if path == root {
+ return true
+ }
+ return strings.HasPrefix(path, root+string(os.PathSeparator))
+}
+
func (w *watches) removePath(path string) ([]uint32, error) {
path, recurse := recursivePath(path)
wd, ok := w.path[path]
@@ -87,20 +97,20 @@ func (w *watches) removePath(path string) ([]uint32, error) {
}
watch := w.wd[wd]
- if recurse && !watch.recurse {
+ if recurse && !watch.recurse() {
return nil, fmt.Errorf("can't use /... with non-recursive watch %q", path)
}
delete(w.path, path)
delete(w.wd, wd)
- if !watch.recurse {
+ if !watch.recurse() {
return []uint32{wd}, nil
}
wds := make([]uint32, 0, 8)
wds = append(wds, wd)
for p, rwd := range w.path {
- if strings.HasPrefix(p, path) {
+ if isSameOrDescendantPath(p, path) {
delete(w.path, p)
delete(w.wd, rwd)
wds = append(wds, rwd)
@@ -139,7 +149,7 @@ func newBackend(ev chan Event, errs chan error) (backend, error) {
// I/O operations won't terminate on close.
fd, errno := unix.InotifyInit1(unix.IN_CLOEXEC | unix.IN_NONBLOCK)
if fd == -1 {
- return nil, errno
+ return nil, fmt.Errorf("couldn't initialize inotify: %w", errno)
}
w := &inotify{
@@ -188,11 +198,8 @@ func (w *inotify) AddWith(path string, opts ...addOpt) error {
return fmt.Errorf("%w: %s", xErrUnsupported, with.op)
}
- add := func(path string, with withOpts, recurse bool) error {
+ add := func(path string, with withOpts, wf watchFlag) error {
var flags uint32
- if with.noFollow {
- flags |= unix.IN_DONT_FOLLOW
- }
if with.op.Has(Create) {
flags |= unix.IN_CREATE
}
@@ -220,7 +227,7 @@ func (w *inotify) AddWith(path string, opts ...addOpt) error {
if with.op.Has(xUnportableCloseRead) {
flags |= unix.IN_CLOSE_NOWRITE
}
- return w.register(path, flags, recurse)
+ return w.register(path, flags, wf)
}
w.mu.Lock()
@@ -248,14 +255,18 @@ func (w *inotify) AddWith(path string, opts ...addOpt) error {
w.sendEvent(Event{Name: root, Op: Create})
}
- return add(root, with, true)
+ wf := flagRecurse
+ if root == path {
+ wf |= flagByUser
+ }
+ return add(root, with, wf)
})
}
- return add(path, with, false)
+ return add(path, with, 0)
}
-func (w *inotify) register(path string, flags uint32, recurse bool) error {
+func (w *inotify) register(path string, flags uint32, wf watchFlag) error {
return w.watches.updatePath(path, func(existing *watch) (*watch, error) {
if existing != nil {
flags |= existing.flags | unix.IN_MASK_ADD
@@ -272,10 +283,10 @@ func (w *inotify) register(path string, flags uint32, recurse bool) error {
if existing == nil {
return &watch{
- wd: uint32(wd),
- path: path,
- flags: flags,
- recurse: recurse,
+ wd: uint32(wd),
+ path: path,
+ flags: flags,
+ watchFlags: wf,
}, nil
}
@@ -425,11 +436,7 @@ func (w *inotify) handleEvent(inEvent *unix.InotifyEvent, buf *[65536]byte, offs
nameLen = uint32(inEvent.Len)
)
if nameLen > 0 {
- /// Point "bytes" at the first byte of the filename
- bb := *buf
- bytes := (*[unix.PathMax]byte)(unsafe.Pointer(&bb[offset+unix.SizeofInotifyEvent]))[:nameLen:nameLen]
- /// The filename is padded with NULL bytes. TrimRight() gets rid of those.
- name += "/" + strings.TrimRight(string(bytes[0:nameLen]), "\x00")
+ name += "/" + inotifyEventName(buf, offset, nameLen)
}
if debug {
@@ -450,7 +457,9 @@ func (w *inotify) handleEvent(inEvent *unix.InotifyEvent, buf *[65536]byte, offs
// We can't really update the state when a watched path is moved; only
// IN_MOVE_SELF is sent and not IN_MOVED_{FROM,TO}. So remove the watch.
if inEvent.Mask&unix.IN_MOVE_SELF == unix.IN_MOVE_SELF {
- if watch.recurse { // Do nothing
+ // Watch is set up as part of recurse: do nothing as the move gets
+ // registered from the parent directory.
+ if watch.recurse() && !watch.byUser() {
return Event{}, true
}
@@ -460,6 +469,10 @@ func (w *inotify) handleEvent(inEvent *unix.InotifyEvent, buf *[65536]byte, offs
return Event{}, false
}
}
+
+ if watch.recurse() {
+ return Event{Name: watch.path, Op: Rename}, true
+ }
}
/// Skip if we're watching both this path and the parent; the parent will
@@ -473,11 +486,11 @@ func (w *inotify) handleEvent(inEvent *unix.InotifyEvent, buf *[65536]byte, offs
ev := w.newEvent(name, inEvent.Mask, inEvent.Cookie)
// Need to update watch path for recurse.
- if watch.recurse {
+ if watch.recurse() {
isDir := inEvent.Mask&unix.IN_ISDIR == unix.IN_ISDIR
/// New directory created: set up watch on it.
if isDir && ev.Has(Create) {
- err := w.register(ev.Name, watch.flags, true)
+ err := w.register(ev.Name, watch.flags, flagRecurse)
if !w.sendError(err) {
return Event{}, false
}
@@ -495,7 +508,7 @@ func (w *inotify) handleEvent(inEvent *unix.InotifyEvent, buf *[65536]byte, offs
if k == watch.wd || ww.path == ev.Name {
continue
}
- if strings.HasPrefix(ww.path, ev.renamedFrom) {
+ if isSameOrDescendantPath(ww.path, ev.renamedFrom) {
ww.path = strings.Replace(ww.path, ev.renamedFrom, ev.Name, 1)
w.watches.wd[k] = ww
}
@@ -507,12 +520,13 @@ func (w *inotify) handleEvent(inEvent *unix.InotifyEvent, buf *[65536]byte, offs
return ev, true
}
-func (w *inotify) isRecursive(path string) bool {
- ww := w.watches.byPath(path)
- if ww == nil { // path could be a file, so also check the Dir.
- ww = w.watches.byPath(filepath.Dir(path))
+func inotifyEventName(buf *[65536]byte, offset, nameLen uint32) string {
+ start := int(offset + unix.SizeofInotifyEvent)
+ bytes := (*[unix.PathMax]byte)(unsafe.Pointer(&buf[start]))[:nameLen:nameLen]
+ for nameLen > 0 && bytes[nameLen-1] == 0 {
+ nameLen--
}
- return ww != nil && ww.recurse
+ return string(bytes[:nameLen])
}
func (w *inotify) newEvent(name string, mask, cookie uint32) Event {
@@ -578,6 +592,6 @@ func (w *inotify) state() {
w.mu.Lock()
defer w.mu.Unlock()
for wd, ww := range w.watches.wd {
- fmt.Fprintf(os.Stderr, "%4d: recurse=%t %q\n", wd, ww.recurse, ww.path)
+ fmt.Fprintf(os.Stderr, "%4d: %q watchFlags=0x%x\n", wd, ww.path, ww.watchFlags)
}
}
diff --git a/vendor/github.com/fsnotify/fsnotify/backend_kqueue.go b/vendor/github.com/fsnotify/fsnotify/backend_kqueue.go
index 340aeec061c..d2c8cfb6c6a 100644
--- a/vendor/github.com/fsnotify/fsnotify/backend_kqueue.go
+++ b/vendor/github.com/fsnotify/fsnotify/backend_kqueue.go
@@ -8,6 +8,7 @@ import (
"os"
"path/filepath"
"runtime"
+ "sort"
"sync"
"time"
@@ -245,9 +246,26 @@ func (w *kqueue) Close() error {
return nil
}
+ // Snapshot and drop all watches directly. w.Remove -> w.remove
+ // short-circuits on isClosed() (which is already true after
+ // w.shared.close() above), so calling Remove here in the happy path
+ // leaked every watched directory + file descriptor. On macOS a
+ // single directory watch opens an fd for every file in the dir, so
+ // long-running processes that recreate watchers (hot-reload dev
+ // servers, etc.) ran out of fds with EMFILE (#732).
pathsToRemove := w.watches.listPaths(false)
for _, name := range pathsToRemove {
- w.Remove(name)
+ info, ok := w.watches.byPath(name)
+ if !ok {
+ // w.path has an entry for name but w.wd doesn't --
+ // drop the stale lookup entry so the map state is
+ // consistent after Close.
+ w.watches.remove(0, name)
+ continue
+ }
+ _ = w.register([]int{info.wd}, unix.EV_DELETE, 0)
+ unix.Close(info.wd)
+ w.watches.remove(info.wd, name)
}
unix.Close(w.closepipe[1]) // Send "quit" message to readEvents
@@ -376,19 +394,12 @@ func (w *kqueue) addWatch(name string, flags uint32, listDir bool) (string, erro
}
}
- // Retry on EINTR; open() can return EINTR in practice on macOS.
- // See #354, and Go issues 11180 and 39237.
- for {
- info.wd, err = unix.Open(name, openMode, 0)
- if err == nil {
- break
- }
- if errors.Is(err, unix.EINTR) {
- continue
- }
+ info.wd, err = internal.IgnoringEINTR(func() (int, error) {
+ return unix.Open(name, openMode, 0)
+ })
+ if err != nil {
return "", err
}
-
info.isDir = fi.IsDir()
}
@@ -436,9 +447,10 @@ func (w *kqueue) readEvents() {
eventBuffer := make([]unix.Kevent_t, 10)
for {
- kevents, err := w.read(eventBuffer)
- // EINTR is okay, the syscall was interrupted before timeout expired.
- if err != nil && err != unix.EINTR {
+ kevents, err := internal.IgnoringEINTR(func() ([]unix.Kevent_t, error) {
+ return w.read(eventBuffer)
+ })
+ if err != nil {
if !w.sendError(fmt.Errorf("fsnotify.readEvents: %w", err)) {
return
}
@@ -583,12 +595,14 @@ func (w *kqueue) watchDirectoryFiles(dirPath string) error {
cleanPath, err := w.internalWatch(path, fi)
if err != nil {
- // No permission to read the file; that's not a problem: just skip.
- // But do add it to w.fileExists to prevent it from being picked up
- // as a "new" file later (it still shows up in the directory
+ // No permission, or the entry resolved to a missing target
+ // (e.g. a dangling symlink): not a problem, just skip. But
+ // do mark it as seen to prevent it from being picked up as
+ // a "new" file later (it still shows up in the directory
// listing).
switch {
- case errors.Is(err, unix.EACCES) || errors.Is(err, unix.EPERM):
+ case errors.Is(err, unix.EACCES) || errors.Is(err, unix.EPERM) ||
+ errors.Is(err, os.ErrNotExist):
cleanPath = filepath.Clean(path)
default:
return fmt.Errorf("%q: %w", path, err)
@@ -703,3 +717,19 @@ func (w *kqueue) xSupports(op Op) bool {
}
return true
}
+
+func (w *kqueue) state() {
+ w.watches.mu.Lock()
+ defer w.watches.mu.Unlock()
+
+ all := make([]int, 0, len(w.watches.wd))
+ for wd := range w.watches.wd {
+ all = append(all, wd)
+ }
+ sort.Ints(all)
+
+ for _, wd := range all {
+ ww := w.watches.wd[wd]
+ fmt.Fprintf(os.Stderr, "%4d %q linkname=%q\n", wd, ww.name, ww.linkName)
+ }
+}
diff --git a/vendor/github.com/fsnotify/fsnotify/backend_windows.go b/vendor/github.com/fsnotify/fsnotify/backend_windows.go
index 3433642d641..fb9210f24ed 100644
--- a/vendor/github.com/fsnotify/fsnotify/backend_windows.go
+++ b/vendor/github.com/fsnotify/fsnotify/backend_windows.go
@@ -11,7 +11,6 @@ import (
"fmt"
"os"
"path/filepath"
- "reflect"
"runtime"
"strings"
"sync"
@@ -37,6 +36,13 @@ type readDirChangesW struct {
var defaultBufferSize = 50
+func isSameOrDescendantPath(path, root string) bool {
+ if path == root {
+ return true
+ }
+ return strings.HasPrefix(path, root+string(os.PathSeparator))
+}
+
func newBackend(ev chan Event, errs chan error) (backend, error) {
port, err := windows.CreateIoCompletionPort(windows.InvalidHandle, 0, 0, 0)
if err != nil {
@@ -359,22 +365,26 @@ func (w *readDirChangesW) addWatch(pathname string, flags uint64, bufsize int) e
} else {
windows.CloseHandle(ino.handle)
}
+ w.mu.Lock()
if pathname == dir {
watchEntry.mask |= flags
} else {
watchEntry.names[filepath.Base(pathname)] |= flags
}
+ w.mu.Unlock()
err = w.startRead(watchEntry)
if err != nil {
return err
}
+ w.mu.Lock()
if pathname == dir {
watchEntry.mask &= ^provisional
} else {
watchEntry.names[filepath.Base(pathname)] &= ^provisional
}
+ w.mu.Unlock()
return nil
}
@@ -394,8 +404,13 @@ func (w *readDirChangesW) remWatch(pathname string) error {
w.mu.Lock()
watch := w.watches.get(ino)
w.mu.Unlock()
+ if watch == nil {
+ windows.CloseHandle(ino.handle)
+ return fmt.Errorf("%w: %s", ErrNonExistentWatch, pathname)
+ }
if recurse && !watch.recurse {
+ windows.CloseHandle(ino.handle)
return fmt.Errorf("can't use \\... with non-recursive watch %q", pathname)
}
@@ -403,16 +418,19 @@ func (w *readDirChangesW) remWatch(pathname string) error {
if err != nil {
w.sendError(os.NewSyscallError("CloseHandle", err))
}
- if watch == nil {
- return fmt.Errorf("%w: %s", ErrNonExistentWatch, pathname)
- }
if pathname == dir {
- w.sendEvent(watch.path, "", watch.mask&sysFSIGNORED)
+ w.mu.Lock()
+ mask := watch.mask
watch.mask = 0
+ w.mu.Unlock()
+ w.sendEvent(watch.path, "", mask&sysFSIGNORED)
} else {
name := filepath.Base(pathname)
- w.sendEvent(filepath.Join(watch.path, name), "", watch.names[name]&sysFSIGNORED)
+ w.mu.Lock()
+ mask := watch.names[name]
delete(watch.names, name)
+ w.mu.Unlock()
+ w.sendEvent(filepath.Join(watch.path, name), "", mask&sysFSIGNORED)
}
return w.startRead(watch)
@@ -420,17 +438,23 @@ func (w *readDirChangesW) remWatch(pathname string) error {
// Must run within the I/O thread.
func (w *readDirChangesW) deleteWatch(watch *watch) {
- for name, mask := range watch.names {
- if mask&provisional == 0 {
- w.sendEvent(filepath.Join(watch.path, name), "", mask&sysFSIGNORED)
+ // Snapshot+clear under the lock so concurrent WatchList() readers see a
+ // consistent state. sendEvent must run outside the lock since it can
+ // block on the user-facing Events channel.
+ w.mu.Lock()
+ names := watch.names
+ watch.names = make(map[string]uint64)
+ mask := watch.mask
+ watch.mask = 0
+ w.mu.Unlock()
+
+ for name, m := range names {
+ if m&provisional == 0 {
+ w.sendEvent(filepath.Join(watch.path, name), "", m&sysFSIGNORED)
}
- delete(watch.names, name)
}
- if watch.mask != 0 {
- if watch.mask&provisional == 0 {
- w.sendEvent(watch.path, "", watch.mask&sysFSIGNORED)
- }
- watch.mask = 0
+ if mask != 0 && mask&provisional == 0 {
+ w.sendEvent(watch.path, "", mask&sysFSIGNORED)
}
}
@@ -457,9 +481,8 @@ func (w *readDirChangesW) startRead(watch *watch) error {
}
// We need to pass the array, rather than the slice.
- hdr := (*reflect.SliceHeader)(unsafe.Pointer(&watch.buf))
rdErr := windows.ReadDirectoryChanges(watch.ino.handle,
- (*byte)(unsafe.Pointer(hdr.Data)), uint32(hdr.Len),
+ unsafe.SliceData(watch.buf), uint32(len(watch.buf)),
watch.recurse, mask, nil, &watch.ov, 0)
if rdErr != nil {
err := os.NewSyscallError("ReadDirectoryChanges", rdErr)
@@ -565,12 +588,7 @@ func (w *readDirChangesW) readEvents() {
// Create a buf that is the size of the path name
size := int(raw.FileNameLength / 2)
- var buf []uint16
- // TODO: Use unsafe.Slice in Go 1.17; https://stackoverflow.com/questions/51187973
- sh := (*reflect.SliceHeader)(unsafe.Pointer(&buf))
- sh.Data = uintptr(unsafe.Pointer(&raw.FileName))
- sh.Len = size
- sh.Cap = size
+ buf := unsafe.Slice(&raw.FileName, size)
name := windows.UTF16ToString(buf)
fullname := filepath.Join(watch.path, name)
@@ -587,31 +605,35 @@ func (w *readDirChangesW) readEvents() {
case windows.FILE_ACTION_RENAMED_OLD_NAME:
watch.rename = name
case windows.FILE_ACTION_RENAMED_NEW_NAME:
- // Update saved path of all sub-watches.
+ // Update saved path of all sub-watches and rename the
+ // names entry under the lock so WatchList() can't observe
+ // a torn state.
old := filepath.Join(watch.path, watch.rename)
w.mu.Lock()
for _, watchMap := range w.watches {
for _, ww := range watchMap {
- if strings.HasPrefix(ww.path, old) {
+ if isSameOrDescendantPath(ww.path, old) {
ww.path = filepath.Join(fullname, strings.TrimPrefix(ww.path, old))
}
}
}
- w.mu.Unlock()
-
if watch.names[watch.rename] != 0 {
watch.names[name] |= watch.names[watch.rename]
delete(watch.names, watch.rename)
mask = sysFSMOVESELF
}
+ w.mu.Unlock()
}
if raw.Action != windows.FILE_ACTION_RENAMED_NEW_NAME {
w.sendEvent(fullname, "", watch.names[name]&mask)
}
if raw.Action == windows.FILE_ACTION_REMOVED {
- w.sendEvent(fullname, "", watch.names[name]&sysFSIGNORED)
+ w.mu.Lock()
+ ignored := watch.names[name] & sysFSIGNORED
delete(watch.names, name)
+ w.mu.Unlock()
+ w.sendEvent(fullname, "", ignored)
}
if watch.rename != "" && raw.Action == windows.FILE_ACTION_RENAMED_NEW_NAME {
diff --git a/vendor/github.com/fsnotify/fsnotify/fsnotify.go b/vendor/github.com/fsnotify/fsnotify/fsnotify.go
index f64be4bf98e..38cb4dd481c 100644
--- a/vendor/github.com/fsnotify/fsnotify/fsnotify.go
+++ b/vendor/github.com/fsnotify/fsnotify/fsnotify.go
@@ -51,26 +51,25 @@ import (
// The fs.inotify.max_user_watches sysctl variable specifies the upper limit
// for the number of watches per user, and fs.inotify.max_user_instances
// specifies the maximum number of inotify instances per user. Every Watcher you
-// create is an "instance", and every path you add is a "watch".
+// create is an "instance", and every path you add is a "watch". Reaching the
+// limit will result in a "no space left on device" or "too many open files"
+// error.
//
// These are also exposed in /proc as /proc/sys/fs/inotify/max_user_watches and
-// /proc/sys/fs/inotify/max_user_instances
+// /proc/sys/fs/inotify/max_user_instances. The default values differ per distro
+// and available memory.
//
// To increase them you can use sysctl or write the value to the /proc file:
//
-// # Default values on Linux 5.18
-// sysctl fs.inotify.max_user_watches=124983
-// sysctl fs.inotify.max_user_instances=128
+// sysctl fs.inotify.max_user_watches=200000
+// sysctl fs.inotify.max_user_instances=256
//
// To make the changes persist on reboot edit /etc/sysctl.conf or
// /usr/lib/sysctl.d/50-default.conf (details differ per Linux distro; check
// your distro's documentation):
//
-// fs.inotify.max_user_watches=124983
-// fs.inotify.max_user_instances=128
-//
-// Reaching the limit will result in a "no space left on device" or "too many open
-// files" error.
+// fs.inotify.max_user_watches=200000
+// fs.inotify.max_user_instances=256
//
// # kqueue notes (macOS, BSD)
//
@@ -93,6 +92,28 @@ import (
// Sometimes it will send events for all files, sometimes it will send no
// events, and often only for some files.
//
+// Recursive watching is not currently enabled through fsnotify's public
+// API; the recursive code path is gated and only exercised by fsnotify's
+// own tests. The note below describes backend behavior observed when
+// recursive watching is enabled internally, and is kept here as a
+// reference for maintainers and contributors who encounter it.
+//
+// When recursive watching is enabled and you watch a directory, you may
+// receive a Write event for an intermediate directory whenever a child
+// entry inside it is created, renamed, or removed. For example, with a
+// recursive watch on /a and a new file /a/b/c, you will receive
+// Create /a/b/c and may also receive Write /a/b.
+//
+// This happens because, on NTFS-backed volumes, modifying the entries of a
+// directory updates that directory's last-write time, and the Windows
+// backend requests FILE_NOTIFY_CHANGE_LAST_WRITE to support Write events
+// on files. The same Write filter therefore picks up the directory's
+// metadata update.
+//
+// Whether the directory Write is actually delivered alongside the child
+// events is not guaranteed; it depends on ReadDirectoryChangesW buffering,
+// NTFS metadata update timing, and event coalescing.
+//
// The default ReadDirectoryChangesW() buffer size is 64K, which is the largest
// value that is guaranteed to work with SMB filesystems. If you have many
// events in quick succession this may not be enough, and you will have to use
@@ -129,8 +150,12 @@ type Watcher struct {
// want to wait until you've stopped receiving them
// (see the dedup example in cmd/fsnotify).
//
- // Some systems may send Write event for directories
- // when the directory content changes.
+ // Some systems also send Write events for directories
+ // when the directory contents change. This is the
+ // case for kqueue, and on Windows for the directory
+ // that contains a created, renamed, or removed child
+ // entry. It does not happen on inotify. See the
+ // per-platform notes on [Watcher].
//
// fsnotify.Chmod Attributes were changed. On Linux this is also sent
// when a file is removed (or more accurately, when a
@@ -179,7 +204,9 @@ const (
Create Op = 1 << iota
// The pathname was written to; this does *not* mean the write has finished,
- // and a write can be followed by more writes.
+ // and a write can be followed by more writes. On Windows and kqueue, a
+ // Write on a directory can also indicate that its contents changed; see
+ // the per-platform notes on [Watcher].
Write
// The path was removed; any watches on it will be removed. Some "remove"
@@ -220,7 +247,7 @@ const (
// File opened for reading was closed.
//
- // Only works on Linux and FreeBSD.
+ // Only works on Linux.
xUnportableCloseRead
)
@@ -410,7 +437,6 @@ type (
withOpts struct {
bufsize int
op Op
- noFollow bool
sendCreate bool
}
)
@@ -469,12 +495,6 @@ func withOps(op Op) addOpt {
return func(opt *withOpts) { opt.op = op }
}
-// WithNoFollow disables following symlinks, so the symlinks themselves are
-// watched.
-func withNoFollow() addOpt {
- return func(opt *withOpts) { opt.noFollow = true }
-}
-
// "Internal" option for recursive watches on inotify.
func withCreate() addOpt {
return func(opt *withOpts) { opt.sendCreate = true }
@@ -494,3 +514,13 @@ func recursivePath(path string) (string, bool) {
}
return path, false
}
+
+type watchFlag uint8
+
+const (
+ // Added by user with Add(), rather than an internal watch.
+ flagByUser = watchFlag(0x01)
+ // Part of recursive watch; as the top-level path added by the user or an
+ // "internal" watch.
+ flagRecurse = watchFlag(0x02)
+)
diff --git a/vendor/github.com/fsnotify/fsnotify/internal/darwin.go b/vendor/github.com/fsnotify/fsnotify/internal/darwin.go
index 0b01bc182a1..6721aa60968 100644
--- a/vendor/github.com/fsnotify/fsnotify/internal/darwin.go
+++ b/vendor/github.com/fsnotify/fsnotify/internal/darwin.go
@@ -15,25 +15,6 @@ var (
var maxfiles uint64
-func SetRlimit() {
- // Go 1.19 will do this automatically: https://go-review.googlesource.com/c/go/+/393354/
- var l syscall.Rlimit
- err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &l)
- if err == nil && l.Cur != l.Max {
- l.Cur = l.Max
- syscall.Setrlimit(syscall.RLIMIT_NOFILE, &l)
- }
- maxfiles = l.Cur
-
- if n, err := syscall.SysctlUint32("kern.maxfiles"); err == nil && uint64(n) < maxfiles {
- maxfiles = uint64(n)
- }
-
- if n, err := syscall.SysctlUint32("kern.maxfilesperproc"); err == nil && uint64(n) < maxfiles {
- maxfiles = uint64(n)
- }
-}
-
func Maxfiles() uint64 { return maxfiles }
func Mkfifo(path string, mode uint32) error { return unix.Mkfifo(path, mode) }
func Mknod(path string, mode uint32, dev int) error { return unix.Mknod(path, mode, dev) }
diff --git a/vendor/github.com/fsnotify/fsnotify/internal/debug_darwin.go b/vendor/github.com/fsnotify/fsnotify/internal/debug_darwin.go
index 928319fb09a..7600180742b 100644
--- a/vendor/github.com/fsnotify/fsnotify/internal/debug_darwin.go
+++ b/vendor/github.com/fsnotify/fsnotify/internal/debug_darwin.go
@@ -6,52 +6,10 @@ var names = []struct {
n string
m uint32
}{
- {"NOTE_ABSOLUTE", unix.NOTE_ABSOLUTE},
{"NOTE_ATTRIB", unix.NOTE_ATTRIB},
- {"NOTE_BACKGROUND", unix.NOTE_BACKGROUND},
- {"NOTE_CHILD", unix.NOTE_CHILD},
- {"NOTE_CRITICAL", unix.NOTE_CRITICAL},
{"NOTE_DELETE", unix.NOTE_DELETE},
- {"NOTE_EXEC", unix.NOTE_EXEC},
- {"NOTE_EXIT", unix.NOTE_EXIT},
- {"NOTE_EXITSTATUS", unix.NOTE_EXITSTATUS},
- {"NOTE_EXIT_CSERROR", unix.NOTE_EXIT_CSERROR},
- {"NOTE_EXIT_DECRYPTFAIL", unix.NOTE_EXIT_DECRYPTFAIL},
- {"NOTE_EXIT_DETAIL", unix.NOTE_EXIT_DETAIL},
- {"NOTE_EXIT_DETAIL_MASK", unix.NOTE_EXIT_DETAIL_MASK},
- {"NOTE_EXIT_MEMORY", unix.NOTE_EXIT_MEMORY},
- {"NOTE_EXIT_REPARENTED", unix.NOTE_EXIT_REPARENTED},
{"NOTE_EXTEND", unix.NOTE_EXTEND},
- {"NOTE_FFAND", unix.NOTE_FFAND},
- {"NOTE_FFCOPY", unix.NOTE_FFCOPY},
- {"NOTE_FFCTRLMASK", unix.NOTE_FFCTRLMASK},
- {"NOTE_FFLAGSMASK", unix.NOTE_FFLAGSMASK},
- {"NOTE_FFNOP", unix.NOTE_FFNOP},
- {"NOTE_FFOR", unix.NOTE_FFOR},
- {"NOTE_FORK", unix.NOTE_FORK},
- {"NOTE_FUNLOCK", unix.NOTE_FUNLOCK},
- {"NOTE_LEEWAY", unix.NOTE_LEEWAY},
{"NOTE_LINK", unix.NOTE_LINK},
- {"NOTE_LOWAT", unix.NOTE_LOWAT},
- {"NOTE_MACHTIME", unix.NOTE_MACHTIME},
- {"NOTE_MACH_CONTINUOUS_TIME", unix.NOTE_MACH_CONTINUOUS_TIME},
- {"NOTE_NONE", unix.NOTE_NONE},
- {"NOTE_NSECONDS", unix.NOTE_NSECONDS},
- {"NOTE_OOB", unix.NOTE_OOB},
- //{"NOTE_PCTRLMASK", unix.NOTE_PCTRLMASK}, -0x100000 (?!)
- {"NOTE_PDATAMASK", unix.NOTE_PDATAMASK},
- {"NOTE_REAP", unix.NOTE_REAP},
{"NOTE_RENAME", unix.NOTE_RENAME},
- {"NOTE_REVOKE", unix.NOTE_REVOKE},
- {"NOTE_SECONDS", unix.NOTE_SECONDS},
- {"NOTE_SIGNAL", unix.NOTE_SIGNAL},
- {"NOTE_TRACK", unix.NOTE_TRACK},
- {"NOTE_TRACKERR", unix.NOTE_TRACKERR},
- {"NOTE_TRIGGER", unix.NOTE_TRIGGER},
- {"NOTE_USECONDS", unix.NOTE_USECONDS},
- {"NOTE_VM_ERROR", unix.NOTE_VM_ERROR},
- {"NOTE_VM_PRESSURE", unix.NOTE_VM_PRESSURE},
- {"NOTE_VM_PRESSURE_SUDDEN_TERMINATE", unix.NOTE_VM_PRESSURE_SUDDEN_TERMINATE},
- {"NOTE_VM_PRESSURE_TERMINATE", unix.NOTE_VM_PRESSURE_TERMINATE},
{"NOTE_WRITE", unix.NOTE_WRITE},
}
diff --git a/vendor/github.com/fsnotify/fsnotify/internal/debug_dragonfly.go b/vendor/github.com/fsnotify/fsnotify/internal/debug_dragonfly.go
index 3186b0c3491..7600180742b 100644
--- a/vendor/github.com/fsnotify/fsnotify/internal/debug_dragonfly.go
+++ b/vendor/github.com/fsnotify/fsnotify/internal/debug_dragonfly.go
@@ -7,27 +7,9 @@ var names = []struct {
m uint32
}{
{"NOTE_ATTRIB", unix.NOTE_ATTRIB},
- {"NOTE_CHILD", unix.NOTE_CHILD},
{"NOTE_DELETE", unix.NOTE_DELETE},
- {"NOTE_EXEC", unix.NOTE_EXEC},
- {"NOTE_EXIT", unix.NOTE_EXIT},
{"NOTE_EXTEND", unix.NOTE_EXTEND},
- {"NOTE_FFAND", unix.NOTE_FFAND},
- {"NOTE_FFCOPY", unix.NOTE_FFCOPY},
- {"NOTE_FFCTRLMASK", unix.NOTE_FFCTRLMASK},
- {"NOTE_FFLAGSMASK", unix.NOTE_FFLAGSMASK},
- {"NOTE_FFNOP", unix.NOTE_FFNOP},
- {"NOTE_FFOR", unix.NOTE_FFOR},
- {"NOTE_FORK", unix.NOTE_FORK},
{"NOTE_LINK", unix.NOTE_LINK},
- {"NOTE_LOWAT", unix.NOTE_LOWAT},
- {"NOTE_OOB", unix.NOTE_OOB},
- {"NOTE_PCTRLMASK", unix.NOTE_PCTRLMASK},
- {"NOTE_PDATAMASK", unix.NOTE_PDATAMASK},
{"NOTE_RENAME", unix.NOTE_RENAME},
- {"NOTE_REVOKE", unix.NOTE_REVOKE},
- {"NOTE_TRACK", unix.NOTE_TRACK},
- {"NOTE_TRACKERR", unix.NOTE_TRACKERR},
- {"NOTE_TRIGGER", unix.NOTE_TRIGGER},
{"NOTE_WRITE", unix.NOTE_WRITE},
}
diff --git a/vendor/github.com/fsnotify/fsnotify/internal/debug_freebsd.go b/vendor/github.com/fsnotify/fsnotify/internal/debug_freebsd.go
index f69fdb930f5..b9e45f55512 100644
--- a/vendor/github.com/fsnotify/fsnotify/internal/debug_freebsd.go
+++ b/vendor/github.com/fsnotify/fsnotify/internal/debug_freebsd.go
@@ -6,37 +6,15 @@ var names = []struct {
n string
m uint32
}{
- {"NOTE_ABSTIME", unix.NOTE_ABSTIME},
- {"NOTE_ATTRIB", unix.NOTE_ATTRIB},
- {"NOTE_CHILD", unix.NOTE_CHILD},
- {"NOTE_CLOSE", unix.NOTE_CLOSE},
- {"NOTE_CLOSE_WRITE", unix.NOTE_CLOSE_WRITE},
{"NOTE_DELETE", unix.NOTE_DELETE},
- {"NOTE_EXEC", unix.NOTE_EXEC},
- {"NOTE_EXIT", unix.NOTE_EXIT},
+ {"NOTE_WRITE", unix.NOTE_WRITE},
{"NOTE_EXTEND", unix.NOTE_EXTEND},
- {"NOTE_FFAND", unix.NOTE_FFAND},
- {"NOTE_FFCOPY", unix.NOTE_FFCOPY},
- {"NOTE_FFCTRLMASK", unix.NOTE_FFCTRLMASK},
- {"NOTE_FFLAGSMASK", unix.NOTE_FFLAGSMASK},
- {"NOTE_FFNOP", unix.NOTE_FFNOP},
- {"NOTE_FFOR", unix.NOTE_FFOR},
- {"NOTE_FILE_POLL", unix.NOTE_FILE_POLL},
- {"NOTE_FORK", unix.NOTE_FORK},
+ {"NOTE_ATTRIB", unix.NOTE_ATTRIB},
{"NOTE_LINK", unix.NOTE_LINK},
- {"NOTE_LOWAT", unix.NOTE_LOWAT},
- {"NOTE_MSECONDS", unix.NOTE_MSECONDS},
- {"NOTE_NSECONDS", unix.NOTE_NSECONDS},
- {"NOTE_OPEN", unix.NOTE_OPEN},
- {"NOTE_PCTRLMASK", unix.NOTE_PCTRLMASK},
- {"NOTE_PDATAMASK", unix.NOTE_PDATAMASK},
- {"NOTE_READ", unix.NOTE_READ},
{"NOTE_RENAME", unix.NOTE_RENAME},
{"NOTE_REVOKE", unix.NOTE_REVOKE},
- {"NOTE_SECONDS", unix.NOTE_SECONDS},
- {"NOTE_TRACK", unix.NOTE_TRACK},
- {"NOTE_TRACKERR", unix.NOTE_TRACKERR},
- {"NOTE_TRIGGER", unix.NOTE_TRIGGER},
- {"NOTE_USECONDS", unix.NOTE_USECONDS},
- {"NOTE_WRITE", unix.NOTE_WRITE},
+ {"NOTE_OPEN", unix.NOTE_OPEN},
+ {"NOTE_CLOSE", unix.NOTE_CLOSE},
+ {"NOTE_CLOSE_WRITE", unix.NOTE_CLOSE_WRITE},
+ {"NOTE_READ", unix.NOTE_READ},
}
diff --git a/vendor/github.com/fsnotify/fsnotify/internal/debug_kqueue.go b/vendor/github.com/fsnotify/fsnotify/internal/debug_kqueue.go
index 607e683bd73..5d8116436db 100644
--- a/vendor/github.com/fsnotify/fsnotify/internal/debug_kqueue.go
+++ b/vendor/github.com/fsnotify/fsnotify/internal/debug_kqueue.go
@@ -27,6 +27,6 @@ func Debug(name string, kevent *unix.Kevent_t) {
if unknown > 0 {
l = append(l, fmt.Sprintf("0x%x", unknown))
}
- fmt.Fprintf(os.Stderr, "FSNOTIFY_DEBUG: %s %10d:%-60s → %q\n",
+ fmt.Fprintf(os.Stderr, "FSNOTIFY_DEBUG: %s %10d:%-20s → %q\n",
time.Now().Format("15:04:05.000000000"), mask, strings.Join(l, " | "), name)
}
diff --git a/vendor/github.com/fsnotify/fsnotify/internal/debug_netbsd.go b/vendor/github.com/fsnotify/fsnotify/internal/debug_netbsd.go
index e5b3b6f6943..7600180742b 100644
--- a/vendor/github.com/fsnotify/fsnotify/internal/debug_netbsd.go
+++ b/vendor/github.com/fsnotify/fsnotify/internal/debug_netbsd.go
@@ -7,19 +7,9 @@ var names = []struct {
m uint32
}{
{"NOTE_ATTRIB", unix.NOTE_ATTRIB},
- {"NOTE_CHILD", unix.NOTE_CHILD},
{"NOTE_DELETE", unix.NOTE_DELETE},
- {"NOTE_EXEC", unix.NOTE_EXEC},
- {"NOTE_EXIT", unix.NOTE_EXIT},
{"NOTE_EXTEND", unix.NOTE_EXTEND},
- {"NOTE_FORK", unix.NOTE_FORK},
{"NOTE_LINK", unix.NOTE_LINK},
- {"NOTE_LOWAT", unix.NOTE_LOWAT},
- {"NOTE_PCTRLMASK", unix.NOTE_PCTRLMASK},
- {"NOTE_PDATAMASK", unix.NOTE_PDATAMASK},
{"NOTE_RENAME", unix.NOTE_RENAME},
- {"NOTE_REVOKE", unix.NOTE_REVOKE},
- {"NOTE_TRACK", unix.NOTE_TRACK},
- {"NOTE_TRACKERR", unix.NOTE_TRACKERR},
{"NOTE_WRITE", unix.NOTE_WRITE},
}
diff --git a/vendor/github.com/fsnotify/fsnotify/internal/debug_openbsd.go b/vendor/github.com/fsnotify/fsnotify/internal/debug_openbsd.go
index 1dd455bc5a4..871766d6997 100644
--- a/vendor/github.com/fsnotify/fsnotify/internal/debug_openbsd.go
+++ b/vendor/github.com/fsnotify/fsnotify/internal/debug_openbsd.go
@@ -7,22 +7,10 @@ var names = []struct {
m uint32
}{
{"NOTE_ATTRIB", unix.NOTE_ATTRIB},
- // {"NOTE_CHANGE", unix.NOTE_CHANGE}, // Not on 386?
- {"NOTE_CHILD", unix.NOTE_CHILD},
{"NOTE_DELETE", unix.NOTE_DELETE},
- {"NOTE_EOF", unix.NOTE_EOF},
- {"NOTE_EXEC", unix.NOTE_EXEC},
- {"NOTE_EXIT", unix.NOTE_EXIT},
{"NOTE_EXTEND", unix.NOTE_EXTEND},
- {"NOTE_FORK", unix.NOTE_FORK},
{"NOTE_LINK", unix.NOTE_LINK},
- {"NOTE_LOWAT", unix.NOTE_LOWAT},
- {"NOTE_PCTRLMASK", unix.NOTE_PCTRLMASK},
- {"NOTE_PDATAMASK", unix.NOTE_PDATAMASK},
{"NOTE_RENAME", unix.NOTE_RENAME},
- {"NOTE_REVOKE", unix.NOTE_REVOKE},
- {"NOTE_TRACK", unix.NOTE_TRACK},
- {"NOTE_TRACKERR", unix.NOTE_TRACKERR},
{"NOTE_TRUNCATE", unix.NOTE_TRUNCATE},
{"NOTE_WRITE", unix.NOTE_WRITE},
}
diff --git a/vendor/github.com/fsnotify/fsnotify/internal/freebsd.go b/vendor/github.com/fsnotify/fsnotify/internal/freebsd.go
index 5ac8b507978..758a2490525 100644
--- a/vendor/github.com/fsnotify/fsnotify/internal/freebsd.go
+++ b/vendor/github.com/fsnotify/fsnotify/internal/freebsd.go
@@ -15,17 +15,6 @@ var (
var maxfiles uint64
-func SetRlimit() {
- // Go 1.19 will do this automatically: https://go-review.googlesource.com/c/go/+/393354/
- var l syscall.Rlimit
- err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &l)
- if err == nil && l.Cur != l.Max {
- l.Cur = l.Max
- syscall.Setrlimit(syscall.RLIMIT_NOFILE, &l)
- }
- maxfiles = uint64(l.Cur)
-}
-
func Maxfiles() uint64 { return maxfiles }
func Mkfifo(path string, mode uint32) error { return unix.Mkfifo(path, mode) }
func Mknod(path string, mode uint32, dev int) error { return unix.Mknod(path, mode, uint64(dev)) }
diff --git a/vendor/github.com/fsnotify/fsnotify/internal/unix.go b/vendor/github.com/fsnotify/fsnotify/internal/unix.go
index b251fb80386..9c66f5d30db 100644
--- a/vendor/github.com/fsnotify/fsnotify/internal/unix.go
+++ b/vendor/github.com/fsnotify/fsnotify/internal/unix.go
@@ -15,17 +15,6 @@ var (
var maxfiles uint64
-func SetRlimit() {
- // Go 1.19 will do this automatically: https://go-review.googlesource.com/c/go/+/393354/
- var l syscall.Rlimit
- err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &l)
- if err == nil && l.Cur != l.Max {
- l.Cur = l.Max
- syscall.Setrlimit(syscall.RLIMIT_NOFILE, &l)
- }
- maxfiles = uint64(l.Cur)
-}
-
func Maxfiles() uint64 { return maxfiles }
func Mkfifo(path string, mode uint32) error { return unix.Mkfifo(path, mode) }
func Mknod(path string, mode uint32, dev int) error { return unix.Mknod(path, mode, dev) }
diff --git a/vendor/github.com/fsnotify/fsnotify/internal/unix2.go b/vendor/github.com/fsnotify/fsnotify/internal/unix2.go
index 37dfeddc289..b2d89592f7c 100644
--- a/vendor/github.com/fsnotify/fsnotify/internal/unix2.go
+++ b/vendor/github.com/fsnotify/fsnotify/internal/unix2.go
@@ -2,6 +2,24 @@
package internal
+import "syscall"
+
func HasPrivilegesForSymlink() bool {
return true
}
+
+// IgnoringEINTR makes a function call and repeats it if it returns an
+// EINTR error. This appears to be required even though we install all
+// signal handlers with SA_RESTART: see #22838, #38033, #38836, #40846.
+// Also #20400 and #36644 are issues in which a signal handler is
+// installed without setting SA_RESTART. None of these are the common case,
+// but there are enough of them that it seems that we can't avoid
+// an EINTR loop.
+func IgnoringEINTR[T any](fn func() (T, error)) (T, error) {
+ for {
+ v, err := fn()
+ if err != syscall.EINTR {
+ return v, err
+ }
+ }
+}
diff --git a/vendor/github.com/fsnotify/fsnotify/internal/windows.go b/vendor/github.com/fsnotify/fsnotify/internal/windows.go
index 896bc2e5a2f..e24d5692641 100644
--- a/vendor/github.com/fsnotify/fsnotify/internal/windows.go
+++ b/vendor/github.com/fsnotify/fsnotify/internal/windows.go
@@ -14,7 +14,6 @@ var (
ErrUnixEACCES = errors.New("dummy")
)
-func SetRlimit() {}
func Maxfiles() uint64 { return 1<<64 - 1 }
func Mkfifo(path string, mode uint32) error { return errors.New("no FIFOs on Windows") }
func Mknod(path string, mode uint32, dev int) error { return errors.New("no device nodes on Windows") }
diff --git a/vendor/github.com/fxamacker/cbor/v2/.golangci.yml b/vendor/github.com/fxamacker/cbor/v2/.golangci.yml
index 38cb9ae101b..08081fbde50 100644
--- a/vendor/github.com/fxamacker/cbor/v2/.golangci.yml
+++ b/vendor/github.com/fxamacker/cbor/v2/.golangci.yml
@@ -1,104 +1,116 @@
-# Do not delete linter settings. Linters like gocritic can be enabled on the command line.
-
-linters-settings:
- depguard:
- rules:
- prevent_unmaintained_packages:
- list-mode: strict
- files:
- - $all
- - "!$test"
- allow:
- - $gostd
- - github.com/x448/float16
- deny:
- - pkg: io/ioutil
- desc: "replaced by io and os packages since Go 1.16: https://tip.golang.org/doc/go1.16#ioutil"
- dupl:
- threshold: 100
- funlen:
- lines: 100
- statements: 50
- goconst:
- ignore-tests: true
- min-len: 2
- min-occurrences: 3
- gocritic:
- enabled-tags:
- - diagnostic
- - experimental
- - opinionated
- - performance
- - style
- disabled-checks:
- - commentedOutCode
- - dupImport # https://github.com/go-critic/go-critic/issues/845
- - ifElseChain
- - octalLiteral
- - paramTypeCombine
- - whyNoLint
- gofmt:
- simplify: false
- goimports:
- local-prefixes: github.com/fxamacker/cbor
- golint:
- min-confidence: 0
- govet:
- check-shadowing: true
- lll:
- line-length: 140
- maligned:
- suggest-new: true
- misspell:
- locale: US
- staticcheck:
- checks: ["all"]
-
+version: "2"
linters:
- disable-all: true
+ default: none
enable:
- asciicheck
- bidichk
- depguard
- errcheck
- - exportloopref
+ - forbidigo
- goconst
- gocritic
- gocyclo
- - gofmt
- - goimports
- goprintffuncname
- gosec
- - gosimple
- govet
- ineffassign
- misspell
- nilerr
- revive
- staticcheck
- - stylecheck
- - typecheck
- unconvert
- unused
-
+ settings:
+ depguard:
+ rules:
+ prevent_unmaintained_packages:
+ list-mode: strict
+ files:
+ - $all
+ - '!$test'
+ allow:
+ - $gostd
+ - github.com/x448/float16
+ deny:
+ - pkg: io/ioutil
+ desc: 'replaced by io and os packages since Go 1.16: https://tip.golang.org/doc/go1.16#ioutil'
+ dupl:
+ threshold: 100
+ funlen:
+ lines: 100
+ statements: 50
+ goconst:
+ min-len: 2
+ min-occurrences: 3
+ gocritic:
+ disabled-checks:
+ - commentedOutCode
+ - dupImport
+ - ifElseChain
+ - octalLiteral
+ - paramTypeCombine
+ - whyNoLint
+ enabled-tags:
+ - diagnostic
+ - experimental
+ - opinionated
+ - performance
+ - style
+ govet:
+ enable:
+ - shadow
+ lll:
+ line-length: 140
+ misspell:
+ locale: US
+ staticcheck:
+ checks:
+ - all
+ exclusions:
+ generated: lax
+ presets:
+ - comments
+ - common-false-positives
+ - legacy
+ - std-error-handling
+ rules:
+ - path: decode.go
+ text: string ` overflows ` has (\d+) occurrences, make it a constant
+ - path: decode.go
+ text: string ` \(range is \[` has (\d+) occurrences, make it a constant
+ - path: decode.go
+ text: string `, ` has (\d+) occurrences, make it a constant
+ - path: decode.go
+ text: string ` overflows Go's int64` has (\d+) occurrences, make it a constant
+ - path: decode.go
+ text: string `\]\)` has (\d+) occurrences, make it a constant
+ - path: valid.go
+ text: string ` for type ` has (\d+) occurrences, make it a constant
+ - path: valid.go
+ text: 'string `cbor: ` has (\d+) occurrences, make it a constant'
+ - linters:
+ - goconst
+ path: (.+)_test\.go
+ paths:
+ - third_party$
+ - builtin$
+ - examples$
issues:
- # max-issues-per-linter default is 50. Set to 0 to disable limit.
max-issues-per-linter: 0
- # max-same-issues default is 3. Set to 0 to disable limit.
max-same-issues: 0
-
- exclude-rules:
- - path: decode.go
- text: "string ` overflows ` has (\\d+) occurrences, make it a constant"
- - path: decode.go
- text: "string ` \\(range is \\[` has (\\d+) occurrences, make it a constant"
- - path: decode.go
- text: "string `, ` has (\\d+) occurrences, make it a constant"
- - path: decode.go
- text: "string ` overflows Go's int64` has (\\d+) occurrences, make it a constant"
- - path: decode.go
- text: "string `\\]\\)` has (\\d+) occurrences, make it a constant"
- - path: valid.go
- text: "string ` for type ` has (\\d+) occurrences, make it a constant"
- - path: valid.go
- text: "string `cbor: ` has (\\d+) occurrences, make it a constant"
+formatters:
+ enable:
+ - gofmt
+ - goimports
+ settings:
+ gofmt:
+ simplify: false
+ goimports:
+ local-prefixes:
+ - github.com/fxamacker/cbor
+ exclusions:
+ generated: lax
+ paths:
+ - third_party$
+ - builtin$
+ - examples$
diff --git a/vendor/github.com/fxamacker/cbor/v2/README.md b/vendor/github.com/fxamacker/cbor/v2/README.md
index d072b81c730..7aca561095d 100644
--- a/vendor/github.com/fxamacker/cbor/v2/README.md
+++ b/vendor/github.com/fxamacker/cbor/v2/README.md
@@ -683,7 +683,7 @@ because RFC 8949 treats CBOR data item with remaining bytes as malformed.
Other useful functions:
- `Diagnose`, `DiagnoseFirst` produce human-readable [Extended Diagnostic Notation](https://www.rfc-editor.org/rfc/rfc8610.html#appendix-G) from CBOR data.
- `UnmarshalFirst` decodes first CBOR data item and return any remaining bytes.
-- `Wellformed` returns true if the CBOR data item is well-formed.
+- `Wellformed` returns nil error if the CBOR data item is well-formed.
Interfaces identical or comparable to Go `encoding` packages include:
`Marshaler`, `Unmarshaler`, `BinaryMarshaler`, and `BinaryUnmarshaler`.
@@ -702,28 +702,29 @@ Default limits may need to be increased for systems handling very large data (e.
## Status
-[v2.9.0](https://github.com/fxamacker/cbor/releases/tag/v2.9.0) (Jul 13, 2025) improved interoperability/transcoding between CBOR & JSON, refactored tests, and improved docs.
-- Add opt-in support for `encoding.TextMarshaler` and `encoding.TextUnmarshaler` to encode and decode from CBOR text string.
-- Add opt-in support for `json.Marshaler` and `json.Unmarshaler` via user-provided transcoding function.
-- Update docs for TimeMode, Tag, RawTag, and add example for Embedded JSON Tag for CBOR.
+v2.9.2 (Sunday, May 3, 2026) refactors and hardens the streaming encoder by adding stricter checks for encoding to CBOR indefinite-length data. This prevents improper use of this library from producing malformed CBOR indefinite-length data that would be rejected by the decoder.
-v2.9.0 passed fuzz tests and is production quality.
+This release includes other bugfixes, defensive checks, and added more tests.
-The minimum version of Go required to build:
-- v2.8.0 and newer releases require go 1.20+.
-- v2.7.1 and older releases require go 1.17+.
+v2.9.2 passed fuzz tests (billions of executions) and is production quality.
-For more details, see [release notes](https://github.com/fxamacker/cbor/releases).
+For more details, see [v2.9.2 release notes](https://github.com/fxamacker/cbor/releases).
### Prior Releases
-[v2.8.0](https://github.com/fxamacker/cbor/releases/tag/v2.8.0) (March 30, 2025) is a small release primarily to add `omitzero` option to struct field tags and fix bugs. It passed fuzz tests (billions of executions) and is production quality.
+Releases and commits tend to be on Sundays because my work schedule didn't leave time to work on this during weekdays (sometimes consecutive weekends and consecutive Christmas breaks, too). Monday morning releases were to allow more fuzzing to run overnight before clicking the release button.
-[v2.7.0](https://github.com/fxamacker/cbor/releases/tag/v2.7.0) (June 23, 2024) adds features and improvements that help large projects (e.g. Kubernetes) use CBOR as an alternative to JSON and Protocol Buffers. Other improvements include speedups, improved memory use, bug fixes, new serialization options, etc. It passed fuzz tests (5+ billion executions) and is production quality.
+[v2.9.1](https://github.com/fxamacker/cbor/releases/tag/v2.9.1) (Monday, Mar 30, 2026) includes important bugfixes, defensive checks, improved code quality, and more tests. Although not public, the fuzzer was also improved by adding more fuzz tests. It passed fuzz tests (billions of executions) and is production quality.
-[v2.6.0](https://github.com/fxamacker/cbor/releases/tag/v2.6.0) (February 2024) adds important new features, optimizations, and bug fixes. It is especially useful to systems that need to convert data between CBOR and JSON. New options and optimizations improve handling of bignum, integers, maps, and strings.
+[v2.9.0](https://github.com/fxamacker/cbor/releases/tag/v2.9.0) (Sunday, Jul 13, 2025) improved interoperability/transcoding between CBOR & JSON, refactored tests, and improved docs. It passed fuzz tests (billions of executions) and is production quality.
-[v2.5.0](https://github.com/fxamacker/cbor/releases/tag/v2.5.0) was released on Sunday, August 13, 2023 with new features and important bug fixes. It is fuzz tested and production quality after extended beta [v2.5.0-beta](https://github.com/fxamacker/cbor/releases/tag/v2.5.0-beta) (Dec 2022) -> [v2.5.0](https://github.com/fxamacker/cbor/releases/tag/v2.5.0) (Aug 2023).
+[v2.8.0](https://github.com/fxamacker/cbor/releases/tag/v2.8.0) (Sunday, March 30, 2025) is a small release primarily to add `omitzero` option to struct field tags and fix bugs. It passed fuzz tests (billions of executions) and is production quality.
+
+[v2.7.0](https://github.com/fxamacker/cbor/releases/tag/v2.7.0) (Monday, June 23, 2024) adds features and improvements that help large projects (e.g. Kubernetes) use CBOR as an alternative to JSON and Protocol Buffers. Other improvements include speedups, improved memory use, bug fixes, new serialization options, etc. It passed fuzz tests (5+ billion executions) and is production quality.
+
+[v2.6.0](https://github.com/fxamacker/cbor/releases/tag/v2.6.0) (Sunday, Feb 11, 2024) adds important new features, optimizations, and bug fixes. It is especially useful to systems that need to convert data between CBOR and JSON. New options and optimizations improve handling of bignum, integers, maps, and strings.
+
+[v2.5.0](https://github.com/fxamacker/cbor/releases/tag/v2.5.0) (Sunday, August 13, 2023) adds new features and important bug fixes. It is fuzz tested and production quality after extended beta [v2.5.0-beta](https://github.com/fxamacker/cbor/releases/tag/v2.5.0-beta) (Dec 2022) -> [v2.5.0](https://github.com/fxamacker/cbor/releases/tag/v2.5.0) (Aug 2023).
__IMPORTANT__: 👉 Before upgrading from v2.4 or older release, please read the notable changes highlighted in the release notes. v2.5.0 is a large release with bug fixes to error handling for extraneous data in `Unmarshal`, etc. that should be reviewed before upgrading.
diff --git a/vendor/github.com/fxamacker/cbor/v2/cache.go b/vendor/github.com/fxamacker/cbor/v2/cache.go
index 5051f110fbb..5743f3eb25e 100644
--- a/vendor/github.com/fxamacker/cbor/v2/cache.go
+++ b/vendor/github.com/fxamacker/cbor/v2/cache.go
@@ -92,94 +92,126 @@ func newTypeInfo(t reflect.Type) *typeInfo {
}
type decodingStructType struct {
- fields fields
- fieldIndicesByName map[string]int
- err error
- toArray bool
+ fields decodingFields
+ fieldIndicesByName map[string]int // Only populated if toArray is false
+ fieldIndicesByIntKey map[int64]int // Only populated if toArray is false
+ err error
+ toArray bool
}
-// The stdlib errors.Join was introduced in Go 1.20, and we still support Go 1.17, so instead,
-// here's a very basic implementation of an aggregated error.
-type multierror []error
-
-func (m multierror) Error() string {
- var sb strings.Builder
- for i, err := range m {
- sb.WriteString(err.Error())
- if i < len(m)-1 {
- sb.WriteString(", ")
- }
- }
- return sb.String()
-}
-
-func getDecodingStructType(t reflect.Type) *decodingStructType {
+func getDecodingStructType(t reflect.Type) (*decodingStructType, error) {
if v, _ := decodingStructTypeCache.Load(t); v != nil {
- return v.(*decodingStructType)
+ structType := v.(*decodingStructType)
+ if structType.err != nil {
+ return nil, structType.err
+ }
+ return structType, nil
}
flds, structOptions := getFields(t)
toArray := hasToArrayOption(structOptions)
- var errs []error
- for i := 0; i < len(flds); i++ {
- if flds[i].keyAsInt {
- nameAsInt, numErr := strconv.Atoi(flds[i].name)
- if numErr != nil {
- errs = append(errs, errors.New("cbor: failed to parse field name \""+flds[i].name+"\" to int ("+numErr.Error()+")"))
- break
+ if toArray {
+ return getDecodingStructToArrayType(t, flds)
+ }
+
+ fieldIndicesByName := make(map[string]int, len(flds))
+ var fieldIndicesByIntKey map[int64]int
+
+ decFlds := make(decodingFields, len(flds))
+ for i, f := range flds {
+ // nameAsInt is set in getFields() except for fields with an unparsable tagged name.
+ // Atoi() is called here to catch and save parsing errors.
+ if f.keyAsInt && f.nameAsInt == 0 {
+ if _, numErr := strconv.Atoi(f.name); numErr != nil {
+ structType := &decodingStructType{
+ err: errors.New("cbor: failed to parse field name \"" + f.name + "\" to int (" + numErr.Error() + ")"),
+ }
+ decodingStructTypeCache.Store(t, structType)
+ return nil, structType.err
}
- flds[i].nameAsInt = int64(nameAsInt)
}
- flds[i].typInfo = getTypeInfo(flds[i].typ)
- }
+ if f.keyAsInt {
+ if fieldIndicesByIntKey == nil {
+ fieldIndicesByIntKey = make(map[int64]int, len(flds))
+ }
+ // The duplication check is only a safeguard, since getFields() already deduplicates fields.
+ if _, ok := fieldIndicesByIntKey[f.nameAsInt]; ok {
+ structType := &decodingStructType{
+ err: fmt.Errorf("cbor: two or more fields of %v have the same keyasint value %d", t, f.nameAsInt),
+ }
+ decodingStructTypeCache.Store(t, structType)
+ return nil, structType.err
+ }
+ fieldIndicesByIntKey[f.nameAsInt] = i
+ } else {
+ // The duplication check is only a safeguard, since getFields() already deduplicates fields.
+ if _, ok := fieldIndicesByName[f.name]; ok {
+ structType := &decodingStructType{
+ err: fmt.Errorf("cbor: two or more fields of %v have the same name %q", t, f.name),
+ }
+ decodingStructTypeCache.Store(t, structType)
+ return nil, structType.err
+ }
+ fieldIndicesByName[f.name] = i
+ }
- fieldIndicesByName := make(map[string]int, len(flds))
- for i, fld := range flds {
- if _, ok := fieldIndicesByName[fld.name]; ok {
- errs = append(errs, fmt.Errorf("cbor: two or more fields of %v have the same name %q", t, fld.name))
- continue
+ decFlds[i] = &decodingField{
+ field: *f,
+ typInfo: getTypeInfo(f.typ),
}
- fieldIndicesByName[fld.name] = i
}
- var err error
- {
- var multi multierror
- for _, each := range errs {
- if each != nil {
- multi = append(multi, each)
+ structType := &decodingStructType{
+ fields: decFlds,
+ fieldIndicesByName: fieldIndicesByName,
+ fieldIndicesByIntKey: fieldIndicesByIntKey,
+ }
+ decodingStructTypeCache.Store(t, structType)
+ return structType, nil
+}
+
+func getDecodingStructToArrayType(t reflect.Type, flds fields) (*decodingStructType, error) {
+ decFlds := make(decodingFields, len(flds))
+ for i, f := range flds {
+ // nameAsInt is set in getFields() except for fields with an unparsable tagged name.
+ // Atoi() is called here to catch and save parsing errors.
+ if f.keyAsInt && f.nameAsInt == 0 {
+ if _, numErr := strconv.Atoi(f.name); numErr != nil {
+ structType := &decodingStructType{
+ err: errors.New("cbor: failed to parse field name \"" + f.name + "\" to int (" + numErr.Error() + ")"),
+ }
+ decodingStructTypeCache.Store(t, structType)
+ return nil, structType.err
}
}
- if len(multi) == 1 {
- err = multi[0]
- } else if len(multi) > 1 {
- err = multi
+
+ decFlds[i] = &decodingField{
+ field: *f,
+ typInfo: getTypeInfo(f.typ),
}
}
structType := &decodingStructType{
- fields: flds,
- fieldIndicesByName: fieldIndicesByName,
- err: err,
- toArray: toArray,
+ fields: decFlds,
+ toArray: true,
}
decodingStructTypeCache.Store(t, structType)
- return structType
+ return structType, nil
}
type encodingStructType struct {
- fields fields
- bytewiseFields fields
- lengthFirstFields fields
- omitEmptyFieldsIdx []int
+ fields encodingFields
+ bytewiseFields encodingFields // Only populated if toArray is false
+ lengthFirstFields encodingFields // Only populated if toArray is false
+ omitEmptyFieldsIdx []int // Only populated if toArray is false
err error
toArray bool
}
-func (st *encodingStructType) getFields(em *encMode) fields {
+func (st *encodingStructType) getFields(em *encMode) encodingFields {
switch em.sort {
case SortNone, SortFastShuffle:
return st.fields
@@ -191,7 +223,7 @@ func (st *encodingStructType) getFields(em *encMode) fields {
}
type bytewiseFieldSorter struct {
- fields fields
+ fields encodingFields
}
func (x *bytewiseFieldSorter) Len() int {
@@ -203,11 +235,11 @@ func (x *bytewiseFieldSorter) Swap(i, j int) {
}
func (x *bytewiseFieldSorter) Less(i, j int) bool {
- return bytes.Compare(x.fields[i].cborName, x.fields[j].cborName) <= 0
+ return bytes.Compare(x.fields[i].cborName, x.fields[j].cborName) < 0
}
type lengthFirstFieldSorter struct {
- fields fields
+ fields encodingFields
}
func (x *lengthFirstFieldSorter) Len() int {
@@ -222,13 +254,16 @@ func (x *lengthFirstFieldSorter) Less(i, j int) bool {
if len(x.fields[i].cborName) != len(x.fields[j].cborName) {
return len(x.fields[i].cborName) < len(x.fields[j].cborName)
}
- return bytes.Compare(x.fields[i].cborName, x.fields[j].cborName) <= 0
+ return bytes.Compare(x.fields[i].cborName, x.fields[j].cborName) < 0
}
func getEncodingStructType(t reflect.Type) (*encodingStructType, error) {
if v, _ := encodingStructTypeCache.Load(t); v != nil {
structType := v.(*encodingStructType)
- return structType, structType.err
+ if structType.err != nil {
+ return nil, structType.err
+ }
+ return structType, nil
}
flds, structOptions := getFields(t)
@@ -237,111 +272,119 @@ func getEncodingStructType(t reflect.Type) (*encodingStructType, error) {
return getEncodingStructToArrayType(t, flds)
}
- var err error
var hasKeyAsInt bool
var hasKeyAsStr bool
var omitEmptyIdx []int
+
+ encFlds := make(encodingFields, len(flds))
+
e := getEncodeBuffer()
- for i := 0; i < len(flds); i++ {
+ defer putEncodeBuffer(e)
+
+ for i, f := range flds {
+ encFlds[i] = &encodingField{field: *f}
+ ef := encFlds[i]
+
// Get field's encodeFunc
- flds[i].ef, flds[i].ief, flds[i].izf = getEncodeFunc(flds[i].typ)
- if flds[i].ef == nil {
- err = &UnsupportedTypeError{t}
- break
+ ef.ef, ef.ief, ef.izf = getEncodeFunc(f.typ)
+ if ef.ef == nil {
+ structType := &encodingStructType{err: &UnsupportedTypeError{t}}
+ encodingStructTypeCache.Store(t, structType)
+ return nil, structType.err
}
// Encode field name
- if flds[i].keyAsInt {
- nameAsInt, numErr := strconv.Atoi(flds[i].name)
- if numErr != nil {
- err = errors.New("cbor: failed to parse field name \"" + flds[i].name + "\" to int (" + numErr.Error() + ")")
- break
+ if f.keyAsInt {
+ if f.nameAsInt == 0 {
+ // nameAsInt is set in getFields() except for fields with an unparsable tagged name.
+ // Atoi() is called here to catch and save parsing errors.
+ if _, numErr := strconv.Atoi(f.name); numErr != nil {
+ structType := &encodingStructType{
+ err: errors.New("cbor: failed to parse field name \"" + f.name + "\" to int (" + numErr.Error() + ")"),
+ }
+ encodingStructTypeCache.Store(t, structType)
+ return nil, structType.err
+ }
}
- flds[i].nameAsInt = int64(nameAsInt)
+ nameAsInt := f.nameAsInt
if nameAsInt >= 0 {
- encodeHead(e, byte(cborTypePositiveInt), uint64(nameAsInt))
+ encodeHead(e, byte(cborTypePositiveInt), uint64(nameAsInt)) //nolint:gosec
} else {
n := nameAsInt*(-1) - 1
- encodeHead(e, byte(cborTypeNegativeInt), uint64(n))
+ encodeHead(e, byte(cborTypeNegativeInt), uint64(n)) //nolint:gosec
}
- flds[i].cborName = make([]byte, e.Len())
- copy(flds[i].cborName, e.Bytes())
+ ef.cborName = make([]byte, e.Len())
+ copy(ef.cborName, e.Bytes())
e.Reset()
hasKeyAsInt = true
} else {
- encodeHead(e, byte(cborTypeTextString), uint64(len(flds[i].name)))
- flds[i].cborName = make([]byte, e.Len()+len(flds[i].name))
- n := copy(flds[i].cborName, e.Bytes())
- copy(flds[i].cborName[n:], flds[i].name)
+ encodeHead(e, byte(cborTypeTextString), uint64(len(f.name)))
+ ef.cborName = make([]byte, e.Len()+len(f.name))
+ n := copy(ef.cborName, e.Bytes())
+ copy(ef.cborName[n:], f.name)
e.Reset()
// If cborName contains a text string, then cborNameByteString contains a
// string that has the byte string major type but is otherwise identical to
// cborName.
- flds[i].cborNameByteString = make([]byte, len(flds[i].cborName))
- copy(flds[i].cborNameByteString, flds[i].cborName)
+ ef.cborNameByteString = make([]byte, len(ef.cborName))
+ copy(ef.cborNameByteString, ef.cborName)
// Reset encoded CBOR type to byte string, preserving the "additional
// information" bits:
- flds[i].cborNameByteString[0] = byte(cborTypeByteString) |
- getAdditionalInformation(flds[i].cborNameByteString[0])
+ ef.cborNameByteString[0] = byte(cborTypeByteString) |
+ getAdditionalInformation(ef.cborNameByteString[0])
hasKeyAsStr = true
}
// Check if field can be omitted when empty
- if flds[i].omitEmpty {
+ if f.omitEmpty {
omitEmptyIdx = append(omitEmptyIdx, i)
}
}
- putEncodeBuffer(e)
-
- if err != nil {
- structType := &encodingStructType{err: err}
- encodingStructTypeCache.Store(t, structType)
- return structType, structType.err
- }
// Sort fields by canonical order
- bytewiseFields := make(fields, len(flds))
- copy(bytewiseFields, flds)
+ bytewiseFields := make(encodingFields, len(encFlds))
+ copy(bytewiseFields, encFlds)
sort.Sort(&bytewiseFieldSorter{bytewiseFields})
lengthFirstFields := bytewiseFields
if hasKeyAsInt && hasKeyAsStr {
- lengthFirstFields = make(fields, len(flds))
- copy(lengthFirstFields, flds)
+ lengthFirstFields = make(encodingFields, len(encFlds))
+ copy(lengthFirstFields, encFlds)
sort.Sort(&lengthFirstFieldSorter{lengthFirstFields})
}
structType := &encodingStructType{
- fields: flds,
+ fields: encFlds,
bytewiseFields: bytewiseFields,
lengthFirstFields: lengthFirstFields,
omitEmptyFieldsIdx: omitEmptyIdx,
}
encodingStructTypeCache.Store(t, structType)
- return structType, structType.err
+ return structType, nil
}
func getEncodingStructToArrayType(t reflect.Type, flds fields) (*encodingStructType, error) {
- for i := 0; i < len(flds); i++ {
- // Get field's encodeFunc
- flds[i].ef, flds[i].ief, flds[i].izf = getEncodeFunc(flds[i].typ)
- if flds[i].ef == nil {
+ encFlds := make(encodingFields, len(flds))
+ for i, f := range flds {
+ encFlds[i] = &encodingField{field: *f}
+ encFlds[i].ef, encFlds[i].ief, encFlds[i].izf = getEncodeFunc(f.typ)
+ if encFlds[i].ef == nil {
structType := &encodingStructType{err: &UnsupportedTypeError{t}}
encodingStructTypeCache.Store(t, structType)
- return structType, structType.err
+ return nil, structType.err
}
}
structType := &encodingStructType{
- fields: flds,
+ fields: encFlds,
toArray: true,
}
encodingStructTypeCache.Store(t, structType)
- return structType, structType.err
+ return structType, nil
}
func getEncodeFunc(t reflect.Type) (encodeFunc, isEmptyFunc, isZeroFunc) {
diff --git a/vendor/github.com/fxamacker/cbor/v2/decode.go b/vendor/github.com/fxamacker/cbor/v2/decode.go
index f0bdc3b38dd..1d3e63d0684 100644
--- a/vendor/github.com/fxamacker/cbor/v2/decode.go
+++ b/vendor/github.com/fxamacker/cbor/v2/decode.go
@@ -16,7 +16,6 @@ import (
"math/big"
"reflect"
"strconv"
- "strings"
"time"
"unicode/utf8"
@@ -326,14 +325,14 @@ func (dmkm DupMapKeyMode) valid() bool {
return dmkm >= 0 && dmkm < maxDupMapKeyMode
}
-// IndefLengthMode specifies whether to allow indefinite length items.
+// IndefLengthMode specifies whether to allow indefinite-length items.
type IndefLengthMode int
const (
- // IndefLengthAllowed allows indefinite length items.
+ // IndefLengthAllowed allows indefinite-length items.
IndefLengthAllowed IndefLengthMode = iota
- // IndefLengthForbidden disallows indefinite length items.
+ // IndefLengthForbidden disallows indefinite-length items.
IndefLengthForbidden
maxIndefLengthMode
@@ -378,6 +377,7 @@ const (
// - int64 if value fits
// - big.Int or *big.Int (see BigIntDecMode) if value < math.MinInt64
// - return UnmarshalTypeError if value > math.MaxInt64
+ //
// Deprecated: IntDecConvertSigned should not be used.
// Please use other options, such as IntDecConvertSignedOrError, IntDecConvertSignedOrBigInt, IntDecConvertNone.
IntDecConvertSigned
@@ -811,7 +811,7 @@ type DecOptions struct {
// Default is 128*1024=131072 and it can be set to [16, 2147483647]
MaxMapPairs int
- // IndefLength specifies whether to allow indefinite length CBOR items.
+ // IndefLength specifies whether to allow indefinite-length CBOR items.
IndefLength IndefLengthMode
// TagsMd specifies whether to allow CBOR tags (major type 6).
@@ -1055,7 +1055,7 @@ func (opts DecOptions) decMode() (*decMode, error) { //nolint:gocritic // ignore
}
if !opts.ExtraReturnErrors.valid() {
- return nil, errors.New("cbor: invalid ExtraReturnErrors " + strconv.Itoa(int(opts.ExtraReturnErrors)))
+ return nil, errors.New("cbor: invalid ExtraReturnErrors " + strconv.Itoa(int(opts.ExtraReturnErrors))) //nolint:gosec
}
if opts.DefaultMapType != nil && opts.DefaultMapType.Kind() != reflect.Map {
@@ -1149,8 +1149,8 @@ func (opts DecOptions) decMode() (*decMode, error) { //nolint:gocritic // ignore
unrecognizedTagToAny: opts.UnrecognizedTagToAny,
timeTagToAny: opts.TimeTagToAny,
simpleValues: simpleValues,
- nanDec: opts.NaN,
- infDec: opts.Inf,
+ nan: opts.NaN,
+ inf: opts.Inf,
byteStringToTime: opts.ByteStringToTime,
byteStringExpectedFormat: opts.ByteStringExpectedFormat,
bignumTag: opts.BignumTag,
@@ -1230,8 +1230,8 @@ type decMode struct {
unrecognizedTagToAny UnrecognizedTagToAnyMode
timeTagToAny TimeTagToAnyMode
simpleValues *SimpleValueRegistry
- nanDec NaNMode
- infDec InfMode
+ nan NaNMode
+ inf InfMode
byteStringToTime ByteStringToTimeMode
byteStringExpectedFormat ByteStringExpectedFormatMode
bignumTag BignumTagMode
@@ -1272,8 +1272,8 @@ func (dm *decMode) DecOptions() DecOptions {
UnrecognizedTagToAny: dm.unrecognizedTagToAny,
TimeTagToAny: dm.timeTagToAny,
SimpleValues: simpleValues,
- NaN: dm.nanDec,
- Inf: dm.infDec,
+ NaN: dm.nan,
+ Inf: dm.inf,
ByteStringToTime: dm.byteStringToTime,
ByteStringExpectedFormat: dm.byteStringExpectedFormat,
BignumTag: dm.bignumTag,
@@ -1583,11 +1583,11 @@ func (d *decoder) parseToValue(v reflect.Value, tInfo *typeInfo) error { //nolin
_, ai, val := d.getHead()
switch ai {
case additionalInformationAsFloat16:
- f := float64(float16.Frombits(uint16(val)).Float32())
+ f := float64(float16.Frombits(uint16(val)).Float32()) //nolint:gosec
return fillFloat(t, f, v)
case additionalInformationAsFloat32:
- f := float64(math.Float32frombits(uint32(val)))
+ f := float64(math.Float32frombits(uint32(val))) //nolint:gosec
return fillFloat(t, f, v)
case additionalInformationAsFloat64:
@@ -1595,10 +1595,10 @@ func (d *decoder) parseToValue(v reflect.Value, tInfo *typeInfo) error { //nolin
return fillFloat(t, f, v)
default: // ai <= 24
- if d.dm.simpleValues.rejected[SimpleValue(val)] {
+ if d.dm.simpleValues.rejected[SimpleValue(val)] { //nolint:gosec
return &UnacceptableDataItemError{
CBORType: t.String(),
- Message: "simple value " + strconv.FormatInt(int64(val), 10) + " is not recognized",
+ Message: "simple value " + strconv.FormatInt(int64(val), 10) + " is not recognized", //nolint:gosec
}
}
@@ -1677,20 +1677,23 @@ func (d *decoder) parseToValue(v reflect.Value, tInfo *typeInfo) error { //nolin
return d.parseToValue(v, tInfo)
case cborTypeArray:
- if tInfo.nonPtrKind == reflect.Slice {
+ switch tInfo.nonPtrKind {
+ case reflect.Slice:
return d.parseArrayToSlice(v, tInfo)
- } else if tInfo.nonPtrKind == reflect.Array {
+ case reflect.Array:
return d.parseArrayToArray(v, tInfo)
- } else if tInfo.nonPtrKind == reflect.Struct {
+ case reflect.Struct:
return d.parseArrayToStruct(v, tInfo)
}
+
d.skip()
return &UnmarshalTypeError{CBORType: t.String(), GoType: tInfo.nonPtrType.String()}
case cborTypeMap:
- if tInfo.nonPtrKind == reflect.Struct {
+ switch tInfo.nonPtrKind {
+ case reflect.Struct:
return d.parseMapToStruct(v, tInfo)
- } else if tInfo.nonPtrKind == reflect.Map {
+ case reflect.Map:
return d.parseMapToMap(v, tInfo)
}
d.skip()
@@ -1745,8 +1748,8 @@ func (d *decoder) parseToTime() (time.Time, bool, error) {
// Read tag number
_, _, tagNum := d.getHead()
if tagNum != 0 && tagNum != 1 {
- d.skip() // skip tag content
- return time.Time{}, false, errors.New("cbor: wrong tag number for time.Time, got " + strconv.Itoa(int(tagNum)) + ", expect 0 or 1")
+ d.skip() // skip tag content
+ return time.Time{}, false, errors.New("cbor: wrong tag number for time.Time, got " + strconv.Itoa(int(tagNum)) + ", expect 0 or 1") //nolint:gosec
}
}
} else {
@@ -1815,10 +1818,10 @@ func (d *decoder) parseToTime() (time.Time, bool, error) {
var f float64
switch ai {
case additionalInformationAsFloat16:
- f = float64(float16.Frombits(uint16(val)).Float32())
+ f = float64(float16.Frombits(uint16(val)).Float32()) //nolint:gosec
case additionalInformationAsFloat32:
- f = float64(math.Float32frombits(uint32(val)))
+ f = float64(math.Float32frombits(uint32(val))) //nolint:gosec
case additionalInformationAsFloat64:
f = math.Float64frombits(val)
@@ -1832,6 +1835,13 @@ func (d *decoder) parseToTime() (time.Time, bool, error) {
return time.Time{}, true, nil
}
seconds, fractional := math.Modf(f)
+ if seconds > math.MaxInt64 || seconds < math.MinInt64 {
+ return time.Time{}, false, &UnmarshalTypeError{
+ CBORType: t.String(),
+ GoType: typeTime.String(),
+ errorMsg: fmt.Sprintf("%v overflows Go's int64", f),
+ }
+ }
return time.Unix(int64(seconds), int64(fractional*1e9)), true, nil
default:
@@ -2145,14 +2155,14 @@ func (d *decoder) parse(skipSelfDescribedTag bool) (any, error) { //nolint:gocyc
case cborTypePrimitives:
_, ai, val := d.getHead()
- if ai <= 24 && d.dm.simpleValues.rejected[SimpleValue(val)] {
+ if ai <= 24 && d.dm.simpleValues.rejected[SimpleValue(val)] { //nolint:gosec
return nil, &UnacceptableDataItemError{
CBORType: t.String(),
- Message: "simple value " + strconv.FormatInt(int64(val), 10) + " is not recognized",
+ Message: "simple value " + strconv.FormatInt(int64(val), 10) + " is not recognized", //nolint:gosec
}
}
if ai < 20 || ai == 24 {
- return SimpleValue(val), nil
+ return SimpleValue(val), nil //nolint:gosec
}
switch ai {
@@ -2165,11 +2175,11 @@ func (d *decoder) parse(skipSelfDescribedTag bool) (any, error) { //nolint:gocyc
return nil, nil
case additionalInformationAsFloat16:
- f := float64(float16.Frombits(uint16(val)).Float32())
+ f := float64(float16.Frombits(uint16(val)).Float32()) //nolint:gosec
return f, nil
case additionalInformationAsFloat32:
- f := float64(math.Float32frombits(uint32(val)))
+ f := float64(math.Float32frombits(uint32(val))) //nolint:gosec
return f, nil
case additionalInformationAsFloat64:
@@ -2202,16 +2212,16 @@ func (d *decoder) parse(skipSelfDescribedTag bool) (any, error) { //nolint:gocyc
func (d *decoder) parseByteString() ([]byte, bool) {
_, _, val, indefiniteLength := d.getHeadWithIndefiniteLengthFlag()
if !indefiniteLength {
- b := d.data[d.off : d.off+int(val)]
- d.off += int(val)
+ b := d.data[d.off : d.off+int(val)] //nolint:gosec
+ d.off += int(val) //nolint:gosec
return b, false
}
- // Process indefinite length string chunks.
+ // Process indefinite-length string chunks.
b := []byte{}
for !d.foundBreak() {
_, _, val = d.getHead()
- b = append(b, d.data[d.off:d.off+int(val)]...)
- d.off += int(val)
+ b = append(b, d.data[d.off:d.off+int(val)]...) //nolint:gosec
+ d.off += int(val) //nolint:gosec
}
return b, true
}
@@ -2253,7 +2263,7 @@ func (d *decoder) applyByteStringTextConversion(
default:
// If this happens, there is a bug: the decoder has pushed an invalid
// "expected later encoding" tag to the stack.
- panic(fmt.Sprintf("unrecognized expected later encoding tag: %d", d.expectedLaterEncodingTags))
+ panic(fmt.Sprintf("unrecognized expected later encoding tag: %d", d.expectedLaterEncodingTags[len(d.expectedLaterEncodingTags)-1]))
}
case reflect.Slice:
@@ -2300,19 +2310,19 @@ func (d *decoder) applyByteStringTextConversion(
func (d *decoder) parseTextString() ([]byte, error) {
_, _, val, indefiniteLength := d.getHeadWithIndefiniteLengthFlag()
if !indefiniteLength {
- b := d.data[d.off : d.off+int(val)]
- d.off += int(val)
+ b := d.data[d.off : d.off+int(val)] //nolint:gosec
+ d.off += int(val) //nolint:gosec
if d.dm.utf8 == UTF8RejectInvalid && !utf8.Valid(b) {
return nil, &SemanticError{"cbor: invalid UTF-8 string"}
}
return b, nil
}
- // Process indefinite length string chunks.
+ // Process indefinite-length string chunks.
b := []byte{}
for !d.foundBreak() {
_, _, val = d.getHead()
- x := d.data[d.off : d.off+int(val)]
- d.off += int(val)
+ x := d.data[d.off : d.off+int(val)] //nolint:gosec
+ d.off += int(val) //nolint:gosec
if d.dm.utf8 == UTF8RejectInvalid && !utf8.Valid(x) {
for !d.foundBreak() {
d.skip() // Skip remaining chunk on error
@@ -2327,7 +2337,7 @@ func (d *decoder) parseTextString() ([]byte, error) {
func (d *decoder) parseArray() ([]any, error) {
_, _, val, indefiniteLength := d.getHeadWithIndefiniteLengthFlag()
hasSize := !indefiniteLength
- count := int(val)
+ count := int(val) //nolint:gosec
if !hasSize {
count = d.numOfItemsUntilBreak() // peek ahead to get array size to preallocate slice for better performance
}
@@ -2349,7 +2359,7 @@ func (d *decoder) parseArray() ([]any, error) {
func (d *decoder) parseArrayToSlice(v reflect.Value, tInfo *typeInfo) error {
_, _, val, indefiniteLength := d.getHeadWithIndefiniteLengthFlag()
hasSize := !indefiniteLength
- count := int(val)
+ count := int(val) //nolint:gosec
if !hasSize {
count = d.numOfItemsUntilBreak() // peek ahead to get array size to preallocate slice for better performance
}
@@ -2371,7 +2381,7 @@ func (d *decoder) parseArrayToSlice(v reflect.Value, tInfo *typeInfo) error {
func (d *decoder) parseArrayToArray(v reflect.Value, tInfo *typeInfo) error {
_, _, val, indefiniteLength := d.getHeadWithIndefiniteLengthFlag()
hasSize := !indefiniteLength
- count := int(val)
+ count := int(val) //nolint:gosec
gi := 0
vLen := v.Len()
var err error
@@ -2400,7 +2410,7 @@ func (d *decoder) parseArrayToArray(v reflect.Value, tInfo *typeInfo) error {
func (d *decoder) parseMap() (any, error) {
_, _, val, indefiniteLength := d.getHeadWithIndefiniteLengthFlag()
hasSize := !indefiniteLength
- count := int(val)
+ count := int(val) //nolint:gosec
m := make(map[any]any)
var k, e any
var err, lastErr error
@@ -2465,7 +2475,7 @@ func (d *decoder) parseMap() (any, error) {
func (d *decoder) parseMapToMap(v reflect.Value, tInfo *typeInfo) error { //nolint:gocyclo
_, _, val, indefiniteLength := d.getHeadWithIndefiniteLengthFlag()
hasSize := !indefiniteLength
- count := int(val)
+ count := int(val) //nolint:gosec
if v.IsNil() {
mapsize := count
if !hasSize {
@@ -2566,9 +2576,9 @@ func (d *decoder) parseMapToMap(v reflect.Value, tInfo *typeInfo) error { //noli
}
func (d *decoder) parseArrayToStruct(v reflect.Value, tInfo *typeInfo) error {
- structType := getDecodingStructType(tInfo.nonPtrType)
- if structType.err != nil {
- return structType.err
+ structType, structTypeErr := getDecodingStructType(tInfo.nonPtrType)
+ if structTypeErr != nil {
+ return structTypeErr
}
if !structType.toArray {
@@ -2584,7 +2594,7 @@ func (d *decoder) parseArrayToStruct(v reflect.Value, tInfo *typeInfo) error {
start := d.off
_, _, val, indefiniteLength := d.getHeadWithIndefiniteLengthFlag()
hasSize := !indefiniteLength
- count := int(val)
+ count := int(val) //nolint:gosec
if !hasSize {
count = d.numOfItemsUntilBreak() // peek ahead to get array size
}
@@ -2637,11 +2647,72 @@ func (d *decoder) parseArrayToStruct(v reflect.Value, tInfo *typeInfo) error {
return err
}
-// parseMapToStruct needs to be fast so gocyclo can be ignored for now.
+// skipMapEntriesFromIndex skips remaining map entries starting from index i.
+func (d *decoder) skipMapEntriesFromIndex(i, count int, hasSize bool) {
+ for ; (hasSize && i < count) || (!hasSize && !d.foundBreak()); i++ {
+ d.skip()
+ d.skip()
+ }
+}
+
+// skipMapForDupKey skips the current map value and all remaining map entries,
+// then returns a DupMapKeyError for the given key at map index i.
+func (d *decoder) skipMapForDupKey(dupKey any, i, count int, hasSize bool) error {
+ // Skip the value of the duplicate key.
+ d.skip()
+ // Skip all remaining map entries.
+ d.skipMapEntriesFromIndex(i+1, count, hasSize)
+ return &DupMapKeyError{dupKey, i}
+}
+
+// skipMapForUnknownField skips the current map value and all remaining map entries,
+// then returns a UnknownFieldError for the given key at map index i.
+func (d *decoder) skipMapForUnknownField(i, count int, hasSize bool) error {
+ // Skip the value of the unknown key.
+ d.skip()
+ // Skip all remaining map entries.
+ d.skipMapEntriesFromIndex(i+1, count, hasSize)
+ return &UnknownFieldError{i}
+}
+
+// decodeToStructField decodes the next CBOR value into the struct field f in v.
+// If the field cannot be resolved, the CBOR value is skipped.
+func (d *decoder) decodeToStructField(v reflect.Value, f *decodingField, tInfo *typeInfo) error {
+ var fv reflect.Value
+
+ if len(f.idx) == 1 {
+ fv = v.Field(f.idx[0])
+ } else {
+ var err error
+ fv, err = getFieldValue(v, f.idx, func(v reflect.Value) (reflect.Value, error) {
+ // Return a new value for embedded field null pointer to point to, or return error.
+ if !v.CanSet() {
+ return reflect.Value{}, errors.New("cbor: cannot set embedded pointer to unexported struct: " + v.Type().String())
+ }
+ v.Set(reflect.New(v.Type().Elem()))
+ return v, nil
+ })
+ if !fv.IsValid() {
+ d.skip()
+ return err
+ }
+ }
+
+ err := d.parseToValue(fv, f.typInfo)
+ if err != nil {
+ if typeError, ok := err.(*UnmarshalTypeError); ok {
+ typeError.StructFieldName = tInfo.nonPtrType.String() + "." + f.name
+ }
+ return err
+ }
+
+ return nil
+}
+
func (d *decoder) parseMapToStruct(v reflect.Value, tInfo *typeInfo) error { //nolint:gocyclo
- structType := getDecodingStructType(tInfo.nonPtrType)
- if structType.err != nil {
- return structType.err
+ structType, structTypeErr := getDecodingStructType(tInfo.nonPtrType)
+ if structTypeErr != nil {
+ return structTypeErr
}
if structType.toArray {
@@ -2654,14 +2725,12 @@ func (d *decoder) parseMapToStruct(v reflect.Value, tInfo *typeInfo) error { //n
}
}
- var err, lastErr error
-
// Get CBOR map size
_, _, val, indefiniteLength := d.getHeadWithIndefiniteLengthFlag()
hasSize := !indefiniteLength
- count := int(val)
+ count := int(val) //nolint:gosec
- // Keeps track of matched struct fields
+ // Keep track of matched struct fields to detect duplicate map keys.
var foundFldIdx []bool
{
const maxStackFields = 128
@@ -2675,99 +2744,80 @@ func (d *decoder) parseMapToStruct(v reflect.Value, tInfo *typeInfo) error { //n
}
}
- // Keeps track of CBOR map keys to detect duplicate map key
- keyCount := 0
- var mapKeys map[any]struct{}
-
- errOnUnknownField := (d.dm.extraReturnErrors & ExtraDecErrorUnknownField) > 0
+ // Keep track of unmatched CBOR map keys to detect duplicate map keys.
+ var unmatchedMapKeys map[any]struct{}
-MapEntryLoop:
- for j := 0; (hasSize && j < count) || (!hasSize && !d.foundBreak()); j++ {
- var f *field
+ var err error
- // If duplicate field detection is enabled and the key at index j did not match any
- // field, k will hold the map key.
- var k any
+ caseInsensitive := d.dm.fieldNameMatching == FieldNameMatchingPreferCaseSensitive
+ for i := 0; (hasSize && i < count) || (!hasSize && !d.foundBreak()); i++ {
t := d.nextCBORType()
- if t == cborTypeTextString || (t == cborTypeByteString && d.dm.fieldNameByteString == FieldNameByteStringAllowed) {
+
+ // Reclassify disallowed byte string keys so they fall to the default case.
+ // keyType is only used for branch control.
+ keyType := t
+ if t == cborTypeByteString && d.dm.fieldNameByteString != FieldNameByteStringAllowed {
+ keyType = 0xff
+ }
+
+ switch keyType {
+ case cborTypeTextString, cborTypeByteString:
var keyBytes []byte
if t == cborTypeTextString {
- keyBytes, lastErr = d.parseTextString()
- if lastErr != nil {
+ var parseErr error
+ keyBytes, parseErr = d.parseTextString()
+ if parseErr != nil {
if err == nil {
- err = lastErr
+ err = parseErr
}
- d.skip() // skip value
+ d.skip() // Skip value
continue
}
} else { // cborTypeByteString
keyBytes, _ = d.parseByteString()
}
- // Check for exact match on field name.
- if i, ok := structType.fieldIndicesByName[string(keyBytes)]; ok {
- fld := structType.fields[i]
+ // Find matching struct field (exact match, then case-insensitive fallback).
+ if fldIdx, ok := findStructFieldByKey(structType, keyBytes, caseInsensitive); ok {
+ fld := structType.fields[fldIdx]
- if !foundFldIdx[i] {
- f = fld
- foundFldIdx[i] = true
- } else if d.dm.dupMapKey == DupMapKeyEnforcedAPF {
- err = &DupMapKeyError{fld.name, j}
- d.skip() // skip value
- j++
- // skip the rest of the map
- for ; (hasSize && j < count) || (!hasSize && !d.foundBreak()); j++ {
- d.skip()
- d.skip()
+ switch checkDupField(d.dm, foundFldIdx, fldIdx) {
+ case mapActionParseValueAndContinue:
+ if fieldErr := d.decodeToStructField(v, fld, tInfo); fieldErr != nil && err == nil {
+ err = fieldErr
}
- return err
- } else {
- // discard repeated match
+ continue
+ case mapActionSkipAllAndReturnError:
+ return d.skipMapForDupKey(string(keyBytes), i, count, hasSize)
+ case mapActionSkipValueAndContinue:
d.skip()
- continue MapEntryLoop
+ continue
}
}
- // Find field with case-insensitive match
- if f == nil && d.dm.fieldNameMatching == FieldNameMatchingPreferCaseSensitive {
- keyLen := len(keyBytes)
- keyString := string(keyBytes)
- for i := 0; i < len(structType.fields); i++ {
- fld := structType.fields[i]
- if len(fld.name) == keyLen && strings.EqualFold(fld.name, keyString) {
- if !foundFldIdx[i] {
- f = fld
- foundFldIdx[i] = true
- } else if d.dm.dupMapKey == DupMapKeyEnforcedAPF {
- err = &DupMapKeyError{keyString, j}
- d.skip() // skip value
- j++
- // skip the rest of the map
- for ; (hasSize && j < count) || (!hasSize && !d.foundBreak()); j++ {
- d.skip()
- d.skip()
- }
- return err
- } else {
- // discard repeated match
- d.skip()
- continue MapEntryLoop
- }
- break
- }
- }
+ // No matching struct field found.
+ if unmatchedErr := handleUnmatchedMapKey(d, string(keyBytes), i, count, hasSize, &unmatchedMapKeys); unmatchedErr != nil {
+ return unmatchedErr
}
- if d.dm.dupMapKey == DupMapKeyEnforcedAPF && f == nil {
- k = string(keyBytes)
- }
- } else if t <= cborTypeNegativeInt { // uint/int
+ case cborTypePositiveInt, cborTypeNegativeInt:
var nameAsInt int64
if t == cborTypePositiveInt {
_, _, val := d.getHead()
- nameAsInt = int64(val)
+ if val > math.MaxInt64 {
+ if err == nil {
+ err = &UnmarshalTypeError{
+ CBORType: t.String(),
+ GoType: reflect.TypeOf(int64(0)).String(),
+ errorMsg: strconv.FormatUint(val, 10) + " overflows Go's int64",
+ }
+ }
+ d.skip() // skip value
+ continue
+ }
+ nameAsInt = int64(val) //nolint:gosec
} else {
_, _, val := d.getHead()
if val > math.MaxInt64 {
@@ -2781,39 +2831,35 @@ MapEntryLoop:
d.skip() // skip value
continue
}
- nameAsInt = int64(-1) ^ int64(val)
- }
-
- // Find field
- for i := 0; i < len(structType.fields); i++ {
- fld := structType.fields[i]
- if fld.keyAsInt && fld.nameAsInt == nameAsInt {
- if !foundFldIdx[i] {
- f = fld
- foundFldIdx[i] = true
- } else if d.dm.dupMapKey == DupMapKeyEnforcedAPF {
- err = &DupMapKeyError{nameAsInt, j}
- d.skip() // skip value
- j++
- // skip the rest of the map
- for ; (hasSize && j < count) || (!hasSize && !d.foundBreak()); j++ {
- d.skip()
- d.skip()
- }
- return err
- } else {
- // discard repeated match
- d.skip()
- continue MapEntryLoop
+ nameAsInt = int64(-1) ^ int64(val) //nolint:gosec
+ }
+
+ // Find field by integer key
+ if fldIdx, ok := structType.fieldIndicesByIntKey[nameAsInt]; ok {
+ fld := structType.fields[fldIdx]
+
+ switch checkDupField(d.dm, foundFldIdx, fldIdx) {
+ case mapActionParseValueAndContinue:
+ if fieldErr := d.decodeToStructField(v, fld, tInfo); fieldErr != nil && err == nil {
+ err = fieldErr
}
- break
+ continue
+ case mapActionSkipAllAndReturnError:
+ return d.skipMapForDupKey(nameAsInt, i, count, hasSize)
+ case mapActionSkipValueAndContinue:
+ d.skip()
+ continue
}
}
- if d.dm.dupMapKey == DupMapKeyEnforcedAPF && f == nil {
- k = nameAsInt
+ // No matching struct field found.
+ if unmatchedErr := handleUnmatchedMapKey(d, nameAsInt, i, count, hasSize, &unmatchedMapKeys); unmatchedErr != nil {
+ return unmatchedErr
}
- } else {
+
+ default:
+ // CBOR map keys that can't be matched to any struct field.
+
if err == nil {
err = &UnmarshalTypeError{
CBORType: t.String(),
@@ -2821,97 +2867,31 @@ MapEntryLoop:
errorMsg: "map key is of type " + t.String() + " and cannot be used to match struct field name",
}
}
+
+ var otherKey any
if d.dm.dupMapKey == DupMapKeyEnforcedAPF {
// parse key
- k, lastErr = d.parse(true)
- if lastErr != nil {
+ var parseErr error
+ otherKey, parseErr = d.parse(true)
+ if parseErr != nil {
d.skip() // skip value
continue
}
// Detect if CBOR map key can be used as Go map key.
- if !isHashableValue(reflect.ValueOf(k)) {
+ if !isHashableValue(reflect.ValueOf(otherKey)) {
d.skip() // skip value
continue
}
} else {
d.skip() // skip key
}
- }
-
- if f == nil {
- if errOnUnknownField {
- err = &UnknownFieldError{j}
- d.skip() // Skip value
- j++
- // skip the rest of the map
- for ; (hasSize && j < count) || (!hasSize && !d.foundBreak()); j++ {
- d.skip()
- d.skip()
- }
- return err
- }
-
- // Two map keys that match the same struct field are immediately considered
- // duplicates. This check detects duplicates between two map keys that do
- // not match a struct field. If unknown field errors are enabled, then this
- // check is never reached.
- if d.dm.dupMapKey == DupMapKeyEnforcedAPF {
- if mapKeys == nil {
- mapKeys = make(map[any]struct{}, 1)
- }
- mapKeys[k] = struct{}{}
- newKeyCount := len(mapKeys)
- if newKeyCount == keyCount {
- err = &DupMapKeyError{k, j}
- d.skip() // skip value
- j++
- // skip the rest of the map
- for ; (hasSize && j < count) || (!hasSize && !d.foundBreak()); j++ {
- d.skip()
- d.skip()
- }
- return err
- }
- keyCount = newKeyCount
- }
-
- d.skip() // Skip value
- continue
- }
-
- // Get field value by index
- var fv reflect.Value
- if len(f.idx) == 1 {
- fv = v.Field(f.idx[0])
- } else {
- fv, lastErr = getFieldValue(v, f.idx, func(v reflect.Value) (reflect.Value, error) {
- // Return a new value for embedded field null pointer to point to, or return error.
- if !v.CanSet() {
- return reflect.Value{}, errors.New("cbor: cannot set embedded pointer to unexported struct: " + v.Type().String())
- }
- v.Set(reflect.New(v.Type().Elem()))
- return v, nil
- })
- if lastErr != nil && err == nil {
- err = lastErr
- }
- if !fv.IsValid() {
- d.skip()
- continue
- }
- }
- if lastErr = d.parseToValue(fv, f.typInfo); lastErr != nil {
- if err == nil {
- if typeError, ok := lastErr.(*UnmarshalTypeError); ok {
- typeError.StructFieldName = tInfo.nonPtrType.String() + "." + f.name
- err = typeError
- } else {
- err = lastErr
- }
+ if unmatchedErr := handleUnmatchedMapKey(d, otherKey, i, count, hasSize, &unmatchedMapKeys); unmatchedErr != nil {
+ return unmatchedErr
}
}
}
+
return err
}
@@ -2958,15 +2938,15 @@ func (d *decoder) skip() {
switch t {
case cborTypeByteString, cborTypeTextString:
- d.off += int(val)
+ d.off += int(val) //nolint:gosec
case cborTypeArray:
- for i := 0; i < int(val); i++ {
+ for i := 0; i < int(val); i++ { //nolint:gosec
d.skip()
}
case cborTypeMap:
- for i := 0; i < int(val)*2; i++ {
+ for i := 0; i < int(val)*2; i++ { //nolint:gosec
d.skip()
}
diff --git a/vendor/github.com/fxamacker/cbor/v2/decode_map_utils.go b/vendor/github.com/fxamacker/cbor/v2/decode_map_utils.go
new file mode 100644
index 00000000000..3c8c423ad1a
--- /dev/null
+++ b/vendor/github.com/fxamacker/cbor/v2/decode_map_utils.go
@@ -0,0 +1,98 @@
+// Copyright (c) Faye Amacker. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+package cbor
+
+import "strings"
+
+// mapAction represents the next action during decoding a CBOR map to a Go struct.
+type mapAction int
+
+const (
+ mapActionParseValueAndContinue mapAction = iota // The caller should process the map value.
+ mapActionSkipValueAndContinue // The caller should skip the map value.
+ mapActionSkipAllAndReturnError // The caller should skip the rest of the map and return an error.
+)
+
+// checkDupField checks if a struct field at index i has already been matched and returns the next action.
+// If not matched, it marks the field as matched and returns mapActionParseValueAndContinue.
+// If matched and DupMapKeyEnforcedAPF is specified in the given dm, it returns mapActionSkipAllAndReturnError.
+// If matched and DupMapKeyEnforcedAPF is not specified in the given dm, it returns mapActionSkipValueAndContinue.
+func checkDupField(dm *decMode, foundFldIdx []bool, i int) mapAction {
+ if !foundFldIdx[i] {
+ foundFldIdx[i] = true
+ return mapActionParseValueAndContinue
+ }
+ if dm.dupMapKey == DupMapKeyEnforcedAPF {
+ return mapActionSkipAllAndReturnError
+ }
+ return mapActionSkipValueAndContinue
+}
+
+// findStructFieldByKey finds a struct field matching keyBytes by name.
+// It tries an exact match first. If no exact match is found and
+// caseInsensitive is true, it falls back to a case-insensitive search.
+// findStructFieldByKey returns the field index and true, or -1 and false.
+func findStructFieldByKey(
+ structType *decodingStructType,
+ keyBytes []byte,
+ caseInsensitive bool,
+) (int, bool) {
+ if fldIdx, ok := structType.fieldIndicesByName[string(keyBytes)]; ok {
+ return fldIdx, true
+ }
+ if caseInsensitive {
+ return findFieldCaseInsensitive(structType.fields, string(keyBytes))
+ }
+ return -1, false
+}
+
+// findFieldCaseInsensitive returns the index of the first field whose name
+// case-insensitively matches key, or -1 and false if no field matches.
+func findFieldCaseInsensitive(flds decodingFields, key string) (int, bool) {
+ keyLen := len(key)
+ for i, f := range flds {
+ if f.keyAsInt {
+ continue
+ }
+ if len(f.name) == keyLen && strings.EqualFold(f.name, key) {
+ return i, true
+ }
+ }
+ return -1, false
+}
+
+// handleUnmatchedMapKey handles a map entry whose key does not match any struct
+// field. It can return UnknownFieldError or DupMapKeyError.
+// handleUnmatchedMapKey consumes the CBOR value, so the caller doesn't need to skip any values.
+// If an error is returned, the caller should abort parsing the map and return the error.
+// If no error is returned, the caller should continue to process the next map pair.
+func handleUnmatchedMapKey(
+ d *decoder,
+ key any,
+ i int,
+ count int,
+ hasSize bool,
+ // *map[any]struct{} is used here because we use lazy initialization for uks
+ uks *map[any]struct{}, //nolint:gocritic
+) error {
+ errOnUnknownField := (d.dm.extraReturnErrors & ExtraDecErrorUnknownField) > 0
+
+ if errOnUnknownField {
+ return d.skipMapForUnknownField(i, count, hasSize)
+ }
+
+ if d.dm.dupMapKey == DupMapKeyEnforcedAPF {
+ if *uks == nil {
+ *uks = make(map[any]struct{})
+ }
+ if _, dup := (*uks)[key]; dup {
+ return d.skipMapForDupKey(key, i, count, hasSize)
+ }
+ (*uks)[key] = struct{}{}
+ }
+
+ // Skip value.
+ d.skip()
+ return nil
+}
diff --git a/vendor/github.com/fxamacker/cbor/v2/diagnose.go b/vendor/github.com/fxamacker/cbor/v2/diagnose.go
index 44afb866089..42a67ad11fa 100644
--- a/vendor/github.com/fxamacker/cbor/v2/diagnose.go
+++ b/vendor/github.com/fxamacker/cbor/v2/diagnose.go
@@ -51,11 +51,8 @@ const (
maxByteStringEncoding
)
-func (bse ByteStringEncoding) valid() error {
- if bse >= maxByteStringEncoding {
- return errors.New("cbor: invalid ByteStringEncoding " + strconv.Itoa(int(bse)))
- }
- return nil
+func (bse ByteStringEncoding) valid() bool {
+ return bse < maxByteStringEncoding
}
// DiagOptions specifies Diag options.
@@ -104,8 +101,8 @@ func (opts DiagOptions) DiagMode() (DiagMode, error) {
}
func (opts DiagOptions) diagMode() (*diagMode, error) {
- if err := opts.ByteStringEncoding.valid(); err != nil {
- return nil, err
+ if !opts.ByteStringEncoding.valid() {
+ return nil, errors.New("cbor: invalid ByteStringEncoding " + strconv.Itoa(int(opts.ByteStringEncoding)))
}
decMode, err := DecOptions{
@@ -360,7 +357,7 @@ func (di *diagnose) item() error { //nolint:gocyclo
case cborTypeArray:
_, _, val := di.d.getHead()
- count := int(val)
+ count := int(val) //nolint:gosec
di.w.WriteByte('[')
for i := 0; i < count; i++ {
@@ -376,7 +373,7 @@ func (di *diagnose) item() error { //nolint:gocyclo
case cborTypeMap:
_, _, val := di.d.getHead()
- count := int(val)
+ count := int(val) //nolint:gosec
di.w.WriteByte('{')
for i := 0; i < count; i++ {
@@ -477,8 +474,8 @@ func (di *diagnose) item() error { //nolint:gocyclo
func (di *diagnose) writeU16(val rune) {
di.w.WriteString("\\u")
var in [2]byte
- in[0] = byte(val >> 8)
- in[1] = byte(val)
+ in[0] = byte(val >> 8) //nolint:gosec
+ in[1] = byte(val) //nolint:gosec
sz := hex.EncodedLen(len(in))
di.w.Grow(sz)
dst := di.w.Bytes()[di.w.Len() : di.w.Len()+sz]
@@ -608,7 +605,7 @@ func (di *diagnose) encodeTextString(val string, quote byte) error {
c, size := utf8.DecodeRuneInString(val[i:])
switch {
- case c == utf8.RuneError:
+ case c == utf8.RuneError && size == 1:
return &SemanticError{"cbor: invalid UTF-8 string"}
case c < utf16SurrSelf:
@@ -631,7 +628,7 @@ func (di *diagnose) encodeFloat(ai byte, val uint64) error {
f64 := float64(0)
switch ai {
case additionalInformationAsFloat16:
- f16 := float16.Frombits(uint16(val))
+ f16 := float16.Frombits(uint16(val)) //nolint:gosec
switch {
case f16.IsNaN():
di.w.WriteString("NaN")
@@ -647,7 +644,7 @@ func (di *diagnose) encodeFloat(ai byte, val uint64) error {
}
case additionalInformationAsFloat32:
- f32 := math.Float32frombits(uint32(val))
+ f32 := math.Float32frombits(uint32(val)) //nolint:gosec
switch {
case f32 != f32:
di.w.WriteString("NaN")
diff --git a/vendor/github.com/fxamacker/cbor/v2/doc.go b/vendor/github.com/fxamacker/cbor/v2/doc.go
index c758b737489..e4c1d27b8dd 100644
--- a/vendor/github.com/fxamacker/cbor/v2/doc.go
+++ b/vendor/github.com/fxamacker/cbor/v2/doc.go
@@ -56,20 +56,30 @@ modes won't accidentally change at runtime after they're created.
Modes are intended to be reused and are safe for concurrent use.
-EncMode and DecMode Interfaces
+EncMode, UserBufferEncMode, and DecMode Interfaces
// EncMode interface uses immutable options and is safe for concurrent use.
type EncMode interface {
- Marshal(v interface{}) ([]byte, error)
+ Marshal(v any) ([]byte, error)
NewEncoder(w io.Writer) *Encoder
- EncOptions() EncOptions // returns copy of options
+ EncOptions() EncOptions
+ }
+
+ // UserBufferEncMode extends EncMode with MarshalToBuffer, which supports
+ // user specified buffer rather than encoding into the built-in buffer pool.
+ type UserBufferEncMode interface {
+ EncMode
+ MarshalToBuffer(v any, buf *bytes.Buffer) error
}
// DecMode interface uses immutable options and is safe for concurrent use.
type DecMode interface {
- Unmarshal(data []byte, v interface{}) error
+ Unmarshal(data []byte, v any) error
+ UnmarshalFirst(data []byte, v any) (rest []byte, err error)
+ Valid(data []byte) error // Deprecated: use Wellformed instead.
+ Wellformed(data []byte) error
NewDecoder(r io.Reader) *Decoder
- DecOptions() DecOptions // returns copy of options
+ DecOptions() DecOptions
}
Using Default Encoding Mode
diff --git a/vendor/github.com/fxamacker/cbor/v2/encode.go b/vendor/github.com/fxamacker/cbor/v2/encode.go
index c550617c387..e65a29d8a6f 100644
--- a/vendor/github.com/fxamacker/cbor/v2/encode.go
+++ b/vendor/github.com/fxamacker/cbor/v2/encode.go
@@ -30,7 +30,7 @@ import (
// If value implements the Marshaler interface, Marshal calls its
// MarshalCBOR method.
//
-// If value implements encoding.BinaryMarshaler, Marhsal calls its
+// If value implements encoding.BinaryMarshaler, Marshal calls its
// MarshalBinary method and encode it as CBOR byte string.
//
// Boolean values encode as CBOR booleans (type 7).
@@ -343,7 +343,7 @@ const (
// non-UTC timezone then a "localtime - UTC" numeric offset will be included as specified in RFC3339.
// NOTE: User applications can avoid including the RFC3339 numeric offset by:
// - providing a time.Time value set to UTC, or
- // - using the TimeUnix, TimeUnixMicro, or TimeUnixDynamic option instead of TimeRFC3339.
+ // - using the TimeUnix, TimeUnixMicro, TimeUnixDynamic, or TimeRFC3339NanoUTC option.
TimeRFC3339
// TimeRFC3339Nano causes time.Time to encode to a CBOR time (tag 0) with a text string content
@@ -351,9 +351,13 @@ const (
// non-UTC timezone then a "localtime - UTC" numeric offset will be included as specified in RFC3339.
// NOTE: User applications can avoid including the RFC3339 numeric offset by:
// - providing a time.Time value set to UTC, or
- // - using the TimeUnix, TimeUnixMicro, or TimeUnixDynamic option instead of TimeRFC3339Nano.
+ // - using the TimeUnix, TimeUnixMicro, TimeUnixDynamic, or TimeRFC3339NanoUTC option.
TimeRFC3339Nano
+ // TimeRFC3339NanoUTC causes time.Time to encode to a CBOR time (tag 0) with a text string content
+ // representing UTC time using nanosecond precision in RFC3339 format.
+ TimeRFC3339NanoUTC
+
maxTimeMode
)
@@ -436,7 +440,7 @@ const (
// FieldNameToTextString encodes struct fields to CBOR text string (major type 3).
FieldNameToTextString FieldNameMode = iota
- // FieldNameToTextString encodes struct fields to CBOR byte string (major type 2).
+ // FieldNameToByteString encodes struct fields to CBOR byte string (major type 2).
FieldNameToByteString
maxFieldNameMode
@@ -567,7 +571,7 @@ type EncOptions struct {
// RFC3339 format gets tag number 0, and numeric epoch time tag number 1.
TimeTag EncTagMode
- // IndefLength specifies whether to allow indefinite length CBOR items.
+ // IndefLength specifies whether to allow indefinite-length CBOR items.
IndefLength IndefLengthMode
// NilContainers specifies how to encode nil slices and maps.
@@ -1132,10 +1136,11 @@ func encodeFloat(e *bytes.Buffer, em *encMode, v reflect.Value) error {
if fopt == ShortestFloat16 {
var f16 float16.Float16
p := float16.PrecisionFromfloat32(f32)
- if p == float16.PrecisionExact {
+ switch p {
+ case float16.PrecisionExact:
// Roundtrip float32->float16->float32 test isn't needed.
f16 = float16.Fromfloat32(f32)
- } else if p == float16.PrecisionUnknown {
+ case float16.PrecisionUnknown:
// Try roundtrip float32->float16->float32 to determine if float32 can fit into float16.
f16 = float16.Fromfloat32(f32)
if f16.Float32() == f32 {
@@ -1293,10 +1298,10 @@ func encodeByteString(e *bytes.Buffer, em *encMode, v reflect.Value) error {
if slen == 0 {
return e.WriteByte(byte(cborTypeByteString))
}
- encodeHead(e, byte(cborTypeByteString), uint64(slen))
+ encodeHead(e, byte(cborTypeByteString), uint64(slen)) //nolint:gosec
if vk == reflect.Array {
for i := 0; i < slen; i++ {
- e.WriteByte(byte(v.Index(i).Uint()))
+ e.WriteByte(byte(v.Index(i).Uint())) //nolint:gosec
}
return nil
}
@@ -1333,7 +1338,7 @@ func (ae arrayEncodeFunc) encode(e *bytes.Buffer, em *encMode, v reflect.Value)
if alen == 0 {
return e.WriteByte(byte(cborTypeArray))
}
- encodeHead(e, byte(cborTypeArray), uint64(alen))
+ encodeHead(e, byte(cborTypeArray), uint64(alen)) //nolint:gosec
for i := 0; i < alen; i++ {
if err := ae.f(e, em, v.Index(i)); err != nil {
return err
@@ -1364,7 +1369,7 @@ func (me mapEncodeFunc) encode(e *bytes.Buffer, em *encMode, v reflect.Value) er
return e.WriteByte(byte(cborTypeMap))
}
- encodeHead(e, byte(cborTypeMap), uint64(mlen))
+ encodeHead(e, byte(cborTypeMap), uint64(mlen)) //nolint:gosec
if em.sort == SortNone || em.sort == SortFastShuffle || mlen <= 1 {
return me.e(e, em, v, nil)
}
@@ -1427,7 +1432,7 @@ func (x *bytewiseKeyValueSorter) Swap(i, j int) {
func (x *bytewiseKeyValueSorter) Less(i, j int) bool {
kvi, kvj := x.kvs[i], x.kvs[j]
- return bytes.Compare(x.data[kvi.offset:kvi.valueOffset], x.data[kvj.offset:kvj.valueOffset]) <= 0
+ return bytes.Compare(x.data[kvi.offset:kvi.valueOffset], x.data[kvj.offset:kvj.valueOffset]) < 0
}
type lengthFirstKeyValueSorter struct {
@@ -1448,7 +1453,7 @@ func (x *lengthFirstKeyValueSorter) Less(i, j int) bool {
if keyLengthDifference := (kvi.valueOffset - kvi.offset) - (kvj.valueOffset - kvj.offset); keyLengthDifference != 0 {
return keyLengthDifference < 0
}
- return bytes.Compare(x.data[kvi.offset:kvi.valueOffset], x.data[kvj.offset:kvj.valueOffset]) <= 0
+ return bytes.Compare(x.data[kvi.offset:kvi.valueOffset], x.data[kvj.offset:kvj.valueOffset]) < 0
}
var keyValuePool = sync.Pool{}
@@ -1535,8 +1540,8 @@ func encodeStruct(e *bytes.Buffer, em *encMode, v reflect.Value) (err error) {
// Head is rewritten later if actual encoded field count is different from struct field count.
encodedHeadLen := encodeHead(e, byte(cborTypeMap), uint64(len(flds)))
- kvbegin := e.Len()
- kvcount := 0
+ kvBeginOffset := e.Len()
+ kvCount := 0
for offset := 0; offset < len(flds); offset++ {
f := flds[(start+offset)%len(flds)]
@@ -1582,10 +1587,10 @@ func encodeStruct(e *bytes.Buffer, em *encMode, v reflect.Value) (err error) {
return err
}
- kvcount++
+ kvCount++
}
- if len(flds) == kvcount {
+ if len(flds) == kvCount {
// Encoded element count in head is the same as actual element count.
return nil
}
@@ -1593,8 +1598,8 @@ func encodeStruct(e *bytes.Buffer, em *encMode, v reflect.Value) (err error) {
// Overwrite the bytes that were reserved for the head before encoding the map entries.
var actualHeadLen int
{
- headbuf := *bytes.NewBuffer(e.Bytes()[kvbegin-encodedHeadLen : kvbegin-encodedHeadLen : kvbegin])
- actualHeadLen = encodeHead(&headbuf, byte(cborTypeMap), uint64(kvcount))
+ headbuf := *bytes.NewBuffer(e.Bytes()[kvBeginOffset-encodedHeadLen : kvBeginOffset-encodedHeadLen : kvBeginOffset])
+ actualHeadLen = encodeHead(&headbuf, byte(cborTypeMap), uint64(kvCount))
}
if actualHeadLen == encodedHeadLen {
@@ -1607,8 +1612,8 @@ func encodeStruct(e *bytes.Buffer, em *encMode, v reflect.Value) (err error) {
// encoded. The encoded entries are offset to the right by the number of excess reserved
// bytes. Shift the entries left to remove the gap.
excessReservedBytes := encodedHeadLen - actualHeadLen
- dst := e.Bytes()[kvbegin-excessReservedBytes : e.Len()-excessReservedBytes]
- src := e.Bytes()[kvbegin:e.Len()]
+ dst := e.Bytes()[kvBeginOffset-excessReservedBytes : e.Len()-excessReservedBytes]
+ src := e.Bytes()[kvBeginOffset:e.Len()]
copy(dst, src)
// After shifting, the excess bytes are at the end of the output buffer and they are
@@ -1633,7 +1638,7 @@ func encodeTime(e *bytes.Buffer, em *encMode, v reflect.Value) error {
}
if em.timeTag == EncTagRequired {
tagNumber := 1
- if em.time == TimeRFC3339 || em.time == TimeRFC3339Nano {
+ if em.time == TimeRFC3339 || em.time == TimeRFC3339Nano || em.time == TimeRFC3339NanoUTC {
tagNumber = 0
}
encodeHead(e, byte(cborTypeTag), uint64(tagNumber))
@@ -1650,7 +1655,7 @@ func encodeTime(e *bytes.Buffer, em *encMode, v reflect.Value) error {
case TimeUnixDynamic:
t = t.UTC().Round(time.Microsecond)
- secs, nsecs := t.Unix(), uint64(t.Nanosecond())
+ secs, nsecs := t.Unix(), uint64(t.Nanosecond()) //nolint:gosec
if nsecs == 0 {
return encodeInt(e, em, reflect.ValueOf(secs))
}
@@ -1661,6 +1666,10 @@ func encodeTime(e *bytes.Buffer, em *encMode, v reflect.Value) error {
s := t.Format(time.RFC3339)
return encodeString(e, em, reflect.ValueOf(s))
+ case TimeRFC3339NanoUTC:
+ s := t.UTC().Format(time.RFC3339Nano)
+ return encodeString(e, em, reflect.ValueOf(s))
+
default: // TimeRFC3339Nano
s := t.Format(time.RFC3339Nano)
return encodeString(e, em, reflect.ValueOf(s))
diff --git a/vendor/github.com/fxamacker/cbor/v2/simplevalue.go b/vendor/github.com/fxamacker/cbor/v2/simplevalue.go
index 30f72814f60..9912e855c24 100644
--- a/vendor/github.com/fxamacker/cbor/v2/simplevalue.go
+++ b/vendor/github.com/fxamacker/cbor/v2/simplevalue.go
@@ -93,6 +93,6 @@ func (sv *SimpleValue) unmarshalCBOR(data []byte) error {
// It is safe to cast val to uint8 here because
// - data is already verified to be well-formed CBOR simple value and
// - val is <= math.MaxUint8.
- *sv = SimpleValue(val)
+ *sv = SimpleValue(val) //nolint:gosec
return nil
}
diff --git a/vendor/github.com/fxamacker/cbor/v2/stream.go b/vendor/github.com/fxamacker/cbor/v2/stream.go
index 7ac6d7d6712..282b3f7ddc9 100644
--- a/vendor/github.com/fxamacker/cbor/v2/stream.go
+++ b/vendor/github.com/fxamacker/cbor/v2/stream.go
@@ -6,6 +6,7 @@ package cbor
import (
"bytes"
"errors"
+ "fmt"
"io"
"reflect"
)
@@ -157,11 +158,32 @@ func (dec *Decoder) overwriteBuf(newBuf []byte) {
dec.off = 0
}
+// indefDataItem tracks open indefinite-length data item during encoding.
+// typ is the CBOR type of the indefinite-length data item.
+// count is the number of items written so far.
+// For indefinite-length maps, count must be even (key/value pairs) when
+// the container is closed.
+type indefDataItem struct {
+ typ cborType
+ count int
+}
+
+// IndefiniteLengthMapOddItemCountError indicates that EndIndefinite was
+// called on an open indefinite-length map with an odd number of items.
+type IndefiniteLengthMapOddItemCountError struct {
+ count int
+}
+
+func (e *IndefiniteLengthMapOddItemCountError) Error() string {
+ return fmt.Sprintf("cbor: cannot end indefinite-length map with %d item(s)", e.count)
+}
+
// Encoder writes CBOR values to io.Writer.
type Encoder struct {
- w io.Writer
- em *encMode
- indefTypes []cborType
+ w io.Writer
+ em *encMode
+ indefs []indefDataItem
+ scratch [1]byte // reused for single-byte writes (indefinite-length head and break code)
}
// NewEncoder returns a new encoder that writes to w using the default encoding options.
@@ -171,89 +193,166 @@ func NewEncoder(w io.Writer) *Encoder {
// Encode writes the CBOR encoding of v.
func (enc *Encoder) Encode(v any) error {
- if len(enc.indefTypes) > 0 && v != nil {
- indefType := enc.indefTypes[len(enc.indefTypes)-1]
- if indefType == cborTypeTextString {
- k := reflect.TypeOf(v).Kind()
- if k != reflect.String {
- return errors.New("cbor: cannot encode item type " + k.String() + " for indefinite-length text string")
- }
- } else if indefType == cborTypeByteString {
- t := reflect.TypeOf(v)
- k := t.Kind()
- if (k != reflect.Array && k != reflect.Slice) || t.Elem().Kind() != reflect.Uint8 {
- return errors.New("cbor: cannot encode item type " + k.String() + " for indefinite-length byte string")
- }
+ if len(enc.indefs) > 0 {
+ err := validateIndefiniteLengthChunkByType(enc.indefs[len(enc.indefs)-1].typ, v)
+ if err != nil {
+ return err
}
}
buf := getEncodeBuffer()
err := encode(buf, enc.em, reflect.ValueOf(v))
+
+ // Validate the encoded chunk against the indefinite-length data item using a byte-based check.
+ // This reliably detects chunks from cbor.Marshaler, registered tags, StringToByteString, etc.,
+ // which may produce a chunk inconsistent with the parent's major type.
+ // Applies only to indefinite-length byte/text string parents (RFC 8949 Section 3.2.3).
+ if err == nil && len(enc.indefs) > 0 {
+ err = validateIndefiniteLengthChunkByData(enc.indefs[len(enc.indefs)-1].typ, buf.Bytes(), v)
+ }
+
if err == nil {
_, err = enc.w.Write(buf.Bytes())
}
putEncodeBuffer(buf)
- return err
+
+ if err != nil {
+ return err
+ }
+
+ if len(enc.indefs) > 0 {
+ enc.indefs[len(enc.indefs)-1].count++
+ }
+
+ return nil
}
-// StartIndefiniteByteString starts byte string encoding of indefinite length.
+// StartIndefiniteByteString starts indefinite-length byte string encoding.
// Subsequent calls of (*Encoder).Encode() encodes definite length byte strings
// ("chunks") as one contiguous string until EndIndefinite is called.
func (enc *Encoder) StartIndefiniteByteString() error {
return enc.startIndefinite(cborTypeByteString)
}
-// StartIndefiniteTextString starts text string encoding of indefinite length.
+// StartIndefiniteTextString starts indefinite-length text string encoding.
// Subsequent calls of (*Encoder).Encode() encodes definite length text strings
// ("chunks") as one contiguous string until EndIndefinite is called.
func (enc *Encoder) StartIndefiniteTextString() error {
return enc.startIndefinite(cborTypeTextString)
}
-// StartIndefiniteArray starts array encoding of indefinite length.
+// StartIndefiniteArray starts indefinite-length array encoding.
// Subsequent calls of (*Encoder).Encode() encodes elements of the array
// until EndIndefinite is called.
func (enc *Encoder) StartIndefiniteArray() error {
return enc.startIndefinite(cborTypeArray)
}
-// StartIndefiniteMap starts array encoding of indefinite length.
+// StartIndefiniteMap starts indefinite-length map encoding.
// Subsequent calls of (*Encoder).Encode() encodes elements of the map
// until EndIndefinite is called.
func (enc *Encoder) StartIndefiniteMap() error {
return enc.startIndefinite(cborTypeMap)
}
-// EndIndefinite closes last opened indefinite length value.
+// EndIndefinite closes last opened indefinite-length value.
+// It returns *IndefiniteLengthMapOddItemCountError without writing the
+// "break" code if the open indefinite-length map has an odd number of
+// items; the encoder state is unchanged so the caller can write the
+// missing value and retry.
func (enc *Encoder) EndIndefinite() error {
- if len(enc.indefTypes) == 0 {
+ if len(enc.indefs) == 0 {
return errors.New("cbor: cannot encode \"break\" code outside indefinite length values")
}
- _, err := enc.w.Write([]byte{cborBreakFlag})
- if err == nil {
- enc.indefTypes = enc.indefTypes[:len(enc.indefTypes)-1]
+
+ // Verify that indefinite-length map has even number of elements
+ top := enc.indefs[len(enc.indefs)-1]
+ if top.typ == cborTypeMap && top.count%2 != 0 {
+ return &IndefiniteLengthMapOddItemCountError{count: top.count}
}
- return err
-}
-var cborIndefHeader = map[cborType][]byte{
- cborTypeByteString: {cborByteStringWithIndefiniteLengthHead},
- cborTypeTextString: {cborTextStringWithIndefiniteLengthHead},
- cborTypeArray: {cborArrayWithIndefiniteLengthHead},
- cborTypeMap: {cborMapWithIndefiniteLengthHead},
+ // Write break code
+ enc.scratch[0] = cborBreakFlag
+ _, err := enc.w.Write(enc.scratch[:])
+ if err != nil {
+ return err
+ }
+
+ enc.indefs = enc.indefs[:len(enc.indefs)-1]
+
+ // Increment parent container's item count because the child
+ // (indefinite-length data item) is fully written to the stream.
+ if len(enc.indefs) > 0 {
+ enc.indefs[len(enc.indefs)-1].count++
+ }
+
+ return nil
}
func (enc *Encoder) startIndefinite(typ cborType) error {
if enc.em.indefLength == IndefLengthForbidden {
return &IndefiniteLengthError{typ}
}
- _, err := enc.w.Write(cborIndefHeader[typ])
- if err == nil {
- enc.indefTypes = append(enc.indefTypes, typ)
+
+ // Verify that new indefinite-length data item is not a chunk in indefinite-length byte/text string.
+ if len(enc.indefs) > 0 {
+ parent := enc.indefs[len(enc.indefs)-1].typ
+ if parent == cborTypeByteString || parent == cborTypeTextString {
+ return errors.New("cbor: cannot encode indefinite-length " + typ.String() +
+ " as chunk of indefinite-length " + parent.String())
+ }
}
- return err
+
+ // Write indefinite-length head.
+ enc.scratch[0] = byte(typ) | additionalInformationAsIndefiniteLengthFlag
+ _, err := enc.w.Write(enc.scratch[:])
+ if err != nil {
+ return err
+ }
+
+ enc.indefs = append(enc.indefs, indefDataItem{typ: typ})
+ return nil
+}
+
+// validateIndefiniteLengthChunkByType rejects chunks based solely on their Go type.
+func validateIndefiniteLengthChunkByType(indefiniteLengthCborType cborType, v any) error {
+ if indefiniteLengthCborType != cborTypeByteString &&
+ indefiniteLengthCborType != cborTypeTextString {
+ return nil
+ }
+ if v == nil {
+ return errors.New("cbor: cannot encode nil for indefinite-length " + indefiniteLengthCborType.String())
+ }
+ return nil
+}
+
+// validateIndefiniteLengthChunkByData checks that chunk is a definite-length
+// CBOR data item with a matching major type.
+// No-op for indefinite-length array/map, where any data item is valid.
+func validateIndefiniteLengthChunkByData(indefiniteLengthCborType cborType, chunk []byte, v any) error {
+ if indefiniteLengthCborType != cborTypeByteString &&
+ indefiniteLengthCborType != cborTypeTextString {
+ return nil
+ }
+
+ if len(chunk) == 0 {
+ return errors.New("cbor: cannot encode item type " + reflect.TypeOf(v).Kind().String() +
+ " for indefinite-length " + indefiniteLengthCborType.String())
+ }
+
+ t, ai := parseInitialByte(chunk[0])
+ if t != indefiniteLengthCborType {
+ return errors.New("cbor: cannot encode item type " + reflect.TypeOf(v).Kind().String() +
+ " for indefinite-length " + indefiniteLengthCborType.String())
+ }
+
+ if ai == additionalInformationAsIndefiniteLengthFlag {
+ return errors.New("cbor: cannot encode indefinite-length " + indefiniteLengthCborType.String() +
+ " as chunk of indefinite-length " + indefiniteLengthCborType.String())
+ }
+ return nil
}
// RawMessage is a raw encoded CBOR value.
@@ -262,7 +361,9 @@ type RawMessage []byte
// MarshalCBOR returns m or CBOR nil if m is nil.
func (m RawMessage) MarshalCBOR() ([]byte, error) {
if len(m) == 0 {
- return cborNil, nil
+ b := make([]byte, len(cborNil))
+ copy(b, cborNil)
+ return b, nil
}
return m, nil
}
diff --git a/vendor/github.com/fxamacker/cbor/v2/structfields.go b/vendor/github.com/fxamacker/cbor/v2/structfields.go
index cf0a922cd7c..b2d71f2e9aa 100644
--- a/vendor/github.com/fxamacker/cbor/v2/structfields.go
+++ b/vendor/github.com/fxamacker/cbor/v2/structfields.go
@@ -6,27 +6,43 @@ package cbor
import (
"reflect"
"sort"
+ "strconv"
"strings"
)
+// field holds shared struct field metadata returned by getFields().
type field struct {
- name string
- nameAsInt int64 // used to decoder to match field name with CBOR int
+ name string
+ nameAsInt int64 // used to match field name with CBOR int
+ idx []int
+ typ reflect.Type // used during cache building only
+ keyAsInt bool // used to encode/decode field name as int
+ tagged bool // used to choose dominant field (at the same level tagged fields dominate untagged fields)
+ omitEmpty bool // used to skip empty field
+ omitZero bool // used to skip zero field
+}
+
+type fields []*field
+
+// encodingField extends field with encoding-specific data.
+type encodingField struct {
+ field
cborName []byte
- cborNameByteString []byte // major type 2 name encoding iff cborName has major type 3
- idx []int
- typ reflect.Type
+ cborNameByteString []byte // major type 2 name encoding if cborName has major type 3
ef encodeFunc
ief isEmptyFunc
izf isZeroFunc
- typInfo *typeInfo // used to decoder to reuse type info
- tagged bool // used to choose dominant field (at the same level tagged fields dominate untagged fields)
- omitEmpty bool // used to skip empty field
- omitZero bool // used to skip zero field
- keyAsInt bool // used to encode/decode field name as int
}
-type fields []*field
+type encodingFields []*encodingField
+
+// decodingField extends field with decoding-specific data.
+type decodingField struct {
+ field
+ typInfo *typeInfo // used by decoder to reuse type info
+}
+
+type decodingFields []*decodingField
// indexFieldSorter sorts fields by field idx at each level, breaking ties with idx depth.
type indexFieldSorter struct {
@@ -48,7 +64,7 @@ func (x *indexFieldSorter) Less(i, j int) bool {
return iIdx[k] < jIdx[k]
}
}
- return len(iIdx) <= len(jIdx)
+ return len(iIdx) < len(jIdx)
}
// nameLevelAndTagFieldSorter sorts fields by field name, idx depth, and presence of tag.
@@ -69,6 +85,10 @@ func (x *nameLevelAndTagFieldSorter) Less(i, j int) bool {
if fi.name != fj.name {
return fi.name < fj.name
}
+ // Fields with the same name but different keyAsInt are in separate namespaces.
+ if fi.keyAsInt != fj.keyAsInt {
+ return fi.keyAsInt
+ }
if len(fi.idx) != len(fj.idx) {
return len(fi.idx) < len(fj.idx)
}
@@ -117,22 +137,37 @@ func getFields(t reflect.Type) (flds fields, structOptions string) {
}
}
+ // Normalize keyasint field names to their canonical integer string form.
+ // This ensures that "01", "+1", and "1" are treated as the same key
+ // during deduplication.
+ for _, f := range flds {
+ if f.keyAsInt {
+ nameAsInt, err := strconv.Atoi(f.name)
+ if err != nil {
+ continue // Leave invalid names for callers to report.
+ }
+ f.nameAsInt = int64(nameAsInt)
+ f.name = strconv.Itoa(nameAsInt)
+ }
+ }
+
sort.Sort(&nameLevelAndTagFieldSorter{flds})
// Keep visible fields.
j := 0 // index of next unique field
for i := 0; i < len(flds); {
name := flds[i].name
+ keyAsInt := flds[i].keyAsInt
if i == len(flds)-1 || // last field
- name != flds[i+1].name || // field i has unique field name
+ name != flds[i+1].name || flds[i+1].keyAsInt != keyAsInt || // field i has unique (name, keyAsInt)
len(flds[i].idx) < len(flds[i+1].idx) || // field i is at a less nested level than field i+1
(flds[i].tagged && !flds[i+1].tagged) { // field i is tagged while field i+1 is not
flds[j] = flds[i]
j++
}
- // Skip fields with the same field name.
- for i++; i < len(flds) && name == flds[i].name; i++ { //nolint:revive
+ // Skip fields with the same (name, keyAsInt).
+ for i++; i < len(flds) && name == flds[i].name && keyAsInt == flds[i].keyAsInt; i++ { //nolint:revive
}
}
if j != len(flds) {
diff --git a/vendor/github.com/fxamacker/cbor/v2/tag.go b/vendor/github.com/fxamacker/cbor/v2/tag.go
index bd8b773f54b..ee46e742136 100644
--- a/vendor/github.com/fxamacker/cbor/v2/tag.go
+++ b/vendor/github.com/fxamacker/cbor/v2/tag.go
@@ -155,6 +155,7 @@ type TagSet interface {
Add(opts TagOptions, contentType reflect.Type, num uint64, nestedNum ...uint64) error
// Remove removes given tag content type from TagSet.
+ // Remove is a no-op if contentType is nil.
Remove(contentType reflect.Type)
tagProvider
@@ -245,7 +246,11 @@ func (t *syncTagSet) Add(opts TagOptions, contentType reflect.Type, num uint64,
}
// Remove removes given tag content type from TagSet.
+// Remove is a no-op if contentType is nil.
func (t *syncTagSet) Remove(contentType reflect.Type) {
+ if contentType == nil {
+ return
+ }
for contentType.Kind() == reflect.Pointer {
contentType = contentType.Elem()
}
diff --git a/vendor/github.com/fxamacker/cbor/v2/valid.go b/vendor/github.com/fxamacker/cbor/v2/valid.go
index b40793b95e3..850b95019c5 100644
--- a/vendor/github.com/fxamacker/cbor/v2/valid.go
+++ b/vendor/github.com/fxamacker/cbor/v2/valid.go
@@ -54,7 +54,7 @@ func (e *MaxMapPairsError) Error() string {
return "cbor: exceeded max number of key-value pairs " + strconv.Itoa(e.maxMapPairs) + " for CBOR map"
}
-// IndefiniteLengthError indicates found disallowed indefinite length items.
+// IndefiniteLengthError indicates found disallowed indefinite-length items.
type IndefiniteLengthError struct {
t cborType
}
@@ -113,7 +113,7 @@ func (d *decoder) wellformedInternal(depth int, checkBuiltinTags bool) (int, err
}
return d.wellformedIndefiniteString(t, depth, checkBuiltinTags)
}
- valInt := int(val)
+ valInt := int(val) //nolint:gosec
if valInt < 0 {
// Detect integer overflow
return 0, errors.New("cbor: " + t.String() + " length " + strconv.FormatUint(val, 10) + " is too large, causing integer overflow")
@@ -136,7 +136,7 @@ func (d *decoder) wellformedInternal(depth int, checkBuiltinTags bool) (int, err
return d.wellformedIndefiniteArrayOrMap(t, depth, checkBuiltinTags)
}
- valInt := int(val)
+ valInt := int(val) //nolint:gosec
if valInt < 0 {
// Detect integer overflow
return 0, errors.New("cbor: " + t.String() + " length " + strconv.FormatUint(val, 10) + " is too large, it would cause integer overflow")
@@ -212,7 +212,7 @@ func (d *decoder) wellformedInternal(depth int, checkBuiltinTags bool) (int, err
return depth, nil
}
-// wellformedIndefiniteString checks indefinite length byte/text string's well-formedness and returns max depth and error.
+// wellformedIndefiniteString checks indefinite-length byte/text string's well-formedness and returns max depth and error.
func (d *decoder) wellformedIndefiniteString(t cborType, depth int, checkBuiltinTags bool) (int, error) {
var err error
for {
@@ -223,7 +223,7 @@ func (d *decoder) wellformedIndefiniteString(t cborType, depth int, checkBuiltin
d.off++
break
}
- // Peek ahead to get next type and indefinite length status.
+ // Peek ahead to get next type and indefinite-length status.
nt, ai := parseInitialByte(d.data[d.off])
if t != nt {
return 0, &SyntaxError{"cbor: wrong element type " + nt.String() + " for indefinite-length " + t.String()}
@@ -238,7 +238,7 @@ func (d *decoder) wellformedIndefiniteString(t cborType, depth int, checkBuiltin
return depth, nil
}
-// wellformedIndefiniteArrayOrMap checks indefinite length array/map's well-formedness and returns max depth and error.
+// wellformedIndefiniteArrayOrMap checks indefinite-length array/map's well-formedness and returns max depth and error.
func (d *decoder) wellformedIndefiniteArrayOrMap(t cborType, depth int, checkBuiltinTags bool) (int, error) {
var err error
maxDepth := depth
@@ -326,7 +326,7 @@ func (d *decoder) wellformedHead() (t cborType, ai byte, val uint64, err error)
val = uint64(binary.BigEndian.Uint16(d.data[d.off : d.off+argumentSize]))
d.off += argumentSize
if t == cborTypePrimitives {
- if err := d.acceptableFloat(float64(float16.Frombits(uint16(val)).Float32())); err != nil {
+ if err := d.acceptableFloat(float64(float16.Frombits(uint16(val)).Float32())); err != nil { //nolint:gosec
return 0, 0, 0, err
}
}
@@ -341,7 +341,7 @@ func (d *decoder) wellformedHead() (t cborType, ai byte, val uint64, err error)
val = uint64(binary.BigEndian.Uint32(d.data[d.off : d.off+argumentSize]))
d.off += argumentSize
if t == cborTypePrimitives {
- if err := d.acceptableFloat(float64(math.Float32frombits(uint32(val)))); err != nil {
+ if err := d.acceptableFloat(float64(math.Float32frombits(uint32(val)))); err != nil { //nolint:gosec
return 0, 0, 0, err
}
}
@@ -379,12 +379,12 @@ func (d *decoder) wellformedHead() (t cborType, ai byte, val uint64, err error)
func (d *decoder) acceptableFloat(f float64) error {
switch {
- case d.dm.nanDec == NaNDecodeForbidden && math.IsNaN(f):
+ case d.dm.nan == NaNDecodeForbidden && math.IsNaN(f):
return &UnacceptableDataItemError{
CBORType: cborTypePrimitives.String(),
Message: "floating-point NaN",
}
- case d.dm.infDec == InfDecodeForbidden && math.IsInf(f, 0):
+ case d.dm.inf == InfDecodeForbidden && math.IsInf(f, 0):
return &UnacceptableDataItemError{
CBORType: cborTypePrimitives.String(),
Message: "floating-point infinity",
diff --git a/vendor/github.com/go-openapi/analysis/.gitignore b/vendor/github.com/go-openapi/analysis/.gitignore
index d8f4186fe59..20c4e0fa048 100644
--- a/vendor/github.com/go-openapi/analysis/.gitignore
+++ b/vendor/github.com/go-openapi/analysis/.gitignore
@@ -3,3 +3,5 @@
.idea
.env
.mcp.json
+go.work.sum
+.worktrees
diff --git a/vendor/github.com/go-openapi/analysis/CONTRIBUTORS.md b/vendor/github.com/go-openapi/analysis/CONTRIBUTORS.md
index 2f85f1c0504..d86830a0f3d 100644
--- a/vendor/github.com/go-openapi/analysis/CONTRIBUTORS.md
+++ b/vendor/github.com/go-openapi/analysis/CONTRIBUTORS.md
@@ -4,24 +4,31 @@
| Total Contributors | Total Contributions |
| --- | --- |
-| 15 | 207 |
+| 22 | 267 |
| Username | All Time Contribution Count | All Commits |
| --- | --- | --- |
-| @fredbi | 104 | |
-| @casualjim | 70 | |
+| @fredbi | 127 | |
+| @casualjim | 91 | |
| @keramix | 9 | |
| @youyuanwu | 8 | |
-| @msample | 3 | |
+| @wjase | 7 | |
| @kul-amr | 3 | |
+| @schafle | 3 | |
+| @msample | 3 | |
| @mbohlool | 2 | |
-| @Copilot | 1 | |
-| @danielfbm | 1 | |
-| @gregmarr | 1 | |
-| @guillemj | 1 | |
-| @knweiss | 1 | |
-| @tklauser | 1 | |
-| @cuishuang | 1 | |
+| @zmay2030 | 2 | |
| @ujjwalsh | 1 | |
+| @itengfei | 1 | |
+| @nrnrk | 1 | |
+| @cuishuang | 1 | |
+| @tklauser | 1 | |
+| @Shimizu1111 | 1 | |
+| @thaJeztah | 1 | |
+| @knweiss | 1 | |
+| @guillemj | 1 | |
+| @gregmarr | 1 | |
+| @danielfbm | 1 | |
+| @Copilot | 1 | |
_this file was generated by the [Contributors GitHub Action](https://github.com/github-community-projects/contributors)_
diff --git a/vendor/github.com/go-openapi/analysis/README.md b/vendor/github.com/go-openapi/analysis/README.md
index 82c782fcdd4..e4e3086598e 100644
--- a/vendor/github.com/go-openapi/analysis/README.md
+++ b/vendor/github.com/go-openapi/analysis/README.md
@@ -12,7 +12,7 @@
---
-A foundational library to analyze an OAI specification document for easier reasoning about the content.
+A foundational library to analyze, diff, flatten, merge, and fix OAI specification documents for easier reasoning about the content.
## Announcements
@@ -38,6 +38,7 @@ go get github.com/go-openapi/analysis
* An analyzer providing methods to walk the functional content of a specification
* A spec flattener producing a self-contained document bundle, while preserving `$ref`s
+* A spec differ ("diff") to compare two specs and report structural and compatibility changes
* A spec merger ("mixin") to merge several spec documents into a primary spec
* A spec "fixer" ensuring that response descriptions are non empty
diff --git a/vendor/github.com/go-openapi/analysis/analyzer.go b/vendor/github.com/go-openapi/analysis/analyzer.go
index 1c91b8c5507..c24811aaeb5 100644
--- a/vendor/github.com/go-openapi/analysis/analyzer.go
+++ b/vendor/github.com/go-openapi/analysis/analyzer.go
@@ -145,19 +145,27 @@ type Spec struct {
enums enumAnalysis
allSchemas map[string]SchemaRef
allOfs map[string]SchemaRef
+ mangler mangling.NameMangler
}
// New takes a swagger spec object and returns an analyzed spec document.
// The analyzed document contains a number of indices that make it easier to
// reason about semantics of a swagger specification for use in code generation
// or validation etc.
-func New(doc *spec.Swagger) *Spec {
+func New(doc *spec.Swagger, opts ...Option) *Spec {
+ o := &analyzerOptions{}
+ for _, opt := range opts {
+ opt(o)
+ }
+
a := &Spec{
spec: doc,
references: referenceAnalysis{},
patterns: patternAnalysis{},
enums: enumAnalysis{},
+ mangler: mangling.NewNameMangler(o.manglerOpts...),
}
+
a.reset()
a.initialize()
@@ -288,20 +296,6 @@ func (s *Spec) ProducesFor(operation *spec.Operation) []string {
return s.structMapKeys(prod)
}
-func mapKeyFromParam(param *spec.Parameter) string {
- return fmt.Sprintf("%s#%s", param.In, fieldNameFromParam(param))
-}
-
-func fieldNameFromParam(param *spec.Parameter) string {
- // TODO: this should be x-go-name
- if nm, ok := param.Extensions.GetString("go-name"); ok {
- return nm
- }
- mangler := mangling.NewNameMangler()
-
- return mangler.ToGoName(param.Name)
-}
-
// ErrorOnParamFunc is a callback function to be invoked
// whenever an error is encountered while resolving references
// on parameters.
@@ -651,6 +645,19 @@ func (s *Spec) AllEnums() map[string][]any {
return cloneEnumMap(s.enums.allEnums)
}
+func (s *Spec) mapKeyFromParam(param *spec.Parameter) string {
+ return fmt.Sprintf("%s#%s", param.In, s.fieldNameFromParam(param))
+}
+
+func (s *Spec) fieldNameFromParam(param *spec.Parameter) string {
+ // TODO: this should be x-go-name
+ if nm, ok := param.Extensions.GetString("go-name"); ok {
+ return nm
+ }
+
+ return s.mangler.ToGoName(param.Name)
+}
+
func (s *Spec) structMapKeys(mp map[string]struct{}) []string {
if len(mp) == 0 {
return nil
@@ -668,7 +675,7 @@ func (s *Spec) paramsAsMap(parameters []spec.Parameter, res map[string]spec.Para
for _, param := range parameters {
pr := param
if pr.Ref.String() == "" {
- res[mapKeyFromParam(&pr)] = pr
+ res[s.mapKeyFromParam(&pr)] = pr
continue
}
@@ -699,7 +706,7 @@ func (s *Spec) paramsAsMap(parameters []spec.Parameter, res map[string]spec.Para
}
pr = objAsParam
- res[mapKeyFromParam(&pr)] = pr
+ res[s.mapKeyFromParam(&pr)] = pr
}
}
diff --git a/vendor/github.com/go-openapi/analysis/flatten.go b/vendor/github.com/go-openapi/analysis/flatten.go
index d7ee0064b6f..1e5016664dc 100644
--- a/vendor/github.com/go-openapi/analysis/flatten.go
+++ b/vendor/github.com/go-openapi/analysis/flatten.go
@@ -554,6 +554,7 @@ func updateRefParents(allRefs map[string]spec.Ref, r *newRef) {
}
}
+//nolint:gocognit,gocyclo,cyclop // legacy from a lot of design choices that led to concentrate the complexity just here.
func stripOAIGenForRef(opts *FlattenOpts, k string, r *newRef) (bool, error) {
replacedWithComplex := false
diff --git a/vendor/github.com/go-openapi/analysis/flatten_name.go b/vendor/github.com/go-openapi/analysis/flatten_name.go
index 922cae55c5e..9d732171840 100644
--- a/vendor/github.com/go-openapi/analysis/flatten_name.go
+++ b/vendor/github.com/go-openapi/analysis/flatten_name.go
@@ -273,9 +273,9 @@ func mangler(o *FlattenOpts) func(string) string {
if o.KeepNames {
return func(in string) string { return in }
}
- mangler := mangling.NewNameMangler()
+ m := mangling.NewNameMangler(o.ManglerOpts...)
- return mangler.ToJSONName
+ return m.ToJSONName
}
func nameFromRef(ref spec.Ref, o *FlattenOpts) string {
diff --git a/vendor/github.com/go-openapi/analysis/flatten_options.go b/vendor/github.com/go-openapi/analysis/flatten_options.go
index 23a57ea1aca..0984941fdea 100644
--- a/vendor/github.com/go-openapi/analysis/flatten_options.go
+++ b/vendor/github.com/go-openapi/analysis/flatten_options.go
@@ -7,6 +7,7 @@ import (
"log"
"github.com/go-openapi/spec"
+ "github.com/go-openapi/swag/mangling"
)
// FlattenOpts configuration for flattening a swagger specification.
@@ -24,12 +25,13 @@ type FlattenOpts struct {
BasePath string // The location of the root document for this spec to resolve relative $ref
// Flattening options
- Expand bool // When true, skip flattening the spec and expand it instead (if Minimal is false)
- Minimal bool // When true, do not decompose complex structures such as allOf
- Verbose bool // enable some reporting on possible name conflicts detected
- RemoveUnused bool // When true, remove unused parameters, responses and definitions after expansion/flattening
- ContinueOnError bool // Continue when spec expansion issues are found
- KeepNames bool // Do not attempt to jsonify names from references when flattening
+ Expand bool // When true, skip flattening the spec and expand it instead (if Minimal is false)
+ Minimal bool // When true, do not decompose complex structures such as allOf
+ Verbose bool // enable some reporting on possible name conflicts detected
+ RemoveUnused bool // When true, remove unused parameters, responses and definitions after expansion/flattening
+ ContinueOnError bool // Continue when spec expansion issues are found
+ KeepNames bool // Do not attempt to jsonify names from references when flattening
+ ManglerOpts []mangling.Option // Options for the name mangler used to jsonify names
/* Extra keys */
_ struct{} // require keys
diff --git a/vendor/github.com/go-openapi/analysis/go.work.sum b/vendor/github.com/go-openapi/analysis/go.work.sum
deleted file mode 100644
index 899a68976e7..00000000000
--- a/vendor/github.com/go-openapi/analysis/go.work.sum
+++ /dev/null
@@ -1,47 +0,0 @@
-github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
-github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
-github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
-github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
-github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
-github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
-github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30 h1:BHT1/DKsYDGkUgQ2jmMaozVcdk+sVfz0+1ZJq4zkWgw=
-github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
-github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
-github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
-github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI=
-github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE=
-github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
-go.mongodb.org/mongo-driver v1.17.6 h1:87JUG1wZfWsr6rIz3ZmpH90rL5tea7O3IHuSwHUpsss=
-go.mongodb.org/mongo-driver v1.17.6/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ=
-golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0=
-golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts=
-golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos=
-golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4=
-golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA=
-golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc=
-golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c=
-golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU=
-golang.org/x/mod v0.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8=
-golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w=
-golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=
-golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
-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.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
-golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k=
-golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
-golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo=
-golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
-golang.org/x/telemetry v0.0.0-20260209163413-e7419c687ee4 h1:bTLqdHv7xrGlFbvf5/TXNxy/iUwwdkjhqQTJDjW7aj0=
-golang.org/x/telemetry v0.0.0-20260209163413-e7419c687ee4/go.mod h1:g5NllXBEermZrmR51cJDQxmJUHUOfRAaNyWBM+R+548=
-golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg=
-golang.org/x/term v0.40.0 h1:36e4zGLqU4yhjlmxEaagx2KuYbJq3EwY8K943ZsHcvg=
-golang.org/x/term v0.40.0/go.mod h1:w2P8uVp06p2iyKKuvXIm7N/y0UCRt3UfJTfZ7oOpglM=
-golang.org/x/term v0.41.0 h1:QCgPso/Q3RTJx2Th4bDLqML4W6iJiaXFq2/ftQF13YU=
-golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A=
-golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ=
-golang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc=
-golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg=
-golang.org/x/tools v0.42.0 h1:uNgphsn75Tdz5Ji2q36v/nsFSfR/9BRFvqhGBaJGd5k=
-golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0=
diff --git a/vendor/github.com/go-openapi/analysis/mixin.go b/vendor/github.com/go-openapi/analysis/mixin.go
index a7a9306cb37..ab15644f680 100644
--- a/vendor/github.com/go-openapi/analysis/mixin.go
+++ b/vendor/github.com/go-openapi/analysis/mixin.go
@@ -11,37 +11,66 @@ import (
"github.com/go-openapi/spec"
)
-// Mixin modifies the primary swagger spec by adding the paths and
-// definitions from the mixin specs. Top level parameters and
-// responses from the mixins are also carried over. Operation id
-// collisions are avoided by appending "Mixin" but only if
-// needed.
+// Mixin merges one or more Swagger 2.0 documents into a primary document.
//
-// The following parts of primary are subject to merge, filling empty details
+// # Argument order and precedence
//
-// - Info
+// The first argument is the primary spec, which Mixin modifies in place.
+// Subsequent arguments are mixins, listed in decreasing order of priority.
+// On any collision, the primary always wins; among mixins, the earliest one
+// wins.
+//
+// Example: given a primary spec with host "a.example.com" and a mixin with
+// host "b.example.com", the merged result keeps "a.example.com" (primary
+// wins, the mixin value is dropped). Given a primary without a host and a
+// mixin with host "b.example.com", the merged result uses "b.example.com"
+// (the mixin fills in the empty field on the primary).
+//
+// # What gets merged
+//
+// Top-level scalar fields on the primary are filled from the first mixin
+// that provides them, but only if the primary's value is the zero value:
+//
+// - Info (including the nested Contact and License)
// - BasePath
// - Host
// - ExternalDocs
//
-// Consider calling [FixEmptyResponseDescriptions]() on the modified primary
-// if you read them from storage and they are valid to start with.
+// Map and slice fields are merged entry by entry. This covers:
+//
+// - paths, definitions, parameters, responses
+// - securityDefinitions, security, tags
+// - top-level and Info extensions
+//
+// Duplicate keys (or equal security requirements, or equal tag names) are
+// skipped with a warning; warnings are returned as a slice and intended to
+// be inspected by the caller (e.g. compared to an expected collision count
+// in build scripts).
+//
+// Schemes, consumes and produces are merged as the union of distinct
+// values. Duplicates there are silently dropped, no warning is emitted.
+//
+// Operation id collisions are auto-resolved by appending "Mixin" to the
+// mixin operation id (N is the mixin index), so the merged spec keeps
+// unique operation ids.
+//
+// # Notes and limitations
//
-// Entries in "paths", "definitions", "parameters" and "responses" are
-// added to the primary in the order of the given mixins. If the entry
-// already exists in primary it is skipped with a warning message.
+// Consider calling [FixEmptyResponseDescriptions] on the modified primary
+// if you read responses from storage and they are valid to start with.
//
-// The count of skipped entries (from collisions) is returned so any
-// deviation from the number expected can flag a warning in your build
-// scripts. Carefully review the collisions before accepting them;
-// consider renaming things if possible.
+// No key normalization takes place. Ensure paths, type names, etc. are
+// canonical if your downstream tools rely on normalized forms.
//
-// No key normalization takes place (paths, type defs,
-// etc). Ensure they are canonical if your downstream tools do
-// key normalization of any form.
+// YAML anchors (& / *) are resolved by the YAML parser before Mixin sees
+// the document, so they are not preserved in the merged output, and they
+// cannot be shared across input files. Use $ref for cross-file reuse. See
+// https://goswagger.io/go-swagger/faq/faq_swagger/#does-swagger-mixin-preserve-yaml-anchors
//
-// Merging schemes ([http], https), and consumers/producers do not account for
-// collisions.
+// The order of paths and definitions in the merged output is alphabetical:
+// the underlying spec model stores them as Go maps, which serialize with
+// sorted keys. Source-file order is not preserved. See
+// https://goswagger.io/go-swagger/faq/faq_swagger/#can-i-control-the-path-or-operation-order-in-swagger-mixin-output
func Mixin(primary *spec.Swagger, mixins ...*spec.Swagger) []string {
skipped := make([]string, 0, len(mixins))
opIDs := getOpIDs(primary)
diff --git a/vendor/github.com/go-openapi/analysis/options.go b/vendor/github.com/go-openapi/analysis/options.go
new file mode 100644
index 00000000000..b46cd2ca693
--- /dev/null
+++ b/vendor/github.com/go-openapi/analysis/options.go
@@ -0,0 +1,21 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package analysis
+
+import "github.com/go-openapi/swag/mangling"
+
+// Option configures the behavior of a new [Spec] analyzer.
+type Option func(*analyzerOptions)
+
+type analyzerOptions struct {
+ manglerOpts []mangling.Option
+}
+
+// WithManglerOptions sets the name mangler options used when building
+// Go identifiers from specification names (e.g. parameter names).
+func WithManglerOptions(opts ...mangling.Option) Option {
+ return func(o *analyzerOptions) {
+ o.manglerOpts = append(o.manglerOpts, opts...)
+ }
+}
diff --git a/vendor/github.com/go-openapi/errors/.gitignore b/vendor/github.com/go-openapi/errors/.gitignore
index 9364443a6f0..96c4149a0b1 100644
--- a/vendor/github.com/go-openapi/errors/.gitignore
+++ b/vendor/github.com/go-openapi/errors/.gitignore
@@ -3,5 +3,4 @@
.idea
.env
.mcp.json
-.claude/
settings.local.json
diff --git a/vendor/github.com/go-openapi/errors/CONTRIBUTORS.md b/vendor/github.com/go-openapi/errors/CONTRIBUTORS.md
index d49e377a135..68b716b5688 100644
--- a/vendor/github.com/go-openapi/errors/CONTRIBUTORS.md
+++ b/vendor/github.com/go-openapi/errors/CONTRIBUTORS.md
@@ -4,12 +4,12 @@
| Total Contributors | Total Contributions |
| --- | --- |
-| 13 | 110 |
+| 13 | 115 |
| Username | All Time Contribution Count | All Commits |
| --- | --- | --- |
| @casualjim | 58 | |
-| @fredbi | 36 | |
+| @fredbi | 41 | |
| @youyuanwu | 5 | |
| @alexandear | 2 | |
| @fiorix | 1 | |
@@ -22,4 +22,4 @@
| @aokumasan | 1 | |
| @ujjwalsh | 1 | |
- _this file was generated by the [Contributors GitHub Action](https://github.com/github/contributors)_
+ _this file was generated by the [Contributors GitHub Action](https://github.com/github-community-projects/contributors)_
diff --git a/vendor/github.com/go-openapi/errors/README.md b/vendor/github.com/go-openapi/errors/README.md
index d9f4a3f1514..35e6b69ba82 100644
--- a/vendor/github.com/go-openapi/errors/README.md
+++ b/vendor/github.com/go-openapi/errors/README.md
@@ -106,7 +106,7 @@ Maintainers can cut a new release by either:
[slack-badge]: https://img.shields.io/badge/slack-blue?link=https%3A%2F%2Fgoswagger.slack.com%2Farchives%2FC04R30YM
[slack-url]: https://goswagger.slack.com/archives/C04R30YMU
[discord-badge]: https://img.shields.io/discord/1446918742398341256?logo=discord&label=discord&color=blue
-[discord-url]: https://discord.gg/twZ9BwT3
+[discord-url]: https://discord.gg/FfnFYaC3k5
[license-badge]: http://img.shields.io/badge/license-Apache%20v2-orange.svg
diff --git a/vendor/github.com/go-openapi/jsonpointer/.cliff.toml b/vendor/github.com/go-openapi/jsonpointer/.cliff.toml
deleted file mode 100644
index 702629f5dc3..00000000000
--- a/vendor/github.com/go-openapi/jsonpointer/.cliff.toml
+++ /dev/null
@@ -1,181 +0,0 @@
-# git-cliff ~ configuration file
-# https://git-cliff.org/docs/configuration
-
-[changelog]
-header = """
-"""
-
-footer = """
-
------
-
-**[{{ remote.github.repo }}]({{ self::remote_url() }}) license terms**
-
-[![License][license-badge]][license-url]
-
-[license-badge]: http://img.shields.io/badge/license-Apache%20v2-orange.svg
-[license-url]: {{ self::remote_url() }}/?tab=Apache-2.0-1-ov-file#readme
-
-{%- macro remote_url() -%}
- https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }}
-{%- endmacro -%}
-"""
-
-body = """
-{%- if version %}
-## [{{ version | trim_start_matches(pat="v") }}]({{ self::remote_url() }}/tree/{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }}
-{%- else %}
-## [unreleased]
-{%- endif %}
-{%- if message %}
- {%- raw %}\n{% endraw %}
-{{ message }}
- {%- raw %}\n{% endraw %}
-{%- endif %}
-{%- if version %}
- {%- if previous.version %}
-
-**Full Changelog**: <{{ self::remote_url() }}/compare/{{ previous.version }}...{{ version }}>
- {%- endif %}
-{%- else %}
- {%- raw %}\n{% endraw %}
-{%- endif %}
-
-{%- if statistics %}{% if statistics.commit_count %}
- {%- raw %}\n{% endraw %}
-{{ statistics.commit_count }} commits in this release.
- {%- raw %}\n{% endraw %}
-{%- endif %}{% endif %}
------
-
-{%- for group, commits in commits | group_by(attribute="group") %}
- {%- raw %}\n{% endraw %}
-### {{ group | upper_first }}
- {%- raw %}\n{% endraw %}
- {%- for commit in commits %}
- {%- if commit.remote.pr_title %}
- {%- set commit_message = commit.remote.pr_title %}
- {%- else %}
- {%- set commit_message = commit.message %}
- {%- endif %}
-* {{ commit_message | split(pat="\n") | first | trim }}
- {%- if commit.remote.username %}
-{%- raw %} {% endraw %}by [@{{ commit.remote.username }}](https://github.com/{{ commit.remote.username }})
- {%- endif %}
- {%- if commit.remote.pr_number %}
-{%- raw %} {% endraw %}in [#{{ commit.remote.pr_number }}]({{ self::remote_url() }}/pull/{{ commit.remote.pr_number }})
- {%- endif %}
-{%- raw %} {% endraw %}[...]({{ self::remote_url() }}/commit/{{ commit.id }})
- {%- endfor %}
-{%- endfor %}
-
-{%- if github %}
-{%- raw %}\n{% endraw -%}
- {%- set all_contributors = github.contributors | length %}
- {%- if github.contributors | filter(attribute="username", value="dependabot[bot]") | length < all_contributors %}
------
-
-### People who contributed to this release
- {% endif %}
- {%- for contributor in github.contributors | filter(attribute="username") | sort(attribute="username") %}
- {%- if contributor.username != "dependabot[bot]" and contributor.username != "github-actions[bot]" %}
-* [@{{ contributor.username }}](https://github.com/{{ contributor.username }})
- {%- endif %}
- {%- endfor %}
-
- {% if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %}
------
- {%- raw %}\n{% endraw %}
-
-### New Contributors
- {%- endif %}
-
- {%- for contributor in github.contributors | filter(attribute="is_first_time", value=true) %}
- {%- if contributor.username != "dependabot[bot]" and contributor.username != "github-actions[bot]" %}
-* @{{ contributor.username }} made their first contribution
- {%- if contributor.pr_number %}
- in [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \
- {%- endif %}
- {%- endif %}
- {%- endfor %}
-{%- endif %}
-
-{%- raw %}\n{% endraw %}
-
-{%- macro remote_url() -%}
- https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }}
-{%- endmacro -%}
-"""
-# Remove leading and trailing whitespaces from the changelog's body.
-trim = true
-# Render body even when there are no releases to process.
-render_always = true
-# An array of regex based postprocessors to modify the changelog.
-postprocessors = [
- # Replace the placeholder with a URL.
- #{ pattern = '', replace = "https://github.com/orhun/git-cliff" },
-]
-# output file path
-# output = "test.md"
-
-[git]
-# Parse commits according to the conventional commits specification.
-# See https://www.conventionalcommits.org
-conventional_commits = false
-# Exclude commits that do not match the conventional commits specification.
-filter_unconventional = false
-# Require all commits to be conventional.
-# Takes precedence over filter_unconventional.
-require_conventional = false
-# Split commits on newlines, treating each line as an individual commit.
-split_commits = false
-# An array of regex based parsers to modify commit messages prior to further processing.
-commit_preprocessors = [
- # Replace issue numbers with link templates to be updated in `changelog.postprocessors`.
- #{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](/issues/${2}))"},
- # Check spelling of the commit message using https://github.com/crate-ci/typos.
- # If the spelling is incorrect, it will be fixed automatically.
- #{ pattern = '.*', replace_command = 'typos --write-changes -' }
-]
-# Prevent commits that are breaking from being excluded by commit parsers.
-protect_breaking_commits = false
-# An array of regex based parsers for extracting data from the commit message.
-# Assigns commits to groups.
-# Optionally sets the commit's scope and can decide to exclude commits from further processing.
-commit_parsers = [
- { message = "^[Cc]hore\\([Rr]elease\\): prepare for", skip = true },
- { message = "(^[Mm]erge)|([Mm]erge conflict)", skip = true },
- { field = "author.name", pattern = "dependabot*", group = "Updates" },
- { message = "([Ss]ecurity)|([Vv]uln)", group = "Security" },
- { body = "(.*[Ss]ecurity)|([Vv]uln)", group = "Security" },
- { message = "([Cc]hore\\(lint\\))|(style)|(lint)|(codeql)|(golangci)", group = "Code quality" },
- { message = "(^[Dd]oc)|((?i)readme)|(badge)|(typo)|(documentation)", group = "Documentation" },
- { message = "(^[Ff]eat)|(^[Ee]nhancement)", group = "Implemented enhancements" },
- { message = "(^ci)|(\\(ci\\))|(fixup\\s+ci)|(fix\\s+ci)|(license)|(example)", group = "Miscellaneous tasks" },
- { message = "^test", group = "Testing" },
- { message = "(^fix)|(panic)", group = "Fixed bugs" },
- { message = "(^refact)|(rework)", group = "Refactor" },
- { message = "(^[Pp]erf)|(performance)", group = "Performance" },
- { message = "(^[Cc]hore)", group = "Miscellaneous tasks" },
- { message = "^[Rr]evert", group = "Reverted changes" },
- { message = "(upgrade.*?go)|(go\\s+version)", group = "Updates" },
- { message = ".*", group = "Other" },
-]
-# Exclude commits that are not matched by any commit parser.
-filter_commits = false
-# An array of link parsers for extracting external references, and turning them into URLs, using regex.
-link_parsers = []
-# Include only the tags that belong to the current branch.
-use_branch_tags = false
-# Order releases topologically instead of chronologically.
-topo_order = false
-# Order releases topologically instead of chronologically.
-topo_order_commits = true
-# Order of commits in each group/release within the changelog.
-# Allowed values: newest, oldest
-sort_commits = "newest"
-# Process submodules commits
-recurse_submodules = false
-
-#[remote.github]
-#owner = "go-openapi"
diff --git a/vendor/github.com/go-openapi/jsonpointer/.gitignore b/vendor/github.com/go-openapi/jsonpointer/.gitignore
index 885dc27ab0b..d8f4186fe59 100644
--- a/vendor/github.com/go-openapi/jsonpointer/.gitignore
+++ b/vendor/github.com/go-openapi/jsonpointer/.gitignore
@@ -3,4 +3,3 @@
.idea
.env
.mcp.json
-.claude/
diff --git a/vendor/github.com/go-openapi/jsonpointer/CONTRIBUTORS.md b/vendor/github.com/go-openapi/jsonpointer/CONTRIBUTORS.md
index 2ebebedc150..9990f4a3542 100644
--- a/vendor/github.com/go-openapi/jsonpointer/CONTRIBUTORS.md
+++ b/vendor/github.com/go-openapi/jsonpointer/CONTRIBUTORS.md
@@ -4,11 +4,11 @@
| Total Contributors | Total Contributions |
| --- | --- |
-| 12 | 101 |
+| 13 | 111 |
| Username | All Time Contribution Count | All Commits |
| --- | --- | --- |
-| @fredbi | 54 | |
+| @fredbi | 63 | |
| @casualjim | 33 | |
| @magodo | 3 | |
| @youyuanwu | 3 | |
@@ -18,7 +18,8 @@
| @ianlancetaylor | 1 | |
| @mfleader | 1 | |
| @Neo2308 | 1 | |
+| @alexandear | 1 | |
| @olivierlemasle | 1 | |
| @testwill | 1 | |
- _this file was generated by the [Contributors GitHub Action](https://github.com/github/contributors)_
+ _this file was generated by the [Contributors GitHub Action](https://github.com/github-community-projects/contributors)_
diff --git a/vendor/github.com/go-openapi/jsonpointer/NOTICE b/vendor/github.com/go-openapi/jsonpointer/NOTICE
index f3b51939a95..201908d2f08 100644
--- a/vendor/github.com/go-openapi/jsonpointer/NOTICE
+++ b/vendor/github.com/go-openapi/jsonpointer/NOTICE
@@ -18,7 +18,7 @@ It ships with copies of other software which license terms are recalled below.
The original software was authored on 25-02-2013 by sigu-399 (https://github.com/sigu-399, sigu.399@gmail.com).
-github.com/sigh-399/jsonpointer
+github.com/sigu-399/jsonpointer
===========================
// SPDX-FileCopyrightText: Copyright 2013 sigu-399 ( https://github.com/sigu-399 )
diff --git a/vendor/github.com/go-openapi/jsonpointer/README.md b/vendor/github.com/go-openapi/jsonpointer/README.md
index c52803e2e8f..24fbe1bf680 100644
--- a/vendor/github.com/go-openapi/jsonpointer/README.md
+++ b/vendor/github.com/go-openapi/jsonpointer/README.md
@@ -16,17 +16,25 @@ An implementation of JSON Pointer for golang, which supports go `struct`.
## Announcements
-* **2025-12-19** : new community chat on discord
- * a new discord community channel is available to be notified of changes and support users
- * our venerable Slack channel remains open, and will be eventually discontinued on **2026-03-31**
-
-You may join the discord community by clicking the invite link on the discord badge (also above). [![Discord Channel][discord-badge]][discord-url]
-
-Or join our Slack channel: [![Slack Channel][slack-logo]![slack-badge]][slack-url]
+* **2026-04-15** : added support for trailing "-" for arrays (v0.23.0)
+ * this brings full support of [RFC6901][RFC6901]
+ * this is supported for types relying on the reflection-based implemented
+ * API semantics remain essentially unaltered. Exception: `Pointer.Set(document any,value any) (document any, err error)`
+ can only perform a best-effort to mutate the input document in place. In the case of adding elements to an array with a
+ trailing "-", either pass a mutable array (`*[]T`) as the input document, or use the returned updated document instead.
+ * types that implement the `JSONSetable` interface may not implement the mutation implied by the trailing "-"
+
+* **2026-04-15** : added support for optional alternate JSON name providers
+ * for struct support the defaults might not suit all situations: there are known limitations
+ when it comes to handle untagged fields or embedded types.
+ * the default name provider in use is not fully aligned with go JSON stdlib
+ * exposed an option (or global setting) to change the provider that resolves a struct into json keys
+ * the default behavior is not altered
+ * a new alternate name provider is added (imported from `go-openapi/swag/jsonname`), aligned with JSON stdlib behavior
## Status
-API is stable.
+API is stable and feature-complete.
## Import this library in your project
@@ -88,7 +96,7 @@ See
-also known as [RFC6901](https://www.rfc-editor.org/rfc/rfc6901)
+also known as [RFC6901][RFC6901].
## Licensing
@@ -99,19 +107,19 @@ on top of which it has been built.
## Limitations
-The 4.Evaluation part of the previous reference, starting with 'If the currently referenced value is a JSON array,
-the reference token MUST contain either...' is not implemented.
-
-That is because our implementation of the JSON pointer only supports explicit references to array elements:
-the provision in the spec to resolve non-existent members as "the last element in the array",
-using the special trailing character "-" is not implemented.
+* [RFC6901][RFC6901] is now fully supported, including trailing "-" semantics for arrays (for `Set` operations).
+* Default behavior: JSON name detection in go `struct`s
+ - Unlike go standard marshaling, untagged fields do not default to the go field name and are ignored.
+ - anonymous fields are not traversed if untagged
+ - the above limitations may be overcome by calling `UseGoNameProvider()` at initialization time.
+ - alternatively, users may inject the desired custom behavior for naming fields as an option.
## Other documentation
* [All-time contributors](./CONTRIBUTORS.md)
-* [Contributing guidelines](.github/CONTRIBUTING.md)
-* [Maintainers documentation](docs/MAINTAINERS.md)
-* [Code style](docs/STYLE.md)
+* [Contributing guidelines][contributing-doc-site]
+* [Maintainers documentation][maintainers-doc-site]
+* [Code style][style-doc-site]
## Cutting a new release
@@ -142,11 +150,8 @@ Maintainers can cut a new release by either:
[godoc-badge]: https://pkg.go.dev/badge/github.com/go-openapi/jsonpointer
[godoc-url]: http://pkg.go.dev/github.com/go-openapi/jsonpointer
-[slack-logo]: https://a.slack-edge.com/e6a93c1/img/icons/favicon-32.png
-[slack-badge]: https://img.shields.io/badge/slack-blue?link=https%3A%2F%2Fgoswagger.slack.com%2Farchives%2FC04R30YM
-[slack-url]: https://goswagger.slack.com/archives/C04R30YMU
[discord-badge]: https://img.shields.io/discord/1446918742398341256?logo=discord&label=discord&color=blue
-[discord-url]: https://discord.gg/twZ9BwT3
+[discord-url]: https://discord.gg/FfnFYaC3k5
[license-badge]: http://img.shields.io/badge/license-Apache%20v2-orange.svg
@@ -156,3 +161,8 @@ Maintainers can cut a new release by either:
[goversion-url]: https://github.com/go-openapi/jsonpointer/blob/master/go.mod
[top-badge]: https://img.shields.io/github/languages/top/go-openapi/jsonpointer
[commits-badge]: https://img.shields.io/github/commits-since/go-openapi/jsonpointer/latest
+[RFC6901]: https://www.rfc-editor.org/rfc/rfc6901
+
+[contributing-doc-site]: https://go-openapi.github.io/doc-site/contributing/contributing/index.html
+[maintainers-doc-site]: https://go-openapi.github.io/doc-site/maintainers/index.html
+[style-doc-site]: https://go-openapi.github.io/doc-site/contributing/style/index.html
diff --git a/vendor/github.com/go-openapi/jsonpointer/errors.go b/vendor/github.com/go-openapi/jsonpointer/errors.go
index 8c50dde8bcf..8813474d447 100644
--- a/vendor/github.com/go-openapi/jsonpointer/errors.go
+++ b/vendor/github.com/go-openapi/jsonpointer/errors.go
@@ -16,12 +16,24 @@ const (
ErrPointer pointerError = "JSON pointer error"
// ErrInvalidStart states that a JSON pointer must start with a separator ("/").
- ErrInvalidStart pointerError = `JSON pointer must be empty or start with a "` + pointerSeparator
+ ErrInvalidStart pointerError = `JSON pointer must be empty or start with a "` + pointerSeparator + `"`
// ErrUnsupportedValueType indicates that a value of the wrong type is being set.
ErrUnsupportedValueType pointerError = "only structs, pointers, maps and slices are supported for setting values"
+
+ // ErrDashToken indicates use of the RFC 6901 "-" reference token
+ // in a context where it cannot be resolved.
+ //
+ // Per RFC 6901 §4 the "-" token refers to the (nonexistent) element
+ // after the last array element. It may only be used as the terminal
+ // token of a [Pointer.Set] against a slice, where it means "append".
+ // Any other use (get, offset, intermediate traversal, non-slice target)
+ // is an error condition that wraps this sentinel.
+ ErrDashToken pointerError = `the "-" array token cannot be resolved here` //nolint:gosec // G101 false positive: this is a JSON Pointer reference token, not a credential.
)
+const dashToken = "-"
+
func errNoKey(key string) error {
return fmt.Errorf("object has no key %q: %w", key, ErrPointer)
}
@@ -33,3 +45,15 @@ func errOutOfBounds(length, idx int) error {
func errInvalidReference(token string) error {
return fmt.Errorf("invalid token reference %q: %w", token, ErrPointer)
}
+
+func errDashOnGet() error {
+ return fmt.Errorf("cannot resolve %q token on get: %w: %w", dashToken, ErrDashToken, ErrPointer)
+}
+
+func errDashIntermediate() error {
+ return fmt.Errorf("the %q token may only appear as the terminal token of a pointer: %w: %w", dashToken, ErrDashToken, ErrPointer)
+}
+
+func errDashOnOffset() error {
+ return fmt.Errorf("cannot compute offset for %q token (nonexistent element): %w: %w", dashToken, ErrDashToken, ErrPointer)
+}
diff --git a/vendor/github.com/go-openapi/jsonpointer/ifaces.go b/vendor/github.com/go-openapi/jsonpointer/ifaces.go
new file mode 100644
index 00000000000..1e56ac0442d
--- /dev/null
+++ b/vendor/github.com/go-openapi/jsonpointer/ifaces.go
@@ -0,0 +1,47 @@
+// SPDX-FileCopyrightText: Copyright (c) 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package jsonpointer
+
+import "reflect"
+
+// JSONPointable is an interface for structs to implement,
+// when they need to customize the json pointer process or want to avoid the use of reflection.
+type JSONPointable interface {
+ // JSONLookup returns a value pointed at this (unescaped) key.
+ JSONLookup(key string) (any, error)
+}
+
+// JSONSetable is an interface for structs to implement,
+// when they need to customize the json pointer process or want to avoid the use of reflection.
+//
+// # Handling of the RFC 6901 "-" token
+//
+// When a type implementing JSONSetable is the terminal parent of a [Pointer.Set]
+// call, the library passes the raw reference token to JSONSet without
+// interpretation. In particular, the RFC 6901 "-" token (which conventionally
+// means "append" for arrays, per RFC 6902) is forwarded verbatim as the key
+// argument. Implementations that model an array-like container are expected
+// to give "-" the append semantics; implementations that do not should return
+// an error wrapping [ErrDashToken] (or [ErrPointer]) for clarity.
+//
+// Implementations are responsible for any in-place mutation: the library does
+// not attempt to rebind the result of JSONSet into a parent container.
+type JSONSetable interface {
+ // JSONSet sets the value pointed at the (unescaped) key.
+ //
+ // The key may be the RFC 6901 "-" token when the pointer targets a
+ // slice-like member; see the interface documentation for details.
+ JSONSet(key string, value any) error
+}
+
+// NameProvider knows how to resolve go struct fields into json names.
+//
+// The default provider is brought by [github.com/go-openapi/swag/jsonname.DefaultJSONNameProvider].
+type NameProvider interface {
+ // GetGoName gets the go name for a json property name
+ GetGoName(subject any, name string) (string, bool)
+
+ // GetGoNameForType gets the go name for a given type for a json property name
+ GetGoNameForType(tpe reflect.Type, name string) (string, bool)
+}
diff --git a/vendor/github.com/go-openapi/jsonpointer/options.go b/vendor/github.com/go-openapi/jsonpointer/options.go
new file mode 100644
index 00000000000..d52caab2224
--- /dev/null
+++ b/vendor/github.com/go-openapi/jsonpointer/options.go
@@ -0,0 +1,86 @@
+// SPDX-FileCopyrightText: Copyright (c) 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package jsonpointer
+
+import (
+ "sync"
+
+ "github.com/go-openapi/swag/jsonname"
+)
+
+// Option to tune the behavior of a JSON [Pointer].
+type Option func(*options)
+
+var (
+ //nolint:gochecknoglobals // package level defaults are provided as a convenient, backward-compatible way to adopt options.
+ defaultOptions = options{
+ provider: jsonname.DefaultJSONNameProvider,
+ }
+ //nolint:gochecknoglobals // guards defaultOptions against concurrent SetDefaultNameProvider / read races (testing)
+ defaultOptionsMu sync.RWMutex
+)
+
+// SetDefaultNameProvider sets the [NameProvider] as a package-level default.
+//
+// By default, the default provider is [jsonname.DefaultJSONNameProvider].
+//
+// It is safe to call concurrently with [Pointer.Get], [Pointer.Set],
+// [GetForToken] and [SetForToken]. The typical usage is to call it once
+// at initialization time.
+//
+// A nil provider is ignored.
+func SetDefaultNameProvider(provider NameProvider) {
+ if provider == nil {
+ return
+ }
+
+ defaultOptionsMu.Lock()
+ defer defaultOptionsMu.Unlock()
+
+ defaultOptions.provider = provider
+}
+
+// UseGoNameProvider sets the [NameProvider] as a package-level default
+// to the alternative provider [jsonname.GoNameProvider], that covers a few areas
+// not supported by the default name provider.
+//
+// This implementation supports untagged exported fields and embedded types in go struct.
+// It follows strictly the behavior of the JSON standard library regarding field naming conventions.
+//
+// It is safe to call concurrently with [Pointer.Get], [Pointer.Set],
+// [GetForToken] and [SetForToken]. The typical usage is to call it once
+// at initialization time.
+func UseGoNameProvider() {
+ SetDefaultNameProvider(jsonname.NewGoNameProvider())
+}
+
+// DefaultNameProvider returns the current package-level [NameProvider].
+func DefaultNameProvider() NameProvider { //nolint:ireturn // returning the interface is the point — callers pick their own implementation.
+ defaultOptionsMu.RLock()
+ defer defaultOptionsMu.RUnlock()
+
+ return defaultOptions.provider
+}
+
+// WithNameProvider injects a custom [NameProvider] to resolve json names from go struct types.
+func WithNameProvider(provider NameProvider) Option {
+ return func(o *options) {
+ o.provider = provider
+ }
+}
+
+type options struct {
+ provider NameProvider
+}
+
+func optionsWithDefaults(opts []Option) options {
+ var o options
+ o.provider = DefaultNameProvider()
+
+ for _, apply := range opts {
+ apply(&o)
+ }
+
+ return o
+}
diff --git a/vendor/github.com/go-openapi/jsonpointer/pointer.go b/vendor/github.com/go-openapi/jsonpointer/pointer.go
index 7df49af3b96..2369c1827e8 100644
--- a/vendor/github.com/go-openapi/jsonpointer/pointer.go
+++ b/vendor/github.com/go-openapi/jsonpointer/pointer.go
@@ -11,8 +11,6 @@ import (
"reflect"
"strconv"
"strings"
-
- "github.com/go-openapi/swag/jsonname"
)
const (
@@ -20,20 +18,6 @@ const (
pointerSeparator = `/`
)
-// JSONPointable is an interface for structs to implement,
-// when they need to customize the json pointer process or want to avoid the use of reflection.
-type JSONPointable interface {
- // JSONLookup returns a value pointed at this (unescaped) key.
- JSONLookup(key string) (any, error)
-}
-
-// JSONSetable is an interface for structs to implement,
-// when they need to customize the json pointer process or want to avoid the use of reflection.
-type JSONSetable interface {
- // JSONSet sets the value pointed at the (unescaped) key.
- JSONSet(key string, value any) error
-}
-
// Pointer is a representation of a json pointer.
//
// Use [Pointer.Get] to retrieve a value or [Pointer.Set] to set a value.
@@ -41,7 +25,7 @@ type JSONSetable interface {
// It works with any go type interpreted as a JSON document, which means:
//
// - if a type implements [JSONPointable], its [JSONPointable.JSONLookup] method is used to resolve [Pointer.Get]
-// - if a type implements [JSONSetable], its [JSONPointable.JSONSet] method is used to resolve [Pointer.Set]
+// - if a type implements [JSONSetable], its [JSONSetable.JSONSet] method is used to resolve [Pointer.Set]
// - a go map[K]V is interpreted as an object, with type K assignable to a string
// - a go slice []T is interpreted as an array
// - a go struct is interpreted as an object, with exported fields interpreted as keys
@@ -71,16 +55,35 @@ func New(jsonPointerString string) (Pointer, error) {
// Get uses the pointer to retrieve a value from a JSON document.
//
// It returns the value with its type as a [reflect.Kind] or an error.
-func (p *Pointer) Get(document any) (any, reflect.Kind, error) {
- return p.get(document, jsonname.DefaultJSONNameProvider)
+func (p *Pointer) Get(document any, opts ...Option) (any, reflect.Kind, error) {
+ o := optionsWithDefaults(opts)
+
+ return p.get(document, o.provider)
}
// Set uses the pointer to set a value from a data type
// that represent a JSON document.
//
-// It returns the updated document.
-func (p *Pointer) Set(document any, value any) (any, error) {
- return document, p.set(document, value, jsonname.DefaultJSONNameProvider)
+// # Mutation contract
+//
+// Set mutates the provided document in place whenever Go's type system allows
+// it: when document is a map, a pointer, or when the targeted value is reached
+// through an addressable ancestor (e.g. a struct field traversed via a pointer,
+// a slice element). Callers that rely on this in-place behavior may continue
+// to ignore the returned document.
+//
+// The returned document is only load-bearing when Set cannot mutate in place.
+// This happens in one specific case: appending to a top-level slice passed by
+// value (e.g. document of type []T rather than *[]T) via the RFC 6901 "-"
+// terminal token. reflect.Append produces a new slice header that the library
+// cannot rebind into the caller's variable; the updated document is returned
+// instead. Pass *[]T if you want in-place rebind for that case as well.
+//
+// See [ErrDashToken] for the semantics of the "-" token.
+func (p *Pointer) Set(document any, value any, opts ...Option) (any, error) {
+ o := optionsWithDefaults(opts)
+
+ return p.set(document, value, o.provider)
}
// DecodedTokens returns the decoded (unescaped) tokens of this JSON pointer.
@@ -109,6 +112,46 @@ func (p *Pointer) String() string {
return pointerSeparator + strings.Join(p.referenceTokens, pointerSeparator)
}
+// Offset returns the byte offset, in the raw JSON text of document, of the
+// location referenced by this pointer's terminal token.
+//
+// Unlike [Pointer.Get] and [Pointer.Set], which operate on a decoded Go value,
+// Offset operates directly on the textual JSON source. It drives an
+// [encoding/json.Decoder] over the string and stops at the terminal token,
+// returning the position at which the decoder was about to read that token.
+//
+// It is primarily intended for tooling that needs to map a pointer back to a
+// region of the original source: reporting line/column for validation or
+// parse diagnostics, extracting a sub-document by slicing the raw bytes, or
+// highlighting the referenced span in an editor.
+//
+// # Offset semantics
+//
+// The meaning of the returned offset depends on whether the terminal token
+// addresses an object property or an array element:
+//
+// - Object property: the offset points to the first byte of the key (its
+// opening quote character), not to the associated value. For example,
+// pointer "/foo/bar" against {"foo": {"bar": 21}} returns 9, the index of
+// the opening quote of "bar".
+// - Array element: the offset points to the first byte of the value at that
+// index. For example, pointer "/0/1" against [[1,2], [3,4]] returns 4,
+// the index of the digit 2.
+//
+// # Errors
+//
+// Offset returns an error in any of these cases:
+//
+// - document is not syntactically valid JSON;
+// - the structure of document does not match the pointer (e.g. traversing
+// into a scalar, or a token that is neither a valid key nor a valid
+// numeric index);
+// - a referenced key or index does not exist in document;
+// - the pointer's terminal token is the RFC 6901 "-" array token, which
+// designates a nonexistent element and therefore has no offset in the
+// source. The returned error wraps [ErrDashToken].
+//
+// All errors wrap [ErrPointer].
func (p *Pointer) Offset(document string) (int64, error) {
dec := json.NewDecoder(strings.NewReader(document))
var offset int64
@@ -137,7 +180,35 @@ func (p *Pointer) Offset(document string) (int64, error) {
return 0, fmt.Errorf("invalid token %#v: %w", tk, ErrPointer)
}
}
- return offset, nil
+ return skipJSONSeparator(document, offset), nil
+}
+
+// skipJSONSeparator advances offset past trailing JSON whitespace and at most
+// one value separator (comma) in document, so the result points at the first
+// byte of the next JSON token.
+//
+// The streaming decoder's InputOffset sits right after the most recently
+// consumed token, which between values is the comma (or whitespace) — not
+// the following token. Normalizing here keeps Offset's contract uniform:
+// for both object keys and array elements, and regardless of position within
+// the parent container, the returned offset always points at the first byte
+// of the addressed token.
+func skipJSONSeparator(document string, offset int64) int64 {
+ n := int64(len(document))
+ for offset < n && isJSONWhitespace(document[offset]) {
+ offset++
+ }
+ if offset < n && document[offset] == ',' {
+ offset++
+ }
+ for offset < n && isJSONWhitespace(document[offset]) {
+ offset++
+ }
+ return offset
+}
+
+func isJSONWhitespace(c byte) bool {
+ return c == ' ' || c == '\t' || c == '\n' || c == '\r'
}
// "Constructor", parses the given string JSON pointer.
@@ -157,9 +228,9 @@ func (p *Pointer) parse(jsonPointerString string) error {
return nil
}
-func (p *Pointer) get(node any, nameProvider *jsonname.NameProvider) (any, reflect.Kind, error) {
+func (p *Pointer) get(node any, nameProvider NameProvider) (any, reflect.Kind, error) {
if nameProvider == nil {
- nameProvider = jsonname.DefaultJSONNameProvider
+ nameProvider = defaultOptions.provider
}
kind := reflect.Invalid
@@ -185,50 +256,130 @@ func (p *Pointer) get(node any, nameProvider *jsonname.NameProvider) (any, refle
return node, kind, nil
}
-func (p *Pointer) set(node, data any, nameProvider *jsonname.NameProvider) error {
+func (p *Pointer) set(node, data any, nameProvider NameProvider) (any, error) {
knd := reflect.ValueOf(node).Kind()
if knd != reflect.Pointer && knd != reflect.Struct && knd != reflect.Map && knd != reflect.Slice && knd != reflect.Array {
- return errors.Join(
+ return node, errors.Join(
fmt.Errorf("unexpected type: %T", node), //nolint:err113 // err wrapping is carried out by errors.Join, not fmt.Errorf.
ErrUnsupportedValueType,
ErrPointer,
)
}
- l := len(p.referenceTokens)
-
// full document when empty
- if l == 0 {
- return nil
+ if len(p.referenceTokens) == 0 {
+ return node, nil
}
if nameProvider == nil {
- nameProvider = jsonname.DefaultJSONNameProvider
+ nameProvider = defaultOptions.provider
}
- var decodedToken string
- lastIndex := l - 1
+ return p.setAt(node, p.referenceTokens, data, nameProvider)
+}
- if lastIndex > 0 { // skip if we only have one token in pointer
- for _, token := range p.referenceTokens[:lastIndex] {
- decodedToken = Unescape(token)
- next, err := p.resolveNodeForToken(node, decodedToken, nameProvider)
- if err != nil {
- return err
- }
+// setAt recursively walks the token list, setting the data at the terminal
+// token and rebinding any new child reference (e.g. a slice header returned
+// by an "-" append) into its parent on the way back up.
+//
+// Returning the (possibly new) node at each level is what makes append work
+// at any depth without requiring the caller to pass a pointer to the
+// containing slice: the new slice header propagates up and each parent
+// rebinds it via the appropriate kind-specific setter.
+func (p *Pointer) setAt(node any, tokens []string, data any, nameProvider NameProvider) (any, error) {
+ decodedToken := Unescape(tokens[0])
+
+ if len(tokens) == 1 {
+ return setSingleImpl(node, data, decodedToken, nameProvider)
+ }
- node = next
- }
+ child, err := p.resolveNodeForToken(node, decodedToken, nameProvider)
+ if err != nil {
+ return node, err
+ }
+
+ newChild, err := p.setAt(child, tokens[1:], data, nameProvider)
+ if err != nil {
+ return node, err
}
- // last token
- decodedToken = Unescape(p.referenceTokens[lastIndex])
+ return rebindChild(node, decodedToken, newChild, nameProvider)
+}
+
+// rebindChild writes newChild back into node at decodedToken.
+//
+// For cases where the child was already mutated in place (pointer aliasing,
+// addressable slice elements) the rebind is a safe no-op. For cases where
+// the child was returned by value (map entries holding a slice, slices
+// reached through a non-addressable ancestor), the rebind propagates the
+// new value into the parent.
+//
+// Parents implementing [JSONPointable] are left alone: they took ownership
+// of the child via JSONLookup and did not opt into a JSONSet-based rebind
+// on intermediate tokens.
+func rebindChild(node any, decodedToken string, newChild any, nameProvider NameProvider) (any, error) {
+ if _, ok := node.(JSONPointable); ok {
+ return node, nil
+ }
+
+ rValue := reflect.Indirect(reflect.ValueOf(node))
+
+ switch rValue.Kind() {
+ case reflect.Struct:
+ nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
+ if !ok {
+ return node, fmt.Errorf("object has no field %q: %w", decodedToken, ErrPointer)
+ }
+ fld := rValue.FieldByName(nm)
+ if !fld.CanSet() {
+ return node, nil
+ }
+ assignReflectValue(fld, newChild)
+ return node, nil
+
+ case reflect.Map:
+ rValue.SetMapIndex(reflect.ValueOf(decodedToken), reflect.ValueOf(newChild))
+ return node, nil
+
+ case reflect.Slice:
+ if decodedToken == dashToken {
+ return node, errDashIntermediate()
+ }
+ idx, err := strconv.Atoi(decodedToken)
+ if err != nil {
+ return node, errors.Join(err, ErrPointer)
+ }
+ elem := rValue.Index(idx)
+ if !elem.CanSet() {
+ return node, nil
+ }
+ assignReflectValue(elem, newChild)
+ return node, nil
+
+ default:
+ return node, errInvalidReference(decodedToken)
+ }
+}
- return setSingleImpl(node, data, decodedToken, nameProvider)
+// assignReflectValue assigns src into dst, unwrapping a pointer when dst
+// expects the pointee type. This tolerates the pointer-wrapping performed
+// by [typeFromValue] for addressable fields.
+func assignReflectValue(dst reflect.Value, src any) {
+ nv := reflect.ValueOf(src)
+ if !nv.IsValid() {
+ return
+ }
+ if nv.Type().AssignableTo(dst.Type()) {
+ dst.Set(nv)
+ return
+ }
+ if nv.Kind() == reflect.Pointer && nv.Elem().Type().AssignableTo(dst.Type()) {
+ dst.Set(nv.Elem())
+ }
}
-func (p *Pointer) resolveNodeForToken(node any, decodedToken string, nameProvider *jsonname.NameProvider) (next any, err error) {
+func (p *Pointer) resolveNodeForToken(node any, decodedToken string, nameProvider NameProvider) (next any, err error) {
// check for nil during traversal
if isNil(node) {
return nil, fmt.Errorf("cannot traverse through nil value at %q: %w", decodedToken, ErrPointer)
@@ -272,6 +423,9 @@ func (p *Pointer) resolveNodeForToken(node any, decodedToken string, nameProvide
return typeFromValue(mv), nil
case reflect.Slice:
+ if decodedToken == dashToken {
+ return nil, errDashIntermediate()
+ }
tokenIndex, err := strconv.Atoi(decodedToken)
if err != nil {
return nil, errors.Join(err, ErrPointer)
@@ -312,16 +466,23 @@ func typeFromValue(v reflect.Value) any {
}
// GetForToken gets a value for a json pointer token 1 level deep.
-func GetForToken(document any, decodedToken string) (any, reflect.Kind, error) {
- return getSingleImpl(document, decodedToken, jsonname.DefaultJSONNameProvider)
+func GetForToken(document any, decodedToken string, opts ...Option) (any, reflect.Kind, error) {
+ o := optionsWithDefaults(opts)
+
+ return getSingleImpl(document, decodedToken, o.provider)
}
// SetForToken sets a value for a json pointer token 1 level deep.
-func SetForToken(document any, decodedToken string, value any) (any, error) {
- return document, setSingleImpl(document, value, decodedToken, jsonname.DefaultJSONNameProvider)
+//
+// See [Pointer.Set] for the mutation contract, in particular the handling of
+// the RFC 6901 "-" token on slices.
+func SetForToken(document any, decodedToken string, value any, opts ...Option) (any, error) {
+ o := optionsWithDefaults(opts)
+
+ return setSingleImpl(document, value, decodedToken, o.provider)
}
-func getSingleImpl(node any, decodedToken string, nameProvider *jsonname.NameProvider) (any, reflect.Kind, error) {
+func getSingleImpl(node any, decodedToken string, nameProvider NameProvider) (any, reflect.Kind, error) {
rValue := reflect.Indirect(reflect.ValueOf(node))
kind := rValue.Kind()
if isNil(node) {
@@ -361,6 +522,9 @@ func getSingleImpl(node any, decodedToken string, nameProvider *jsonname.NamePro
return nil, kind, errNoKey(decodedToken)
case reflect.Slice:
+ if decodedToken == dashToken {
+ return nil, kind, errDashOnGet()
+ }
tokenIndex, err := strconv.Atoi(decodedToken)
if err != nil {
return nil, kind, errors.Join(err, ErrPointer)
@@ -378,14 +542,14 @@ func getSingleImpl(node any, decodedToken string, nameProvider *jsonname.NamePro
}
}
-func setSingleImpl(node, data any, decodedToken string, nameProvider *jsonname.NameProvider) error {
+func setSingleImpl(node, data any, decodedToken string, nameProvider NameProvider) (any, error) {
// check for nil to prevent panic when calling rValue.Type()
if isNil(node) {
- return fmt.Errorf("cannot set field %q on nil value: %w", decodedToken, ErrPointer)
+ return node, fmt.Errorf("cannot set field %q on nil value: %w", decodedToken, ErrPointer)
}
if ns, ok := node.(JSONSetable); ok {
- return ns.JSONSet(decodedToken, data)
+ return node, ns.JSONSet(decodedToken, data)
}
rValue := reflect.Indirect(reflect.ValueOf(node))
@@ -394,12 +558,12 @@ func setSingleImpl(node, data any, decodedToken string, nameProvider *jsonname.N
case reflect.Struct:
nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
if !ok {
- return fmt.Errorf("object has no field %q: %w", decodedToken, ErrPointer)
+ return node, fmt.Errorf("object has no field %q: %w", decodedToken, ErrPointer)
}
fld := rValue.FieldByName(nm)
if !fld.CanSet() {
- return fmt.Errorf("can't set struct field %s to %v: %w", nm, data, ErrPointer)
+ return node, fmt.Errorf("can't set struct field %s to %v: %w", nm, data, ErrPointer)
}
value := reflect.ValueOf(data)
@@ -407,33 +571,51 @@ func setSingleImpl(node, data any, decodedToken string, nameProvider *jsonname.N
assignedType := fld.Type()
if !valueType.AssignableTo(assignedType) {
- return fmt.Errorf("can't set value with type %T to field %s with type %v: %w", data, nm, assignedType, ErrPointer)
+ return node, fmt.Errorf("can't set value with type %T to field %s with type %v: %w", data, nm, assignedType, ErrPointer)
}
fld.Set(value)
- return nil
+ return node, nil
case reflect.Map:
kv := reflect.ValueOf(decodedToken)
rValue.SetMapIndex(kv, reflect.ValueOf(data))
- return nil
+ return node, nil
case reflect.Slice:
+ if decodedToken == dashToken {
+ // RFC 6901 §4 / RFC 6902 append semantics: terminal "-" appends
+ // the value to the slice. We rebind in place when the slice is
+ // reachable via an addressable ancestor; otherwise we return the
+ // new slice header for the parent (or the public Set) to rebind.
+ value := reflect.ValueOf(data)
+ elemType := rValue.Type().Elem()
+ if !value.Type().AssignableTo(elemType) {
+ return node, fmt.Errorf("can't append value of type %T to slice of %v: %w", data, elemType, ErrPointer)
+ }
+ newSlice := reflect.Append(rValue, value)
+ if rValue.CanSet() {
+ rValue.Set(newSlice)
+ return node, nil
+ }
+ return newSlice.Interface(), nil
+ }
+
tokenIndex, err := strconv.Atoi(decodedToken)
if err != nil {
- return errors.Join(err, ErrPointer)
+ return node, errors.Join(err, ErrPointer)
}
sLength := rValue.Len()
if tokenIndex < 0 || tokenIndex >= sLength {
- return errOutOfBounds(sLength, tokenIndex)
+ return node, errOutOfBounds(sLength, tokenIndex)
}
elem := rValue.Index(tokenIndex)
if !elem.CanSet() {
- return fmt.Errorf("can't set slice index %s to %v: %w", decodedToken, data, ErrPointer)
+ return node, fmt.Errorf("can't set slice index %s to %v: %w", decodedToken, data, ErrPointer)
}
value := reflect.ValueOf(data)
@@ -441,15 +623,15 @@ func setSingleImpl(node, data any, decodedToken string, nameProvider *jsonname.N
assignedType := elem.Type()
if !valueType.AssignableTo(assignedType) {
- return fmt.Errorf("can't set value with type %T to slice element %d with type %v: %w", data, tokenIndex, assignedType, ErrPointer)
+ return node, fmt.Errorf("can't set value with type %T to slice element %d with type %v: %w", data, tokenIndex, assignedType, ErrPointer)
}
elem.Set(value)
- return nil
+ return node, nil
default:
- return errInvalidReference(decodedToken)
+ return node, errInvalidReference(decodedToken)
}
}
@@ -460,24 +642,27 @@ func offsetSingleObject(dec *json.Decoder, decodedToken string) (int64, error) {
if err != nil {
return 0, err
}
- switch tk := tk.(type) {
- case json.Delim:
- switch tk {
- case '{':
- if err = drainSingle(dec); err != nil {
- return 0, err
- }
- case '[':
+ key, ok := tk.(string)
+ if !ok {
+ return 0, fmt.Errorf("invalid key token %#v: %w", tk, ErrPointer)
+ }
+ if key == decodedToken {
+ return offset, nil
+ }
+
+ // Consume the associated value. Scalars are fully read by a single
+ // Token() call; composite values must be drained.
+ tk, err = dec.Token()
+ if err != nil {
+ return 0, err
+ }
+ if delim, isDelim := tk.(json.Delim); isDelim {
+ switch delim {
+ case '{', '[':
if err = drainSingle(dec); err != nil {
return 0, err
}
}
- case string:
- if tk == decodedToken {
- return offset, nil
- }
- default:
- return 0, fmt.Errorf("invalid token %#v: %w", tk, ErrPointer)
}
}
@@ -485,6 +670,9 @@ func offsetSingleObject(dec *json.Decoder, decodedToken string) (int64, error) {
}
func offsetSingleArray(dec *json.Decoder, decodedToken string) (int64, error) {
+ if decodedToken == dashToken {
+ return 0, errDashOnOffset()
+ }
idx, err := strconv.Atoi(decodedToken)
if err != nil {
return 0, fmt.Errorf("token reference %q is not a number: %w: %w", decodedToken, err, ErrPointer)
diff --git a/vendor/github.com/go-openapi/jsonreference/.gitignore b/vendor/github.com/go-openapi/jsonreference/.gitignore
index 885dc27ab0b..d8f4186fe59 100644
--- a/vendor/github.com/go-openapi/jsonreference/.gitignore
+++ b/vendor/github.com/go-openapi/jsonreference/.gitignore
@@ -3,4 +3,3 @@
.idea
.env
.mcp.json
-.claude/
diff --git a/vendor/github.com/go-openapi/jsonreference/CONTRIBUTORS.md b/vendor/github.com/go-openapi/jsonreference/CONTRIBUTORS.md
index 7faeb83a77d..3cfbca6a6a3 100644
--- a/vendor/github.com/go-openapi/jsonreference/CONTRIBUTORS.md
+++ b/vendor/github.com/go-openapi/jsonreference/CONTRIBUTORS.md
@@ -4,18 +4,18 @@
| Total Contributors | Total Contributions |
| --- | --- |
-| 9 | 73 |
+| 9 | 79 |
| Username | All Time Contribution Count | All Commits |
| --- | --- | --- |
-| @fredbi | 36 | https://github.com/go-openapi/jsonreference/commits?author=fredbi |
-| @casualjim | 25 | https://github.com/go-openapi/jsonreference/commits?author=casualjim |
-| @youyuanwu | 5 | https://github.com/go-openapi/jsonreference/commits?author=youyuanwu |
-| @olivierlemasle | 2 | https://github.com/go-openapi/jsonreference/commits?author=olivierlemasle |
-| @apelisse | 1 | https://github.com/go-openapi/jsonreference/commits?author=apelisse |
-| @gbjk | 1 | https://github.com/go-openapi/jsonreference/commits?author=gbjk |
-| @honza | 1 | https://github.com/go-openapi/jsonreference/commits?author=honza |
-| @Neo2308 | 1 | https://github.com/go-openapi/jsonreference/commits?author=Neo2308 |
-| @erraggy | 1 | https://github.com/go-openapi/jsonreference/commits?author=erraggy |
+| @fredbi | 42 | |
+| @casualjim | 25 | |
+| @youyuanwu | 5 | |
+| @olivierlemasle | 2 | |
+| @apelisse | 1 | |
+| @gbjk | 1 | |
+| @honza | 1 | |
+| @Neo2308 | 1 | |
+| @erraggy | 1 | |
- _this file was generated by the [Contributors GitHub Action](https://github.com/github/contributors)_
+ _this file was generated by the [Contributors GitHub Action](https://github.com/github-community-projects/contributors)_
diff --git a/vendor/github.com/go-openapi/jsonreference/README.md b/vendor/github.com/go-openapi/jsonreference/README.md
index adea1606197..43d05b05069 100644
--- a/vendor/github.com/go-openapi/jsonreference/README.md
+++ b/vendor/github.com/go-openapi/jsonreference/README.md
@@ -14,15 +14,9 @@
An implementation of JSON Reference for golang.
+
## Status
@@ -74,9 +68,9 @@ on top of which it has been built.
## Other documentation
* [All-time contributors](./CONTRIBUTORS.md)
-* [Contributing guidelines](.github/CONTRIBUTING.md)
-* [Maintainers documentation](docs/MAINTAINERS.md)
-* [Code style](docs/STYLE.md)
+* [Contributing guidelines][contributing-doc-site]
+* [Maintainers documentation][maintainers-doc-site]
+* [Code style][style-doc-site]
## Cutting a new release
@@ -115,7 +109,7 @@ Maintainers can cut a new release by either:
[slack-badge]: https://img.shields.io/badge/slack-blue?link=https%3A%2F%2Fgoswagger.slack.com%2Farchives%2FC04R30YM
[slack-url]: https://goswagger.slack.com/archives/C04R30YMU
[discord-badge]: https://img.shields.io/discord/1446918742398341256?logo=discord&label=discord&color=blue
-[discord-url]: https://discord.gg/twZ9BwT3
+[discord-url]: https://discord.gg/FfnFYaC3k5
[license-badge]: http://img.shields.io/badge/license-Apache%20v2-orange.svg
@@ -125,3 +119,7 @@ Maintainers can cut a new release by either:
[goversion-url]: https://github.com/go-openapi/jsonreference/blob/master/go.mod
[top-badge]: https://img.shields.io/github/languages/top/go-openapi/jsonreference
[commits-badge]: https://img.shields.io/github/commits-since/go-openapi/jsonreference/latest
+
+[contributing-doc-site]: https://go-openapi.github.io/doc-site/contributing/contributing/index.html
+[maintainers-doc-site]: https://go-openapi.github.io/doc-site/maintainers/index.html
+[style-doc-site]: https://go-openapi.github.io/doc-site/contributing/style/index.html
diff --git a/vendor/github.com/go-openapi/loads/.gitignore b/vendor/github.com/go-openapi/loads/.gitignore
index d8f4186fe59..fbb78de2c34 100644
--- a/vendor/github.com/go-openapi/loads/.gitignore
+++ b/vendor/github.com/go-openapi/loads/.gitignore
@@ -3,3 +3,4 @@
.idea
.env
.mcp.json
+.worktrees
diff --git a/vendor/github.com/go-openapi/loads/.golangci.yml b/vendor/github.com/go-openapi/loads/.golangci.yml
index 83968f3faeb..272b14e545d 100644
--- a/vendor/github.com/go-openapi/loads/.golangci.yml
+++ b/vendor/github.com/go-openapi/loads/.golangci.yml
@@ -7,6 +7,8 @@ linters:
- gochecknoglobals # on this repo, it is hard to refactor without globals/inits and no breaking change
- gochecknoinits
- godox
+ - gomodguard
+ - gomodguard_v2
- exhaustruct
- nlreturn
- nonamedreturns
diff --git a/vendor/github.com/go-openapi/loads/CONTRIBUTORS.md b/vendor/github.com/go-openapi/loads/CONTRIBUTORS.md
index 36b836a3d5a..6ab26b8dd76 100644
--- a/vendor/github.com/go-openapi/loads/CONTRIBUTORS.md
+++ b/vendor/github.com/go-openapi/loads/CONTRIBUTORS.md
@@ -4,12 +4,12 @@
| Total Contributors | Total Contributions |
| --- | --- |
-| 14 | 123 |
+| 14 | 133 |
| Username | All Time Contribution Count | All Commits |
| --- | --- | --- |
+| @fredbi | 55 | |
| @casualjim | 48 | |
-| @fredbi | 45 | |
| @youyuanwu | 6 | |
| @vburenin | 4 | |
| @keramix | 4 | |
@@ -23,4 +23,4 @@
| @kreativka | 1 | |
| @petrkotas | 1 | |
- _this file was generated by the [Contributors GitHub Action](https://github.com/github/contributors)_
+ _this file was generated by the [Contributors GitHub Action](https://github.com/github-community-projects/contributors)_
diff --git a/vendor/github.com/go-openapi/loads/README.md b/vendor/github.com/go-openapi/loads/README.md
index d92e62a040d..293f79bb6a0 100644
--- a/vendor/github.com/go-openapi/loads/README.md
+++ b/vendor/github.com/go-openapi/loads/README.md
@@ -20,12 +20,9 @@ Supports JSON and YAML documents.
* **2025-12-19** : new community chat on discord
* a new discord community channel is available to be notified of changes and support users
- * our venerable Slack channel remains open, and will be eventually discontinued on **2026-03-31**
You may join the discord community by clicking the invite link on the discord badge (also above). [![Discord Channel][discord-badge]][discord-url]
-Or join our Slack channel: [![Slack Channel][slack-logo]![slack-badge]][slack-url]
-
## Status
API is stable.
@@ -58,6 +55,41 @@ go get github.com/go-openapi/loads
See also the provided [examples](https://pkg.go.dev/github.com/go-openapi/loads#pkg-examples).
+## Security
+
+This library does not enforce a security policy of its own: it reads whatever the configured
+loader is allowed to read.
+
+This is deliberate — like `go-openapi/swag/loading`, it is a base utility,
+and sanitizing or containing untrusted input is the caller's responsibility,
+just as sanitizing a file name before passing it to `os.ReadFile` is not that function's job.
+
+When a spec — its path or its `$ref` contents — may come from an untrusted source, confine
+loading explicitly (e.g. `loading.WithRoot` for local files and a restricted
+`loading.WithHTTPClient` for remote URLs, passed via `loads.WithLoadingOptions`).
+
+For the common case, the pre-baked `loads.SpecRestricted` / `loads.JSONSpecRestricted` loaders
+bundle a trusted root with a network-restricted client (`loads.RestrictedHTTPClient`) and apply
+the confinement to `$ref` resolution as well:
+
+```go
+doc, err := loads.SpecRestricted(path, trustedRoot)
+```
+
+To harden the package-level default in one call — so even callers that rely on the global
+loader (including cross-package `$ref` resolution via `spec.PathLoader`) are confined, with no
+unconfined fallback left — use `loads.SetRestrictedLoaders` at startup:
+
+```go
+loads.SetRestrictedLoaders(trustedRoot)
+```
+
+Note that `loads.AddLoader` only *prepends* to the default chain, leaving the unconfined loader
+reachable; use `loads.SetLoaders` / `loads.SetRestrictedLoaders` to replace it.
+
+See the [Security section of the package documentation][security-doc] for the threat model and
+runnable examples. For the project's vulnerability reporting policy, see [SECURITY.md](./SECURITY.md).
+
## Change log
See
@@ -69,9 +101,9 @@ This library ships under the [SPDX-License-Identifier: Apache-2.0](./LICENSE).
## Other documentation
* [All-time contributors](./CONTRIBUTORS.md)
-* [Contributing guidelines](.github/CONTRIBUTING.md)
-* [Maintainers documentation](docs/MAINTAINERS.md)
-* [Code style](docs/STYLE.md)
+* [Contributing guidelines][contributing-doc-site]
+* [Maintainers documentation][maintainers-doc-site]
+* [Code style][style-doc-site]
## Cutting a new release
@@ -102,11 +134,8 @@ Maintainers can cut a new release by either:
[godoc-badge]: https://pkg.go.dev/badge/github.com/go-openapi/loads
[godoc-url]: http://pkg.go.dev/github.com/go-openapi/loads
-[slack-logo]: https://a.slack-edge.com/e6a93c1/img/icons/favicon-32.png
-[slack-badge]: https://img.shields.io/badge/slack-blue?link=https%3A%2F%2Fgoswagger.slack.com%2Farchives%2FC04R30YM
-[slack-url]: https://goswagger.slack.com/archives/C04R30YMU
[discord-badge]: https://img.shields.io/discord/1446918742398341256?logo=discord&label=discord&color=blue
-[discord-url]: https://discord.gg/twZ9BwT3
+[discord-url]: https://discord.gg/FfnFYaC3k5
[license-badge]: http://img.shields.io/badge/license-Apache%20v2-orange.svg
@@ -116,3 +145,9 @@ Maintainers can cut a new release by either:
[goversion-url]: https://github.com/go-openapi/loads/blob/master/go.mod
[top-badge]: https://img.shields.io/github/languages/top/go-openapi/loads
[commits-badge]: https://img.shields.io/github/commits-since/go-openapi/loads/latest
+
+[security-doc]: https://pkg.go.dev/github.com/go-openapi/loads#hdr-Security
+
+[contributing-doc-site]: https://go-openapi.github.io/doc-site/contributing/contributing/index.html
+[maintainers-doc-site]: https://go-openapi.github.io/doc-site/maintainers/index.html
+[style-doc-site]: https://go-openapi.github.io/doc-site/contributing/style/index.html
diff --git a/vendor/github.com/go-openapi/loads/doc.go b/vendor/github.com/go-openapi/loads/doc.go
index 67a5e2f8d95..0fafe4f4683 100644
--- a/vendor/github.com/go-openapi/loads/doc.go
+++ b/vendor/github.com/go-openapi/loads/doc.go
@@ -6,4 +6,72 @@
// It is used by other go-openapi packages to load and run analysis on local or remote spec documents.
//
// Loaders support JSON and YAML documents.
+//
+// # Security
+//
+// This package does not enforce a security policy of its own: like the underlying
+// [github.com/go-openapi/swag/loading] utilities, it reads whatever the configured loader is
+// allowed to read.
+//
+// When a spec — its path or its contents — may derive from untrusted input, the caller must confine loading explicitly.
+//
+// This is a deliberate design choice.
+// Both this package and the [github.com/go-openapi/swag/loading] utilities are base building blocks:
+// deciding which sources are legitimate, and containing access to them,
+// requires application context that a general-purpose loader does not have.
+//
+// Just as sanitizing a file name before handing it to [os.ReadFile] is the caller's
+// responsibility and not that function's, sanitizing and containing the path and references
+// resolved here is the responsibility of the code that may feed them untrusted input.
+//
+// There are two distinct attack surfaces:
+//
+// - The path passed to [Spec], [JSONSpec], or [Embedded]. By default a local path is read
+// with no confinement, so a caller-controlled path (including an absolute path or a
+// "file:///etc/passwd" URI) may read any file the process can access. A remote path is
+// fetched with [net/http.DefaultClient], which follows redirects and performs no
+// destination filtering, so a caller-controlled URL may reach internal services or cloud
+// metadata endpoints (server-side request forgery).
+//
+// - The contents of the spec, when references are resolved. [Document.Expanded] follows the
+// "$ref" pointers found inside the document by calling the same loader recursively. A spec
+// obtained even from a trusted path can therefore drive arbitrary local reads
+// ("$ref": "file:///etc/passwd") or SSRF ("$ref": "http://169.254.169.254/...") through
+// its own contents. This amplification is specific to reference resolution and does not
+// exist in the raw loading utilities.
+//
+// Mitigation. Pass [github.com/go-openapi/swag/loading] options through [WithLoadingOptions];
+// they are attached to the document's loader and so apply both to the initial load and to
+// every "$ref" resolved during expansion:
+//
+// - [github.com/go-openapi/swag/loading.WithRoot] confines local reads to a trusted
+// directory, rejecting absolute paths, ".." traversal, and symlinks that escape it. Prefer
+// it over a [github.com/go-openapi/swag/loading.WithFS] built from [os.DirFS], which does
+// not block symlink escapes.
+//
+// - [github.com/go-openapi/swag/loading.WithHTTPClient] allows to supply a restricted HTTP client.
+// Enforce the network policy at dial time (a [net.Dialer] Control hook), so it also covers
+// redirects and DNS rebinding, which a URL-string allowlist cannot. See the example on
+// [Spec].
+//
+// Pre-baked loaders. When the opinionated defaults fit, [SpecRestricted], [JSONSpecRestricted]
+// and [JSONDocRestricted] bundle a trusted root with a network-restricted client
+// ([RestrictedHTTPClient]), and apply the confinement to "$ref" resolution as well — so the
+// common case needs no manual wiring. To harden the global default in one call (so even callers
+// that rely on the package-level loader are confined), use [SetRestrictedLoaders]. Reach for the
+// options above when you need a custom policy; [IsForbiddenAddress] exposes the default network
+// policy so you can reuse it as the base of your own HTTP client.
+//
+// Caveats:
+//
+// - The package-level default loader (also installed as [github.com/go-openapi/spec.PathLoader])
+// carries no loading options and is therefore unconfined. It is used as a fallback when
+// expansion runs without a document loader, and by other go-openapi packages that resolve
+// references on their own. [AddLoader] does not fix this — it only prepends, leaving the
+// unconfined fallback reachable. Either build a confined loader per call, or replace the
+// global default outright with [SetLoaders] / [SetRestrictedLoaders].
+//
+// - A custom loader installed via [WithDocLoader] or [AddLoader] only honors these
+// protections if its loading function actually applies the [github.com/go-openapi/swag/loading]
+// options it is given.
package loads
diff --git a/vendor/github.com/go-openapi/loads/errors.go b/vendor/github.com/go-openapi/loads/errors.go
index 14a8186b6ca..e94f038f947 100644
--- a/vendor/github.com/go-openapi/loads/errors.go
+++ b/vendor/github.com/go-openapi/loads/errors.go
@@ -15,4 +15,8 @@ const (
// ErrNoLoader indicates that no configured loader matched the input.
ErrNoLoader loaderError = "no loader matched"
+
+ // ErrForbiddenAddress is returned by [RestrictedHTTPClient] when a connection is attempted
+ // to a non-public address (loopback, private, link-local, or unspecified).
+ ErrForbiddenAddress loaderError = "blocked dial to a non-public address"
)
diff --git a/vendor/github.com/go-openapi/loads/loaders.go b/vendor/github.com/go-openapi/loads/loaders.go
index ac8adfe8b20..f8a2a9438de 100644
--- a/vendor/github.com/go-openapi/loads/loaders.go
+++ b/vendor/github.com/go-openapi/loads/loaders.go
@@ -21,6 +21,15 @@ import (
var loaders *loader
func init() {
+ loaders = defaultLoaders()
+
+ // sets the global default loader for go-openapi/spec
+ spec.PathLoader = loaders.Load
+}
+
+// defaultLoaders builds the built-in loader chain: a YAML matcher first, with a JSON loader as
+// the catch-all fallback.
+func defaultLoaders() *loader {
jsonLoader := &loader{
DocLoaderWithMatch: DocLoaderWithMatch{
Match: func(_ string) bool {
@@ -30,15 +39,35 @@ func init() {
},
}
- loaders = jsonLoader.WithHead(&loader{
+ return jsonLoader.WithHead(&loader{
DocLoaderWithMatch: DocLoaderWithMatch{
Match: loading.YAMLMatcher,
Fn: loading.YAMLDoc,
},
})
+}
- // sets the global default loader for go-openapi/spec
- spec.PathLoader = loaders.Load
+// buildLoaderChain links a list of [DocLoaderWithMatch] into a loader chain, preserving order.
+// Entries with a nil Fn are skipped. Returns nil when no usable loader is provided.
+func buildLoaderChain(ldrs ...DocLoaderWithMatch) *loader {
+ var final, prev *loader
+ for _, ldr := range ldrs {
+ if ldr.Fn == nil {
+ continue
+ }
+
+ node := &loader{DocLoaderWithMatch: ldr}
+ if prev == nil {
+ final = node
+ prev = node
+
+ continue
+ }
+
+ prev = prev.WithNext(node)
+ }
+
+ return final
}
// DocLoader represents a doc loader type.
@@ -141,6 +170,17 @@ func JSONDoc(path string, opts ...loading.Option) (json.RawMessage, error) {
//
// This function updates the default loader used by [github.com/go-openapi/spec].
// Since this sets package level globals, you shouldn't call this concurrently.
+//
+// # Security
+//
+// AddLoader only *prepends* to the default chain: the previous loaders — including the
+// unconfined JSON fallback — remain reachable, both here and via cross-package "$ref"
+// resolution. It is therefore the wrong tool for hardening the global default. To replace the
+// chain entirely (leaving no unconfined fallback) use [SetLoaders], or [SetRestrictedLoaders]
+// for a one-call confined setup. For a single load, prefer a confined per-call loader via
+// [WithLoadingOptions] or [WithDocLoaderMatches]. A custom loader registered here only honors
+// the protections if its loading function applies the [github.com/go-openapi/swag/loading]
+// options it is given. See the package documentation on Security.
func AddLoader(predicate DocMatcher, load DocLoader) {
loaders = loaders.WithHead(&loader{
DocLoaderWithMatch: DocLoaderWithMatch{
@@ -152,3 +192,36 @@ func AddLoader(predicate DocMatcher, load DocLoader) {
// sets the global default loader for go-openapi/spec
spec.PathLoader = loaders.Load
}
+
+// SetLoaders replaces the package-level default loader chain with the given loaders, tried in
+// order, and re-points [github.com/go-openapi/spec.PathLoader] at it.
+//
+// Unlike [AddLoader], nothing of the previous default survives — so when the replacement is
+// confined, no unconfined fallback remains for any caller relying on the global default
+// (including cross-package "$ref" resolution). An entry with a nil Match is a catch-all; you
+// are responsible for providing a suitable fallback. Calling SetLoaders with no usable loader
+// restores the built-in default (a YAML matcher with a JSON fallback).
+//
+// # Concurrency
+//
+// This sets package-level globals and the [github.com/go-openapi/spec] global loader. It is
+// not safe to call concurrently with other loads or with [AddLoader]; configure it once at
+// startup, before serving.
+//
+// # Security
+//
+// This is the way to harden the global default in one place. For a ready-made confined setup,
+// see [SetRestrictedLoaders]. As with [AddLoader], a custom loader only honors the protections
+// if its loading function applies the [github.com/go-openapi/swag/loading] options it is given.
+// See the package documentation on Security.
+func SetLoaders(ldrs ...DocLoaderWithMatch) {
+ chain := buildLoaderChain(ldrs...)
+ if chain == nil {
+ chain = defaultLoaders()
+ }
+
+ loaders = chain
+
+ // sets the global default loader for go-openapi/spec
+ spec.PathLoader = loaders.Load
+}
diff --git a/vendor/github.com/go-openapi/loads/options.go b/vendor/github.com/go-openapi/loads/options.go
index 045ece5e095..fec20520b4d 100644
--- a/vendor/github.com/go-openapi/loads/options.go
+++ b/vendor/github.com/go-openapi/loads/options.go
@@ -51,25 +51,16 @@ func WithDocLoader(l DocLoader) LoaderOption {
// Loaders are executed in the order of provided [DocLoaderWithMatch] 'es.
func WithDocLoaderMatches(l ...DocLoaderWithMatch) LoaderOption {
return func(opt *options) {
- var final, prev *loader
- for _, ldr := range l {
- if ldr.Fn == nil {
- continue
- }
-
- if prev == nil {
- final = &loader{DocLoaderWithMatch: ldr}
- prev = final
- continue
- }
-
- prev = prev.WithNext(&loader{DocLoaderWithMatch: ldr})
- }
- opt.loader = final
+ opt.loader = buildLoaderChain(l...)
}
}
// WithLoadingOptions adds some [loading.Option] to be added when calling a registered loader.
+//
+// The options are attached to the document's loader, so they apply both to the initial load
+// and to every "$ref" resolved during [Document.Expanded]. This is the recommended place to
+// confine loading of untrusted input, for example with [loading.WithRoot] (local) and
+// [loading.WithHTTPClient] (remote). See the package documentation on Security.
func WithLoadingOptions(loadingOptions ...loading.Option) LoaderOption {
return func(opt *options) {
opt.loadingOptions = loadingOptions
diff --git a/vendor/github.com/go-openapi/loads/restricted.go b/vendor/github.com/go-openapi/loads/restricted.go
new file mode 100644
index 00000000000..022a9a8572a
--- /dev/null
+++ b/vendor/github.com/go-openapi/loads/restricted.go
@@ -0,0 +1,185 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package loads
+
+import (
+ "encoding/json"
+ "net"
+ "net/http"
+ "net/netip"
+ "syscall"
+ "time"
+
+ "github.com/go-openapi/swag/loading"
+)
+
+const (
+ // numConfinementOptions is the count of loading options appended to enforce confinement
+ // (WithRoot + WithHTTPClient), used to size the bundled option slice.
+ numConfinementOptions = 2
+
+ defaultTLSHandshakeTimeout = 10 * time.Second
+)
+
+// RestrictedHTTPClient returns an [http.Client] that refuses, at dial time, to connect to
+// loopback, private, link-local (including cloud-metadata endpoints such as 169.254.169.254),
+// or unspecified addresses. A blocked connection fails with an error wrapping
+// [ErrForbiddenAddress].
+//
+// The check runs in the dialer Control hook, after DNS resolution and before connect, so it
+// also covers HTTP redirects and DNS rebinding — which a URL-string allowlist cannot. The
+// client does not honor proxy environment variables, so the guard always inspects the real
+// destination rather than a proxy address.
+//
+// This is the network half of the restricted loaders ([JSONDocRestricted],
+// [JSONSpecRestricted], [SpecRestricted]). It may also be used directly with
+// [github.com/go-openapi/swag/loading.WithHTTPClient].
+//
+// The policy is opinionated and deliberately simple. For a different one (a custom allow/deny
+// list, an explicit proxy, mutual TLS, ...), build your own client and pass it with
+// [github.com/go-openapi/swag/loading.WithHTTPClient]. To keep the default address policy as a
+// base, reuse [IsForbiddenAddress] in your own dialer Control hook — see the package examples
+// for the pattern.
+func RestrictedHTTPClient() *http.Client {
+ control := func(_, address string, _ syscall.RawConn) error {
+ host, _, err := net.SplitHostPort(address)
+ if err != nil {
+ return err
+ }
+ addr, err := netip.ParseAddr(host)
+ if err != nil {
+ return err
+ }
+ if IsForbiddenAddress(addr) {
+ return ErrForbiddenAddress
+ }
+
+ return nil
+ }
+
+ return &http.Client{
+ Transport: &http.Transport{
+ Proxy: nil, // dial the real destination so the guard inspects it
+ DialContext: (&net.Dialer{Control: control}).DialContext,
+ ForceAttemptHTTP2: true,
+ TLSHandshakeTimeout: defaultTLSHandshakeTimeout,
+ },
+ }
+}
+
+// IsForbiddenAddress reports whether addr is one that [RestrictedHTTPClient] refuses to dial:
+// a loopback, private, link-local (including cloud-metadata endpoints such as 169.254.169.254),
+// or unspecified address. IPv4-mapped IPv6 addresses are unmapped before the check.
+//
+// It is exported so callers can reuse or extend the default policy when building their own
+// dialer Control hook, for example to also reject a CGNAT range or to carve out a single
+// trusted internal host:
+//
+// control := func(_, address string, _ syscall.RawConn) error {
+// host, _, err := net.SplitHostPort(address)
+// if err != nil {
+// return err
+// }
+// addr, err := netip.ParseAddr(host)
+// if err != nil {
+// return err
+// }
+// if loads.IsForbiddenAddress(addr) && host != allowedInternalHost {
+// return loads.ErrForbiddenAddress
+// }
+// return nil
+// }
+func IsForbiddenAddress(addr netip.Addr) bool {
+ a := addr.Unmap()
+
+ return a.IsLoopback() || a.IsPrivate() || a.IsLinkLocalUnicast() || a.IsUnspecified()
+}
+
+// restrictedLoadingOptions bundles caller-supplied options with the confinement options,
+// appended last so that local rooting and the restricted client always take precedence
+// (the loading options are last-wins).
+func restrictedLoadingOptions(root string, extra []loading.Option) []loading.Option {
+ out := make([]loading.Option, 0, len(extra)+numConfinementOptions)
+ out = append(out, extra...)
+ out = append(out, loading.WithRoot(root), loading.WithHTTPClient(RestrictedHTTPClient()))
+
+ return out
+}
+
+// JSONDocRestricted returns a JSON [DocLoader] that confines local reads to root (via
+// [github.com/go-openapi/swag/loading.WithRoot]) and restricts remote fetches with
+// [RestrictedHTTPClient].
+//
+// The returned loader may be registered with [WithDocLoader] or [AddLoader]. The confinement
+// always takes precedence over any option passed here or at call time, so a caller cannot
+// loosen it through [WithLoadingOptions].
+//
+// Like [JSONDoc], it loads JSON only: it does not convert YAML. For specs whose references may
+// point at YAML documents, prefer [SpecRestricted], which keeps the default JSON/YAML chain.
+func JSONDocRestricted(root string, opts ...loading.Option) DocLoader {
+ // one restricted client, reused for every path and $ref
+ return restrictedDocLoader(JSONDoc, restrictedLoadingOptions(root, opts))
+}
+
+// restrictedDocLoader wraps a [DocLoader] so that the confinement options in base are always
+// applied, appended after any call-time options so they take precedence (loading options are
+// last-wins).
+func restrictedDocLoader(fn DocLoader, base []loading.Option) DocLoader {
+ return func(path string, callOpts ...loading.Option) (json.RawMessage, error) {
+ if len(callOpts) == 0 {
+ return fn(path, base...)
+ }
+
+ all := make([]loading.Option, 0, len(callOpts)+len(base))
+ all = append(all, callOpts...)
+ all = append(all, base...) // confinement (tail of base) still wins
+
+ return fn(path, all...)
+ }
+}
+
+// JSONSpecRestricted loads a JSON spec like [JSONSpec], but confines local reads to root and
+// restricts remote fetches with [RestrictedHTTPClient].
+//
+// The confinement is attached to the document's loader, so it also applies to every "$ref"
+// resolved by [Document.Expanded]. Extra [github.com/go-openapi/swag/loading] options (custom
+// headers, basic auth, timeout, ...) may be supplied; the confinement always wins over them.
+func JSONSpecRestricted(path, root string, opts ...loading.Option) (*Document, error) {
+ return JSONSpec(path, WithLoadingOptions(restrictedLoadingOptions(root, opts)...))
+}
+
+// SpecRestricted loads a spec like [Spec] — with JSON/YAML auto-detection — but confines local
+// reads to root and restricts remote fetches with [RestrictedHTTPClient].
+//
+// The confinement is attached to the document's loader, so it also applies to every "$ref"
+// resolved by [Document.Expanded]. Extra [github.com/go-openapi/swag/loading] options (custom
+// headers, basic auth, timeout, ...) may be supplied; the confinement always wins over them.
+func SpecRestricted(path, root string, opts ...loading.Option) (*Document, error) {
+ return Spec(path, WithLoadingOptions(restrictedLoadingOptions(root, opts)...))
+}
+
+// SetRestrictedLoaders hardens the package-level default in a single call: it installs a
+// confined JSON/YAML loader chain — local reads rooted at root, remote fetches through
+// [RestrictedHTTPClient] — as the global default and as
+// [github.com/go-openapi/spec.PathLoader].
+//
+// After this call, every load that relies on the package default ([Spec], [JSONSpec], and any
+// cross-package "$ref" resolution) is confined, with no unconfined fallback left behind. It is
+// the global counterpart of [SpecRestricted]; a single restricted client is shared across the
+// chain. Extra [github.com/go-openapi/swag/loading] options may be supplied; the confinement
+// always wins over them.
+//
+// # Concurrency
+//
+// Like [SetLoaders], this mutates package-level and [github.com/go-openapi/spec] globals and is
+// not safe to call concurrently. Configure it once at startup, before serving. To revert, call
+// [SetLoaders] with no arguments.
+func SetRestrictedLoaders(root string, opts ...loading.Option) {
+ base := restrictedLoadingOptions(root, opts) // one restricted client shared by the whole chain
+
+ SetLoaders(
+ NewDocLoaderWithMatch(restrictedDocLoader(loading.YAMLDoc, base), loading.YAMLMatcher),
+ NewDocLoaderWithMatch(restrictedDocLoader(JSONDoc, base), nil), // nil matcher: JSON catch-all fallback
+ )
+}
diff --git a/vendor/github.com/go-openapi/loads/spec.go b/vendor/github.com/go-openapi/loads/spec.go
index 606a01d8e9f..40eaff2c73b 100644
--- a/vendor/github.com/go-openapi/loads/spec.go
+++ b/vendor/github.com/go-openapi/loads/spec.go
@@ -77,6 +77,14 @@ func Embedded(orig, flat json.RawMessage, opts ...LoaderOption) (*Document, erro
// Spec loads a new spec document from a local or remote path.
//
// By default it uses a JSON or YAML loader, with auto-detection based on the resource extension.
+//
+// Security: by default the path is read with no confinement (local) and fetched with
+// [net/http.DefaultClient] (remote), and any "$ref" later resolved by [Document.Expanded] is
+// loaded the same way. When the path or the spec contents may derive from untrusted input,
+// confine loading with [WithLoadingOptions] (for example
+// [github.com/go-openapi/swag/loading.WithRoot] and
+// [github.com/go-openapi/swag/loading.WithHTTPClient]). See the package documentation on
+// Security.
func Spec(path string, opts ...LoaderOption) (*Document, error) {
ldr := loaderFromOptions(opts)
@@ -157,6 +165,14 @@ func trimData(in json.RawMessage) (json.RawMessage, error) {
}
// Expanded expands the $ref fields in the spec [Document] and returns a new expanded [Document].
+//
+// Security: expansion resolves every "$ref" by calling the document's loader recursively, so
+// the spec contents drive further loads. A spec from an untrusted source can thus trigger
+// arbitrary local reads or SSRF through its references. The loader carries the
+// [github.com/go-openapi/swag/loading] options supplied via [WithLoadingOptions] at load time;
+// configure confinement there so it applies to expansion as well. When no document loader is
+// set, expansion falls back to the unconfined package-level loader. See the package
+// documentation on Security.
func (d *Document) Expanded(options ...*spec.ExpandOptions) (*Document, error) {
swspec := new(spec.Swagger)
if err := json.Unmarshal(d.raw, swspec); err != nil {
diff --git a/vendor/github.com/go-openapi/runtime/.codecov.yml b/vendor/github.com/go-openapi/runtime/.codecov.yml
new file mode 100644
index 00000000000..a5ba8e96d8e
--- /dev/null
+++ b/vendor/github.com/go-openapi/runtime/.codecov.yml
@@ -0,0 +1,9 @@
+codecov:
+ notify:
+ after_n_builds: 2
+
+coverage:
+ status:
+ patch:
+ default:
+ target: 80%
diff --git a/vendor/github.com/go-openapi/runtime/.gitignore b/vendor/github.com/go-openapi/runtime/.gitignore
index d8f4186fe59..c0bc15bebe6 100644
--- a/vendor/github.com/go-openapi/runtime/.gitignore
+++ b/vendor/github.com/go-openapi/runtime/.gitignore
@@ -3,3 +3,5 @@
.idea
.env
.mcp.json
+go.work.sum
+.worktrees/
diff --git a/vendor/github.com/go-openapi/runtime/.golangci.yml b/vendor/github.com/go-openapi/runtime/.golangci.yml
index 0087ed31130..ef2ff12bea3 100644
--- a/vendor/github.com/go-openapi/runtime/.golangci.yml
+++ b/vendor/github.com/go-openapi/runtime/.golangci.yml
@@ -2,13 +2,9 @@ version: "2"
linters:
default: all
disable:
- - cyclop
- depguard
- err113 # disabled temporarily: there are just too many issues to address
- - errchkjson
- - errorlint
- exhaustruct
- - forcetypeassert
- funlen
- gochecknoglobals
- gochecknoinits
@@ -16,12 +12,12 @@ linters:
- godot
- godox
- gomoddirectives # moved to mono-repo, multi-modules, so replace directives are needed
+ - gomodguard
+ - gomodguard_v2
- gosmopolitan
- inamedparam
- - ireturn
- - lll
+ - ireturn # this repo adopted a pattern where there are quite many returned interfaces. To be challenged with v2
- musttag
- - nestif
- nilerr # nilerr crashes on this repo
- nlreturn
- noinlineerr
@@ -31,7 +27,6 @@ linters:
- testpackage
- thelper
- tparallel
- - unparam
- varnamelen
- whitespace
- wrapcheck
@@ -43,8 +38,17 @@ linters:
goconst:
min-len: 2
min-occurrences: 3
+ cyclop:
+ max-complexity: 25
gocyclo:
- min-complexity: 45
+ min-complexity: 25
+ gocognit:
+ min-complexity: 35
+ exhaustive:
+ default-signifies-exhaustive: true
+ default-case-required: true
+ lll:
+ line-length: 180
exclusions:
generated: lax
presets:
@@ -53,6 +57,7 @@ linters:
- legacy
- std-error-handling
paths:
+ - .worktrees
- third_party$
- builtin$
- examples$
@@ -60,12 +65,17 @@ formatters:
enable:
- gofmt
- goimports
+ settings:
+ # local prefixes regroup imports from these packages
+ goimports:
+ local-prefixes:
+ - github.com/go-openapi
exclusions:
generated: lax
paths:
+ - .worktrees
- third_party$
- builtin$
- - examples$
issues:
# Maximum issues count per one linter.
# Set to 0 to disable.
diff --git a/vendor/github.com/go-openapi/runtime/CONTRIBUTORS.md b/vendor/github.com/go-openapi/runtime/CONTRIBUTORS.md
new file mode 100644
index 00000000000..0ef327861d0
--- /dev/null
+++ b/vendor/github.com/go-openapi/runtime/CONTRIBUTORS.md
@@ -0,0 +1,83 @@
+# Contributors
+
+- Repository: ['go-openapi/runtime']
+
+| Total Contributors | Total Contributions |
+| --- | --- |
+| 71 | 565 |
+
+| Username | All Time Contribution Count | All Commits |
+| --- | --- | --- |
+| @casualjim | 268 | |
+| @fredbi | 140 | |
+| @youyuanwu | 19 | |
+| @josephwoodward | 13 | |
+| @kenjones-cisco | 12 | |
+| @GlenDC | 7 | |
+| @moenning | 6 | |
+| @mstoykov | 6 | |
+| @elakito | 6 | |
+| @ifraixedes | 5 | |
+| @zeitlinger | 4 | |
+| @Copilot | 3 | |
+| @jkawamoto | 3 | |
+| @stoyanr | 3 | |
+| @keramix | 2 | |
+| @Equanox | 2 | |
+| @ederavilaprado | 2 | |
+| @nan0tube | 2 | |
+| @thomdixon | 2 | |
+| @deborggraever | 2 | |
+| @MakarandNsd | 2 | |
+| @Vadskye | 2 | |
+| @jsilland | 2 | |
+| @Kunde21 | 2 | |
+| @bcomnes | 2 | |
+| @galaxie | 2 | |
+| @anfernee | 2 | |
+| @wahabmk | 1 | |
+| @vearutop | 1 | |
+| @tschaub | 1 | |
+| @pytlesk4 | 1 | |
+| @tgraf | 1 | |
+| @seanprince | 1 | |
+| @rodriguise | 1 | |
+| @petrkotas | 1 | |
+| @maxatome | 1 | |
+| @maxkarelov | 1 | |
+| @tooolbox | 1 | |
+| @akutz | 1 | |
+| @yabberyabber | 1 | |
+| @elv-gilles | 1 | |
+| @gregmarr | 1 | |
+| @jwalter1-quest | 1 | |
+| @s4s7 | 1 | |
+| @stingshen | 1 | |
+| @tamalsaha | 1 | |
+| @tte | 1 | |
+| @martian4202 | 1 | |
+| @yan-zhuang | 1 | |
+| @aleksandr-vin | 1 | |
+| @azylman | 1 | |
+| @anasmuhmd | 1 | |
+| @ArFe | 1 | |
+| @CodeLingoBot | 1 | |
+| @dlmiddlecote | 1 | |
+| @danny-cheung | 1 | |
+| @calavera | 1 | |
+| @EdwardBetts | 1 | |
+| @etsangsplk | 1 | |
+| @ericzsplk | 1 | |
+| @faguirre1 | 1 | |
+| @florindragos | 1 | |
+| @gbjk | 1 | |
+| @taisho6339 | 1 | |
+| @jbowes | 1 | |
+| @JoakimSoderberg | 1 | |
+| @robbert229 | 1 | |
+| @jonathaningram | 1 | |
+| @KuaaMU | 1 | |
+| @germanhs | 1 | |
+| @pracucci | 1 | |
+
+ _this file was generated by the [Contributors GitHub Action](https://github.com/github-community-projects/contributors)_
diff --git a/vendor/github.com/go-openapi/runtime/README.md b/vendor/github.com/go-openapi/runtime/README.md
index dd7f5039a79..134d930cd9f 100644
--- a/vendor/github.com/go-openapi/runtime/README.md
+++ b/vendor/github.com/go-openapi/runtime/README.md
@@ -8,8 +8,7 @@
[![Release][release-badge]][release-url] [![Go Report Card][gocard-badge]][gocard-url] [![CodeFactor Grade][codefactor-badge]][codefactor-url] [![License][license-badge]][license-url]
-[![GoDoc][godoc-badge]][godoc-url] [![Discord Channel][discord-badge]][discord-url] [![go version][goversion-badge]][goversion-url] ![Top language][top-badge] ![Commits since latest release][commits-badge]
-
+[![Doc][doc-badge]][doc-url] [![GoDoc][godoc-badge]][godoc-url] [![Discord Channel][discord-badge]][discord-url] [![go version][goversion-badge]][goversion-url] ![Top language][top-badge] ![Commits since latest release][commits-badge]
---
A runtime for go OpenAPI toolkit.
@@ -18,13 +17,44 @@ The runtime component for use in code generation or as untyped usage.
## Announcements
-* **2025-12-19** : new community chat on discord
- * a new discord community channel is available to be notified of changes and support users
- * our venerable Slack channel remains open, and will be eventually discontinued on **2026-03-31**
+[**Complete documentation as github pages**][doc-url]
+
+**Changes to the API surface in `v0.30.0`**:
+
+* utility package `header` has now moved to `github.com/go-openapi/runtime/server-middleware/negotiate/header`
+
+> A shim is provided to support existing programs, with a deprecation notice.
+
+**Changes in semantics in `v0.30.0`**:
+
+Function `negotiate.NegotiateContentType` (available as an alias for backward compatibility as `middleware.NegotiateContentType`
+now performs a full match considering MIME parameters.
+
+The previous behavior (matching in order of appearance after stripping parameters) may be enabled explicitly with
+option `negotiate.WithIgnoreParameters`.
+
+* **2026-05-07** : exposed UI and Spec middleware as a separate, dependency-free module.
+
+> Newly available package: `github.com/go-openapi/runtime/server-middleware/docui` that now holds our
+> UI and spec serve middleware.
+>
+> A shim is available in `github.com/go-openapi/runtime/middleware` to bridge the older UI options to the new ones,
+> with a deprecation notice.
+>
+> Methods that were unduly exported and purely used to manipulate options (e.g. `SwaggerUIOpts.EnsureDefaults`) have been
+> removed. New options in `docui` should be used instead.
+
+> Users may reuse this middleware to serve a Redoc, Rapidoc or SwaggerUI documentation without
+> importing the complete go-openapi scaffolding.
-You may join the discord community by clicking the invite link on the discord badge (also above). [![Discord Channel][discord-badge]][discord-url]
+* **2026-05-05** : exposed content negotiation methods as a separate, dependency-free module
-Or join our Slack channel: [![Slack Channel][slack-logo]![slack-badge]][slack-url]
+> Users may reuse these utilities to support content-negotiation without extra dependencies.
+>
+> Newly available module: `github.com/go-openapi/runtime/server-middleware`
+>
+> Newly available packages: `github.com/go-openapi/runtime/server-middleware/negotiate` and
+> `github.com/go-openapi/runtime/server-middleware/mediatype`.
## Status
@@ -40,18 +70,21 @@ go get github.com/go-openapi/runtime
See
-For pre-v0.30.0 releases see [release notes](docs/NOTES.md).
+For v0.29.0 release see [release notes](docs/NOTES.md).
+From that release onwards, changes are tracked in the github release notes.
**What coming next?**
Moving forward, we want to :
-* [ ] continue narrowing down the scope of dependencies:
- * yaml support in an independent module
+* [x] fix a few known issues with some file upload requests (e.g. #286)
+* [] continue narrowing down the scope of dependencies:
+ * [x] split middleware and other useful utilities as a separate dependency-free module
+ * yaml support in an independent module (v2)
* introduce more up-to-date support for opentelemetry as a separate module that evolves
independently from the main package (to avoid breaking changes, the existing API
- will remain maintained, but evolve at a slower pace than opentelemetry).
-* [ ] fix a few known issues with some file upload requests (e.g. #286)
+ will remain maintained, but evolve at a slower pace than opentelemetry). (v2)
+* [] publish proper documentation and examples
## Licensing
@@ -62,11 +95,11 @@ on top of which it has been built.
## Other documentation
-* [FAQ](docs/FAQ.md)
+* [FAQ](https://go-openapi.github.io/runtime/tutorials/faq/) · [Media-type selection](https://go-openapi.github.io/runtime/tutorials/media-types/) · [Client keep-alive](https://go-openapi.github.io/runtime/tutorials/keep-alive/)
* [All-time contributors](./CONTRIBUTORS.md)
-* [Contributing guidelines](.github/CONTRIBUTING.md)
-* [Maintainers documentation](docs/MAINTAINERS.md)
-* [Code style](docs/STYLE.md)
+* [Contributing guidelines][contributing-doc-site]
+* [Maintainers documentation][maintainers-doc-site]
+* [Code style][style-doc-site]
## Cutting a new release
@@ -95,13 +128,12 @@ Maintainers can cut a new release by either:
[codefactor-badge]: https://img.shields.io/codefactor/grade/github/go-openapi/runtime
[codefactor-url]: https://www.codefactor.io/repository/github/go-openapi/runtime
+[doc-badge]: https://img.shields.io/badge/doc-site-blue?link=https%3A%2F%2Fgo-openapi.github.io%2Fruntime%2F
+[doc-url]: https://go-openapi.github.io/runtime
[godoc-badge]: https://pkg.go.dev/badge/github.com/go-openapi/runtime
[godoc-url]: http://pkg.go.dev/github.com/go-openapi/runtime
-[slack-logo]: https://a.slack-edge.com/e6a93c1/img/icons/favicon-32.png
-[slack-badge]: https://img.shields.io/badge/slack-blue?link=https%3A%2F%2Fgoswagger.slack.com%2Farchives%2FC04R30YM
-[slack-url]: https://goswagger.slack.com/archives/C04R30YMU
[discord-badge]: https://img.shields.io/discord/1446918742398341256?logo=discord&label=discord&color=blue
-[discord-url]: https://discord.gg/twZ9BwT3
+[discord-url]: https://discord.gg/FfnFYaC3k5
[license-badge]: http://img.shields.io/badge/license-Apache%20v2-orange.svg
@@ -111,3 +143,7 @@ Maintainers can cut a new release by either:
[goversion-url]: https://github.com/go-openapi/runtime/blob/master/go.mod
[top-badge]: https://img.shields.io/github/languages/top/go-openapi/runtime
[commits-badge]: https://img.shields.io/github/commits-since/go-openapi/runtime/latest
+
+[contributing-doc-site]: https://go-openapi.github.io/doc-site/contributing/contributing/index.html
+[maintainers-doc-site]: https://go-openapi.github.io/doc-site/maintainers/index.html
+[style-doc-site]: https://go-openapi.github.io/doc-site/contributing/style/index.html
diff --git a/vendor/github.com/go-openapi/runtime/bytestream.go b/vendor/github.com/go-openapi/runtime/bytestream.go
index 8701c8e3d66..9371ea4ea1f 100644
--- a/vendor/github.com/go-openapi/runtime/bytestream.go
+++ b/vendor/github.com/go-openapi/runtime/bytestream.go
@@ -97,7 +97,7 @@ func ByteStreamConsumer(opts ...byteStreamOpt) Consumer {
}
default:
// check for the underlying type to be pointer to []byte or string,
- if ptr := reflect.TypeOf(data); ptr.Kind() != reflect.Ptr {
+ if ptr := reflect.TypeOf(data); ptr.Kind() != reflect.Pointer {
return errors.New("destination must be a pointer")
}
@@ -126,13 +126,13 @@ func ByteStreamConsumer(opts ...byteStreamOpt) Consumer {
//
// Supported input underlying types and interfaces, prioritized in this order:
//
-// - [io.WriterTo] (for maximum control)
-// - [io.Reader] (performs [io.Copy]). A ReadCloser is closed before exiting.
-// - [encoding.BinaryMarshaler]
-// - error (writes as a string)
-// - []byte
-// - string
-// - struct, other slices: writes as JSON.
+// - [io.WriterTo] (for maximum control)
+// - [io.Reader] (performs [io.Copy]). A ReadCloser is closed before exiting.
+// - [encoding.BinaryMarshaler]
+// - error (writes as a string)
+// - []byte
+// - string
+// - struct, other slices: writes as JSON.
func ByteStreamProducer(opts ...byteStreamOpt) Producer {
var vals byteStreamOpts
for _, opt := range opts {
diff --git a/vendor/github.com/go-openapi/runtime/client/httptrace.go b/vendor/github.com/go-openapi/runtime/client/httptrace.go
new file mode 100644
index 00000000000..5bdea4e2418
--- /dev/null
+++ b/vendor/github.com/go-openapi/runtime/client/httptrace.go
@@ -0,0 +1,520 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package client
+
+import (
+ "context"
+ "crypto/tls"
+ "fmt"
+ "io"
+ "net/http/httptrace"
+ "strings"
+ "sync"
+ "time"
+
+ "github.com/go-openapi/runtime/logger"
+)
+
+// traceSession owns the per-request state for [Runtime.Trace].
+//
+// It tracks the t=0 anchor for the connection phase, accumulates
+// per-phase timestamps (for the trailing summary), and emits each
+// event to the runtime logger as it fires. One session per
+// SubmitContext call.
+type traceSession struct {
+ logger logger.Logger
+ method string
+ url string
+
+ // tlsCfg points at the *tls.Config of the http.Transport that
+ // will run the request, when introspectable (i.e. the transport
+ // is an *http.Transport). Used by the TLS diagnostic mode to
+ // cross-check user configuration against what the handshake
+ // actually attempted. Nil when the transport is custom and
+ // the config cannot be reached.
+ tlsCfg *tls.Config
+
+ mu sync.Mutex
+ start time.Time
+ last time.Time // last printed event, for relative-dt rendering
+ phases phaseTimings
+ gotConn httptrace.GotConnInfo
+ tlsDone tlsResult
+
+ dnsStartAt time.Time
+ connectStartAt time.Time
+ tlsHandshakeStartAt time.Time
+ wait100StartAt time.Time
+ gotConnAt time.Time
+ wroteHeadersAt time.Time
+ wroteRequestAt time.Time
+ ttfbAt time.Time
+
+ statusCode int
+ rtError error
+}
+
+// phaseTimings holds the per-phase durations for the trailing
+// summary line. Zero values mean "phase did not occur" (e.g. no
+// DNS lookup on a reused conn, no TLS on http://).
+type phaseTimings struct {
+ dns time.Duration
+ dial time.Duration
+ tls time.Duration
+ ttfb time.Duration // time from GotConn to first response byte
+}
+
+// tlsResult captures whatever we learned from TLSHandshakeDone.
+// On the happy path err is nil and state is fully populated; on
+// failure state may be partial (and is what the TLS diagnostic
+// mode in httptrace_tls.go works from).
+type tlsResult struct {
+ state tls.ConnectionState
+ err error
+ done bool
+}
+
+const tracePrefix = "[trace] "
+
+// staleIdleThreshold is the idle duration above which a reused
+// pooled connection earns a HEADS-UP annotation. Per-runtime
+// configurability is deferred to v2; 30s matches the issue #336
+// territory (typical NAT idle timeouts start in the 60–350s
+// range, so a 30s reuse is already in "could be stale" zone).
+const staleIdleThreshold = 30 * time.Second
+
+// newTraceSession allocates a session and pre-renders the opening
+// line (method + url). The session is not yet attached to a
+// context — that's the caller's responsibility via session.attach.
+//
+// tlsCfg may be nil; when non-nil it is used by the TLS diagnostic
+// mode to cross-check user-configured constraints (MinVersion,
+// CipherSuites, custom RootCAs) against handshake failures.
+func newTraceSession(log logger.Logger, method, url string, tlsCfg *tls.Config) *traceSession {
+ s := &traceSession{
+ logger: log,
+ method: method,
+ url: url,
+ tlsCfg: tlsCfg,
+ start: time.Now(),
+ }
+ s.last = s.start
+ s.emitf("%s %s", method, url)
+ return s
+}
+
+// attach installs the session's ClientTrace on ctx and returns the
+// derived context. Callers pass the returned context to
+// http.Client.Do (typically by setting it on req via
+// req.WithContext) so the transport fires the hooks.
+func (s *traceSession) attach(ctx context.Context) context.Context {
+ return httptrace.WithClientTrace(ctx, s.clientTrace())
+}
+
+// clientTrace wires every httptrace hook to the corresponding
+// session method. Each callback is responsible for its own
+// locking; the stdlib does not serialize trace callbacks.
+func (s *traceSession) clientTrace() *httptrace.ClientTrace {
+ return &httptrace.ClientTrace{
+ GetConn: s.onGetConn,
+ GotConn: s.onGotConn,
+ PutIdleConn: s.onPutIdleConn,
+ GotFirstResponseByte: s.onGotFirstResponseByte,
+ Got100Continue: s.onGot100Continue,
+ DNSStart: s.onDNSStart,
+ DNSDone: s.onDNSDone,
+ ConnectStart: s.onConnectStart,
+ ConnectDone: s.onConnectDone,
+ TLSHandshakeStart: s.onTLSHandshakeStart,
+ TLSHandshakeDone: s.onTLSHandshakeDone,
+ WroteHeaders: s.onWroteHeaders,
+ Wait100Continue: s.onWait100Continue,
+ WroteRequest: s.onWroteRequest,
+ }
+}
+
+// ---------------------------------------------------------------
+// Phase callbacks (stdlib httptrace hooks)
+// ---------------------------------------------------------------
+
+func (s *traceSession) onGetConn(hostPort string) {
+ s.emitTf("GetConn(%s)", hostPort)
+}
+
+func (s *traceSession) onGotConn(info httptrace.GotConnInfo) {
+ s.mu.Lock()
+ s.gotConn = info
+ s.gotConnAt = time.Now()
+ s.mu.Unlock()
+
+ if info.Reused {
+ s.emitTf("GotConn(reused=true, idle=%t, idle-time=%s)",
+ info.WasIdle, info.IdleTime.Round(time.Millisecond))
+ } else {
+ s.emitTf("GotConn(reused=false)")
+ }
+
+ if isStaleIdleReuse(info) {
+ s.emitf("# HEADS-UP: reused idle connection (idle for %s).",
+ info.IdleTime.Round(time.Second))
+ s.emitf("# If this request fails with EOF/connection reset, the server")
+ s.emitf("# or an in-path NAT may have dropped the conn silently.")
+ }
+}
+
+// isStaleIdleReuse reports whether a GotConn info indicates the
+// connection came from the idle pool after sitting idle for
+// longer than [staleIdleThreshold]. This is the issue #336
+// pattern: long-idle pooled conns are the ones most likely to be
+// dead by the time the next request tries to use them.
+func isStaleIdleReuse(info httptrace.GotConnInfo) bool {
+ return info.Reused && info.WasIdle && info.IdleTime > staleIdleThreshold
+}
+
+func (s *traceSession) onPutIdleConn(err error) {
+ if err != nil {
+ s.emitTf("PutIdleConn(err=%v)", err)
+ return
+ }
+ s.emitTf("PutIdleConn")
+}
+
+func (s *traceSession) onGotFirstResponseByte() {
+ s.mu.Lock()
+ s.ttfbAt = time.Now()
+ if !s.gotConnAt.IsZero() {
+ s.phases.ttfb = s.ttfbAt.Sub(s.gotConnAt)
+ }
+ s.mu.Unlock()
+ s.emitTf("GotFirstResponseByte (TTFB)")
+}
+
+func (s *traceSession) onGot100Continue() {
+ s.emitTf("Got100Continue")
+}
+
+func (s *traceSession) onDNSStart(info httptrace.DNSStartInfo) {
+ s.mu.Lock()
+ s.dnsStartAt = time.Now()
+ s.mu.Unlock()
+ s.emitTf("DNSStart(host=%s)", info.Host)
+}
+
+func (s *traceSession) onDNSDone(info httptrace.DNSDoneInfo) {
+ s.mu.Lock()
+ if !s.dnsStartAt.IsZero() {
+ s.phases.dns = time.Since(s.dnsStartAt)
+ }
+ s.mu.Unlock()
+
+ addrs := make([]string, 0, len(info.Addrs))
+ for _, a := range info.Addrs {
+ addrs = append(addrs, a.String())
+ }
+ if info.Err != nil {
+ s.emitTf("DNSDone(err=%v, addrs=[%s], coalesced=%t)",
+ info.Err, strings.Join(addrs, " "), info.Coalesced)
+ return
+ }
+ s.emitTf("DNSDone(addrs=[%s], coalesced=%t)",
+ strings.Join(addrs, " "), info.Coalesced)
+}
+
+func (s *traceSession) onConnectStart(network, addr string) {
+ s.mu.Lock()
+ s.connectStartAt = time.Now()
+ s.mu.Unlock()
+ s.emitTf("ConnectStart(%s %s)", network, addr)
+}
+
+func (s *traceSession) onConnectDone(network, addr string, err error) {
+ s.mu.Lock()
+ if !s.connectStartAt.IsZero() {
+ s.phases.dial = time.Since(s.connectStartAt)
+ }
+ s.mu.Unlock()
+
+ if err != nil {
+ s.emitTf("ConnectDone(%s %s, err=%v)", network, addr, err)
+ return
+ }
+ s.emitTf("ConnectDone(%s %s)", network, addr)
+}
+
+func (s *traceSession) onTLSHandshakeStart() {
+ s.mu.Lock()
+ s.tlsHandshakeStartAt = time.Now()
+ s.mu.Unlock()
+ s.emitTf("TLSHandshakeStart")
+}
+
+func (s *traceSession) onTLSHandshakeDone(state tls.ConnectionState, err error) {
+ s.mu.Lock()
+ if !s.tlsHandshakeStartAt.IsZero() {
+ s.phases.tls = time.Since(s.tlsHandshakeStartAt)
+ }
+ s.tlsDone = tlsResult{state: state, err: err, done: true}
+ s.mu.Unlock()
+
+ if err != nil {
+ s.emitTf("TLSHandshakeDone(err=%v)", err)
+ s.emitTLSDiagnostic(state, err)
+ return
+ }
+ s.emitTf("TLSHandshakeDone(tls=%s, cipher=%s, server=%s%s)",
+ tlsVersionName(state.Version),
+ tls.CipherSuiteName(state.CipherSuite),
+ state.ServerName,
+ certExpiryFragment(state),
+ )
+}
+
+func (s *traceSession) onWroteHeaders() {
+ s.mu.Lock()
+ s.wroteHeadersAt = time.Now()
+ s.mu.Unlock()
+ s.emitTf("WroteHeaders")
+}
+
+func (s *traceSession) onWait100Continue() {
+ s.mu.Lock()
+ s.wait100StartAt = time.Now()
+ s.mu.Unlock()
+ s.emitTf("Wait100Continue")
+}
+
+func (s *traceSession) onWroteRequest(info httptrace.WroteRequestInfo) {
+ s.mu.Lock()
+ s.wroteRequestAt = time.Now()
+ s.mu.Unlock()
+
+ if info.Err != nil {
+ s.emitTf("WroteRequest(err=%v)", info.Err)
+ return
+ }
+ s.emitTf("WroteRequest")
+}
+
+// ---------------------------------------------------------------
+// Body wrapping
+// ---------------------------------------------------------------
+
+// bodySide identifies which direction an instrumented body is on.
+type bodySide string
+
+const (
+ bodySend bodySide = "Sent"
+ bodyRecv bodySide = "Received"
+)
+
+// instrumentedBody wraps an [io.ReadCloser] and emits a
+// BodyChunk{Sent,Received} trace event per Read call. Tracks the
+// inter-read delay in `dt` so users can see streaming-body
+// cadence.
+//
+// Read granularity: bytes returned by the underlying body, not
+// HTTP/1.1 chunked-framing units. For wire-level chunking, use
+// [Runtime.Debug] instead.
+//
+// Concurrency: a single body is read from a single goroutine in
+// practice (http.Transport for request bodies, the application
+// for response bodies), so no internal locking is needed beyond
+// what the underlying ReadCloser provides.
+type instrumentedBody struct {
+ wrapped io.ReadCloser
+ sess *traceSession
+ side bodySide
+ last time.Time
+}
+
+func (b *instrumentedBody) Read(p []byte) (int, error) {
+ n, err := b.wrapped.Read(p)
+ if n > 0 {
+ first := b.last.IsZero()
+ var dt time.Duration
+ if !first {
+ dt = time.Since(b.last)
+ }
+ b.last = time.Now()
+ b.sess.onBodyChunk(b.side, n, dt, first)
+ }
+ return n, err
+}
+
+func (b *instrumentedBody) Close() error {
+ return b.wrapped.Close()
+}
+
+// wrapRequestBody returns an instrumented wrapper around the
+// outgoing request body, or the original body if nil (which is
+// the common case for GET requests). The wrapper observes
+// Transport-side reads, so BodyChunkSent events appear between
+// WroteHeaders and WroteRequest in the trace timeline.
+func (s *traceSession) wrapRequestBody(body io.ReadCloser) io.ReadCloser {
+ if body == nil {
+ return nil
+ }
+ return &instrumentedBody{wrapped: body, sess: s, side: bodySend}
+}
+
+// wrapResponseBody returns an instrumented wrapper around the
+// incoming response body. Stacks cleanly above
+// [KeepAliveTransport]'s drain-on-close behavior.
+func (s *traceSession) wrapResponseBody(body io.ReadCloser) io.ReadCloser {
+ if body == nil {
+ return nil
+ }
+ return &instrumentedBody{wrapped: body, sess: s, side: bodyRecv}
+}
+
+// onBodyChunk renders a single BodyChunk{Sent,Received} event.
+// dt is the duration since the previous Read on the same body and
+// is meaningful only when `first` is false. The first chunk has no
+// preceding read, so the dt= field is suppressed; every subsequent
+// chunk emits dt= unconditionally — even when the measured value
+// rounds to zero (common on Windows, where the system clock
+// resolution is coarser than a fast loopback read loop).
+func (s *traceSession) onBodyChunk(side bodySide, n int, dt time.Duration, first bool) {
+ if first {
+ s.emitTf("BodyChunk%s(n=%d)", side, n)
+ return
+ }
+ s.emitTf("BodyChunk%s(n=%d, dt=%s)", side, n, round(dt))
+}
+
+// ---------------------------------------------------------------
+// Submit-level lifecycle hooks (called from SubmitContext)
+// ---------------------------------------------------------------
+
+// onRoundTripError is called by SubmitContext when http.Client.Do
+// returns an error. It records the error for the summary line.
+func (s *traceSession) onRoundTripError(err error) {
+ s.mu.Lock()
+ s.rtError = err
+ s.mu.Unlock()
+ s.emitTf("! error: %v", err)
+}
+
+// onResponse is called when http.Client.Do returns successfully.
+// It records the status code for the summary line.
+func (s *traceSession) onResponse(statusCode int) {
+ s.mu.Lock()
+ s.statusCode = statusCode
+ s.mu.Unlock()
+}
+
+// finish renders the trailing single-line summary and is called
+// by SubmitContext after the response body has been consumed (or
+// on error path, after the error was recorded). When a round-trip
+// error happened on a stale-idle reused connection, a tail block
+// flags the issue #336 pattern explicitly.
+func (s *traceSession) finish() {
+ s.mu.Lock()
+ defer s.mu.Unlock()
+
+ total := time.Since(s.start)
+ var b strings.Builder
+ fmt.Fprintf(&b, "Summary: %s — ", s.method)
+ if s.rtError != nil {
+ fmt.Fprintf(&b, "FAILED (%v)", s.rtError)
+ } else {
+ fmt.Fprintf(&b, "%d", s.statusCode)
+ }
+ if s.phases.dns > 0 {
+ fmt.Fprintf(&b, ", dns=%s", round(s.phases.dns))
+ }
+ if s.phases.dial > 0 {
+ fmt.Fprintf(&b, ", dial=%s", round(s.phases.dial))
+ }
+ if s.phases.tls > 0 {
+ fmt.Fprintf(&b, ", tls=%s", round(s.phases.tls))
+ }
+ if s.phases.ttfb > 0 {
+ fmt.Fprintf(&b, ", ttfb=%s", round(s.phases.ttfb))
+ }
+ fmt.Fprintf(&b, ", total=%s", round(total))
+
+ s.emitRaw(b.String())
+
+ // issue #336 tail annotation: a round-trip failure on a
+ // stale-idle reused conn is the canonical pattern.
+ if s.rtError != nil && isStaleIdleReuse(s.gotConn) {
+ s.emitf("# FAILED on a reused idle conn (%s idle).",
+ s.gotConn.IdleTime.Round(time.Second))
+ s.emitf("# Silently closed the conn while it sat in the idle pool.")
+ s.emitf("# Consider lowering http.Transport.IdleConnTimeout to evict")
+ s.emitf("# pooled conns before the NAT/server side does.")
+ }
+}
+
+// ---------------------------------------------------------------
+// Emission helpers
+// ---------------------------------------------------------------
+
+// emitf prints a plain event line (no t= timestamp). Used for the
+// opening line and the summary.
+func (s *traceSession) emitf(format string, args ...any) {
+ s.logger.Debugf(tracePrefix+format, args...)
+}
+
+// emitRaw is like emitf but takes an already-rendered string. Used
+// by finish() which builds its line via strings.Builder.
+func (s *traceSession) emitRaw(line string) {
+ s.logger.Debugf("%s", tracePrefix+line)
+}
+
+// emitTf prints a phase event with a cumulative t=... offset from
+// the session start.
+func (s *traceSession) emitTf(format string, args ...any) {
+ t := round(time.Since(s.start))
+ msg := fmt.Sprintf(format, args...)
+ s.logger.Debugf(tracePrefix+"%s (t=%s)", msg, t)
+}
+
+// traceRoundUnit is the rounding granularity for >=1ms durations
+// rendered in trace output. 100µs keeps lines readable while
+// preserving enough resolution to spot millisecond-scale phase
+// differences.
+const traceRoundUnit = 100 * time.Microsecond
+
+// round trims durations for human-readable trace output.
+// Sub-millisecond durations round to 1µs (preserves visibility on
+// fast loopback servers); >=1ms durations round to [traceRoundUnit].
+func round(d time.Duration) time.Duration {
+ if d <= 0 {
+ return 0
+ }
+ if d < time.Millisecond {
+ return d.Round(time.Microsecond)
+ }
+ return d.Round(traceRoundUnit)
+}
+
+// ---------------------------------------------------------------
+// TLS rendering helpers
+// ---------------------------------------------------------------
+
+func tlsVersionName(v uint16) string {
+ switch v {
+ case tls.VersionTLS10:
+ return "1.0"
+ case tls.VersionTLS11:
+ return "1.1"
+ case tls.VersionTLS12:
+ return "1.2"
+ case tls.VersionTLS13:
+ return "1.3"
+ default:
+ return fmt.Sprintf("0x%04x", v)
+ }
+}
+
+// certExpiryFragment renders ", expires=YYYY-MM-DD" for the leaf
+// cert when available, or an empty string otherwise.
+func certExpiryFragment(state tls.ConnectionState) string {
+ if len(state.PeerCertificates) == 0 {
+ return ""
+ }
+ return ", expires=" + state.PeerCertificates[0].NotAfter.UTC().Format("2006-01-02")
+}
diff --git a/vendor/github.com/go-openapi/runtime/client/httptrace_tls.go b/vendor/github.com/go-openapi/runtime/client/httptrace_tls.go
new file mode 100644
index 00000000000..063fb259272
--- /dev/null
+++ b/vendor/github.com/go-openapi/runtime/client/httptrace_tls.go
@@ -0,0 +1,353 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package client
+
+import (
+ "crypto/tls"
+ "crypto/x509"
+ "errors"
+ "fmt"
+ "net/http"
+ "strings"
+ "time"
+)
+
+// TLS alert codes used by the diagnostic to classify handshake
+// failures. The crypto/tls package does not export named constants
+// for individual alerts, so we declare the ones we care about.
+// Values are from RFC 8446 §6 (the TLS 1.3 alert protocol; the
+// numbering is shared with earlier TLS versions for these alerts).
+//
+// The `err`-prefixed names satisfy the errname linter — tls.AlertError
+// implements error, so these are sentinel errors.
+const (
+ errTLSAlertHandshakeFailure tls.AlertError = 40
+ errTLSAlertProtocolVersion tls.AlertError = 70
+)
+
+// introspectTLSConfig returns the *tls.Config of the http.Transport
+// that will run a request, when reachable, or nil otherwise.
+//
+// Reachable means the client's Transport is an *http.Transport
+// (the default and most common case). Custom transports — wrappers
+// around the default, or entirely user-provided — break introspection;
+// the TLS diagnostic falls back to "configured: not introspectable"
+// in that case.
+//
+// A nil client (zero value) or nil Transport falls through to
+// [http.DefaultTransport], whose TLSClientConfig is also nil; the
+// function returns nil and the diagnostic reports defaults.
+func introspectTLSConfig(client *http.Client) *tls.Config {
+ if client == nil {
+ return nil
+ }
+ transport := client.Transport
+ if transport == nil {
+ transport = http.DefaultTransport
+ }
+ t, ok := transport.(*http.Transport)
+ if !ok {
+ return nil
+ }
+ return t.TLSClientConfig
+}
+
+// emitTLSDiagnostic renders the failure-mode TLS diagnostic block.
+// Called from [traceSession.onTLSHandshakeDone] when err != nil.
+//
+// The block covers three axes (per the plan):
+//
+// 1. Protocol-version negotiation — detected from
+// [errTLSAlertProtocolVersion] or a "protocol version" substring.
+// 2. Cipher-suite negotiation — detected from
+// [errTLSAlertHandshakeFailure] when the user pinned CipherSuites.
+// 3. Certificate-chain validity — detected from
+// [x509.CertificateInvalidError], [x509.UnknownAuthorityError]
+// or [x509.HostnameError].
+//
+// When none of the specific axes match, a generic fallback emits
+// the raw error and whatever inspectable config the session holds.
+func (s *traceSession) emitTLSDiagnostic(state tls.ConnectionState, err error) {
+ s.emitf("# TLS DIAGNOSTIC")
+
+ // tlsAxisGeneric is handled by the default branch.
+ switch axis := classifyTLSError(err); axis {
+ case tlsAxisProtocolVersion:
+ s.diagnoseProtocolVersion(state, err)
+ case tlsAxisCipher:
+ s.diagnoseCipher(err)
+ case tlsAxisCertChain:
+ s.diagnoseCertChain(err)
+ default:
+ s.diagnoseTLSGeneric(err)
+ }
+}
+
+// tlsAxis is the diagnostic dimension a TLS handshake error maps
+// to. Axes are mutually exclusive at classification time.
+type tlsAxis int
+
+const (
+ tlsAxisGeneric tlsAxis = iota
+ tlsAxisProtocolVersion
+ tlsAxisCipher
+ tlsAxisCertChain
+)
+
+// classifyTLSError maps a TLS handshake error to one of the
+// diagnostic axes. The ordering matters: cert-chain errors win
+// over the generic handshake_failure alert because the alert is
+// what the server sends back, but the local error type carries
+// the more specific reason.
+func classifyTLSError(err error) tlsAxis {
+ if err == nil {
+ return tlsAxisGeneric
+ }
+
+ // Cert-chain errors are the most specific local diagnostic
+ // and should be reported even if a generic alert is also
+ // present in the chain.
+ var certInvalid x509.CertificateInvalidError
+ if errors.As(err, &certInvalid) {
+ return tlsAxisCertChain
+ }
+ var unknownAuth x509.UnknownAuthorityError
+ if errors.As(err, &unknownAuth) {
+ return tlsAxisCertChain
+ }
+ var hostnameErr x509.HostnameError
+ if errors.As(err, &hostnameErr) {
+ return tlsAxisCertChain
+ }
+
+ // TLS alert classification.
+ var alert tls.AlertError
+ if errors.As(err, &alert) {
+ switch alert {
+ case errTLSAlertProtocolVersion:
+ return tlsAxisProtocolVersion
+ case errTLSAlertHandshakeFailure:
+ return tlsAxisCipher
+ }
+ }
+
+ // Fall back on substring detection for protocol-version
+ // failures that arrive via the local error path rather than
+ // a server-side alert (e.g. when the client refuses the
+ // server's offered version).
+ msg := err.Error()
+ if strings.Contains(msg, "protocol version") || strings.Contains(msg, "unsupported protocol") {
+ return tlsAxisProtocolVersion
+ }
+
+ return tlsAxisGeneric
+}
+
+// ---------------------------------------------------------------
+// Axis renderers
+// ---------------------------------------------------------------
+
+func (s *traceSession) diagnoseProtocolVersion(state tls.ConnectionState, err error) {
+ s.emitf("# axis: protocol-version")
+ s.emitf("# error: %v", err)
+
+ configuredMin, configuredMax := configuredVersionRange(s.tlsCfg)
+ s.emitf("# client offered: TLS %s — TLS %s",
+ tlsVersionName(configuredMin), tlsVersionName(configuredMax))
+
+ if state.Version != 0 {
+ s.emitf("# negotiated up to: TLS %s", tlsVersionName(state.Version))
+ }
+ s.emitf("# suggested: widen TLSClientOptions.MinVersion/MaxVersion,")
+ s.emitf("# or pin to a version the server speaks.")
+}
+
+func (s *traceSession) diagnoseCipher(err error) {
+ s.emitf("# axis: cipher-suite")
+ s.emitf("# error: %v", err)
+
+ if s.tlsCfg != nil && len(s.tlsCfg.CipherSuites) > 0 {
+ s.emitf("# client configured: [%s]",
+ strings.Join(cipherSuiteNames(s.tlsCfg.CipherSuites), ", "))
+ s.emitf("# server set: not exposed by Go stdlib")
+ s.emitf("# (capture with: openssl s_client -cipher ALL)")
+ s.emitf("# suggested: drop the explicit CipherSuites restriction,")
+ s.emitf("# or align it with the server's policy.")
+ return
+ }
+ // No client-side restriction. The handshake_failure alert
+ // is generic; without more info we can only surface the
+ // fact and suggest investigation.
+ s.emitf("# client configured: defaults (no CipherSuites restriction)")
+ s.emitf("# note: alert 40 is generic; the server may have rejected")
+ s.emitf("# the handshake for a non-cipher reason. Try")
+ s.emitf("# openssl s_client to capture details.")
+}
+
+func (s *traceSession) diagnoseCertChain(err error) {
+ s.emitf("# axis: cert-chain")
+
+ var certInvalid x509.CertificateInvalidError
+ if errors.As(err, &certInvalid) {
+ s.diagnoseCertInvalid(certInvalid)
+ return
+ }
+
+ var unknownAuth x509.UnknownAuthorityError
+ if errors.As(err, &unknownAuth) {
+ s.diagnoseUnknownAuthority(unknownAuth)
+ return
+ }
+
+ var hostnameErr x509.HostnameError
+ if errors.As(err, &hostnameErr) {
+ s.diagnoseHostnameMismatch(hostnameErr)
+ return
+ }
+
+ // Defensive: should not happen — classifyTLSError already
+ // matched one of the three.
+ s.emitf("# error: %v", err)
+}
+
+func (s *traceSession) diagnoseCertInvalid(certInvalid x509.CertificateInvalidError) {
+ cert := certInvalid.Cert
+ s.emitf("# reason: %s", certInvalidReasonName(certInvalid.Reason))
+
+ switch certInvalid.Reason {
+ case x509.Expired:
+ s.emitf("# leaf: subject=%s", cert.Subject)
+ s.emitf("# NotBefore=%s", cert.NotBefore.UTC().Format(time.RFC3339))
+ s.emitf("# NotAfter=%s", cert.NotAfter.UTC().Format(time.RFC3339))
+ s.emitf("# now=%s", time.Now().UTC().Format(time.RFC3339))
+ delta := time.Since(cert.NotAfter).Round(time.Hour)
+ s.emitf("# expired %s ago", delta)
+ s.emitf("# suggested: renew the server cert.")
+ case x509.NameMismatch, x509.CANotAuthorizedForThisName:
+ s.emitf("# leaf: subject=%s", cert.Subject)
+ s.emitf("# DNS SANs=%v", cert.DNSNames)
+ s.emitf("# suggested: set TLSClientOptions.ServerName to match")
+ s.emitf("# one of the cert SANs, or fix the cert.")
+ default:
+ // Less-common reasons render via the default branch (issuer + NotAfter dump).
+ s.emitf("# leaf: subject=%s, issuer=%s", cert.Subject, cert.Issuer)
+ s.emitf("# NotBefore=%s", cert.NotBefore.UTC().Format(time.RFC3339))
+ s.emitf("# NotAfter=%s", cert.NotAfter.UTC().Format(time.RFC3339))
+ s.emitf("# error: %v", certInvalid)
+ }
+}
+
+func (s *traceSession) diagnoseUnknownAuthority(unknownAuth x509.UnknownAuthorityError) {
+ s.emitf("# reason: chain root not in trust store (unknown-CA)")
+ if cert := unknownAuth.Cert; cert != nil {
+ s.emitf("# offending: subject=%s", cert.Subject)
+ s.emitf("# issuer=%s", cert.Issuer)
+ s.emitf("# NotAfter=%s", cert.NotAfter.UTC().Format(time.RFC3339))
+ }
+
+ trust := "SystemCertPool"
+ if s.tlsCfg != nil && s.tlsCfg.RootCAs != nil {
+ trust = "TLSClientOptions.CA (custom RootCAs)"
+ }
+ s.emitf("# trust store in use: %s", trust)
+
+ s.emitf("# suggested: set TLSClientOptions.CA to a bundle that")
+ s.emitf("# includes the issuing CA, or add it to the")
+ s.emitf("# OS trust store.")
+}
+
+func (s *traceSession) diagnoseHostnameMismatch(hostnameErr x509.HostnameError) {
+ s.emitf("# reason: hostname mismatch")
+ s.emitf("# dialed: %s", hostnameErr.Host)
+ if cert := hostnameErr.Certificate; cert != nil {
+ s.emitf("# leaf: subject=%s", cert.Subject)
+ s.emitf("# DNS SANs=%v", cert.DNSNames)
+ s.emitf("# IP SANs=%v", cert.IPAddresses)
+ }
+ if s.tlsCfg != nil && s.tlsCfg.ServerName != "" {
+ s.emitf("# TLSClientOptions.ServerName=%q", s.tlsCfg.ServerName)
+ }
+ s.emitf("# suggested: dial the hostname listed in the cert SANs,")
+ s.emitf("# or set TLSClientOptions.ServerName to match.")
+}
+
+func (s *traceSession) diagnoseTLSGeneric(err error) {
+ s.emitf("# axis: unclassified")
+ s.emitf("# error: %v", err)
+ if s.tlsCfg != nil {
+ minV, maxV := configuredVersionRange(s.tlsCfg)
+ s.emitf("# configured: MinVersion=TLS %s, MaxVersion=TLS %s",
+ tlsVersionName(minV), tlsVersionName(maxV))
+ if s.tlsCfg.InsecureSkipVerify {
+ s.emitf("# note: TLSClientOptions.InsecureSkipVerify=true — yet")
+ s.emitf("# a TLS error still surfaced. Something deeper than")
+ s.emitf("# certificate verification is failing.")
+ }
+ }
+}
+
+// ---------------------------------------------------------------
+// Helpers
+// ---------------------------------------------------------------
+
+// configuredVersionRange returns the effective (Min, Max) TLS
+// version range a client config negotiates. Zero values in the
+// stdlib config mean "use Go default", which is TLS 1.2 .. 1.3 in
+// modern Go. We materialize those defaults for display.
+func configuredVersionRange(cfg *tls.Config) (uint16, uint16) {
+ const (
+ defaultMin = tls.VersionTLS12
+ defaultMax = tls.VersionTLS13
+ )
+ if cfg == nil {
+ return defaultMin, defaultMax
+ }
+ minV := cfg.MinVersion
+ if minV == 0 {
+ minV = defaultMin
+ }
+ maxV := cfg.MaxVersion
+ if maxV == 0 {
+ maxV = defaultMax
+ }
+ return minV, maxV
+}
+
+func cipherSuiteNames(ids []uint16) []string {
+ out := make([]string, 0, len(ids))
+ for _, id := range ids {
+ out = append(out, tls.CipherSuiteName(id))
+ }
+ return out
+}
+
+// certInvalidReasonName renders an x509.InvalidReason as a short
+// human-readable label. The stdlib does not expose a String()
+// method for these, so we keep a small table.
+//
+// Anything outside the listed cases falls through to the numeric default.
+func certInvalidReasonName(r x509.InvalidReason) string {
+ switch r {
+ case x509.NotAuthorizedToSign:
+ return "not-authorized-to-sign"
+ case x509.Expired:
+ return "expired"
+ case x509.CANotAuthorizedForThisName:
+ return "ca-not-authorized-for-this-name"
+ case x509.TooManyIntermediates:
+ return "too-many-intermediates"
+ case x509.IncompatibleUsage:
+ return "incompatible-usage"
+ case x509.NameMismatch:
+ return "name-mismatch"
+ case x509.NameConstraintsWithoutSANs:
+ return "name-constraints-without-sans"
+ case x509.TooManyConstraints:
+ return "too-many-constraints"
+ case x509.CANotAuthorizedForExtKeyUsage:
+ return "ca-not-authorized-for-ext-key-usage"
+ default:
+ return fmt.Sprintf("invalid-reason-%d", r)
+ }
+}
diff --git a/vendor/github.com/go-openapi/runtime/client/internal/request/request.go b/vendor/github.com/go-openapi/runtime/client/internal/request/request.go
new file mode 100644
index 00000000000..22d3f64c01b
--- /dev/null
+++ b/vendor/github.com/go-openapi/runtime/client/internal/request/request.go
@@ -0,0 +1,945 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package request
+
+import (
+ "bytes"
+ "context"
+ "errors"
+ "fmt"
+ "io"
+ "log"
+ "mime"
+ "mime/multipart"
+ "net/http"
+ "net/textproto"
+ "net/url"
+ "os"
+ "path"
+ "path/filepath"
+ "strings"
+ "time"
+
+ "github.com/go-openapi/runtime"
+ "github.com/go-openapi/strfmt"
+)
+
+var _ runtime.ClientRequest = new(Request) // ensure compliance to the interface
+
+// Request represents a swagger client request.
+// It binds parameters to a HTTP request.
+//
+// The main purpose of this struct is to hide the machinery of adding OpenAPI v2 parameters to a transport request.
+//
+// A generated client only implements what is necessary to turn a parameter into a valid value for these methods.
+//
+// There is no parameter validation here, it is assumed to be used after a spec has been validated.
+//
+// # Request binding
+//
+// The binding of parameters is carried out by method [Request.BuildHTTPContext].
+//
+// It analyzes parameters, which may come in different flavors:
+//
+// - a file or multipart form containing a file
+// - a body which is a [io.Reader]
+// - a buffered body (regular schema body, including urlencoded form)
+//
+// In all cases, we may also have query or path parameters encoded in the URL, or header parameters.
+//
+// The result is a [http.Request], with the following properties:
+//
+// - file, multipart form or [io.Reader] body: a streaming request with an attached go routine that consumes the [io.Reader].
+// - buffered body: a simple request
+//
+// The caller passes the parent [context.Context] to [Request.BuildHTTPContext] and receives back a cancel
+// function to release the resources held by the derived request context once the response is consumed.
+//
+// # Authentication
+//
+// Authentication is built in the request by using a [runtime.ClientAuthInfoWriter].
+// This helper may need to inspect the body of the request before sending authentication info.
+// To cover that case, streaming bodies use a copy of the body [io.Reader] for the [runtime.ClientAuthInfoWriter]
+// to consume if it wants to.
+//
+// # Content negotiation
+//
+// The [Request] detects `multipart/form-data` to switch to streamed request.
+//
+// `application/x-www-form-urlencoded` is also honored, even for file parameters, which are not streamed in this case.
+// File parameters default behavior is `multipart/form-data`.
+//
+// The natural way to define the `Content-Type` header is to use the `contentType` parameter to switch to the map of
+// available body producers.
+//
+// For buffered requests, this setting override any `Content-Type` header possibly set by calling [Request.SetHeaderParam].
+//
+// For streamed requests, users may want more flexibility, as we enter custom territory, with use-cases not supported by OpenAPI v2.
+//
+// The `Content-Type` header of a streamed request is defined using the following sequence:
+//
+// 1. if the caller sets an explicit value already in header — the user set it via
+// [Request.SetHeaderParam] during WriteToRequest, and we treat that as an intentional escape hatch
+// 2. use payload's [runtime.ContentTyper] declaration (in this case, the produced payload knows its content type)
+// 3. use `application/octet-stream` if it is available in the registered producers
+// 4. otherwise set the picker's mediaType
+//
+// For multi-part requests, the content type of each part is auto-detected using the following sequence:
+//
+// 1. use [runtime.ContentTyper] declaration (in this case, the file payload knows its content type)
+// 2. use [http.DetectContentType] on the first 512 bytes of the file
+//
+// # Concurrency
+//
+// A [Request] is a disposable object that is NOT intended to be reused or called concurrently.
+//
+// # Future evolutions
+//
+// There might be other similar structs that convert to other transports.
+type Request struct {
+ pathPattern string
+ method string
+ writer runtime.ClientRequestWriter
+
+ pathParams map[string]string
+ header http.Header
+ query url.Values
+ formFields url.Values
+ fileFields map[string][]runtime.NamedReadCloser
+ payload any
+ // consumes carries the operation's full ConsumesMediaTypes list so
+ // that buildHTTP — which runs after the writer populates the payload
+ // — can apply payload-aware fallback rules (see streamFallbackMime).
+ //
+ // This is set by Runtime.createHttpRequest.
+ consumes []string
+ timeout time.Duration
+ buf *bytes.Buffer
+
+ getBody func(r *Request) []byte
+}
+
+// New creates a new http client [Request] to handle OpenAPI v2 parameters.
+func New(method, pathPattern string, writer runtime.ClientRequestWriter) *Request {
+ return &Request{
+ pathPattern: pathPattern,
+ method: method,
+ writer: writer,
+ header: make(http.Header),
+ query: make(url.Values),
+ timeout: 0,
+ getBody: getRequestBuffer,
+ }
+}
+
+// GetMethod yields the method being used.
+func (r *Request) GetMethod() string {
+ return r.method
+}
+
+// GetPath yields the URL path being used.
+func (r *Request) GetPath() string {
+ pth := r.pathPattern
+ for k, v := range r.pathParams {
+ pth = strings.ReplaceAll(pth, "{"+k+"}", v)
+ }
+
+ return pth
+}
+
+// GetBody returns the request body, if any.
+//
+// For streaming requests, this is a copy of the original [io.Reader].
+func (r *Request) GetBody() []byte {
+ return r.getBody(r)
+}
+
+// SetHeaderParam adds a header parameter to the request.
+//
+// The header key is always canonicalized.
+//
+// - when there is only 1 value provided, it will set it.
+// - when there are several values provided, it will add all of those (no overriding).
+func (r *Request) SetHeaderParam(name string, values ...string) error {
+ if r.header == nil {
+ r.header = make(http.Header)
+ }
+ r.header[http.CanonicalHeaderKey(name)] = values
+
+ return nil
+}
+
+// GetHeaderParams returns all headers currently set for the request.
+func (r *Request) GetHeaderParams() http.Header {
+ return r.header
+}
+
+// SetQueryParam adds a query parameter to the request.
+//
+// - when there is only 1 value provided, it will set it.
+// - when there are several values provided, it will add all of those (no overriding).
+func (r *Request) SetQueryParam(name string, values ...string) error {
+ if r.query == nil {
+ r.query = make(url.Values)
+ }
+ r.query[name] = values
+
+ return nil
+}
+
+// GetQueryParams returns a copy of all query params currently set for the request.
+func (r *Request) GetQueryParams() url.Values {
+ result := make(url.Values, len(r.query))
+ for key, values := range r.query {
+ result[key] = append([]string{}, values...)
+ }
+
+ return result
+}
+
+// SetFormParam adds a form param to the request.
+//
+// - when there is only 1 value provided, it will set it.
+// - when there are several values provided, it will add all of those (no overriding).
+func (r *Request) SetFormParam(name string, values ...string) error {
+ if r.formFields == nil {
+ r.formFields = make(url.Values)
+ }
+ r.formFields[name] = values
+
+ return nil
+}
+
+// SetPathParam adds a path param to the request.
+func (r *Request) SetPathParam(name string, value string) error {
+ if r.pathParams == nil {
+ r.pathParams = make(map[string]string)
+ }
+
+ r.pathParams[name] = value
+
+ return nil
+}
+
+// SetFileParam adds a file parameter to the request.
+//
+// Files must implement [runtime.NamedReadCloser].
+//
+// [runtime.File] is proposed as the default concrete implementation.
+func (r *Request) SetFileParam(name string, files ...runtime.NamedReadCloser) error {
+ for _, file := range files {
+ if actualFile, ok := file.(*os.File); ok {
+ fi, err := os.Stat(actualFile.Name())
+ if err != nil {
+ return err
+ }
+
+ if fi.IsDir() {
+ return fmt.Errorf("%q is a directory, only files are supported", file.Name())
+ }
+ }
+ }
+
+ if r.fileFields == nil {
+ r.fileFields = make(map[string][]runtime.NamedReadCloser)
+ }
+
+ if r.formFields == nil {
+ r.formFields = make(url.Values)
+ }
+
+ r.fileFields[name] = files
+
+ return nil
+}
+
+// GetFileParam yields all file parameters.
+func (r *Request) GetFileParam() map[string][]runtime.NamedReadCloser {
+ return r.fileFields
+}
+
+// SetBodyParam sets a body parameter on the request.
+//
+// This does not yet serialize the object: actual serialization happens as late as possible.
+func (r *Request) SetBodyParam(payload any) error {
+ r.payload = payload
+
+ return nil
+}
+
+// GetBodyParam returns the body payload.
+func (r *Request) GetBodyParam() any {
+ return r.payload
+}
+
+// GetTimeout sets the timeout for a request.
+func (r *Request) GetTimeout() time.Duration {
+ return r.timeout
+}
+
+// SetTimeout sets the timeout for a request.
+func (r *Request) SetTimeout(timeout time.Duration) error {
+ r.timeout = timeout
+
+ return nil
+}
+
+// SetConsumes sets the list of registered consumed content for a request.
+func (r *Request) SetConsumes(consumers []string) {
+ r.consumes = consumers
+}
+
+// BuildHTTPContext binds the request parameters and returns a ready-to-send [http.Request].
+//
+// Dispatch picks one of two end-to-end builders based on whether:
+//
+// - the body source is a stream (multipart pipe or stream payload)
+// - or a buffer (urlencoded form, producer output, or no body)
+//
+// It starts by writing the request, then proceed with adding authentication,
+// then finally assembling URL or header parameters.
+//
+// The split mirrors the auth question: streaming bodies require a lazy body-copy closure during [AuthenticateRequest],
+// whereas buffered bodies do not.
+//
+// The returned [http.Request] carries a context derived from parentCtx that:
+//
+// - inherits any deadline or cancellation already set on parentCtx;
+// - additionally honors the per-request timeout set via [Request.SetTimeout]
+// (the [runtime.ClientRequestWriter] may override the runtime default during
+// WriteToRequest, which is why the derivation happens here rather than
+// at the call site).
+//
+// The returned cancel must be invoked by the caller (typically deferred)
+// once the response has been fully read; otherwise resources held by the
+// derived context — including any timeout timer — are leaked.
+//
+// On error the cancel is invoked internally and a no-op cancel is returned,
+// so callers can defer cancel unconditionally.
+func (r *Request) BuildHTTPContext(parentCtx context.Context, mediaType, basePath string,
+ producers map[string]runtime.Producer, registry strfmt.Registry, auth runtime.ClientAuthInfoWriter,
+) (*http.Request, context.CancelFunc, error) {
+ if err := r.writer.WriteToRequest(r, registry); err != nil {
+ return nil, noop, err
+ }
+
+ ctx, cancel := deriveRequestContext(parentCtx, r.timeout)
+ r.buf = bytes.NewBuffer(nil)
+
+ var (
+ httpReq *http.Request
+ err error
+ )
+ if r.usesStreamingBody(mediaType) {
+ httpReq, err = r.buildStreamingRequest(ctx, mediaType, basePath, producers, registry, auth)
+ } else {
+ httpReq, err = r.buildBufferedRequest(ctx, mediaType, basePath, producers, registry, auth)
+ }
+ if err != nil {
+ cancel()
+ return nil, noop, err
+ }
+ return httpReq, cancel, nil
+}
+
+func noop() {}
+
+// deriveRequestContext returns a child of parent bounded by timeout.
+// If timeout == 0 the child is only canceled when the caller invokes
+// cancel; any deadline already on parent is preserved. If timeout > 0
+// the child uses the shortest of timeout and parent's existing deadline.
+func deriveRequestContext(parent context.Context, timeout time.Duration) (context.Context, context.CancelFunc) {
+ if timeout == 0 {
+ return context.WithCancel(parent)
+ }
+ return context.WithTimeout(parent, timeout)
+}
+
+// usesStreamingBody reports whether the request body must be assembled
+// as a stream (an io.Pipe for multipart, or the payload's own reader
+// for stream payloads).
+//
+// The complementary case is a fully buffered body in r.buf — urlencoded form, producer output, or no body at all.
+func (r *Request) usesStreamingBody(mediaType string) bool {
+ if (len(r.formFields) > 0 || len(r.fileFields) > 0) && r.isMultipart(mediaType) {
+ return true
+ }
+
+ if r.payload != nil {
+ if _, ok := r.payload.(io.Reader); ok {
+ return true
+ }
+ }
+
+ return false
+}
+
+func (r *Request) isMultipart(mediaType string) bool {
+ // Strip media-type parameters before comparing: callers may legally
+ // pass `multipart/form-data; boundary=…` or
+ // `application/x-www-form-urlencoded; charset=utf-8` per RFC 7231,
+ // and a bare-string compare would route those to the wrong flow.
+ //
+ // mime.ParseMediaType lowercases the type/subtype and is
+ // case-insensitive on input, so plain == against our (lowercase)
+ // constants is sufficient on the happy path.
+ base, _, err := mime.ParseMediaType(mediaType)
+ if err != nil {
+ // Malformed mediaType: only the file-presence shortcut can
+ // fire — by definition we cannot recognize either canonical
+ // form mime in unparseable input.
+ return len(r.fileFields) > 0
+ }
+
+ // An explicit application/x-www-form-urlencoded choice is honored even when
+ // file fields are present: the spec allows files to travel as URL-encoded
+ // form values, although it does not stream and is discouraged. Without this
+ // short-circuit, picking urlencoded with files would silently fall back to
+ // multipart and emit an inconsistent Content-Type.
+ if base == runtime.URLencodedFormMime {
+ return false
+ }
+
+ if len(r.fileFields) > 0 {
+ return true
+ }
+
+ return base == runtime.MultipartFormMime
+}
+
+// buildBufferedRequest assembles a request whose body is fully
+// buffered in r.buf before AuthenticateRequest runs — urlencoded form,
+// producer-serialized payload, or no body.
+//
+// Auth is trivial in this flow because the buffer is already populated when the auth helper
+// asks for the body via r.GetBody().
+func (r *Request) buildBufferedRequest(ctx context.Context, mediaType, basePath string,
+ producers map[string]runtime.Producer, registry strfmt.Registry, auth runtime.ClientAuthInfoWriter,
+) (*http.Request, error) {
+ var body io.Reader
+ var err error
+
+ switch {
+ case len(r.formFields) > 0 || len(r.fileFields) > 0:
+ body, err = r.writeURLEncodedBody(mediaType)
+ case r.payload != nil:
+ body, err = r.writeNonStreamPayload(mediaType, producers)
+ }
+ if err != nil {
+ return nil, err
+ }
+
+ if runtime.CanHaveBody(r.method) && body != nil && r.header.Get(runtime.HeaderContentType) == "" {
+ r.header.Set(runtime.HeaderContentType, mediaType)
+ }
+
+ if auth != nil {
+ if err := auth.AuthenticateRequest(r, registry); err != nil {
+ return nil, err
+ }
+ }
+
+ return r.assembleRequest(ctx, basePath, body)
+}
+
+// buildStreamingRequest assembles a request whose body is a stream —
+// either an io.Pipe filled by the multipart goroutine, or the
+// payload's own io.Reader.
+//
+// AuthenticateRequest consumes the body lazily through the getBody closure installed by
+// applyAuthWithBodyCopy, which buffers the stream into r.buf so the http.Request can use the buffered copy.
+//
+// On any error path before the http.Request takes ownership of body, we close the body to release
+// the underlying resource.
+//
+// For multipart this unblocks the spawned writer goroutine
+// (it would otherwise park forever on pw.Write with no reader).
+//
+// For stream payloads it closes the user-provided io.ReadCloser.
+func (r *Request) buildStreamingRequest(ctx context.Context, mediaType, basePath string,
+ producers map[string]runtime.Producer, registry strfmt.Registry, auth runtime.ClientAuthInfoWriter,
+) (req *http.Request, retErr error) {
+ var body io.Reader
+ if len(r.formFields) > 0 || len(r.fileFields) > 0 {
+ body = r.writeMultipartBody(ctx, mediaType)
+ } else {
+ body = r.writeStreamPayload(mediaType, producers)
+ }
+
+ defer func() {
+ if retErr == nil {
+ return
+ }
+ if c, ok := body.(io.Closer); ok {
+ _ = c.Close()
+ }
+ }()
+
+ if runtime.CanHaveBody(r.method) && body != nil && r.header.Get(runtime.HeaderContentType) == "" {
+ r.header.Set(runtime.HeaderContentType, mediaType)
+ }
+
+ body, err := r.applyAuthWithBodyCopy(auth, body, registry)
+ if err != nil {
+ return nil, err
+ }
+
+ return r.assembleRequest(ctx, basePath, body)
+}
+
+// assembleRequest is the shared tail of both flows: build the URL
+// path, create the http.Request, merge static query parameters, and
+// finalize headers/query.
+func (r *Request) assembleRequest(ctx context.Context, basePath string, body io.Reader) (*http.Request, error) {
+ urlPath, staticQueryParams, err := r.resolveURLPath(basePath)
+ if err != nil {
+ return nil, err
+ }
+
+ req, err := http.NewRequestWithContext(ctx, r.method, urlPath, body)
+ if err != nil {
+ return nil, err
+ }
+
+ if err := r.mergeStaticQuery(staticQueryParams); err != nil {
+ return nil, err
+ }
+
+ req.URL.RawQuery = r.query.Encode()
+ req.Header = r.header
+
+ return req, nil
+}
+
+// resolveURLPath builds the final url path string and returns the static
+// query parameters extracted from basePath and r.pathPattern.
+//
+// Static query parameters from the path pattern take precedence over those
+// from the base path; merging with r.query is the caller's responsibility
+// (see [request.mergeStaticQuery]).
+//
+// The path is assembled from basePath + pathPattern with path-param
+// substitution and trailing-slash preservation when the original
+// pathPattern carried one.
+func (r *Request) resolveURLPath(basePath string) (string, url.Values, error) {
+ basePathURL, err := url.Parse(basePath)
+ if err != nil {
+ return "", nil, err
+ }
+ staticQueryParams := basePathURL.Query()
+
+ pathPatternURL, err := url.Parse(r.pathPattern)
+ if err != nil {
+ return "", nil, err
+ }
+ for name, values := range pathPatternURL.Query() {
+ if _, present := staticQueryParams[name]; present {
+ staticQueryParams.Del(name)
+ }
+ for _, value := range values {
+ staticQueryParams.Add(name, value)
+ }
+ }
+
+ // path.Join strips trailing slashes; reinstate one whenever the
+ // pathPattern carried it, including the bare-root case ("/" under a
+ // non-empty basePath, which path.Join would collapse to "/basepath").
+ // The HasSuffix check on urlPath keeps the rewrite idempotent and
+ // avoids producing "//" when basePath is "/" or empty.
+ reinstateSlash := strings.HasSuffix(pathPatternURL.Path, "/")
+
+ urlPath := path.Join(basePathURL.Path, pathPatternURL.Path)
+ for k, v := range r.pathParams {
+ urlPath = strings.ReplaceAll(urlPath, "{"+k+"}", url.PathEscape(v))
+ }
+ if reinstateSlash && !strings.HasSuffix(urlPath, "/") {
+ urlPath += "/"
+ }
+
+ return urlPath, staticQueryParams, nil
+}
+
+// applyAuthWithBodyCopy runs auth.AuthenticateRequest for the
+// streaming flow, where the http.Request body is a pipe or a payload
+// reader rather than r.buf. If AuthenticateRequest asks for the body
+// via r.GetBody(), the lazy closure copies the stream into r.buf on
+// demand and reassigns body to r.buf so the post-auth source passed
+// to http.NewRequestWithContext is the buffered copy.
+//
+// The closure is registered lazily because there is no way to know
+// ahead of time whether AuthenticateRequest will read the body.
+//
+// On error precedence: a copy error is reported in preference to the
+// AuthenticateRequest error, because a mis-read body may have
+// interfered with auth.
+//
+// No-op when auth is nil; returns body unchanged.
+func (r *Request) applyAuthWithBodyCopy(auth runtime.ClientAuthInfoWriter, body io.Reader, registry strfmt.Registry) (io.Reader, error) {
+ if auth == nil {
+ return body, nil
+ }
+
+ var copyErr error
+ var copied bool
+ r.getBody = func(r *Request) []byte {
+ if copied {
+ return getRequestBuffer(r)
+ }
+
+ defer func() {
+ copied = true
+ }()
+
+ if _, copyErr = io.Copy(r.buf, body); copyErr != nil {
+ return nil
+ }
+
+ if closer, ok := body.(io.ReadCloser); ok {
+ if copyErr = closer.Close(); copyErr != nil {
+ return nil
+ }
+ }
+
+ body = r.buf
+ return getRequestBuffer(r)
+ }
+
+ authErr := auth.AuthenticateRequest(r, registry)
+
+ // On error we return body alongside the error so the caller's
+ // cleanup defer (in buildStreamingRequest) can close the
+ // underlying pipe/stream. Caller treats body as ignorable when
+ // err != nil per Go convention; the defer reads it via closure.
+ if copyErr != nil {
+ return body, fmt.Errorf("error copying the request body: %w", copyErr)
+ }
+
+ if authErr != nil {
+ return body, authErr
+ }
+
+ return body, nil
+}
+
+// mergeStaticQuery overlays staticQuery onto r.query. On conflict r.query
+// wins — the parameters set by the client take precedence over the ones
+// extracted from basePath / pathPattern.
+func (r *Request) mergeStaticQuery(staticQuery url.Values) error {
+ originalParams := r.GetQueryParams()
+ for k, v := range staticQuery {
+ if _, present := originalParams[k]; present {
+ continue
+ }
+ if err := r.SetQueryParam(k, v...); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+// writeURLEncodedBody serializes form fields (and any file fields, per
+// Swagger 2.0 fallback semantics) into r.buf as
+// application/x-www-form-urlencoded. Sets Content-Type to mediaType and
+// returns r.buf as the body source.
+//
+// Per Swagger 2.0, file form parameters can be sent under
+// application/x-www-form-urlencoded by including the file content as a
+// regular form-field value. The whole form is then percent-encoded as
+// usual. This buffers the entire payload and does not preserve a
+// per-file Content-Type — multipart/form-data is preferred when both
+// are advertised by the operation.
+func (r *Request) writeURLEncodedBody(mediaType string) (io.Reader, error) {
+ r.header.Set(runtime.HeaderContentType, mediaType)
+ values := url.Values{}
+ for k, vs := range r.formFields {
+ values[k] = append(values[k], vs...)
+ }
+ for fn, ff := range r.fileFields {
+ for _, fi := range ff {
+ data, ferr := io.ReadAll(fi)
+ if cerr := fi.Close(); cerr != nil && ferr == nil {
+ ferr = cerr
+ }
+ if ferr != nil {
+ return nil, ferr
+ }
+ values.Add(fn, string(data))
+ }
+ }
+ r.buf.WriteString(values.Encode())
+ return r.buf, nil
+}
+
+// writeMultipartBody assembles a multipart/form-data body via an
+// io.Pipe. A goroutine streams form fields and files into the pipe
+// writer; the pipe reader is returned as the body. Sets Content-Type to
+// the multipart media type with the writer's boundary parameter.
+//
+// The goroutine owns the pipe writer's lifecycle: it closes the
+// multipart writer (flushing the closing boundary) and the pipe writer
+// when it finishes or hits an error.
+func (r *Request) writeMultipartBody(ctx context.Context, mediaType string) io.Reader {
+ pr, pw := io.Pipe()
+ mp := multipart.NewWriter(pw)
+ r.header.Set(runtime.HeaderContentType, mangleContentType(mediaType, mp.Boundary()))
+
+ go r.streamMultipartParts(ctx, mp, pw)
+
+ return pr
+}
+
+// streamMultipartParts writes form fields then file fields to mp,
+// closing mp and pw when done.
+//
+// Errors are reported by closing pw with the error so the consumer of pr observes them on its next Read.
+//
+// Context cancellation is observed at iteration boundaries (between
+// fields and between files) and during file copy via a context-aware
+// reader. When ctx is canceled the pipe writer is closed with ctx.Err()
+// so the body consumer surfaces the cancellation as the read error.
+func (r *Request) streamMultipartParts(ctx context.Context, mp *multipart.Writer, pw *io.PipeWriter) {
+ defer func() {
+ mp.Close()
+ pw.Close()
+ }()
+
+ for fn, v := range r.formFields {
+ for _, vi := range v {
+ if err := ctx.Err(); err != nil {
+ _ = pw.CloseWithError(err)
+ return
+ }
+ if err := mp.WriteField(fn, vi); err != nil {
+ logClose(err, pw)
+ return
+ }
+ }
+ }
+
+ defer func() {
+ for _, ff := range r.fileFields {
+ for _, ffi := range ff {
+ ffi.Close()
+ }
+ }
+ }()
+
+ for fn, f := range r.fileFields {
+ for _, fi := range f {
+ if err := ctx.Err(); err != nil {
+ _ = pw.CloseWithError(err)
+ return
+ }
+
+ var fileContentType string
+ if p, ok := fi.(runtime.ContentTyper); ok {
+ fileContentType = p.ContentType()
+ } else {
+ // Need to read the data so that we can detect the content type
+ const contentTypeBufferSize = 512
+ buf := make([]byte, contentTypeBufferSize)
+ size, err := fi.Read(buf)
+ if err != nil && !errors.Is(err, io.EOF) {
+ logClose(err, pw)
+ return
+ }
+ fileContentType = http.DetectContentType(buf)
+ fi = runtime.NamedReader(fi.Name(), io.MultiReader(bytes.NewReader(buf[:size]), fi))
+ }
+
+ // Create the MIME headers for the new part
+ h := make(textproto.MIMEHeader)
+ h.Set("Content-Disposition",
+ fmt.Sprintf(`form-data; name="%s"; filename="%s"`,
+ escapeQuotes(fn), escapeQuotes(filepath.Base(fi.Name()))))
+ h.Set("Content-Type", fileContentType)
+
+ wrtr, err := mp.CreatePart(h)
+ if err != nil {
+ logClose(err, pw)
+ return
+ }
+ if _, err := io.Copy(wrtr, &ctxReader{ctx: ctx, r: fi}); err != nil {
+ logClose(err, pw)
+ return
+ }
+ }
+ }
+}
+
+// ctxReader wraps an [io.Reader] with a context check on each Read. Once
+// ctx is done, subsequent Reads return ctx.Err() instead of delegating
+// to the underlying reader. It does not preempt a Read already in flight
+// — that is the source's responsibility (e.g. *os.File honors Close from
+// another goroutine, network sources honor SetDeadline).
+type ctxReader struct {
+ ctx context.Context //nolint:containedctx // io.Reader's Read method has no ctx parameter, so the wrapper must carry it on the struct
+ r io.Reader
+}
+
+func (cr *ctxReader) Read(p []byte) (int, error) {
+ if err := cr.ctx.Err(); err != nil {
+ return 0, err
+ }
+ return cr.r.Read(p)
+}
+
+// writeStreamPayload handles a stream payload (io.Reader /
+// io.ReadCloser). The bytes flow through verbatim — no producer is
+// invoked. The wire Content-Type is resolved via setStreamContentType
+// (priority: existing header, payload's ContentTyper,
+// streamFallbackMime, mediaType).
+//
+// Caller must ensure r.payload satisfies io.Reader (see
+// [request.usesStreamingBody]).
+func (r *Request) writeStreamPayload(mediaType string, producers map[string]runtime.Producer) io.Reader {
+ setStreamContentType(r.header, r.payload, mediaType, r.consumes, producers)
+ if rdr, ok := r.payload.(io.ReadCloser); ok {
+ return rdr
+ }
+
+ rdr, ok := r.payload.(io.Reader)
+ if !ok {
+ panic("internal error: payload expected to be an io.Reader") // guaranteed by earlier checks
+ }
+
+ return rdr
+}
+
+// writeNonStreamPayload runs the producer registered for mediaType
+// against r.payload, writing into r.buf. The Content-Type header
+// reflects the picker.
+//
+// SetHeaderParam("Content-Type", …) is intentionally NOT honored on
+// the producer path because the producer is dispatched off mediaType —
+// the wire header would otherwise misrepresent the body.
+//
+// The same reasoning applies to the form/multipart branch.
+func (r *Request) writeNonStreamPayload(mediaType string, producers map[string]runtime.Producer) (io.Reader, error) {
+ r.header.Set(runtime.HeaderContentType, mediaType)
+ producer, ok := producers[mediaType]
+ if !ok {
+ return nil, fmt.Errorf("no producer registered for content type %q (register one with Runtime.Producers)", mediaType)
+ }
+
+ if err := producer.Produce(r.buf, r.payload); err != nil {
+ return nil, err
+ }
+ return r.buf, nil
+}
+
+var quoter = strings.NewReplacer(
+ "\\", "\\\\",
+ `"`, "\\\"",
+ "\r", "_",
+ "\n", "_",
+)
+
+// escapeQuotes escapes backslash and double-quote for embedding in a
+// quoted-string Content-Disposition parameter value, and rewrites
+// CR / LF to '_' to prevent header-injection through attacker-influenced
+// field names or filenames.
+//
+// RFC 7578 §4.2 limits parameter values to printable characters; this
+// is the conservative subset relevant to security (control characters
+// that would split the header line into a forged header or part).
+// Mirrors the known stdlib gap golang/go#19038.
+func escapeQuotes(s string) string {
+ return quoter.Replace(s)
+}
+
+// setStreamContentType resolves and writes the wire Content-Type for a
+// stream payload (io.Reader / io.ReadCloser). Priority:
+//
+// 1. an explicit value already in header — the user set it via
+// SetHeaderParam during [ClientRequestWriter.WriteToRequest], and we treat that as an
+// intentional escape hatch;
+// 2. payload's [runtime.ContentTyper] declaration;
+// 3. [streamFallbackMime] (Stage-2 octet-stream upgrade);
+// 4. the picker's mediaType (passed in as the chain's terminal
+// fallback).
+//
+// Does not apply to non-stream payloads or to form/multipart bodies —
+// see the comment above the call site in [request.buildHTTP].
+func setStreamContentType(
+ header http.Header,
+ payload any,
+ mediaType string,
+ candidates []string,
+ producers map[string]runtime.Producer,
+) {
+ if header.Get(runtime.HeaderContentType) != "" {
+ return
+ }
+ fallback := streamFallbackMime(mediaType, candidates, producers)
+ header.Set(runtime.HeaderContentType, payloadContentType(payload, fallback))
+}
+
+// payloadContentType returns the payload's declared content type when
+// it implements [runtime.ContentTyper] with a non-empty result, and
+// fallback otherwise. Mirrors the per-file convention already used for
+// multipart upload parts (see [request.buildHTTP] file-fields branch).
+func payloadContentType(payload any, fallback string) string {
+ if t, ok := payload.(runtime.ContentTyper); ok {
+ if ct := t.ContentType(); ct != "" {
+ return ct
+ }
+ }
+
+ return fallback
+}
+
+// streamFallbackMime selects a wire content-type for a stream payload
+// (io.Reader / io.ReadCloser) that has neither implemented
+// `ContentType() string` nor declared an explicit value.
+//
+// The picker (Stage 1) ran without seeing the payload, so its choice
+// may be wildly wrong for raw bytes — e.g. picking application/json
+// for a payload that is just a stream of opaque data. When the
+// candidate consumes list also offers application/octet-stream and
+// the runtime has an octet-stream producer registered, that's a
+// safer wire type than the picker's choice: it advertises "raw bytes"
+// rather than making a structural claim about the body.
+//
+// If octet-stream is unavailable in either the candidate list or the
+// producer set, the picker's choice is preserved. The wire header
+// then continues to misrepresent the body — but no correct
+// alternative exists and we cannot infer one without more
+// information from the caller.
+func streamFallbackMime(picked string, candidates []string, producers map[string]runtime.Producer) string {
+ if strings.EqualFold(picked, runtime.DefaultMime) {
+ return picked
+ }
+
+ for _, c := range candidates {
+ if strings.EqualFold(c, runtime.DefaultMime) {
+ if _, ok := producers[runtime.DefaultMime]; ok {
+ return runtime.DefaultMime
+ }
+ }
+ }
+
+ return picked
+}
+
+func getRequestBuffer(r *Request) []byte {
+ if r.buf == nil {
+ return nil
+ }
+ return r.buf.Bytes()
+}
+
+func logClose(err error, pw *io.PipeWriter) {
+ log.Println(err)
+ closeErr := pw.CloseWithError(err)
+ if closeErr != nil {
+ log.Println(closeErr)
+ }
+}
+
+func mangleContentType(mediaType, boundary string) string {
+ _ = mediaType // reserved for future enhancement: honor caller-provided media type
+ // Proposal for enhancement: honor caller's boundary if specified
+ return "multipart/form-data; boundary=" + boundary
+}
diff --git a/vendor/github.com/go-openapi/runtime/client/keepalive.go b/vendor/github.com/go-openapi/runtime/client/keepalive.go
index 3bac5e272cf..6b6097d206f 100644
--- a/vendor/github.com/go-openapi/runtime/client/keepalive.go
+++ b/vendor/github.com/go-openapi/runtime/client/keepalive.go
@@ -34,20 +34,20 @@ func (k *keepAliveTransport) RoundTrip(r *http.Request) (*http.Response, error)
type drainingReadCloser struct {
rdr io.ReadCloser
- seenEOF uint32
+ seenEOF atomic.Uint32
}
func (d *drainingReadCloser) Read(p []byte) (n int, err error) {
n, err = d.rdr.Read(p)
if err == io.EOF || n == 0 {
- atomic.StoreUint32(&d.seenEOF, 1)
+ d.seenEOF.Store(1)
}
return
}
func (d *drainingReadCloser) Close() error {
// drain buffer
- if atomic.LoadUint32(&d.seenEOF) != 1 {
+ if d.seenEOF.Load() != 1 {
// If the reader side (a HTTP server) is misbehaving, it still may send
// some bytes, but the closer ignores them to keep the underling
// connection open.
diff --git a/vendor/github.com/go-openapi/runtime/client/opentelemetry.go b/vendor/github.com/go-openapi/runtime/client/opentelemetry.go
index 5054878c06c..e422f83cb12 100644
--- a/vendor/github.com/go-openapi/runtime/client/opentelemetry.go
+++ b/vendor/github.com/go-openapi/runtime/client/opentelemetry.go
@@ -4,18 +4,20 @@
package client
import (
+ "context"
"fmt"
"net/http"
"strings"
- "github.com/go-openapi/runtime"
- "github.com/go-openapi/strfmt"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/codes"
"go.opentelemetry.io/otel/propagation"
semconv "go.opentelemetry.io/otel/semconv/v1.37.0"
"go.opentelemetry.io/otel/trace"
+
+ "github.com/go-openapi/runtime"
+ "github.com/go-openapi/strfmt"
)
const (
@@ -23,6 +25,52 @@ const (
tracerName = "go-openapi"
)
+// WithOpenTelemetry adds opentelemetry support to the provided runtime.
+// A new client span is created for each request.
+// The provided opts are applied to each spans - for example to add global tags.
+//
+// The returned transport satisfies [runtime.ContextualTransport]: callers
+// should prefer [openTelemetryTransport.SubmitContext] over the
+// legacy [runtime.ClientOperation.Context] field. Setting that
+// field is still honored on the [openTelemetryTransport.Submit]
+// compatibility path.
+func (r *Runtime) WithOpenTelemetry(opts ...OpenTelemetryOpt) runtime.ContextualTransport {
+ return newOpenTelemetryTransport(r, r.Host, opts)
+}
+
+// WithOpenTracing adds opentracing support to the provided runtime.
+// A new client span is created for each request.
+// If the context of the client operation does not contain an active span, no span is created.
+// The provided opts are applied to each spans - for example to add global tags.
+//
+// Deprecated: use [WithOpenTelemetry] instead, as opentracing is now archived and superseded by opentelemetry.
+//
+// # Deprecation notice
+//
+// The [Runtime.WithOpenTracing] method has been deprecated in favor of [Runtime.WithOpenTelemetry].
+//
+// The method is still around so programs calling it will still build. However, it will return
+// an opentelemetry transport.
+//
+// If you have a strict requirement on using opentracing, you may still do so by importing
+// module [github.com/go-openapi/runtime/client-[middleware]/opentracing] and using
+// [github.com/go-openapi/runtime/client-[middleware]/opentracing.WithOpenTracing] with your
+// usual opentracing options and opentracing-enabled transport.
+//
+// Passed options are ignored unless they are of type [OpenTelemetryOpt].
+func (r *Runtime) WithOpenTracing(opts ...any) runtime.ContextualTransport {
+ otelOpts := make([]OpenTelemetryOpt, 0, len(opts))
+ for _, o := range opts {
+ otelOpt, ok := o.(OpenTelemetryOpt)
+ if !ok {
+ continue
+ }
+ otelOpts = append(otelOpts, otelOpt)
+ }
+
+ return r.WithOpenTelemetry(otelOpts...)
+}
+
type config struct {
Tracer trace.Tracer
Propagator propagation.TextMapPropagator
@@ -113,11 +161,31 @@ func newOpenTelemetryTransport(transport runtime.ClientTransport, host string, o
return tr
}
+// Submit implements [runtime.ClientTransport]. It honors the legacy
+// [runtime.ClientOperation.Context] field for backward compatibility
+// — that field is being phased out; new code should call
+// [openTelemetryTransport.SubmitContext] directly with an explicit
+// context.
func (t *openTelemetryTransport) Submit(op *runtime.ClientOperation) (any, error) {
- if op.Context == nil {
- return t.transport.Submit(op)
+ ctx := op.Context
+ if ctx == nil {
+ ctx = context.Background()
}
+ return t.SubmitContext(ctx, op)
+}
+// SubmitContext submits an operation with an explicit context that
+// drives both the tracing span and (when supported) the wrapped
+// transport's SubmitContext call. The legacy
+// [runtime.ClientOperation.Context] field is not consulted.
+//
+// When the wrapped transport implements [runtime.ContextualTransport], ctx is
+// forwarded directly via its SubmitContext. Otherwise, the legacy
+// Submit path is used: ctx is stamped onto op.Context for the
+// duration of that call and restored afterwards, so the wrapped
+// transport still receives a usable context. The legacy fallback
+// disappears once SubmitContext is universal (v2).
+func (t *openTelemetryTransport) SubmitContext(ctx context.Context, op *runtime.ClientOperation) (any, error) {
params := op.Params
reader := op.Reader
@@ -129,7 +197,7 @@ func (t *openTelemetryTransport) Submit(op *runtime.ClientOperation) (any, error
}()
op.Params = runtime.ClientRequestWriterFunc(func(req runtime.ClientRequest, reg strfmt.Registry) error {
- span = t.newOpenTelemetrySpan(op, req.GetHeaderParams())
+ span = t.newOpenTelemetrySpan(ctx, op, req.GetHeaderParams())
return params.WriteToRequest(req, reg)
})
@@ -149,7 +217,7 @@ func (t *openTelemetryTransport) Submit(op *runtime.ClientOperation) (any, error
return reader.ReadResponse(response, consumer)
})
- submit, err := t.transport.Submit(op)
+ submit, err := t.submitWrapped(ctx, op)
if err != nil && span != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
@@ -158,9 +226,18 @@ func (t *openTelemetryTransport) Submit(op *runtime.ClientOperation) (any, error
return submit, err
}
-func (t *openTelemetryTransport) newOpenTelemetrySpan(op *runtime.ClientOperation, header http.Header) trace.Span {
- ctx := op.Context
+//nolint:contextcheck // ctx is forwarded verbatim; the legacy Submit branch only stamps it onto op.Context for the wrapped transport.
+func (t *openTelemetryTransport) submitWrapped(ctx context.Context, op *runtime.ClientOperation) (any, error) {
+ if sc, ok := t.transport.(runtime.ContextualTransport); ok {
+ return sc.SubmitContext(ctx, op)
+ }
+ prev := op.Context
+ op.Context = ctx
+ defer func() { op.Context = prev }()
+ return t.transport.Submit(op)
+}
+func (t *openTelemetryTransport) newOpenTelemetrySpan(ctx context.Context, op *runtime.ClientOperation, header http.Header) trace.Span {
tracer := t.tracer
if tracer == nil {
if span := trace.SpanFromContext(ctx); span.SpanContext().IsValid() {
diff --git a/vendor/github.com/go-openapi/runtime/client/request.go b/vendor/github.com/go-openapi/runtime/client/request.go
deleted file mode 100644
index f16ee487bab..00000000000
--- a/vendor/github.com/go-openapi/runtime/client/request.go
+++ /dev/null
@@ -1,468 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
-// SPDX-License-Identifier: Apache-2.0
-
-package client
-
-import (
- "bytes"
- "context"
- "fmt"
- "io"
- "log"
- "mime/multipart"
- "net/http"
- "net/textproto"
- "net/url"
- "os"
- "path"
- "path/filepath"
- "strings"
- "time"
-
- "github.com/go-openapi/runtime"
- "github.com/go-openapi/strfmt"
-)
-
-var _ runtime.ClientRequest = new(request) // ensure compliance to the interface
-
-// Request represents a swagger client request.
-//
-// This Request struct converts to a HTTP request.
-// There might be others that convert to other transports.
-// There is no error checking here, it is assumed to be used after a spec has been validated.
-// so impossible combinations should not arise (hopefully).
-//
-// The main purpose of this struct is to hide the machinery of adding params to a transport request.
-// The generated code only implements what is necessary to turn a param into a valid value for these methods.
-type request struct {
- pathPattern string
- method string
- writer runtime.ClientRequestWriter
-
- pathParams map[string]string
- header http.Header
- query url.Values
- formFields url.Values
- fileFields map[string][]runtime.NamedReadCloser
- payload any
- timeout time.Duration
- buf *bytes.Buffer
-
- getBody func(r *request) []byte
-}
-
-// NewRequest creates a new swagger http client request.
-func newRequest(method, pathPattern string, writer runtime.ClientRequestWriter) *request {
- return &request{
- pathPattern: pathPattern,
- method: method,
- writer: writer,
- header: make(http.Header),
- query: make(url.Values),
- timeout: DefaultTimeout,
- getBody: getRequestBuffer,
- }
-}
-
-// BuildHTTP creates a new http request based on the data from the params.
-func (r *request) BuildHTTP(mediaType, basePath string, producers map[string]runtime.Producer, registry strfmt.Registry) (*http.Request, error) {
- return r.buildHTTP(mediaType, basePath, producers, registry, nil)
-}
-
-func (r *request) GetMethod() string {
- return r.method
-}
-
-func (r *request) GetPath() string {
- path := r.pathPattern
- for k, v := range r.pathParams {
- path = strings.ReplaceAll(path, "{"+k+"}", v)
- }
- return path
-}
-
-func (r *request) GetBody() []byte {
- return r.getBody(r)
-}
-
-// SetHeaderParam adds a header param to the request
-// when there is only 1 value provided for the varargs, it will set it.
-// when there are several values provided for the varargs it will add it (no overriding).
-func (r *request) SetHeaderParam(name string, values ...string) error {
- if r.header == nil {
- r.header = make(http.Header)
- }
- r.header[http.CanonicalHeaderKey(name)] = values
- return nil
-}
-
-// GetHeaderParams returns the all headers currently set for the request.
-func (r *request) GetHeaderParams() http.Header {
- return r.header
-}
-
-// SetQueryParam adds a query param to the request
-// when there is only 1 value provided for the varargs, it will set it.
-// when there are several values provided for the varargs it will add it (no overriding).
-func (r *request) SetQueryParam(name string, values ...string) error {
- if r.query == nil {
- r.query = make(url.Values)
- }
- r.query[name] = values
- return nil
-}
-
-// GetQueryParams returns a copy of all query params currently set for the request.
-func (r *request) GetQueryParams() url.Values {
- var result = make(url.Values)
- for key, value := range r.query {
- result[key] = append([]string{}, value...)
- }
- return result
-}
-
-// SetFormParam adds a forn param to the request
-// when there is only 1 value provided for the varargs, it will set it.
-// when there are several values provided for the varargs it will add it (no overriding).
-func (r *request) SetFormParam(name string, values ...string) error {
- if r.formFields == nil {
- r.formFields = make(url.Values)
- }
- r.formFields[name] = values
- return nil
-}
-
-// SetPathParam adds a path param to the request.
-func (r *request) SetPathParam(name string, value string) error {
- if r.pathParams == nil {
- r.pathParams = make(map[string]string)
- }
-
- r.pathParams[name] = value
- return nil
-}
-
-// SetFileParam adds a file param to the request.
-func (r *request) SetFileParam(name string, files ...runtime.NamedReadCloser) error {
- for _, file := range files {
- if actualFile, ok := file.(*os.File); ok {
- fi, err := os.Stat(actualFile.Name())
- if err != nil {
- return err
- }
- if fi.IsDir() {
- return fmt.Errorf("%q is a directory, only files are supported", file.Name())
- }
- }
- }
-
- if r.fileFields == nil {
- r.fileFields = make(map[string][]runtime.NamedReadCloser)
- }
- if r.formFields == nil {
- r.formFields = make(url.Values)
- }
-
- r.fileFields[name] = files
- return nil
-}
-
-func (r *request) GetFileParam() map[string][]runtime.NamedReadCloser {
- return r.fileFields
-}
-
-// SetBodyParam sets a body parameter on the request.
-// This does not yet serialze the object, this happens as late as possible.
-func (r *request) SetBodyParam(payload any) error {
- r.payload = payload
- return nil
-}
-
-func (r *request) GetBodyParam() any {
- return r.payload
-}
-
-// SetTimeout sets the timeout for a request.
-func (r *request) SetTimeout(timeout time.Duration) error {
- r.timeout = timeout
- return nil
-}
-
-func (r *request) isMultipart(mediaType string) bool {
- if len(r.fileFields) > 0 {
- return true
- }
-
- return runtime.MultipartFormMime == mediaType
-}
-
-func (r *request) buildHTTP(mediaType, basePath string, producers map[string]runtime.Producer, registry strfmt.Registry, auth runtime.ClientAuthInfoWriter) (*http.Request, error) { //nolint:gocyclo,maintidx
- // build the data
- if err := r.writer.WriteToRequest(r, registry); err != nil {
- return nil, err
- }
-
- // Our body must be an io.Reader.
- // When we create the http.Request, if we pass it a
- // bytes.Buffer then it will wrap it in an io.ReadCloser
- // and set the content length automatically.
- var body io.Reader
- var pr *io.PipeReader
- var pw *io.PipeWriter
-
- r.buf = bytes.NewBuffer(nil)
- if r.payload != nil || len(r.formFields) > 0 || len(r.fileFields) > 0 {
- body = r.buf
- if r.isMultipart(mediaType) {
- pr, pw = io.Pipe()
- body = pr
- }
- }
-
- // check if this is a form type request
- if len(r.formFields) > 0 || len(r.fileFields) > 0 {
- if !r.isMultipart(mediaType) {
- r.header.Set(runtime.HeaderContentType, mediaType)
- formString := r.formFields.Encode()
- r.buf.WriteString(formString)
- goto DoneChoosingBodySource
- }
-
- mp := multipart.NewWriter(pw)
- r.header.Set(runtime.HeaderContentType, mangleContentType(mediaType, mp.Boundary()))
-
- go func() {
- defer func() {
- mp.Close()
- pw.Close()
- }()
-
- for fn, v := range r.formFields {
- for _, vi := range v {
- if err := mp.WriteField(fn, vi); err != nil {
- logClose(err, pw)
- return
- }
- }
- }
-
- defer func() {
- for _, ff := range r.fileFields {
- for _, ffi := range ff {
- ffi.Close()
- }
- }
- }()
- for fn, f := range r.fileFields {
- for _, fi := range f {
- var fileContentType string
- if p, ok := fi.(interface {
- ContentType() string
- }); ok {
- fileContentType = p.ContentType()
- } else {
- // Need to read the data so that we can detect the content type
- const contentTypeBufferSize = 512
- buf := make([]byte, contentTypeBufferSize)
- size, err := fi.Read(buf)
- if err != nil && err != io.EOF {
- logClose(err, pw)
- return
- }
- fileContentType = http.DetectContentType(buf)
- fi = runtime.NamedReader(fi.Name(), io.MultiReader(bytes.NewReader(buf[:size]), fi))
- }
-
- // Create the MIME headers for the new part
- h := make(textproto.MIMEHeader)
- h.Set("Content-Disposition",
- fmt.Sprintf(`form-data; name="%s"; filename="%s"`,
- escapeQuotes(fn), escapeQuotes(filepath.Base(fi.Name()))))
- h.Set("Content-Type", fileContentType)
-
- wrtr, err := mp.CreatePart(h)
- if err != nil {
- logClose(err, pw)
- return
- }
- if _, err := io.Copy(wrtr, fi); err != nil {
- logClose(err, pw)
- }
- }
- }
- }()
-
- goto DoneChoosingBodySource
- }
-
- // if there is payload, use the producer to write the payload, and then
- // set the header to the content-type appropriate for the payload produced
- if r.payload != nil {
- // Enhancement proposal: https://github.com/go-openapi/runtime/issues/387
- r.header.Set(runtime.HeaderContentType, mediaType)
- if rdr, ok := r.payload.(io.ReadCloser); ok {
- body = rdr
- goto DoneChoosingBodySource
- }
-
- if rdr, ok := r.payload.(io.Reader); ok {
- body = rdr
- goto DoneChoosingBodySource
- }
-
- producer := producers[mediaType]
- if err := producer.Produce(r.buf, r.payload); err != nil {
- return nil, err
- }
- }
-
-DoneChoosingBodySource:
-
- if runtime.CanHaveBody(r.method) && body != nil && r.header.Get(runtime.HeaderContentType) == "" {
- r.header.Set(runtime.HeaderContentType, mediaType)
- }
-
- if auth != nil {
- // If we're not using r.buf as our http.Request's body,
- // either the payload is an io.Reader or io.ReadCloser,
- // or we're doing a multipart form/file.
- //
- // In those cases, if the AuthenticateRequest call asks for the body,
- // we must read it into a buffer and provide that, then use that buffer
- // as the body of our http.Request.
- //
- // This is done in-line with the GetBody() request rather than ahead
- // of time, because there's no way to know if the AuthenticateRequest
- // will even ask for the body of the request.
- //
- // If for some reason the copy fails, there's no way to return that
- // error to the GetBody() call, so return it afterwards.
- //
- // An error from the copy action is prioritized over any error
- // from the AuthenticateRequest call, because the mis-read
- // body may have interfered with the auth.
- //
- var copyErr error
- if buf, ok := body.(*bytes.Buffer); body != nil && (!ok || buf != r.buf) {
- var copied bool
- r.getBody = func(r *request) []byte {
- if copied {
- return getRequestBuffer(r)
- }
-
- defer func() {
- copied = true
- }()
-
- if _, copyErr = io.Copy(r.buf, body); copyErr != nil {
- return nil
- }
-
- if closer, ok := body.(io.ReadCloser); ok {
- if copyErr = closer.Close(); copyErr != nil {
- return nil
- }
- }
-
- body = r.buf
- return getRequestBuffer(r)
- }
- }
-
- authErr := auth.AuthenticateRequest(r, registry)
-
- if copyErr != nil {
- return nil, fmt.Errorf("error retrieving the response body: %v", copyErr)
- }
-
- if authErr != nil {
- return nil, authErr
- }
- }
-
- // In case the basePath or the request pathPattern include static query parameters,
- // parse those out before constructing the final path. The parameters themselves
- // will be merged with the ones set by the client, with the priority given first to
- // the ones set by the client, then the path pattern, and lastly the base path.
- basePathURL, err := url.Parse(basePath)
- if err != nil {
- return nil, err
- }
- staticQueryParams := basePathURL.Query()
-
- pathPatternURL, err := url.Parse(r.pathPattern)
- if err != nil {
- return nil, err
- }
- for name, values := range pathPatternURL.Query() {
- if _, present := staticQueryParams[name]; present {
- staticQueryParams.Del(name)
- }
- for _, value := range values {
- staticQueryParams.Add(name, value)
- }
- }
-
- // create http request
- var reinstateSlash bool
- if pathPatternURL.Path != "" && pathPatternURL.Path != "/" && pathPatternURL.Path[len(pathPatternURL.Path)-1] == '/' {
- reinstateSlash = true
- }
-
- urlPath := path.Join(basePathURL.Path, pathPatternURL.Path)
- for k, v := range r.pathParams {
- urlPath = strings.ReplaceAll(urlPath, "{"+k+"}", url.PathEscape(v))
- }
- if reinstateSlash {
- urlPath += "/"
- }
-
- req, err := http.NewRequestWithContext(context.Background(), r.method, urlPath, body)
- if err != nil {
- return nil, err
- }
-
- originalParams := r.GetQueryParams()
-
- // Merge the query parameters extracted from the basePath with the ones set by
- // the client in this struct. In case of conflict, the client wins.
- for k, v := range staticQueryParams {
- _, present := originalParams[k]
- if !present {
- if err = r.SetQueryParam(k, v...); err != nil {
- return nil, err
- }
- }
- }
-
- req.URL.RawQuery = r.query.Encode()
- req.Header = r.header
-
- return req, nil
-}
-
-func escapeQuotes(s string) string {
- return strings.NewReplacer("\\", "\\\\", `"`, "\\\"").Replace(s)
-}
-
-func getRequestBuffer(r *request) []byte {
- if r.buf == nil {
- return nil
- }
- return r.buf.Bytes()
-}
-
-func logClose(err error, pw *io.PipeWriter) {
- log.Println(err)
- closeErr := pw.CloseWithError(err)
- if closeErr != nil {
- log.Println(closeErr)
- }
-}
-
-func mangleContentType(mediaType, boundary string) string {
- if strings.ToLower(mediaType) == runtime.URLencodedFormMime {
- return fmt.Sprintf("%s; boundary=%s", mediaType, boundary)
- }
- return "multipart/form-data; boundary=" + boundary
-}
diff --git a/vendor/github.com/go-openapi/runtime/client/runtime.go b/vendor/github.com/go-openapi/runtime/client/runtime.go
index eeb17dfb24e..b890f9f4133 100644
--- a/vendor/github.com/go-openapi/runtime/client/runtime.go
+++ b/vendor/github.com/go-openapi/runtime/client/runtime.go
@@ -5,25 +5,19 @@ package client
import (
"context"
- "crypto"
- "crypto/ecdsa"
- "crypto/rsa"
- "crypto/tls"
- "crypto/x509"
- "encoding/pem"
- "errors"
"fmt"
"mime"
"net/http"
"net/http/httputil"
- "os"
"strings"
"sync"
"time"
"github.com/go-openapi/runtime"
+ "github.com/go-openapi/runtime/client/internal/request"
"github.com/go-openapi/runtime/logger"
"github.com/go-openapi/runtime/middleware"
+ "github.com/go-openapi/runtime/server-middleware/mediatype"
"github.com/go-openapi/runtime/yamlpc"
"github.com/go-openapi/strfmt"
)
@@ -36,184 +30,6 @@ const (
// DefaultTimeout the default request timeout.
var DefaultTimeout = 30 * time.Second
-// TLSClientOptions to configure client authentication with mutual TLS.
-type TLSClientOptions struct {
- // Certificate is the path to a PEM-encoded certificate to be used for
- // client authentication. If set then Key must also be set.
- Certificate string
-
- // LoadedCertificate is the certificate to be used for client authentication.
- // This field is ignored if Certificate is set. If this field is set, LoadedKey
- // is also required.
- LoadedCertificate *x509.Certificate
-
- // Key is the path to an unencrypted PEM-encoded private key for client
- // authentication. This field is required if Certificate is set.
- Key string
-
- // LoadedKey is the key for client authentication. This field is required if
- // LoadedCertificate is set.
- LoadedKey crypto.PrivateKey
-
- // CA is a path to a PEM-encoded certificate that specifies the root certificate
- // to use when validating the TLS certificate presented by the server. If this field
- // (and LoadedCA) is not set, the system certificate pool is used. This field is ignored if LoadedCA
- // is set.
- CA string
-
- // LoadedCA specifies the root certificate to use when validating the server's TLS certificate.
- // If this field (and CA) is not set, the system certificate pool is used.
- LoadedCA *x509.Certificate
-
- // LoadedCAPool specifies a pool of RootCAs to use when validating the server's TLS certificate.
- // If set, it will be combined with the other loaded certificates (see LoadedCA and CA).
- // If neither LoadedCA or CA is set, the provided pool with override the system
- // certificate pool.
- // The caller must not use the supplied pool after calling TLSClientAuth.
- LoadedCAPool *x509.CertPool
-
- // ServerName specifies the hostname to use when verifying the server certificate.
- // If this field is set then InsecureSkipVerify will be ignored and treated as
- // false.
- ServerName string
-
- // InsecureSkipVerify controls whether the certificate chain and hostname presented
- // by the server are validated. If true, any certificate is accepted.
- InsecureSkipVerify bool
-
- // VerifyPeerCertificate, if not nil, is called after normal
- // certificate verification. It receives the raw ASN.1 certificates
- // provided by the peer and also any verified chains that normal processing found.
- // If it returns a non-nil error, the handshake is aborted and that error results.
- //
- // If normal verification fails then the handshake will abort before
- // considering this callback. If normal verification is disabled by
- // setting InsecureSkipVerify then this callback will be considered but
- // the verifiedChains argument will always be nil.
- VerifyPeerCertificate func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error
-
- // VerifyConnection, if not nil, is called after normal certificate
- // verification and after [TLSClientOptions.VerifyPeerCertificate] by either a TLS client or
- // server. It receives the [tls.ConnectionState] which may be inspected.
- //
- // Unlike VerifyPeerCertificate, this callback is invoked on every
- // connection, including resumed ones, making it suitable for checks
- // that must always apply (e.g. certificate pinning).
- //
- // If it returns a non-nil error, the handshake is aborted and that error results.
- VerifyConnection func(tls.ConnectionState) error
-
- // SessionTicketsDisabled may be set to true to disable session ticket and
- // PSK (resumption) support. Note that on clients, session ticket support is
- // also disabled if ClientSessionCache is nil.
- SessionTicketsDisabled bool
-
- // ClientSessionCache is a cache of ClientSessionState entries for TLS
- // session resumption. It is only used by clients.
- ClientSessionCache tls.ClientSessionCache
-
- // Prevents callers using unkeyed fields.
- _ struct{}
-}
-
-// TLSClientAuth creates a [tls.Config] for mutual auth.
-func TLSClientAuth(opts TLSClientOptions) (*tls.Config, error) {
- // create client tls config
- cfg := &tls.Config{
- MinVersion: tls.VersionTLS12,
- }
-
- // load client cert if specified
- if opts.Certificate != "" {
- cert, err := tls.LoadX509KeyPair(opts.Certificate, opts.Key)
- if err != nil {
- return nil, fmt.Errorf("tls client cert: %v", err)
- }
- cfg.Certificates = []tls.Certificate{cert}
- } else if opts.LoadedCertificate != nil {
- block := pem.Block{Type: "CERTIFICATE", Bytes: opts.LoadedCertificate.Raw}
- certPem := pem.EncodeToMemory(&block)
-
- var keyBytes []byte
- switch k := opts.LoadedKey.(type) {
- case *rsa.PrivateKey:
- keyBytes = x509.MarshalPKCS1PrivateKey(k)
- case *ecdsa.PrivateKey:
- var err error
- keyBytes, err = x509.MarshalECPrivateKey(k)
- if err != nil {
- return nil, fmt.Errorf("tls client priv key: %v", err)
- }
- default:
- return nil, errors.New("tls client priv key: unsupported key type")
- }
-
- block = pem.Block{Type: "PRIVATE KEY", Bytes: keyBytes}
- keyPem := pem.EncodeToMemory(&block)
-
- cert, err := tls.X509KeyPair(certPem, keyPem)
- if err != nil {
- return nil, fmt.Errorf("tls client cert: %v", err)
- }
- cfg.Certificates = []tls.Certificate{cert}
- }
-
- cfg.InsecureSkipVerify = opts.InsecureSkipVerify
-
- cfg.VerifyPeerCertificate = opts.VerifyPeerCertificate
- cfg.VerifyConnection = opts.VerifyConnection
- cfg.SessionTicketsDisabled = opts.SessionTicketsDisabled
- cfg.ClientSessionCache = opts.ClientSessionCache
-
- // When no CA certificate is provided, default to the system cert pool
- // that way when a request is made to a server known by the system trust store,
- // the name is still verified
- switch {
- case opts.LoadedCA != nil:
- caCertPool := basePool(opts.LoadedCAPool)
- caCertPool.AddCert(opts.LoadedCA)
- cfg.RootCAs = caCertPool
- case opts.CA != "":
- // load ca cert
- caCert, err := os.ReadFile(opts.CA)
- if err != nil {
- return nil, fmt.Errorf("tls client ca: %v", err)
- }
- caCertPool := basePool(opts.LoadedCAPool)
- caCertPool.AppendCertsFromPEM(caCert)
- cfg.RootCAs = caCertPool
- case opts.LoadedCAPool != nil:
- cfg.RootCAs = opts.LoadedCAPool
- }
-
- // apply servername overrride
- if opts.ServerName != "" {
- cfg.InsecureSkipVerify = false
- cfg.ServerName = opts.ServerName
- }
-
- return cfg, nil
-}
-
-// TLSTransport creates a [http] client transport suitable for mutual [tls] auth.
-func TLSTransport(opts TLSClientOptions) (http.RoundTripper, error) {
- cfg, err := TLSClientAuth(opts)
- if err != nil {
- return nil, err
- }
-
- return &http.Transport{TLSClientConfig: cfg}, nil
-}
-
-// TLSClient creates a [http.Client] for mutual auth.
-func TLSClient(opts TLSClientOptions) (*http.Client, error) {
- transport, err := TLSTransport(opts)
- if err != nil {
- return nil, err
- }
- return &http.Client{Transport: transport}, nil
-}
-
// Runtime represents an API client that uses the transport
// to make [http] requests based on a swagger specification.
type Runtime struct {
@@ -228,17 +44,50 @@ type Runtime struct {
Host string
BasePath string
Formats strfmt.Registry
- Context context.Context //nolint:containedctx // we precisely want this type to contain the request context
+ // Deprecated: prefer [runtime.ContextualTransport.SubmitContext] to pass the request context explicitly.
+ Context context.Context //nolint:containedctx // we precisely want this type to contain the request context
+
+ Debug bool
+
+ // Trace enables connection-level diagnostic output via
+ // [net/http/httptrace]. When true, the runtime narrates the
+ // connection lifecycle of every request through r.logger.Debugf:
+ // DNS, dial, TLS handshake, idle-pool reuse, request body
+ // transfer, time-to-first-byte, response body transfer, and a
+ // trailing per-request summary line.
+ //
+ // Trace is orthogonal to Debug: Debug dumps wire bytes (request
+ // and response headers and body), Trace narrates how the
+ // connection got there. Both may be enabled independently.
+ //
+ // Trace is not coupled to the SWAGGER_DEBUG / DEBUG environment
+ // variables: it defaults to false and is only enabled by
+ // explicit assignment.
+ //
+ // Trace is primarily intended as a problem-investigation tool
+ // (the local equivalent of curl -vvv), not an always-on tracer.
+ // For distributed-trace correlation, use the OpenTelemetry
+ // integration ([Runtime.WithOpenTelemetry]).
+ Trace bool
- Debug bool
logger logger.Logger
+ // MatchSuffix enables RFC 6839 structured-syntax suffix tolerance
+ // for codec lookup. When true, a response with Content-Type
+ // "application/problem+json" finds the JSON consumer registered
+ // under "application/json"; with the default false, the lookup
+ // is strict and falls through to the "*/*" wildcard if present.
+ // See [mediatype.AllowSuffix] for the semantics.
+ MatchSuffix bool
+
clientOnce *sync.Once
client *http.Client
schemes []string
response ClientResponseFunc
}
+var _ runtime.ContextualTransport = &Runtime{}
+
// New creates a new default runtime for a swagger api runtime.Client.
func New(host, basePath string, schemes []string) *Runtime {
var rt Runtime
@@ -246,13 +95,15 @@ func New(host, basePath string, schemes []string) *Runtime {
// Enhancement proposal: https://github.com/go-openapi/runtime/issues/385
rt.Consumers = map[string]runtime.Consumer{
- runtime.YAMLMime: yamlpc.YAMLConsumer(),
- runtime.JSONMime: runtime.JSONConsumer(),
- runtime.XMLMime: runtime.XMLConsumer(),
- runtime.TextMime: runtime.TextConsumer(),
- runtime.HTMLMime: runtime.TextConsumer(),
- runtime.CSVMime: runtime.CSVConsumer(),
- runtime.DefaultMime: runtime.ByteStreamConsumer(),
+ runtime.YAMLMime: yamlpc.YAMLConsumer(),
+ runtime.JSONMime: runtime.JSONConsumer(),
+ runtime.XMLMime: runtime.XMLConsumer(),
+ runtime.TextMime: runtime.TextConsumer(),
+ runtime.HTMLMime: runtime.TextConsumer(),
+ runtime.CSVMime: runtime.CSVConsumer(),
+ runtime.MultipartFormMime: runtime.ByteStreamConsumer(),
+ runtime.URLencodedFormMime: runtime.ByteStreamConsumer(),
+ runtime.DefaultMime: runtime.ByteStreamConsumer(),
}
rt.Producers = map[string]runtime.Producer{
runtime.YAMLMime: yamlpc.YAMLProducer(),
@@ -294,47 +145,6 @@ func NewWithClient(host, basePath string, schemes []string, client *http.Client)
return rt
}
-// WithOpenTracing adds opentracing support to the provided runtime.
-// A new client span is created for each request.
-// If the context of the client operation does not contain an active span, no span is created.
-// The provided opts are applied to each spans - for example to add global tags.
-//
-// Deprecated: use [WithOpenTelemetry] instead, as opentracing is now archived and superseded by opentelemetry.
-//
-// # Deprecation notice
-//
-// The [Runtime.WithOpenTracing] method has been deprecated in favor of [Runtime.WithOpenTelemetry].
-//
-// The method is still around so programs calling it will still build. However, it will return
-// an opentelemetry transport.
-//
-// If you have a strict requirement on using opentracing, you may still do so by importing
-// module [github.com/go-openapi/runtime/client-[middleware]/opentracing] and using
-// [github.com/go-openapi/runtime/client-[middleware]/opentracing.WithOpenTracing] with your
-// usual opentracing options and opentracing-enabled transport.
-//
-// Passed options are ignored unless they are of type [OpenTelemetryOpt].
-func (r *Runtime) WithOpenTracing(opts ...any) runtime.ClientTransport {
- otelOpts := make([]OpenTelemetryOpt, 0, len(opts))
- for _, o := range opts {
- otelOpt, ok := o.(OpenTelemetryOpt)
- if !ok {
- continue
- }
- otelOpts = append(otelOpts, otelOpt)
- }
-
- return r.WithOpenTelemetry(otelOpts...)
-}
-
-// WithOpenTelemetry adds opentelemetry support to the provided runtime.
-// A new client span is created for each request.
-// If the context of the client operation does not contain an active span, no span is created.
-// The provided opts are applied to each spans - for example to add global tags.
-func (r *Runtime) WithOpenTelemetry(opts ...OpenTelemetryOpt) runtime.ClientTransport {
- return newOpenTelemetryTransport(r, r.Host, opts)
-}
-
// EnableConnectionReuse drains the remaining body from a response
// so that go will reuse the TCP connections.
//
@@ -357,105 +167,109 @@ func (r *Runtime) EnableConnectionReuse() {
)
}
+// CreateHTTPRequestContext creates the requests and bind the parameters, but does not send it over the wire
+// like [Runtime.SubmitContext].
+//
+// The [http.Request] is complete with authentication, headers and body (including streamed body) and ready for callers
+// to submit it to a [http.Client] of their choice, then consume the [http.Response].
+//
+// Most users would simply use [Runtime.SubmitContext], which wraps all these operations in one call.
+func (r *Runtime) CreateHTTPRequestContext(ctx context.Context, operation *runtime.ClientOperation) (req *http.Request, cancel context.CancelFunc, err error) {
+ req, cancel, err = r.createHTTPRequestContext(ctx, operation)
+ return
+}
+
+// CreateHttpRequest builds the [http.Request] for the given operation, using
+// [context.Background] as the request context.
+//
+// Any per-operation timeout declared by the operation's [runtime.ClientRequestWriter]
+// is silently ignored here, which can leak a context-cancellation channel if the
+// caller relies on it.
+//
+// Deprecated: use [Runtime.CreateHTTPRequestContext] instead, with explicit
+// control over the request context and its cancellation.
func (r *Runtime) CreateHttpRequest(operation *runtime.ClientOperation) (req *http.Request, err error) { //nolint:revive
- _, req, err = r.createHttpRequest(operation)
+ req, _, err = r.createHTTPRequestContext(context.Background(), operation)
return
}
// Submit a request and when there is a body on success it will turn that into the result
// all other things are turned into an api error for swagger which retains the status code.
+//
+// This call inherits the context possibly put in the operation, otherwise the one possibly put in the [Runtime].
+// If none are set, use [context.Background].
+//
+// Any timeout set by parameters is honored.
func (r *Runtime) Submit(operation *runtime.ClientOperation) (any, error) {
- _, readResponse, _ := operation.Params, operation.Reader, operation.AuthInfo
+ return r.SubmitContext(r.ensureContext(operation), operation)
+}
- request, req, err := r.createHttpRequest(operation)
+// SubmitContext submits a request and returns the result.
+//
+// Errors are turned into an api error for swagger which retains the status code.
+//
+// Unlike [Submit], [SubmitContext] only injects the context provided by the caller:
+// contexts possibly cached in operation or runtime are ignored.
+//
+// On the other hand, a timeout set by parameters is honored.
+func (r *Runtime) SubmitContext(parentCtx context.Context, operation *runtime.ClientOperation) (any, error) {
+ req, cancel, err := r.createHTTPRequestContext(parentCtx, operation)
if err != nil {
return nil, err
}
+ defer cancel()
- r.clientOnce.Do(func() {
- r.client = &http.Client{
- Transport: r.Transport,
- Jar: r.Jar,
- }
- })
-
- if r.Debug {
- b, err2 := httputil.DumpRequestOut(req, true)
- if err2 != nil {
- return nil, err2
- }
- r.logger.Debugf("%s\n", string(b))
- }
+ r.ensureClient()
- var parentCtx context.Context
- switch {
- case operation.Context != nil:
- parentCtx = operation.Context
- case r.Context != nil:
- parentCtx = r.Context
- default:
- parentCtx = context.Background()
+ if err := r.dumpRequest(req); err != nil {
+ return nil, err
}
- var (
- ctx context.Context
- cancel context.CancelFunc
- )
- if request.timeout == 0 {
- // There may be a deadline in the context passed to the operation.
- // Otherwise, there is no timeout set.
- ctx, cancel = context.WithCancel(parentCtx)
- } else {
- // Sets the timeout passed from request params (by default runtime.DefaultTimeout).
- // If there is already a deadline in the parent context, the shortest will
- // apply.
- ctx, cancel = context.WithTimeout(parentCtx, request.timeout)
+ // Attach the trace session before Do so the httptrace hooks
+ // fire during the round-trip. The session emits its trailing
+ // summary on finish; the response body is consumed by
+ // ReadResponse downstream, after which finish is called.
+ var trace *traceSession
+ if r.Trace {
+ trace = newTraceSession(r.logger, req.Method, req.URL.String(),
+ introspectTLSConfig(r.pickClient(operation)))
+ //nolint:contextcheck // We intentionally derive from req.Context() to layer the trace hooks onto the existing request context.
+ req = req.WithContext(trace.attach(req.Context()))
+ if req.Body != nil {
+ req.Body = trace.wrapRequestBody(req.Body)
+ }
+ defer trace.finish()
}
- defer cancel()
- var client *http.Client
- if operation.Client != nil {
- client = operation.Client
- } else {
- client = r.client
- }
- req = req.WithContext(ctx)
- res, err := client.Do(req) // make requests, by default follows 10 redirects before failing
+ res, err := r.pickClient(operation).Do(req)
if err != nil {
+ if trace != nil {
+ trace.onRoundTripError(err)
+ }
return nil, err
}
defer res.Body.Close()
+ if trace != nil {
+ trace.onResponse(res.StatusCode)
+ res.Body = trace.wrapResponseBody(res.Body)
+ }
+
ct := res.Header.Get(runtime.HeaderContentType)
if ct == "" { // this should really never occur
ct = r.DefaultMediaType
}
- if r.Debug {
- printBody := true
- if ct == runtime.DefaultMime {
- printBody = false // Spare the terminal from a binary blob.
- }
- b, err2 := httputil.DumpResponse(res, printBody)
- if err2 != nil {
- return nil, err2
- }
- r.logger.Debugf("%s\n", string(b))
+ if err := r.dumpResponse(res, ct); err != nil {
+ return nil, err
}
- mt, _, err := mime.ParseMediaType(ct)
+ cons, err := r.resolveConsumer(ct)
if err != nil {
- return nil, fmt.Errorf("parse content type: %s", err)
+ return nil, err
}
- cons, ok := r.Consumers[mt]
- if !ok {
- if cons, ok = r.Consumers["*/*"]; !ok {
- // scream about not knowing what to do
- return nil, fmt.Errorf("no consumer: %q", ct)
- }
- }
- return readResponse.ReadResponse(r.response(res), cons)
+ return operation.Reader.ReadResponse(r.response(res), cons)
}
// SetDebug changes the debug flag.
@@ -482,6 +296,17 @@ func (r *Runtime) SetResponseReader(f ClientResponseFunc) {
r.response = f
}
+func (r *Runtime) ensureContext(operation *runtime.ClientOperation) context.Context {
+ switch {
+ case operation.Context != nil: //nolint:staticcheck // kept for backward compatibility
+ return operation.Context
+ case r.Context != nil:
+ return r.Context
+ default:
+ return context.Background()
+ }
+}
+
func (r *Runtime) pickScheme(schemes []string) string {
if v := r.selectScheme(r.schemes); v != "" {
return v
@@ -518,16 +343,121 @@ func transportOrDefault(left, right http.RoundTripper) http.RoundTripper {
return left
}
-// takes a client operation and creates equivalent http.Request.
-func (r *Runtime) createHttpRequest(operation *runtime.ClientOperation) (*request, *http.Request, error) { //nolint:revive
+// ensureClient lazily initializes r.client from r.Transport and r.Jar
+// on first use. Safe under concurrent calls via sync.Once.
+func (r *Runtime) ensureClient() {
+ r.clientOnce.Do(func() {
+ r.client = &http.Client{
+ Transport: r.Transport,
+ Jar: r.Jar,
+ }
+ })
+}
+
+// pickClient returns the http.Client to use for this operation: the
+// per-operation override if set, else the runtime's shared client.
+func (r *Runtime) pickClient(operation *runtime.ClientOperation) *http.Client {
+ if operation.Client != nil {
+ return operation.Client
+ }
+ return r.client
+}
+
+// dumpRequest writes the outgoing request to the debug logger when
+// r.Debug is enabled. No-op otherwise. Returns the dump error so the
+// caller can decide whether to abort the submit.
+func (r *Runtime) dumpRequest(req *http.Request) error {
+ if !r.Debug {
+ return nil
+ }
+ b, err := httputil.DumpRequestOut(req, true)
+ if err != nil {
+ return err
+ }
+ r.logger.Debugf("%s\n", string(b))
+ return nil
+}
+
+// dumpResponse writes the incoming response to the debug logger when
+// r.Debug is enabled. The body is omitted for runtime.DefaultMime
+// (binary blob). No-op otherwise.
+func (r *Runtime) dumpResponse(res *http.Response, ct string) error {
+ if !r.Debug {
+ return nil
+ }
+ printBody := ct != runtime.DefaultMime // Spare the terminal from a binary blob.
+ b, err := httputil.DumpResponse(res, printBody)
+ if err != nil {
+ return err
+ }
+ r.logger.Debugf("%s\n", string(b))
+ return nil
+}
+
+// resolveConsumer parses ct and returns the registered Consumer for
+// that media type. Lookup is alias-aware (RFC 9512 §2.1 — yaml
+// aliases) and, when [Runtime.MatchSuffix] is true, also tolerates
+// RFC 6839 structured-syntax suffix media types (+json, +xml, +yaml).
+// Falls back to the "*/*" entry if no match found.
+func (r *Runtime) resolveConsumer(ct string) (runtime.Consumer, error) {
+ if _, _, err := mime.ParseMediaType(ct); err != nil {
+ return nil, fmt.Errorf("parse content type: %w", err)
+ }
+ if cons, ok := mediatype.Lookup(r.Consumers, ct, r.matchOpts()...); ok {
+ return cons, nil
+ }
+ if cons, ok := r.Consumers["*/*"]; ok {
+ return cons, nil
+ }
+ // scream about not knowing what to do
+ return nil, fmt.Errorf("no consumer: %q", ct)
+}
+
+// matchOpts builds the mediatype.MatchOption slice for codec
+// lookups on the Runtime, currently just the AllowSuffix opt-in.
+func (r *Runtime) matchOpts() []mediatype.MatchOption {
+ if !r.MatchSuffix {
+ return nil
+ }
+
+ return []mediatype.MatchOption{mediatype.AllowSuffix()}
+}
+
+// createHTTPRequestContext is the context-aware builder of a [http.Request].
+//
+// The returned [http.Request] carries a context derived from parentCtx that
+// honors the per-request timeout set during WriteToRequest. Callers must
+// invoke cancel once the response is fully read.
+func (r *Runtime) createHTTPRequestContext(parentCtx context.Context, operation *runtime.ClientOperation) (*http.Request, context.CancelFunc, error) {
+ req, cmt, auth, err := r.prepareRequest(operation)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ httpReq, cancel, err := req.BuildHTTPContext(parentCtx, cmt, r.BasePath, r.Producers, r.Formats, auth)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ r.applyHostScheme(httpReq, operation)
+
+ return httpReq, cancel, nil
+}
+
+// prepareRequest performs the operation-to-request setup that is
+// independent of how the http.Request is finally assembled: parameters,
+// headers, default authentication, and consumes-media-type selection.
+func (r *Runtime) prepareRequest(operation *runtime.ClientOperation) (*request.Request, string, runtime.ClientAuthInfoWriter, error) {
params, _, auth := operation.Params, operation.Reader, operation.AuthInfo
- request := newRequest(operation.Method, operation.PathPattern, params)
+ req := request.New(operation.Method, operation.PathPattern, params)
+ _ = req.SetTimeout(DefaultTimeout) // the timeout may be overridden by ClientRequestWriter
+ req.SetConsumes(operation.ConsumesMediaTypes)
accept := make([]string, 0, len(operation.ProducesMediaTypes))
accept = append(accept, operation.ProducesMediaTypes...)
- if err := request.SetHeaderParam(runtime.HeaderAccept, accept...); err != nil {
- return nil, nil, err
+ if err := req.SetHeaderParam(runtime.HeaderAccept, accept...); err != nil {
+ return nil, "", nil, err
}
if auth == nil && r.DefaultAuthentication != nil {
@@ -538,39 +468,75 @@ func (r *Runtime) createHttpRequest(operation *runtime.ClientOperation) (*reques
return r.DefaultAuthentication.AuthenticateRequest(req, reg)
})
}
- // if auth != nil {
- // if err := auth.AuthenticateRequest(request, r.Formats); err != nil {
- // return nil, err
- // }
- //}
-
- // Enhancement proposal: https://github.com/go-openapi/runtime/issues/386
- cmt := r.DefaultMediaType
- for _, mediaType := range operation.ConsumesMediaTypes {
- // Pick first non-empty media type
- if mediaType != "" {
- cmt = mediaType
- break
- }
- }
- if _, ok := r.Producers[cmt]; !ok && cmt != runtime.MultipartFormMime && cmt != runtime.URLencodedFormMime {
- return nil, nil, fmt.Errorf("none of producers: %v registered. try %s", r.Producers, cmt)
+ cmt := pickConsumesMediaType(operation.ConsumesMediaTypes, r.Producers, r.DefaultMediaType, r.matchOpts()...)
+ if _, ok := mediatype.Lookup(r.Producers, cmt, r.matchOpts()...); !ok && cmt != runtime.MultipartFormMime && cmt != runtime.URLencodedFormMime {
+ return nil, "", nil, fmt.Errorf("none of producers: %v registered. try %s", r.Producers, cmt)
}
- req, err := request.buildHTTP(cmt, r.BasePath, r.Producers, r.Formats, auth)
- if err != nil {
- return nil, nil, err
- }
- req.URL.Scheme = r.pickScheme(operation.Schemes)
- req.URL.Host = r.Host
- req.Host = r.Host
- return request, req, nil
+ return req, cmt, auth, nil
}
-func basePool(pool *x509.CertPool) *x509.CertPool {
- if pool == nil {
- return x509.NewCertPool()
+// applyHostScheme stamps the runtime's host and the operation-selected
+// scheme onto the freshly built http.Request.
+func (r *Runtime) applyHostScheme(httpReq *http.Request, operation *runtime.ClientOperation) {
+ httpReq.URL.Scheme = r.pickScheme(operation.Schemes)
+ httpReq.URL.Host = r.Host
+ httpReq.Host = r.Host
+}
+
+// pickConsumesMediaType selects which Content-Type the client will send.
+//
+// Selection rules, in priority order:
+//
+// 1. multipart/form-data if any consumes entry advertises it (it streams
+// and preserves per-file Content-Type, regardless of codegen ordering;
+// resolves issue #286);
+// 2. the first non-empty entry whose mime is either structural
+// (multipart/form-data or application/x-www-form-urlencoded — these
+// do not need a producer in the map) or has a producer registered in
+// producers — this lets the client gracefully skip unregistered
+// spec entries instead of erroring at the gate that follows;
+// 3. the first non-empty entry overall (preserves the historical error
+// path: the gate at the call site reports "none of producers" with
+// the unregistered mime, so the diagnostic is unchanged when nothing
+// in consumes is registered);
+// 4. def, if consumes is empty or all empty strings.
+//
+// Step 2 closes part of issues #32 and #386: an operation declaring
+// `consumes: [application/x-vendor, application/json]` with no vendor
+// producer registered now silently uses JSON instead of erroring.
+func pickConsumesMediaType(consumes []string, producers map[string]runtime.Producer, def string, opts ...mediatype.MatchOption) string {
+ for _, mt := range consumes {
+ if strings.EqualFold(mt, runtime.MultipartFormMime) {
+ return mt
+ }
+ }
+ var firstNonEmpty string
+ for _, mt := range consumes {
+ if mt == "" {
+ continue
+ }
+ if firstNonEmpty == "" {
+ firstNonEmpty = mt
+ }
+ if isStructuralMime(mt) {
+ return mt
+ }
+ if _, ok := mediatype.Lookup(producers, mt, opts...); ok {
+ return mt
+ }
+ }
+ if firstNonEmpty != "" {
+ return firstNonEmpty
}
- return pool
+ return def
+}
+
+// isStructuralMime reports whether mt is a media type whose body shape
+// is owned by the runtime (multipart envelope, urlencoded form). These
+// do not require an entry in the producers map.
+func isStructuralMime(mt string) bool {
+ return strings.EqualFold(mt, runtime.MultipartFormMime) ||
+ strings.EqualFold(mt, runtime.URLencodedFormMime)
}
diff --git a/vendor/github.com/go-openapi/runtime/client/tls.go b/vendor/github.com/go-openapi/runtime/client/tls.go
new file mode 100644
index 00000000000..017694fae08
--- /dev/null
+++ b/vendor/github.com/go-openapi/runtime/client/tls.go
@@ -0,0 +1,197 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package client
+
+import (
+ "crypto"
+ "crypto/tls"
+ "crypto/x509"
+ "encoding/pem"
+ "fmt"
+ "net/http"
+ "os"
+)
+
+// TLSClientOptions to configure client authentication with mutual TLS.
+type TLSClientOptions struct {
+ // Certificate is the path to a PEM-encoded certificate to be used for
+ // client authentication. If set then Key must also be set.
+ Certificate string
+
+ // LoadedCertificate is the certificate to be used for client authentication.
+ // This field is ignored if Certificate is set. If this field is set, LoadedKey
+ // is also required.
+ LoadedCertificate *x509.Certificate
+
+ // Key is the path to an unencrypted PEM-encoded private key for client
+ // authentication. This field is required if Certificate is set.
+ Key string
+
+ // LoadedKey is the key for client authentication. This field is required if
+ // LoadedCertificate is set.
+ LoadedKey crypto.PrivateKey
+
+ // CA is a path to a PEM-encoded certificate that specifies the root certificate
+ // to use when validating the TLS certificate presented by the server. If this field
+ // (and LoadedCA) is not set, the system certificate pool is used. This field is ignored if LoadedCA
+ // is set.
+ CA string
+
+ // LoadedCA specifies the root certificate to use when validating the server's TLS certificate.
+ // If this field (and CA) is not set, the system certificate pool is used.
+ LoadedCA *x509.Certificate
+
+ // LoadedCAPool specifies a pool of RootCAs to use when validating the server's TLS certificate.
+ // If set, it will be combined with the other loaded certificates (see LoadedCA and CA).
+ // If neither LoadedCA or CA is set, the provided pool will override the system
+ // certificate pool.
+ //
+ // The caller must not use the supplied pool after calling TLSClientAuth.
+ LoadedCAPool *x509.CertPool
+
+ // ServerName specifies the hostname to use when verifying the server certificate.
+ // If this field is set then InsecureSkipVerify will be ignored and treated as
+ // false.
+ ServerName string
+
+ // InsecureSkipVerify controls whether the certificate chain and hostname presented
+ // by the server are validated. If true, any certificate is accepted.
+ InsecureSkipVerify bool
+
+ // VerifyPeerCertificate, if not nil, is called after normal
+ // certificate verification. It receives the raw ASN.1 certificates
+ // provided by the peer and also any verified chains that normal processing found.
+ // If it returns a non-nil error, the handshake is aborted and that error results.
+ //
+ // If normal verification fails then the handshake will abort before
+ // considering this callback. If normal verification is disabled by
+ // setting InsecureSkipVerify then this callback will be considered but
+ // the verifiedChains argument will always be nil.
+ VerifyPeerCertificate func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error
+
+ // VerifyConnection, if not nil, is called after normal certificate
+ // verification and after [TLSClientOptions.VerifyPeerCertificate] by either a TLS client or
+ // server. It receives the [tls.ConnectionState] which may be inspected.
+ //
+ // Unlike VerifyPeerCertificate, this callback is invoked on every
+ // connection, including resumed ones, making it suitable for checks
+ // that must always apply (e.g. certificate pinning).
+ //
+ // If it returns a non-nil error, the handshake is aborted and that error results.
+ VerifyConnection func(tls.ConnectionState) error
+
+ // SessionTicketsDisabled may be set to true to disable session ticket and
+ // PSK (resumption) support. Note that on clients, session ticket support is
+ // also disabled if ClientSessionCache is nil.
+ SessionTicketsDisabled bool
+
+ // ClientSessionCache is a cache of ClientSessionState entries for TLS
+ // session resumption. It is only used by clients.
+ ClientSessionCache tls.ClientSessionCache
+
+ // Prevents callers using unkeyed fields.
+ _ struct{}
+}
+
+// TLSClientAuth creates a [tls.Config] for mutual auth.
+func TLSClientAuth(opts TLSClientOptions) (*tls.Config, error) {
+ // create client tls config
+ cfg := &tls.Config{
+ MinVersion: tls.VersionTLS12,
+ }
+
+ // load client cert if specified
+ if opts.Certificate != "" {
+ cert, err := tls.LoadX509KeyPair(opts.Certificate, opts.Key)
+ if err != nil {
+ return nil, fmt.Errorf("tls client cert: %w", err)
+ }
+ cfg.Certificates = []tls.Certificate{cert}
+ } else if opts.LoadedCertificate != nil {
+ block := pem.Block{Type: "CERTIFICATE", Bytes: opts.LoadedCertificate.Raw}
+ certPem := pem.EncodeToMemory(&block)
+
+ // PKCS#8 covers RSA, ECDSA, Ed25519, X25519 (the key types tls.X509KeyPair
+ // understands) and pairs with the canonical "PRIVATE KEY" PEM label.
+ keyBytes, err := x509.MarshalPKCS8PrivateKey(opts.LoadedKey)
+ if err != nil {
+ return nil, fmt.Errorf("tls client priv key: %w", err)
+ }
+
+ block = pem.Block{Type: "PRIVATE KEY", Bytes: keyBytes}
+ keyPem := pem.EncodeToMemory(&block)
+
+ cert, err := tls.X509KeyPair(certPem, keyPem)
+ if err != nil {
+ return nil, fmt.Errorf("tls client cert: %w", err)
+ }
+ cfg.Certificates = []tls.Certificate{cert}
+ }
+
+ cfg.InsecureSkipVerify = opts.InsecureSkipVerify
+
+ cfg.VerifyPeerCertificate = opts.VerifyPeerCertificate
+ cfg.VerifyConnection = opts.VerifyConnection
+ cfg.SessionTicketsDisabled = opts.SessionTicketsDisabled
+ cfg.ClientSessionCache = opts.ClientSessionCache
+
+ // When no CA certificate is provided, default to the system cert pool
+ // that way when a request is made to a server known by the system trust store,
+ // the name is still verified
+ switch {
+ case opts.LoadedCA != nil:
+ caCertPool := basePool(opts.LoadedCAPool)
+ caCertPool.AddCert(opts.LoadedCA)
+ cfg.RootCAs = caCertPool
+ case opts.CA != "":
+ // load ca cert
+ caCert, err := os.ReadFile(opts.CA)
+ if err != nil {
+ return nil, fmt.Errorf("tls client ca: %w", err)
+ }
+ caCertPool := basePool(opts.LoadedCAPool)
+ caCertPool.AppendCertsFromPEM(caCert)
+ cfg.RootCAs = caCertPool
+ case opts.LoadedCAPool != nil:
+ cfg.RootCAs = opts.LoadedCAPool
+ }
+
+ // apply servername override
+ if opts.ServerName != "" {
+ cfg.InsecureSkipVerify = false
+ cfg.ServerName = opts.ServerName
+ }
+
+ return cfg, nil
+}
+
+// TLSTransport creates a [http.RoundTripper] for a client transport,suitable for mutual TLS auth.
+func TLSTransport(opts TLSClientOptions) (http.RoundTripper, error) {
+ cfg, err := TLSClientAuth(opts)
+ if err != nil {
+ return nil, err
+ }
+
+ return &http.Transport{TLSClientConfig: cfg}, nil
+}
+
+// TLSClient creates a [http.Client] for mutual auth.
+func TLSClient(opts TLSClientOptions) (*http.Client, error) {
+ transport, err := TLSTransport(opts)
+ if err != nil {
+ return nil, err
+ }
+ return &http.Client{Transport: transport}, nil
+}
+
+// basePool returns pool if non-nil; otherwise it returns a new empty cert pool.
+//
+// Clones the pool provided up front by the caller.
+func basePool(pool *x509.CertPool) *x509.CertPool {
+ if pool == nil {
+ return x509.NewCertPool()
+ }
+
+ return pool.Clone()
+}
diff --git a/vendor/github.com/go-openapi/runtime/client_operation.go b/vendor/github.com/go-openapi/runtime/client_operation.go
index ad7277e091f..61f6ead34a2 100644
--- a/vendor/github.com/go-openapi/runtime/client_operation.go
+++ b/vendor/github.com/go-openapi/runtime/client_operation.go
@@ -19,12 +19,30 @@ type ClientOperation struct {
AuthInfo ClientAuthInfoWriter
Params ClientRequestWriter
Reader ClientResponseReader
- Context context.Context //nolint:containedctx // we precisely want this type to contain the request context
- Client *http.Client
+ // Deprecated: prefer [ContextualTransport.SubmitContext] to pass the request context explicitly.
+ Context context.Context //nolint:containedctx // we precisely want this type to contain the request context
+ Client *http.Client
}
// A ClientTransport implementor knows how to submit Request objects to some destination.
type ClientTransport interface {
- // Submit(string, RequestWriter, ResponseReader, AuthInfoWriter) (interface{}, error)
+ // Submit the operation and return the deserialized response or an error.
Submit(*ClientOperation) (any, error)
}
+
+// ContextualTransport extends [ClientTransport] with an explicit
+// context-aware submission method.
+//
+// Wrappers such as the OpenTelemetry transport type-assert to this
+// interface so they can forward an explicit context to the underlying
+// transport without setting the cached [ClientOperation.Context] field.
+//
+// In v2, SubmitContext will be folded into [ClientTransport] itself
+// and the cached [ClientOperation.Context] field removed; this interface
+// is the v0.x bridge.
+type ContextualTransport interface {
+ ClientTransport
+
+ // SubmitContext submits the operation using ctx as the request context.
+ SubmitContext(ctx context.Context, operation *ClientOperation) (any, error)
+}
diff --git a/vendor/github.com/go-openapi/runtime/client_response.go b/vendor/github.com/go-openapi/runtime/client_response.go
index 92668db4ece..7b4b7e40df7 100644
--- a/vendor/github.com/go-openapi/runtime/client_response.go
+++ b/vendor/github.com/go-openapi/runtime/client_response.go
@@ -59,7 +59,7 @@ func (o *APIError) Error() string {
if err, ok := o.Response.(error); ok {
resp = []byte("'" + sanitizer.Replace(err.Error()) + "'")
} else {
- resp, _ = json.Marshal(o.Response)
+ resp, _ = json.Marshal(o.Response) //nolint:errchkjson // error swallowed as this is our last best effort attempt
}
return fmt.Sprintf("%s (status %d): %s", o.OperationName, o.Code, resp)
diff --git a/vendor/github.com/go-openapi/runtime/constants.go b/vendor/github.com/go-openapi/runtime/constants.go
index 80de6c80868..ea86cfadbc1 100644
--- a/vendor/github.com/go-openapi/runtime/constants.go
+++ b/vendor/github.com/go-openapi/runtime/constants.go
@@ -21,8 +21,12 @@ const (
DefaultMime = "application/octet-stream"
// JSONMime the json mime type.
JSONMime = "application/json"
- // YAMLMime the [yaml] mime type.
- YAMLMime = "application/x-yaml"
+ // YAMLMime the [yaml] mime type. Set to the canonical RFC 9512
+ // name (application/yaml). Legacy forms application/x-yaml,
+ // text/yaml, and text/x-yaml — per RFC 9512 §2.1 "Deprecated
+ // alias names for this type" — resolve to the same codec via
+ // the mediatype alias bridge.
+ YAMLMime = "application/yaml"
// XMLMime the [xml] mime type.
XMLMime = "application/xml"
// TextMime the text mime type.
diff --git a/vendor/github.com/go-openapi/runtime/csv.go b/vendor/github.com/go-openapi/runtime/csv.go
index 558d0cb99aa..11d60872c3e 100644
--- a/vendor/github.com/go-openapi/runtime/csv.go
+++ b/vendor/github.com/go-openapi/runtime/csv.go
@@ -100,7 +100,7 @@ func CSVConsumer(opts ...CSVOpt) Consumer {
default:
// support *[][]string, *[]byte, *string
- if ptr := reflect.TypeOf(data); ptr.Kind() != reflect.Ptr {
+ if ptr := reflect.TypeOf(data); ptr.Kind() != reflect.Pointer {
return errors.New("destination must be a pointer")
}
@@ -159,14 +159,14 @@ func CSVConsumer(opts ...CSVOpt) Consumer {
//
// Supported input underlying types and interfaces, prioritized in this order:
//
-// - *[csv.Reader]
-// - [CSVReader] (reader options are ignored)
-// - [io.Reader]
-// - [io.WriterTo]
-// - [encoding.BinaryMarshaler]
-// - [][]string
-// - []byte
-// - string
+// - *[csv.Reader]
+// - [CSVReader] (reader options are ignored)
+// - [io.Reader]
+// - [io.WriterTo]
+// - [encoding.BinaryMarshaler]
+// - [][]string
+// - []byte
+// - string
//
// The producer prioritizes situations where buffering the input is not required.
func CSVProducer(opts ...CSVOpt) Producer {
diff --git a/vendor/github.com/go-openapi/runtime/file.go b/vendor/github.com/go-openapi/runtime/file.go
index 2a85379a748..0420db9440a 100644
--- a/vendor/github.com/go-openapi/runtime/file.go
+++ b/vendor/github.com/go-openapi/runtime/file.go
@@ -5,4 +5,10 @@ package runtime
import "github.com/go-openapi/swag/fileutils"
+// File represents an uploaded file. Re-exported from
+// [fileutils.File] for backwards compatibility.
+//
+// See [BindForm] (in form.go) for the orchestrator that parses
+// multipart / urlencoded request bodies and binds declared file
+// fields onto handler-side targets.
type File = fileutils.File
diff --git a/vendor/github.com/go-openapi/runtime/form.go b/vendor/github.com/go-openapi/runtime/form.go
new file mode 100644
index 00000000000..b4b36f14705
--- /dev/null
+++ b/vendor/github.com/go-openapi/runtime/form.go
@@ -0,0 +1,355 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package runtime
+
+import (
+ stderrors "errors"
+ "fmt"
+ "mime/multipart"
+ "net/http"
+ "strings"
+
+ "github.com/go-openapi/errors"
+)
+
+// DefaultMaxUploadFilenameLength is the default cap applied to
+// FileHeader.Filename for each declared file when [BindForm] is invoked
+// without an explicit [BindFormMaxFilenameLen] option.
+//
+// Multipart headers are allocated per part; an attacker submitting
+// multi-MB filenames inflates the parser's memory footprint. 1 KiB
+// matches the IETF guidance for sane filename length and is enough
+// for realistic uploads.
+const DefaultMaxUploadFilenameLength = 1024
+
+// DefaultMaxUploadBodySize limits the size of the body to upload forms to 32MB.
+//
+// Use an explicit [BindFormMaxBody] option to change this limit.
+const DefaultMaxUploadBodySize = int64(32) << 20
+
+// filenamePreviewLen caps the byte length of the FileHeader.Filename
+// preview embedded as the ParseError.Value field when the helper
+// rejects a too-long filename.
+const filenamePreviewLen = 32
+
+// ValidateFilenameLength enforces the FileHeader.Filename length cap
+// that [BindForm] applies via [BindFormFile] declarations. Untyped
+// binder paths that fetch the file via [http.Request.FormFile]
+// directly (rather than declaring the file through [BindFormFile]) call
+// this to opt into the same protection.
+//
+// Returns nil if filename length is within maxLen or maxLen <= 0.
+// Otherwise returns a [*errors.ParseError] suitable for direct return
+// from a parameter binder. The error embeds a truncated preview of
+// the offending filename to keep the error message bounded.
+func ValidateFilenameLength(paramName, paramIn, filename string, maxLen int) error {
+ if maxLen <= 0 || len(filename) <= maxLen {
+ return nil
+ }
+ preview := filename[:min(len(filename), filenamePreviewLen)]
+ return errors.NewParseError(paramName, paramIn, preview,
+ fmt.Errorf("filename length %d exceeds limit %d", len(filename), maxLen))
+}
+
+// FileBinder is the per-file callback invoked by [BindForm] when a
+// declared file field is present.
+//
+// The callback is responsible for BOTH validating the file (size, MIME, etc.) AND assigning the bound
+// file to its destination — typically using:
+//
+// o.FieldName = &runtime.File{Data: file, Header: header}
+//
+// Returning a non-nil error surfaces the error in [BindForm]'s per-field
+// accumulator. Errors from the binder flow through verbatim — the
+// binder is expected to produce HTTP-aware errors (e.g.
+// [errors.ExceedsMaximum] from go-openapi/validate).
+type FileBinder func(file multipart.File, header *multipart.FileHeader) error
+
+// BindOption configures [BindForm]. The variadic style keeps simple
+// call sites simple and lets new knobs (security caps, additional
+// behaviour) be added without breaking the signature.
+type BindOption func(*bindConfig)
+
+type bindConfig struct {
+ maxParseMemory int64
+ maxBody int64
+ maxFiles int
+ maxFilenameLen int
+ files []formFileSpec
+}
+
+type formFileSpec struct {
+ name string
+ required bool
+ bind FileBinder
+}
+
+// BindFormMaxParseMemory caps the in-memory portion of a multipart
+// body. Bytes beyond this are spilled to temporary files on disk by
+// the stdlib parser. 0 (the default) defers to the stdlib's 32 MB.
+//
+// This option does NOT cap total body bytes — see [BindFormMaxBody]
+// for that. The default body cap ([DefaultMaxUploadBodySize] = 32 MB)
+// is applied even when this option is not supplied, so out of the box
+// [BindForm] is bounded; callers with stricter or looser requirements
+// adjust via [BindFormMaxBody].
+func BindFormMaxParseMemory(n int64) BindOption {
+ return func(c *bindConfig) { c.maxParseMemory = n }
+}
+
+// BindFormMaxBody caps the size of the body read from a http form before parsing.
+//
+// The limit is set to 32MB by default. This default limit is applied for any n=0.
+//
+// The limit is disabled for n<0, assuming the caller has already capped the body size upstream.
+func BindFormMaxBody(n int64) BindOption {
+ return func(c *bindConfig) { c.maxBody = n }
+}
+
+// BindFormMaxFiles rejects parses where the total number of file
+// parts across all field names exceeds n. 0 (the default) means no
+// cap. Exceeding the cap is a fatal error — [BindForm] returns
+// fatal=true and no per-file binders run.
+func BindFormMaxFiles(n int) BindOption {
+ return func(c *bindConfig) { c.maxFiles = n }
+}
+
+// BindFormMaxFilenameLen rejects per-file headers whose Filename
+// length exceeds n. 0 means no cap; the default applied when this
+// option is not supplied is [DefaultMaxUploadFilenameLength]. The
+// cap is a per-field bind error (non-fatal); other declared files
+// still run.
+func BindFormMaxFilenameLen(n int) BindOption {
+ return func(c *bindConfig) { c.maxFilenameLen = n }
+}
+
+// BindFormFile declares a file field to bind under the given form
+// name. If required is true and the field is absent, [BindForm]
+// produces the per-field error.
+//
+// errors.NewParseError(name, "formData", "", http.ErrMissingFile)
+//
+// If required is false, absence is silent (no error, no bind).
+//
+// The bind callback runs only when the field is present. It is the
+// site where both validation and assignment happen — see [FileBinder].
+//
+// FileHeader.Filename is attacker-controlled text; the binder MUST
+// NOT use it directly as a filesystem path. The helper does not
+// touch the filesystem.
+func BindFormFile(name string, required bool, bind FileBinder) BindOption {
+ return func(c *bindConfig) {
+ c.files = append(c.files, formFileSpec{
+ name: name,
+ required: required,
+ bind: bind,
+ })
+ }
+}
+
+// BindForm parses r as multipart/form-data, falling back to
+// application/x-www-form-urlencoded when the request is not
+// multipart. On success, r.MultipartForm and r.PostForm are populated;
+// the caller can read non-file form values via [Values](r.Form) after
+// the call returns.
+//
+// All errors produced by BindForm itself (parse failure, missing
+// required field, cap exceeded) are [*errors.ParseError] values built
+// via [errors.NewParseError], matching the untyped
+// middleware/parameter.go path. Errors returned by per-file binders
+// flow through verbatim — binders own their HTTP-aware error shape.
+//
+// Per-file binders declared via [BindFormFile] run in declaration
+// order after a successful parse. Their errors are accumulated and
+// returned wrapped in [errors.CompositeValidationError]; the caller
+// typically appends the returned err to its own []error and continues
+// with non-file parameter binding.
+//
+// Return semantics:
+//
+// - fatal=true, err!=nil: parse failure or a hard cap (e.g.
+// [BindFormMaxFiles]) was exceeded. No per-file binders ran; the
+// caller MUST return err immediately.
+// - fatal=false, err!=nil: one or more per-file binders produced
+// errors. The form parsed successfully; r.Form is populated. The
+// caller appends err to its accumulator and continues.
+// - fatal=false, err==nil: full success.
+//
+// fatal==true implies err!=nil.
+//
+// Defaults applied out of the box:
+//
+// - Total body bytes capped at [DefaultMaxUploadBodySize] (32 MB)
+// via [http.MaxBytesReader]. Adjust with [BindFormMaxBody]
+// (negative n disables, when the caller has already capped the
+// body upstream).
+// - FileHeader.Filename length capped at
+// [DefaultMaxUploadFilenameLength]. Adjust with
+// [BindFormMaxFilenameLen].
+//
+// Caller responsibilities the helper does NOT cover:
+//
+// - Set [http.Server.ReadTimeout] / [http.Server.IdleTimeout] to defend
+// against slow-read attacks.
+// - Decompress Content-Encoding: gzip request bodies upstream if
+// the API accepts them, using a size-limited reader.
+// - Treat FileHeader.Filename as untrusted user input; never use
+// it directly as a filesystem path.
+func BindForm(r *http.Request, opts ...BindOption) (fatal bool, err error) {
+ cfg := bindConfig{
+ maxFilenameLen: DefaultMaxUploadFilenameLength,
+ }
+ for _, opt := range opts {
+ opt(&cfg)
+ }
+
+ if perr := parseFormBody(r, cfg.maxParseMemory, cfg.maxBody); perr != nil {
+ // Body-cap hit gets the 413 status; everything else maps to a
+ // 400 ParseError. parseFormBody returns the raw stdlib error
+ // in both cases — the HTTP-aware wrapping happens here.
+ var maxBytesErr *http.MaxBytesError
+ if stderrors.As(perr, &maxBytesErr) {
+ return true, errors.New(http.StatusRequestEntityTooLarge, "formData: %v", perr)
+ }
+ return true, errors.NewParseError("body", "formData", "", perr)
+ }
+
+ if cfg.maxFiles > 0 {
+ if got := countFileParts(r); got > cfg.maxFiles {
+ return true, errors.NewParseError("body", "formData", "",
+ fmt.Errorf("multipart form contains %d file parts, exceeds limit %d", got, cfg.maxFiles))
+ }
+ }
+
+ var bindErrs []error
+ for _, spec := range cfg.files {
+ if e := bindFormFile(r, spec, cfg.maxFilenameLen); e != nil {
+ bindErrs = append(bindErrs, e)
+ }
+ }
+ if len(bindErrs) > 0 {
+ return false, errors.CompositeValidationError(bindErrs...)
+ }
+ return false, nil
+}
+
+// parseFormBody parses the request body. Content-Type drives the
+// parser: multipart/form-data → r.ParseMultipartForm, everything else
+// → r.ParseForm (stdlib's parsePostForm only actually reads the body
+// when Content-Type is application/x-www-form-urlencoded, so calling
+// ParseForm is safe for unrecognised types).
+//
+// Caveat: ParseMultipartForm calls ParseForm internally and discards its error
+// when the body turns out not to be multipart, returning ErrNotMultipart instead
+// — the subsequent retry then short-circuits because r.PostForm is already
+// set. Content-type-based routing avoids the lossy detour.
+//
+// Returns the raw stdlib error on failure; the caller (BindForm)
+// handles HTTP-aware wrapping (413 for MaxBytesError, 400 ParseError
+// otherwise).
+//
+// maxMemory == 0 falls through to the stdlib default (32 MB).
+// maxBody == 0 defaults to DefaultMaxUploadBodySize; maxBody < 0
+// disables the body cap (caller has capped upstream).
+func parseFormBody(r *http.Request, maxMemory, maxBody int64) error {
+ if r.Body != nil && maxBody >= 0 {
+ if maxBody == 0 {
+ maxBody = DefaultMaxUploadBodySize
+ }
+ r.Body = http.MaxBytesReader(nil, r.Body, maxBody)
+ }
+
+ mt, _, _ := ContentType(r.Header)
+ if mt == MultipartFormMime {
+ //nolint:gosec // G120: false positive -- see below
+ // gosec doesn't track the Body.
+ // See https://github.com/securego/gosec/blob/de65614d10a6b84029e3e1215567b8ce7e490f23/testutils/g120_samples.go#L57
+ return r.ParseMultipartForm(maxMemory)
+ }
+ return r.ParseForm()
+}
+
+func countFileParts(r *http.Request) int {
+ if r.MultipartForm == nil {
+ return 0
+ }
+ var n int
+ for _, fhs := range r.MultipartForm.File {
+ n += len(fhs)
+ }
+
+ return n
+}
+
+// FormFile resolves a file field from a parsed form body, transparently
+// handling both content types accepted for `type: file` parameters by
+// the OpenAPI 2.0 spec:
+//
+// - multipart/form-data — delegates to [http.Request.FormFile].
+// - application/x-www-form-urlencoded — looks up the field in
+// r.PostForm and synthesizes a [multipart.File] backed by the
+// value bytes plus a [multipart.FileHeader] with Filename equal
+// to the field name and Size set to the byte length.
+//
+// Returns [http.ErrMissingFile] when the field is absent under either
+// content type. Callers must have parsed the body upstream (e.g. via
+// [BindForm] or [http.Request.ParseForm]) before reading from the
+// urlencoded path — [http.Request.FormFile] takes care of parsing on
+// the multipart path.
+//
+// Presence is the only criterion for binding a urlencoded file: an
+// empty value (e.g. `file=`) is bound as a zero-byte file.
+func FormFile(r *http.Request, name string) (multipart.File, *multipart.FileHeader, error) {
+ file, header, err := r.FormFile(name)
+ if err == nil {
+ return file, header, nil
+ }
+ if !stderrors.Is(err, http.ErrNotMultipart) {
+ return nil, nil, err
+ }
+
+ values, present := r.PostForm[name]
+ if !present {
+ return nil, nil, http.ErrMissingFile
+ }
+ value := values[0]
+ return urlencodedFile{Reader: strings.NewReader(value)},
+ &multipart.FileHeader{Filename: name, Size: int64(len(value))},
+ nil
+}
+
+// urlencodedFile adapts a urlencoded form value (already buffered in
+// memory by [http.Request.ParseForm]) to the [multipart.File]
+// interface. The embedded [strings.Reader] supplies Read/ReadAt/Seek;
+// Close is a no-op since there is no resource to release.
+type urlencodedFile struct {
+ *strings.Reader
+}
+
+func (urlencodedFile) Close() error { return nil }
+
+func bindFormFile(r *http.Request, spec formFileSpec, maxFilenameLen int) error {
+ file, header, err := FormFile(r, spec.name)
+ if err != nil {
+ if stderrors.Is(err, http.ErrMissingFile) {
+ if spec.required {
+ return errors.New(http.StatusBadRequest, "formData: %v", http.ErrMissingFile)
+ }
+
+ return nil
+ }
+
+ return errors.NewParseError(spec.name, "formData", "", err)
+ }
+
+ if err := ValidateFilenameLength(spec.name, "formData", header.Filename, maxFilenameLen); err != nil {
+ return err
+ }
+
+ if spec.bind == nil {
+ return nil
+ }
+
+ return spec.bind(file, header)
+}
diff --git a/vendor/github.com/go-openapi/runtime/go.work b/vendor/github.com/go-openapi/runtime/go.work
index b4cd9e01e86..73479f9ad8f 100644
--- a/vendor/github.com/go-openapi/runtime/go.work
+++ b/vendor/github.com/go-openapi/runtime/go.work
@@ -1,6 +1,8 @@
use (
.
./client-middleware/opentracing
+ ./docs/examples
+ ./server-middleware
)
-go 1.24.0
+go 1.25.0
diff --git a/vendor/github.com/go-openapi/runtime/go.work.sum b/vendor/github.com/go-openapi/runtime/go.work.sum
deleted file mode 100644
index b24a8cfaf94..00000000000
--- a/vendor/github.com/go-openapi/runtime/go.work.sum
+++ /dev/null
@@ -1,109 +0,0 @@
-github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
-github.com/go-openapi/errors v0.22.2/go.mod h1:+n/5UdIqdVnLIJ6Q9Se8HNGUXYaY6CN8ImWzfi/Gzp0=
-github.com/go-openapi/jsonpointer v0.22.0/go.mod h1:xt3jV88UtExdIkkL7NloURjRQjbeUgcxFblMjq2iaiU=
-github.com/go-openapi/jsonreference v0.21.1/go.mod h1:PWs8rO4xxTUqKGu+lEvvCxD5k2X7QYkKAepJyCmSTT8=
-github.com/go-openapi/swag v0.24.1/go.mod h1:sm8I3lCPlspsBBwUm1t5oZeWZS0s7m/A+Psg0ooRU0A=
-github.com/go-openapi/swag/cmdutils v0.24.0/go.mod h1:uxib2FAeQMByyHomTlsP8h1TtPd54Msu2ZDU/H5Vuf8=
-github.com/go-openapi/swag/conv v0.24.0/go.mod h1:jbn140mZd7EW2g8a8Y5bwm8/Wy1slLySQQ0ND6DPc2c=
-github.com/go-openapi/swag/fileutils v0.24.0/go.mod h1:3SCrCSBHyP1/N+3oErQ1gP+OX1GV2QYFSnrTbzwli90=
-github.com/go-openapi/swag/jsonname v0.24.0/go.mod h1:GXqrPzGJe611P7LG4QB9JKPtUZ7flE4DOVechNaDd7Q=
-github.com/go-openapi/swag/jsonutils v0.24.0/go.mod h1:vBowZtF5Z4DDApIoxcIVfR8v0l9oq5PpYRUuteVu6f0=
-github.com/go-openapi/swag/loading v0.24.0/go.mod h1:gShCN4woKZYIxPxbfbyHgjXAhO61m88tmjy0lp/LkJk=
-github.com/go-openapi/swag/mangling v0.24.0/go.mod h1:Jm5Go9LHkycsz0wfoaBDkdc4CkpuSnIEf62brzyCbhc=
-github.com/go-openapi/swag/netutils v0.24.0/go.mod h1:WRgiHcYTnx+IqfMCtu0hy9oOaPR0HnPbmArSRN1SkZM=
-github.com/go-openapi/swag/stringutils v0.24.0/go.mod h1:5nUXB4xA0kw2df5PRipZDslPJgJut+NjL7D25zPZ/4w=
-github.com/go-openapi/swag/typeutils v0.24.0/go.mod h1:q8C3Kmk/vh2VhpCLaoR2MVWOGP8y7Jc8l82qCTd1DYI=
-github.com/go-openapi/swag/yamlutils v0.24.0/go.mod h1:DpKv5aYuaGm/sULePoeiG8uwMpZSfReo1HR3Ik0yaG8=
-github.com/go-openapi/testify/enable/yaml/v2 v2.4.0/go.mod h1:14iV8jyyQlinc9StD7w1xVPW3CO3q1Gj04Jy//Kw4VM=
-github.com/go-openapi/testify/v2 v2.4.0/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54=
-github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
-github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
-github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
-github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
-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/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU=
-github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
-github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
-github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
-github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
-github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
-github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30 h1:BHT1/DKsYDGkUgQ2jmMaozVcdk+sVfz0+1ZJq4zkWgw=
-github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
-github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
-github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
-github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=
-github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
-github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
-github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
-github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
-github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
-github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
-github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI=
-github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
-go.mongodb.org/mongo-driver v1.17.6/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ=
-go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
-golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
-golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
-golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8=
-golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0=
-golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts=
-golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos=
-golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
-golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
-golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
-golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=
-golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI=
-golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c=
-golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU=
-golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
-golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
-golang.org/x/net v0.45.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY=
-golang.org/x/sync v0.0.0-20190423024810-112230192c58/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.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
-golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
-golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
-golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0=
-golang.org/x/telemetry v0.0.0-20250807160809-1a19826ec488/go.mod h1:fGb/2+tgXXjhjHsTNdVEEMZNWA0quBnfrO+AfoDSAKw=
-golang.org/x/telemetry v0.0.0-20260109210033-bd525da824e2/go.mod h1:b7fPSJ0pKZ3ccUh8gnTONJxhn3c/PS6tyzQvyqw4iA8=
-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.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk=
-golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA=
-golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss=
-golang.org/x/term v0.40.0 h1:36e4zGLqU4yhjlmxEaagx2KuYbJq3EwY8K943ZsHcvg=
-golang.org/x/term v0.40.0/go.mod h1:w2P8uVp06p2iyKKuvXIm7N/y0UCRt3UfJTfZ7oOpglM=
-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.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
-golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
-golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
-golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c=
-golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0=
-golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw=
-golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
-golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w=
-golang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc=
-golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg=
-golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/vendor/github.com/go-openapi/runtime/interfaces.go b/vendor/github.com/go-openapi/runtime/interfaces.go
index a8b4b318d9c..85211989078 100644
--- a/vendor/github.com/go-openapi/runtime/interfaces.go
+++ b/vendor/github.com/go-openapi/runtime/interfaces.go
@@ -99,3 +99,25 @@ type Validatable interface {
type ContextValidatable interface {
ContextValidate(context.Context, strfmt.Registry) error
}
+
+// ContentTyper is implemented by values that declare their own MIME
+// content type. The client runtime consults it in two places:
+//
+// - on a body payload set via [SetBodyParam]: when the payload is a
+// stream (io.Reader, io.ReadCloser) and ContentType returns a
+// non-empty value, that value becomes the wire Content-Type
+// header instead of the operation's picked consumes entry.
+//
+// - on individual file values inside a multipart upload: their per-
+// part Content-Type header is taken from ContentType() rather
+// than sniffed via http.DetectContentType.
+//
+// An empty string return is treated as "no opinion" and the runtime
+// falls back to its default selection. Values that have no content
+// type to declare may simply not implement the interface.
+//
+// See docs/MEDIA_TYPES.md for the full client-side selection
+// algorithm.
+type ContentTyper interface {
+ ContentType() string
+}
diff --git a/vendor/github.com/go-openapi/runtime/middleware/context.go b/vendor/github.com/go-openapi/runtime/middleware/context.go
index 1f85e86b538..8291f63a72d 100644
--- a/vendor/github.com/go-openapi/runtime/middleware/context.go
+++ b/vendor/github.com/go-openapi/runtime/middleware/context.go
@@ -5,10 +5,9 @@ package middleware
import (
stdContext "context"
+ stderrors "errors"
"fmt"
"net/http"
- "net/url"
- "path"
"strings"
"sync"
@@ -17,19 +16,21 @@ import (
"github.com/go-openapi/loads"
"github.com/go-openapi/spec"
"github.com/go-openapi/strfmt"
+ "github.com/go-openapi/swag/typeutils"
"github.com/go-openapi/runtime"
"github.com/go-openapi/runtime/logger"
"github.com/go-openapi/runtime/middleware/untyped"
"github.com/go-openapi/runtime/security"
+ "github.com/go-openapi/runtime/server-middleware/docui"
+ "github.com/go-openapi/runtime/server-middleware/mediatype"
+ "github.com/go-openapi/runtime/server-middleware/negotiate"
)
// Debug when true turns on verbose logging.
var Debug = logger.DebugEnabled()
// Logger is the standard library logger used for printing debug messages.
-//
-// (Note: The correct spelling is "library", not "libra". "Libra" is a zodiac sign/constellation and wouldn't make sense in this context.)
var Logger logger.Logger = logger.StandardLogger{}
func debugLogfFunc(lg logger.Logger) func(string, ...any) {
@@ -75,11 +76,103 @@ func (fn ResponderFunc) WriteResponse(rw http.ResponseWriter, pr runtime.Produce
// used throughout to store request context with the standard context attached
// to the [http.Request].
type Context struct {
- spec *loads.Document
- analyzer *analysis.Spec
- api RoutableAPI
- router Router
- debugLogf func(string, ...any) // a logging function to debug context and all components using it
+ spec *loads.Document
+ analyzer *analysis.Spec
+ api RoutableAPI
+ router Router
+ debugLogf func(string, ...any) // a logging function to debug context and all components using it
+ ignoreParameters bool // see SetIgnoreParameters / WithIgnoreParameters
+ matchSuffix bool // see SetMatchSuffix / WithMatchSuffix
+}
+
+// NewRoutableContext creates a new context for a routable API.
+//
+// If a nil Router is provided, the [DefaultRouter] ([denco]-based) will be used.
+func NewRoutableContext(spec *loads.Document, routableAPI RoutableAPI, routes Router) *Context {
+ var an *analysis.Spec
+ if spec != nil {
+ an = analysis.New(spec.Spec())
+ }
+
+ return NewRoutableContextWithAnalyzedSpec(spec, an, routableAPI, routes)
+}
+
+// NewRoutableContextWithAnalyzedSpec is like [NewRoutableContext] but takes as input an already analysed spec.
+//
+// If a nil Router is provided, the [DefaultRouter] ([denco]-based) will be used.
+func NewRoutableContextWithAnalyzedSpec(spec *loads.Document, an *analysis.Spec, routableAPI RoutableAPI, routes Router) *Context {
+ // Either there are no spec doc and analysis, or both of them.
+ if (spec != nil || an != nil) && (spec == nil || an == nil) {
+ panic(fmt.Errorf("%d: %s", http.StatusInternalServerError, "routable context requires either both spec doc and analysis, or none of them"))
+ }
+
+ return &Context{
+ spec: spec,
+ api: routableAPI,
+ analyzer: an,
+ router: routes,
+ debugLogf: debugLogfFunc(nil),
+ }
+}
+
+// NewContext creates a new context wrapper.
+//
+// If a nil Router is provided, the [DefaultRouter] ([denco]-based) will be used.
+func NewContext(spec *loads.Document, api *untyped.API, routes Router) *Context {
+ var an *analysis.Spec
+ if spec != nil {
+ an = analysis.New(spec.Spec())
+ }
+ ctx := &Context{
+ spec: spec,
+ analyzer: an,
+ router: routes,
+ debugLogf: debugLogfFunc(nil),
+ }
+ ctx.api = newRoutableUntypedAPI(spec, api, ctx)
+
+ return ctx
+}
+
+// Serve serves the specified spec with the specified api registrations as a [http.Handler].
+func Serve(spec *loads.Document, api *untyped.API) http.Handler {
+ return ServeWithBuilder(spec, api, PassthroughBuilder)
+}
+
+// SetIgnoreParameters toggles the legacy parameter-stripping behaviour for
+// Accept negotiation server-wide. When set, every internal call to
+// [NegotiateContentType] from this Context applies [WithIgnoreParameters].
+//
+// Returns the receiver for fluent configuration:
+//
+// ctx := middleware.NewContext(spec, api, nil).SetIgnoreParameters(true)
+//
+// See [WithIgnoreParameters] for the rationale and an example.
+func (c *Context) SetIgnoreParameters(ignore bool) *Context {
+ c.ignoreParameters = ignore
+
+ return c
+}
+
+// SetMatchSuffix toggles RFC 6839 structured-syntax suffix tolerance
+// server-wide. When enabled, both Accept negotiation and codec lookup
+// fall back through the suffix base for the recognised suffixes
+// (+json, +xml, +yaml) — so an operation declaring
+// consumes: [application/json] also accepts request bodies sent with
+// Content-Type: application/vnd.api+json (or any other +json variant).
+//
+// Default: strict (false). Use only when interoperating with clients
+// that do not strictly abide by the spec.
+//
+// Returns the receiver for fluent configuration:
+//
+// ctx := middleware.NewContext(spec, api, nil).SetMatchSuffix(true)
+//
+// See [negotiate.WithMatchSuffix] for the per-call form and rationale.
+func (c *Context) SetMatchSuffix(enable bool) *Context {
+ c.matchSuffix = enable
+
+ return c
}
type routableUntypedAPI struct {
@@ -95,53 +188,57 @@ func newRoutableUntypedAPI(spec *loads.Document, api *untyped.API, context *Cont
if spec == nil || api == nil {
return nil
}
+
analyzer := analysis.New(spec.Spec())
for method, hls := range analyzer.Operations() {
um := strings.ToUpper(method)
for path, op := range hls {
schemes := analyzer.SecurityRequirementsFor(op)
- if oh, ok := api.OperationHandlerFor(method, path); ok {
- if handlers == nil {
- handlers = make(map[string]map[string]http.Handler)
+ oh, ok := api.OperationHandlerFor(method, path)
+ if !ok {
+ continue
+ }
+
+ if handlers == nil {
+ handlers = make(map[string]map[string]http.Handler)
+ }
+ if b, ok := handlers[um]; !ok || b == nil {
+ handlers[um] = make(map[string]http.Handler)
+ }
+
+ var handler http.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ // lookup route info in the context
+ route, rCtx, _ := context.RouteInfo(r)
+ if rCtx != nil {
+ r = rCtx
}
- if b, ok := handlers[um]; !ok || b == nil {
- handlers[um] = make(map[string]http.Handler)
+
+ // bind and validate the request using reflection
+ var bound any
+ var validation error
+ bound, r, validation = context.BindAndValidate(r, route)
+ if validation != nil {
+ context.Respond(w, r, route.Produces, route, validation)
+ return
}
- var handler http.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- // lookup route info in the context
- route, rCtx, _ := context.RouteInfo(r)
- if rCtx != nil {
- r = rCtx
- }
-
- // bind and validate the request using reflection
- var bound any
- var validation error
- bound, r, validation = context.BindAndValidate(r, route)
- if validation != nil {
- context.Respond(w, r, route.Produces, route, validation)
- return
- }
-
- // actually handle the request
- result, err := oh.Handle(bound)
- if err != nil {
- // respond with failure
- context.Respond(w, r, route.Produces, route, err)
- return
- }
-
- // respond with success
- context.Respond(w, r, route.Produces, route, result)
- })
-
- if len(schemes) > 0 {
- handler = newSecureAPI(context, handler)
+ // actually handle the request
+ result, err := oh.Handle(bound)
+ if err != nil {
+ // respond with failure
+ context.Respond(w, r, route.Produces, route, err)
+ return
}
- handlers[um][path] = handler
+
+ // respond with success
+ context.Respond(w, r, route.Produces, route, result)
+ })
+
+ if len(schemes) > 0 {
+ handler = newSecureAPI(context, handler)
}
+ handlers[um][path] = handler
}
}
@@ -192,60 +289,6 @@ func (r *routableUntypedAPI) DefaultConsumes() string {
return r.defaultConsumes
}
-// NewRoutableContext creates a new context for a routable API.
-//
-// If a nil Router is provided, the [DefaultRouter] ([denco]-based) will be used.
-func NewRoutableContext(spec *loads.Document, routableAPI RoutableAPI, routes Router) *Context {
- var an *analysis.Spec
- if spec != nil {
- an = analysis.New(spec.Spec())
- }
-
- return NewRoutableContextWithAnalyzedSpec(spec, an, routableAPI, routes)
-}
-
-// NewRoutableContextWithAnalyzedSpec is like [NewRoutableContext] but takes as input an already analysed spec.
-//
-// If a nil Router is provided, the [DefaultRouter] ([denco]-based) will be used.
-func NewRoutableContextWithAnalyzedSpec(spec *loads.Document, an *analysis.Spec, routableAPI RoutableAPI, routes Router) *Context {
- // Either there are no spec doc and analysis, or both of them.
- if (spec != nil || an != nil) && (spec == nil || an == nil) {
- panic(fmt.Errorf("%d: %s", http.StatusInternalServerError, "routable context requires either both spec doc and analysis, or none of them"))
- }
-
- return &Context{
- spec: spec,
- api: routableAPI,
- analyzer: an,
- router: routes,
- debugLogf: debugLogfFunc(nil),
- }
-}
-
-// NewContext creates a new context wrapper.
-//
-// If a nil Router is provided, the [DefaultRouter] ([denco]-based) will be used.
-func NewContext(spec *loads.Document, api *untyped.API, routes Router) *Context {
- var an *analysis.Spec
- if spec != nil {
- an = analysis.New(spec.Spec())
- }
- ctx := &Context{
- spec: spec,
- analyzer: an,
- router: routes,
- debugLogf: debugLogfFunc(nil),
- }
- ctx.api = newRoutableUntypedAPI(spec, api, ctx)
-
- return ctx
-}
-
-// Serve serves the specified spec with the specified api registrations as a [http.Handler].
-func Serve(spec *loads.Document, api *untyped.API) http.Handler {
- return ServeWithBuilder(spec, api, PassthroughBuilder)
-}
-
// ServeWithBuilder serves the specified spec with the specified api registrations as a [http.Handler] that is decorated
// by the Builder.
func ServeWithBuilder(spec *loads.Document, api *untyped.API, builder Builder) http.Handler {
@@ -319,57 +362,42 @@ func (c *Context) RequiredProduces() []string {
// BindValidRequest binds a params object to a request but only when the request is valid
// if the request is not valid an error will be returned.
func (c *Context) BindValidRequest(request *http.Request, route *MatchedRoute, binder RequestBinder) error {
- var res []error
var requestContentType string
// check and validate content type, select consumer
if runtime.HasBody(request) {
- ct, _, err := runtime.ContentType(request.Header)
+ ct, cons, err := c.bindRequestBody(request, route)
if err != nil {
- res = append(res, err)
- } else {
- c.debugLogf("validating content type for %q against [%s]", ct, strings.Join(route.Consumes, ", "))
- if err := validateContentType(route.Consumes, ct); err != nil {
- res = append(res, err)
- }
- if len(res) == 0 {
- cons, ok := route.Consumers[ct]
- if !ok {
- res = append(res, errors.New(http.StatusInternalServerError, "no consumer registered for %s", ct))
- } else {
- route.Consumer = cons
- requestContentType = ct
- }
- }
+ return errors.CompositeValidationError(err)
}
+
+ // happy path
+ requestContentType = ct
+ route.Consumer = cons
}
// check and validate the response format
- if len(res) == 0 {
- // if the route does not provide Produces and a default contentType could not be identified
- // based on a body, typical for GET and DELETE requests, then default contentType to.
- if len(route.Produces) == 0 && requestContentType == "" {
- requestContentType = "*/*"
- }
+ // if the route does not provide Produces and a default contentType could not be identified
+ // based on a body, typical for GET and DELETE requests, then default contentType to.
+ if len(route.Produces) == 0 && requestContentType == "" {
+ requestContentType = "*/*"
+ }
- if str := NegotiateContentType(request, route.Produces, requestContentType); str == "" {
- res = append(res, errors.InvalidResponseFormat(request.Header.Get(runtime.HeaderAccept), route.Produces))
- }
+ str := negotiate.ContentType(request, route.Produces, requestContentType, c.negotiateOpts()...)
+ if str == "" {
+ return errors.CompositeValidationError(
+ errors.InvalidResponseFormat(request.Header.Get(runtime.HeaderAccept), route.Produces),
+ )
+ }
+
+ if binder == nil {
+ return nil
}
// now bind the request with the provided binder
// it's assumed the binder will also validate the request and return an error if the
// request is invalid
- if binder != nil && len(res) == 0 {
- if err := binder.BindRequest(request, route); err != nil {
- return err
- }
- }
-
- if len(res) > 0 {
- return errors.CompositeValidationError(res...)
- }
- return nil
+ return binder.BindRequest(request, route)
}
// ContentType gets the parsed value of a content type
@@ -431,7 +459,7 @@ func (c *Context) ResponseFormat(r *http.Request, offers []string) (string, *htt
return v, r
}
- format := NegotiateContentType(r, offers, "")
+ format := negotiate.ContentType(r, offers, "", c.negotiateOpts()...)
if format != "" {
c.debugLogf("[%s %s] set response format %q in context", r.Method, r.URL.Path, format)
r = r.WithContext(stdContext.WithValue(rCtx, ctxResponseFormat, format))
@@ -453,44 +481,6 @@ func (c *Context) ResetAuth(request *http.Request) *http.Request {
return request.WithContext(rctx)
}
-// Authorize authorizes the request
-// Returns the principal object and a shallow copy of the request when its
-// context doesn't contain the principal, otherwise the same request or an error
-// (the last) if one of the authenticators returns one or an Unauthenticated error.
-func (c *Context) Authorize(request *http.Request, route *MatchedRoute) (any, *http.Request, error) {
- if route == nil || !route.HasAuth() {
- return nil, nil, nil
- }
-
- var rCtx = request.Context()
- if v := rCtx.Value(ctxSecurityPrincipal); v != nil {
- return v, request, nil
- }
-
- applies, usr, err := route.Authenticators.Authenticate(request, route)
- if !applies || err != nil || !route.Authenticators.AllowsAnonymous() && usr == nil {
- if err != nil {
- return nil, nil, err
- }
- return nil, nil, errors.Unauthenticated("invalid credentials")
- }
- if route.Authorizer != nil {
- if err := route.Authorizer.Authorize(request, usr); err != nil {
- if _, ok := err.(errors.Error); ok {
- return nil, nil, err
- }
-
- return nil, nil, errors.New(http.StatusForbidden, "%v", err)
- }
- }
-
- rCtx = request.Context()
-
- rCtx = stdContext.WithValue(rCtx, ctxSecurityPrincipal, usr)
- rCtx = stdContext.WithValue(rCtx, ctxSecurityScopes, route.Authenticator.AllScopes())
- return usr, request.WithContext(rCtx), nil
-}
-
// BindAndValidate binds and validates the request
// Returns the validation map and a shallow copy of the request when its context
// doesn't contain the validation, otherwise it returns the same request or an
@@ -523,91 +513,29 @@ func (c *Context) NotFound(rw http.ResponseWriter, r *http.Request) {
// Respond renders the response after doing some content negotiation.
func (c *Context) Respond(rw http.ResponseWriter, r *http.Request, produces []string, route *MatchedRoute, data any) {
c.debugLogf("responding to %s %s with produces: %v", r.Method, r.URL.Path, produces)
- offers := []string{}
- for _, mt := range produces {
- if mt != c.api.DefaultProduces() {
- offers = append(offers, mt)
- }
- }
- // the default producer is last so more specific producers take precedence
- offers = append(offers, c.api.DefaultProduces())
- c.debugLogf("offers: %v", offers)
+ offers := c.buildOffers(produces)
var format string
format, r = c.ResponseFormat(r, offers)
rw.Header().Set(runtime.HeaderContentType, format)
if resp, ok := data.(Responder); ok {
- producers := route.Producers
- // producers contains keys with normalized format, if a format has MIME type parameter such as `text/plain; charset=utf-8`
- // then you must provide `text/plain` to get the correct producer. HOWEVER, format here is not normalized.
- prod, ok := producers[normalizeOffer(format)]
- if !ok {
- prods := c.api.ProducersFor(normalizeOffers([]string{c.api.DefaultProduces()}))
- pr, ok := prods[c.api.DefaultProduces()]
- if !ok {
- panic(fmt.Errorf("%d: %s", http.StatusInternalServerError, cantFindProducer(format)))
- }
- prod = pr
- }
- resp.WriteResponse(rw, prod)
+ c.respondWithResponder(rw, r, route, resp, format)
return
}
if err, ok := data.(error); ok {
- if format == "" {
- rw.Header().Set(runtime.HeaderContentType, runtime.JSONMime)
- }
-
- if realm := security.FailedBasicAuth(r); realm != "" {
- rw.Header().Set("WWW-Authenticate", fmt.Sprintf("Basic realm=%q", realm))
- }
-
- if route == nil || route.Operation == nil {
- c.api.ServeErrorFor("")(rw, r, err)
- return
- }
- c.api.ServeErrorFor(route.Operation.ID)(rw, r, err)
+ c.respondWithError(rw, r, produces, route, err, format)
return
}
if route == nil || route.Operation == nil {
- rw.WriteHeader(http.StatusOK)
- if r.Method == http.MethodHead {
- return
- }
- producers := c.api.ProducersFor(normalizeOffers(offers))
- prod, ok := producers[format]
- if !ok {
- panic(fmt.Errorf("%d: %s", http.StatusInternalServerError, cantFindProducer(format)))
- }
- if err := prod.Produce(rw, data); err != nil {
- panic(err) // let the recovery middleware deal with this
- }
+ c.respondWithoutCode(rw, r, data, format, offers)
return
}
if _, code, ok := route.Operation.SuccessResponse(); ok {
- rw.WriteHeader(code)
- if code == http.StatusNoContent || r.Method == http.MethodHead {
- return
- }
-
- producers := route.Producers
- prod, ok := producers[format]
- if !ok {
- if !ok {
- prods := c.api.ProducersFor(normalizeOffers([]string{c.api.DefaultProduces()}))
- pr, ok := prods[c.api.DefaultProduces()]
- if !ok {
- panic(fmt.Errorf("%d: %s", http.StatusInternalServerError, cantFindProducer(format)))
- }
- prod = pr
- }
- }
- if err := prod.Produce(rw, data); err != nil {
- panic(err) // let the recovery middleware deal with this
- }
+ c.respondWithCode(rw, r, route, code, data, format)
return
}
@@ -618,57 +546,76 @@ func (c *Context) Respond(rw http.ResponseWriter, r *http.Request, produces []st
//
// This handler includes a swagger spec, router and the contract defined in the swagger spec.
//
-// A spec UI ([SwaggerUI]) is served at {API base path}/docs and the spec document at /swagger.json
-// (these can be modified with uiOptions).
+// A spec UI ([docui.SwaggerUI]) is served at {API base path}/docs and the spec document at /swagger.json
+// (these can be modified with combined [UIOption]).
+//
+// Deprecated: use [Context.APIHandlerWithUI] with [docui.SwaggerUI] middleware instead.
func (c *Context) APIHandlerSwaggerUI(builder Builder, opts ...UIOption) http.Handler {
- b := builder
- if b == nil {
- b = PassthroughBuilder
- }
-
- specPath, uiOpts, specOpts := c.uiOptionsForHandler(opts)
- var swaggerUIOpts SwaggerUIOpts
- fromCommonToAnyOptions(uiOpts, &swaggerUIOpts)
-
- return Spec(specPath, c.spec.Raw(), SwaggerUI(swaggerUIOpts, c.RoutesHandler(b)), specOpts...)
+ return c.APIHandlerWithUI(builder, docui.UseSwaggerUI, c.uiOptionsForHandler(opts)...)
}
// APIHandlerRapiDoc returns a handler to serve the API.
//
// This handler includes a swagger spec, router and the contract defined in the swagger spec.
//
-// A spec UI ([RapiDoc]) is served at {API base path}/docs and the spec document at /swagger.json
-// (these can be modified with uiOptions).
+// A spec UI ([docui.RapiDoc]) is served at {API base path}/docs and the spec document at /swagger.json
+// (these can be modified with combined [UIOption]).
+//
+// Deprecated: use [Context.APIHandlerWithUI] with [docui.UseRapiDoc] middleware instead.
func (c *Context) APIHandlerRapiDoc(builder Builder, opts ...UIOption) http.Handler {
- b := builder
- if b == nil {
- b = PassthroughBuilder
- }
-
- specPath, uiOpts, specOpts := c.uiOptionsForHandler(opts)
- var rapidocUIOpts RapiDocOpts
- fromCommonToAnyOptions(uiOpts, &rapidocUIOpts)
-
- return Spec(specPath, c.spec.Raw(), RapiDoc(rapidocUIOpts, c.RoutesHandler(b)), specOpts...)
+ return c.APIHandlerWithUI(builder, docui.UseRapiDoc, c.uiOptionsForHandler(opts)...)
}
// APIHandler returns a handler to serve the API.
//
// This handler includes a swagger spec, router and the contract defined in the swagger spec.
//
-// A spec UI ([Redoc]) is served at {API base path}/docs and the spec document at /swagger.json
-// (these can be modified with uiOptions).
+// A spec UI ([docui.Redoc]) is served at {API base path}/docs and the spec document at /swagger.json
+// (these can be modified with combined [UIOption]).
+//
+// Notice that you may use [Context.APIHandlerWithUI] to use an alternate UI-serving middleware.
func (c *Context) APIHandler(builder Builder, opts ...UIOption) http.Handler {
+ return c.APIHandlerWithUI(builder, docui.UseRedoc, c.uiOptionsForHandler(opts)...)
+}
+
+// APIHandlerWithUI returns a handler to serve the API with a swagger spec and a UI.
+//
+// This handler includes a swagger spec, router and the contract defined in the swagger spec.
+//
+// A spec UI is served at {API base path}/docs and the spec document at /swagger.json
+// (these can be modified with combined [UIOption]).
+//
+// Notice that any function that accepts the [docui.Option] set and returns a valid middleware may be injected here.
+//
+// [Context.APIHandlerWithUI] extends [Context.APIHandler], and supersedes [Context.APIHandlerRapiDoc] and [Context.APIHandlerSwaggerUI].
+func (c *Context) APIHandlerWithUI(builder Builder, uiMiddleware docui.UIMiddleware, opts ...docui.Option) http.Handler {
b := builder
if b == nil {
b = PassthroughBuilder
}
- specPath, uiOpts, specOpts := c.uiOptionsForHandler(opts)
- var redocOpts RedocOpts
- fromCommonToAnyOptions(uiOpts, &redocOpts)
+ // the UI titles defaults to the title in the spec
+ const extraOptions = 2
+ prepend := make([]docui.Option, 0, len(opts)+extraOptions)
+ var title string
- return Spec(specPath, c.spec.Raw(), Redoc(redocOpts, c.RoutesHandler(b)), specOpts...)
+ sp := c.spec.Spec()
+ if sp != nil && sp.Info != nil && sp.Info.Title != "" {
+ title = sp.Info.Title
+ }
+ if title != "" {
+ prepend = append(prepend, docui.WithUITitle(title))
+ }
+
+ prepend = append(prepend, docui.WithUIBasePath(c.BasePath()))
+ prepend = append(prepend, opts...)
+
+ // aligns spec serve path with UI setting to fetch spec document.
+ return docui.UseSpec(c.spec.Raw(), docui.WithSpecPathFromOptions(prepend...))(
+ uiMiddleware(prepend...)(
+ c.RoutesHandler(b),
+ ),
+ )
}
// RoutesHandler returns a handler to serve the API, just the routes and the contract defined in the swagger spec.
@@ -680,37 +627,192 @@ func (c *Context) RoutesHandler(builder Builder) http.Handler {
return NewRouter(c, b(NewOperationExecutor(c)))
}
-func (c Context) uiOptionsForHandler(opts []UIOption) (string, uiOptions, []SpecOption) {
- var title string
- sp := c.spec.Spec()
- if sp != nil && sp.Info != nil && sp.Info.Title != "" {
- title = sp.Info.Title
+// authorizeImpl is the real authentication+authorization body shared
+// between the production and dev-only variants of [Context.Authorize].
+// See context_skipauth_disabled.go (default build) and
+// context_skipauth_enabled.go (the `openapi_unsafe_skipauth` build tag).
+//
+// The doc on the exported Authorize describes the user-facing
+// contract; this function MUST NOT change semantics for the
+// production path.
+func (c *Context) authorizeImpl(request *http.Request, route *MatchedRoute) (any, *http.Request, error) {
+ if route == nil || !route.HasAuth() {
+ return nil, nil, nil
}
- // default options (may be overridden)
- const baseOptions = 2
- optsForContext := make([]UIOption, 0, len(opts)+baseOptions)
- optsForContext = append(optsForContext,
- WithUIBasePath(c.BasePath()),
- WithUITitle(title),
- )
- optsForContext = append(optsForContext, opts...)
- uiOpts := uiOptionsWithDefaults(optsForContext)
+ var rCtx = request.Context()
+ if v := rCtx.Value(ctxSecurityPrincipal); v != nil {
+ return v, request, nil
+ }
+
+ applies, usr, err := route.Authenticators.Authenticate(request, route)
+ if !applies || err != nil || !route.Authenticators.AllowsAnonymous() && typeutils.IsZero(usr) {
+ if err != nil {
+ return nil, nil, err
+ }
+ return nil, nil, errors.Unauthenticated("invalid credentials")
+ }
+ if route.Authorizer != nil {
+ if err := route.Authorizer.Authorize(request, usr); err != nil {
+ var apiError errors.Error
+ if stderrors.As(err, &apiError) {
+ return nil, nil, err
+ }
+
+ return nil, nil, errors.New(http.StatusForbidden, "%v", err)
+ }
+ }
+
+ rCtx = request.Context()
+
+ rCtx = stdContext.WithValue(rCtx, ctxSecurityPrincipal, usr)
+ rCtx = stdContext.WithValue(rCtx, ctxSecurityScopes, route.Authenticator.AllScopes())
+ return usr, request.WithContext(rCtx), nil
+}
+
+func (c *Context) bindRequestBody(request *http.Request, route *MatchedRoute) (string, runtime.Consumer, error) {
+ ct, _, err := runtime.ContentType(request.Header)
+ if err != nil {
+ return "", nil, err
+ }
+
+ c.debugLogf("validating content type for %q against [%s]", ct, strings.Join(route.Consumes, ", "))
+ if err := validateContentType(route.Consumes, ct); err != nil {
+ return "", nil, err
+ }
+
+ cons, ok := mediatype.Lookup(route.Consumers, ct, c.matchOpts()...)
+ if !ok {
+ return "", nil, errors.New(http.StatusInternalServerError, "no consumer registered for %s", ct)
+ }
+
+ return ct, cons, nil
+}
+
+func (c *Context) respondWithResponder(rw http.ResponseWriter, r *http.Request, route *MatchedRoute, resp Responder, format string) {
+ _ = r
+ producers := route.Producers
+
+ // producers contains keys with normalized format, if a format has MIME type parameter such as `text/plain; charset=utf-8`
+ // then you must provide `text/plain` to get the correct producer. HOWEVER, format here is not normalized.
+ prod, ok := producers[normalizeOffer(format)]
+ if !ok {
+ prods := c.api.ProducersFor(normalizeOffers([]string{c.api.DefaultProduces()}))
+ pr, ok := prods[c.api.DefaultProduces()]
+ if !ok {
+ panic(fmt.Errorf("%d: %s", http.StatusInternalServerError, cantFindProducer(format)))
+ }
+ prod = pr
+ }
+
+ resp.WriteResponse(rw, prod)
+}
+
+func (c *Context) respondWithError(rw http.ResponseWriter, r *http.Request, produces []string, route *MatchedRoute, err error, format string) {
+ _ = produces
+
+ if format == "" {
+ rw.Header().Set(runtime.HeaderContentType, runtime.JSONMime)
+ }
+
+ if realm := security.FailedBasicAuth(r); realm != "" {
+ rw.Header().Set("WWW-Authenticate", fmt.Sprintf("Basic realm=%q", realm))
+ }
+
+ if route == nil || route.Operation == nil {
+ c.api.ServeErrorFor("")(rw, r, err)
+ return
+ }
+
+ c.api.ServeErrorFor(route.Operation.ID)(rw, r, err)
+}
+
+func (c *Context) respondWithoutCode(rw http.ResponseWriter, r *http.Request, data any, format string, offers []string) {
+ rw.WriteHeader(http.StatusOK)
+ if r.Method == http.MethodHead {
+ return
+ }
+
+ producers := c.api.ProducersFor(normalizeOffers(offers))
+ prod, ok := producers[format]
+ if !ok {
+ panic(fmt.Errorf("%d: %s", http.StatusInternalServerError, cantFindProducer(format)))
+ }
+
+ if err := prod.Produce(rw, data); err != nil {
+ panic(err) // let the recovery middleware deal with this
+ }
+}
+
+func (c *Context) buildOffers(produces []string) []string {
+ offers := make([]string, 0, len(produces)+1)
+
+ for _, mt := range produces {
+ if mt != c.api.DefaultProduces() {
+ offers = append(offers, mt)
+ }
+ }
+
+ // the default producer is last so more specific producers take precedence
+ offers = append(offers, c.api.DefaultProduces())
+ c.debugLogf("offers: %v", offers)
+
+ return offers
+}
+
+func (c *Context) respondWithCode(rw http.ResponseWriter, r *http.Request, route *MatchedRoute, code int, data any, format string) {
+ rw.WriteHeader(code)
+ if code == http.StatusNoContent || r.Method == http.MethodHead {
+ return
+ }
+
+ producers := route.Producers
+ prod, ok := producers[format]
+ if !ok {
+ if !ok {
+ prods := c.api.ProducersFor(normalizeOffers([]string{c.api.DefaultProduces()}))
+ pr, ok := prods[c.api.DefaultProduces()]
+ if !ok {
+ panic(fmt.Errorf("%d: %s", http.StatusInternalServerError, cantFindProducer(format)))
+ }
+ prod = pr
+ }
+ }
- // If spec URL is provided, there is a non-default path to serve the spec.
- // This makes sure that the UI middleware is aligned with the Spec middleware.
- u, _ := url.Parse(uiOpts.SpecURL)
- var specPath string
- if u != nil {
- specPath = u.Path
+ if err := prod.Produce(rw, data); err != nil {
+ panic(err) // let the recovery middleware deal with this
}
+}
+
+// uiOptionsForHandler bridges the deprecated [UIOption] set to the new [docui.Option] set.
+func (c Context) uiOptionsForHandler(opts []UIOption) []docui.Option {
+ uiOpts := uiOptionsWithDefaults(opts)
- pth, doc := path.Split(specPath)
- if pth == "." {
- pth = ""
+ return uiOpts.toFuncOptions()
+}
+
+func (c *Context) negotiateOpts() []negotiate.Option {
+ var opts []negotiate.Option
+ if c.ignoreParameters {
+ opts = append(opts, negotiate.WithIgnoreParameters(true))
+ }
+ if c.matchSuffix {
+ opts = append(opts, negotiate.WithMatchSuffix(true))
+ }
+
+ return opts
+}
+
+// matchOpts builds the mediatype.MatchOption slice that the
+// codec-lookup and Content-Type validation paths apply server-wide.
+// Mirrors negotiateOpts but at the mediatype level (without going
+// through the negotiate.Option wrapper).
+func (c *Context) matchOpts() []mediatype.MatchOption {
+ if !c.matchSuffix {
+ return nil
}
- return pth, uiOpts, []SpecOption{WithSpecDocument(doc)}
+ return []mediatype.MatchOption{mediatype.AllowSuffix()}
}
func cantFindProducer(format string) string {
diff --git a/vendor/github.com/go-openapi/runtime/middleware/context_skipauth_disabled.go b/vendor/github.com/go-openapi/runtime/middleware/context_skipauth_disabled.go
new file mode 100644
index 00000000000..c8cd01a4343
--- /dev/null
+++ b/vendor/github.com/go-openapi/runtime/middleware/context_skipauth_disabled.go
@@ -0,0 +1,24 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+//go:build !openapi_unsafe_skipauth
+
+package middleware
+
+import "net/http"
+
+// Authorize authorizes the request.
+//
+// Returns the principal object and a shallow copy of the request when its
+// context doesn't contain the principal, otherwise the same request or an error
+// (the last) if one of the authenticators returns one or an Unauthenticated error.
+//
+// This is the production variant — compiled when the build tag
+// `openapi_unsafe_skipauth` is NOT set. There is no skip-auth check
+// in this codepath; the field, setter, and storage for the bypass
+// flag are entirely absent from the binary. See the alternate
+// implementation in context_skipauth_enabled.go for the dev-only
+// bypass mechanism.
+func (c *Context) Authorize(request *http.Request, route *MatchedRoute) (any, *http.Request, error) {
+ return c.authorizeImpl(request, route)
+}
diff --git a/vendor/github.com/go-openapi/runtime/middleware/context_skipauth_enabled.go b/vendor/github.com/go-openapi/runtime/middleware/context_skipauth_enabled.go
new file mode 100644
index 00000000000..2ac87068187
--- /dev/null
+++ b/vendor/github.com/go-openapi/runtime/middleware/context_skipauth_enabled.go
@@ -0,0 +1,61 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+//go:build openapi_unsafe_skipauth
+
+package middleware
+
+import (
+ "log"
+ "net/http"
+ "sync/atomic"
+)
+
+// skipAuthEnabled holds the process-wide skip-auth flag. It only
+// exists in binaries built with the `openapi_unsafe_skipauth` tag —
+// production binaries (built without the tag) have no field, no
+// setter, no storage, and no skip-checking branch in [Context.Authorize].
+// Reflection, unsafe-pointer arithmetic, or a debugger cannot flip
+// what is not in the binary.
+var skipAuthEnabled atomic.Bool
+
+// SetSkipAuth toggles a PROCESS-WIDE bypass of authentication AND
+// authorization for every operation served by every Context in the
+// running program.
+//
+// DANGER: this disables ALL authentication and ALL authorization.
+// Every request to every secured endpoint runs as if it had been
+// authorized with a nil principal. Use ONLY on developer
+// workstations during early prototyping (e.g. while
+// authentication is not yet wired up).
+//
+// This function exists only when the build tag
+// `openapi_unsafe_skipauth` is set:
+//
+// go build -tags openapi_unsafe_skipauth ./...
+//
+// Production CI MUST NOT pass this tag. Calls compile to a symbol
+// that does not exist in production binaries.
+//
+// Calling with true emits a one-line WARNING via the stdlib `log`
+// package (stderr by default) so the bypass is visible at startup.
+// Calling with false silently disables it.
+func SetSkipAuth(skip bool) {
+ skipAuthEnabled.Store(skip)
+ if skip {
+ log.Println("WARNING: go-openapi/runtime: SetSkipAuth(true) — authentication and authorization are bypassed for ALL operations. This MUST NOT run in production.")
+ }
+}
+
+// Authorize is the dev-build variant of the production
+// [Context.Authorize] (see context_skipauth_disabled.go for the
+// production path). When [SetSkipAuth] has enabled the bypass, this
+// returns a nil principal with the original request and no error —
+// handlers downstream receive a nil-value principal. Otherwise it
+// delegates to the standard authentication+authorization body.
+func (c *Context) Authorize(request *http.Request, route *MatchedRoute) (any, *http.Request, error) {
+ if skipAuthEnabled.Load() {
+ return nil, request, nil
+ }
+ return c.authorizeImpl(request, route)
+}
diff --git a/vendor/github.com/go-openapi/runtime/middleware/denco/router.go b/vendor/github.com/go-openapi/runtime/middleware/denco/router.go
index f89d761cf2a..e380a138d50 100644
--- a/vendor/github.com/go-openapi/runtime/middleware/denco/router.go
+++ b/vendor/github.com/go-openapi/runtime/middleware/denco/router.go
@@ -9,6 +9,7 @@ package denco
import (
"errors"
"fmt"
+ "slices"
"sort"
"strings"
)
@@ -29,8 +30,8 @@ const (
// PathParamCharacter indicates a RESTCONF path param.
PathParamCharacter = '='
- // MaxSize is max size of records and internal slice.
- MaxSize = (1 << 22) - 1 //nolint:mnd
+ // MaxSize is the maximum size of records and internal slice (encoded over 22 bits).
+ MaxSize = (1 << baseBits) - 1
)
// Router represents a URL router.
@@ -53,9 +54,12 @@ func New() *Router {
}
}
-// Lookup returns data and path parameters that associated with path.
+// Lookup returns data and path parameters which are associated to the path.
+//
// params is a slice of the [Param] that arranged in the order in which parameters appeared.
-// e.g. when built routing path is "/path/to/:id/:name" and given path is "/path/to/1/alice". params order is [{"id": "1"}, {"name": "alice"}], not [{"name": "alice"}, {"id": "1"}].
+//
+// e.g. when built routing path is "/path/to/:id/:name" and given path is "/path/to/1/alice",
+// params order is [{"id": "1"}, {"name": "alice"}], not [{"name": "alice"}, {"id": "1"}].
func (rt *Router) Lookup(path string) (data any, params Params, found bool) {
if data, found = rt.static[path]; found {
return data, nil, true
@@ -144,6 +148,7 @@ func newDoubleArray() *doubleArray {
type baseCheck uint32
const (
+ baseBits = 22
flagsBits = 10
checkBits = 8
)
@@ -157,7 +162,7 @@ func (bc *baseCheck) SetBase(base int) {
}
func (bc baseCheck) Check() byte {
- return byte(bc) //nolint:gosec // integer conversion is ok
+ return byte(bc) //nolint:gosec // integer conversion is ok: we pick the last 8 bits
}
func (bc *baseCheck) SetCheck(check byte) {
@@ -213,8 +218,8 @@ func (da *doubleArray) lookup(path string, params []Param, idx int) (*node, []Pa
}
BACKTRACKING:
- for j := len(indices) - 1; j >= 0; j-- {
- i, idx := int(indices[j]>>indexOffset), int(indices[j]&indexMask)
+ for _, j := range slices.Backward(indices) {
+ i, idx := int(j>>indexOffset), int(j&indexMask)
if da.bc[idx].IsSingleParam() {
nextIdx := nextIndex(da.bc[idx].Base(), ParamCharacter)
if nextIdx >= len(da.bc) {
diff --git a/vendor/github.com/go-openapi/runtime/middleware/denco/server.go b/vendor/github.com/go-openapi/runtime/middleware/denco/server.go
index e6c0976d8b2..3bbbc679d92 100644
--- a/vendor/github.com/go-openapi/runtime/middleware/denco/server.go
+++ b/vendor/github.com/go-openapi/runtime/middleware/denco/server.go
@@ -9,7 +9,7 @@ import (
"net/http"
)
-// Mux represents a multiplexer for HTTP request.
+// Mux represents a multiplexer for HTTP requests.
type Mux struct{}
// NewMux returns a new [Mux].
@@ -17,27 +17,27 @@ func NewMux() *Mux {
return &Mux{}
}
-// GET is shorthand of [Mux].Handler("GET", path, handler).
+// GET is shorthand for [Mux.Handler] ("GET", path, handler).
func (m *Mux) GET(path string, handler HandlerFunc) Handler {
return m.Handler("GET", path, handler)
}
-// POST is shorthand of [Mux].Handler("POST", path, handler).
+// POST is shorthand for [Mux.Handler] ("POST", path, handler).
func (m *Mux) POST(path string, handler HandlerFunc) Handler {
return m.Handler("POST", path, handler)
}
-// PUT is shorthand of [Mux].Handler("PUT", path, handler).
+// PUT is shorthand for [Mux.Handler] ("PUT", path, handler).
func (m *Mux) PUT(path string, handler HandlerFunc) Handler {
return m.Handler("PUT", path, handler)
}
-// HEAD is shorthand of [Mux].Handler("HEAD", path, handler).
+// HEAD is shorthand for [Mux.Handler]("HEAD", path, handler).
func (m *Mux) HEAD(path string, handler HandlerFunc) Handler {
return m.Handler("HEAD", path, handler)
}
-// Handler returns a handler for HTTP method.
+// Handler returns a [Handler] for a HTTP method.
func (m *Mux) Handler(method, path string, handler HandlerFunc) Handler {
return Handler{
Method: method,
@@ -63,7 +63,7 @@ func (m *Mux) Build(handlers []Handler) (http.Handler, error) {
return mux, nil
}
-// Handler represents a handler of HTTP request.
+// Handler represents a handler of HTTP requests.
type Handler struct {
// Method is an HTTP method.
Method string
@@ -75,7 +75,7 @@ type Handler struct {
Func HandlerFunc
}
-// HandlerFunc is aliased to type of handler function.
+// HandlerFunc is an alias to the handler function, similar to [http.HandlerFunc].
type HandlerFunc func(w http.ResponseWriter, r *http.Request, params Params)
type serveMux struct {
@@ -88,7 +88,7 @@ func newServeMux() *serveMux {
}
}
-// ServeHTTP implements http.Handler interface.
+// ServeHTTP implements the [http.Handler] interface.
func (mux *serveMux) ServeHTTP(w http.ResponseWriter, r *http.Request) {
handler, params := mux.handler(r.Method, r.URL.Path)
handler(w, r, params)
@@ -97,15 +97,17 @@ func (mux *serveMux) ServeHTTP(w http.ResponseWriter, r *http.Request) {
func (mux *serveMux) handler(method, path string) (HandlerFunc, []Param) {
if router, found := mux.routers[method]; found {
if handler, params, found := router.Lookup(path); found {
- return handler.(HandlerFunc), params
+ return handler.(HandlerFunc), params //nolint:forcetypeassert // type is guaranteed when the path is found
}
}
return NotFound, nil
}
// NotFound replies to the request with an HTTP 404 not found error.
-// NotFound is called when unknown HTTP method or a handler not found.
-// If you want to use the your own NotFound handler, please overwrite this variable.
+//
+// NotFound is called when unknown HTTP methods are being user or a handler not found.
+//
+// If you want to use your own NotFound handler, please overwrite this variable.
var NotFound = func(w http.ResponseWriter, r *http.Request, _ Params) {
http.NotFound(w, r)
}
diff --git a/vendor/github.com/go-openapi/runtime/middleware/negotiate.go b/vendor/github.com/go-openapi/runtime/middleware/negotiate.go
deleted file mode 100644
index cb0a85283c1..00000000000
--- a/vendor/github.com/go-openapi/runtime/middleware/negotiate.go
+++ /dev/null
@@ -1,102 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
-// SPDX-License-Identifier: Apache-2.0
-
-// Copyright 2013 The Go Authors. All rights reserved.
-//
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file or at
-// https://developers.google.com/open-source/licenses/bsd.
-
-// this file was taken from the github.com/golang/gddo repository
-
-package middleware
-
-import (
- "net/http"
- "strings"
-
- "github.com/go-openapi/runtime/middleware/header"
-)
-
-// NegotiateContentEncoding returns the best offered content encoding for the
-// request's Accept-Encoding header. If two offers match with equal weight and
-// then the offer earlier in the list is preferred. If no offers are
-// acceptable, then "" is returned.
-func NegotiateContentEncoding(r *http.Request, offers []string) string {
- bestOffer := "identity"
- bestQ := -1.0
- specs := header.ParseAccept(r.Header, "Accept-Encoding")
- for _, offer := range offers {
- for _, spec := range specs {
- if spec.Q > bestQ &&
- (spec.Value == "*" || spec.Value == offer) {
- bestQ = spec.Q
- bestOffer = offer
- }
- }
- }
- if bestQ == 0 {
- bestOffer = ""
- }
- return bestOffer
-}
-
-// NegotiateContentType returns the best offered content type for the request's
-// Accept header. If two offers match with equal weight, then the more specific
-// offer is preferred. For example, text/* trumps */*. If two offers match
-// with equal weight and specificity, then the offer earlier in the list is
-// preferred. If no offers match, then defaultOffer is returned.
-func NegotiateContentType(r *http.Request, offers []string, defaultOffer string) string {
- bestOffer := defaultOffer
- bestQ := -1.0
- bestWild := 3
- specs := header.ParseAccept(r.Header, "Accept")
- for _, rawOffer := range offers {
- offer := normalizeOffer(rawOffer)
- // No Accept header: just return the first offer.
- if len(specs) == 0 {
- return rawOffer
- }
- for _, spec := range specs {
- switch {
- case spec.Q == 0.0:
- // ignore
- case spec.Q < bestQ:
- // better match found
- case spec.Value == "*/*":
- if spec.Q > bestQ || bestWild > 2 {
- bestQ = spec.Q
- bestWild = 2
- bestOffer = rawOffer
- }
- case strings.HasSuffix(spec.Value, "/*"):
- if strings.HasPrefix(offer, spec.Value[:len(spec.Value)-1]) &&
- (spec.Q > bestQ || bestWild > 1) {
- bestQ = spec.Q
- bestWild = 1
- bestOffer = rawOffer
- }
- default:
- if spec.Value == offer &&
- (spec.Q > bestQ || bestWild > 0) {
- bestQ = spec.Q
- bestWild = 0
- bestOffer = rawOffer
- }
- }
- }
- }
- return bestOffer
-}
-
-func normalizeOffers(orig []string) (norm []string) {
- for _, o := range orig {
- norm = append(norm, normalizeOffer(o))
- }
- return
-}
-
-func normalizeOffer(orig string) string {
- const maxParts = 2
- return strings.SplitN(orig, ";", maxParts)[0]
-}
diff --git a/vendor/github.com/go-openapi/runtime/middleware/parameter.go b/vendor/github.com/go-openapi/runtime/middleware/parameter.go
index a9d2a36460b..4ae8e3d62d6 100644
--- a/vendor/github.com/go-openapi/runtime/middleware/parameter.go
+++ b/vendor/github.com/go-openapi/runtime/middleware/parameter.go
@@ -6,7 +6,7 @@ package middleware
import (
"encoding"
"encoding/base64"
- "fmt"
+ stderrors "errors"
"io"
"net/http"
"reflect"
@@ -56,126 +56,153 @@ func (p *untypedParamBinder) Type() reflect.Type {
}
func (p *untypedParamBinder) Bind(request *http.Request, routeParams RouteParams, consumer runtime.Consumer, target reflect.Value) error {
- // fmt.Println("binding", p.name, "as", p.Type())
switch p.parameter.In {
case "query":
- data, custom, hasKey, err := p.readValue(runtime.Values(request.URL.Query()), target)
- if err != nil {
- return err
- }
- if custom {
- return nil
- }
-
- return p.bindValue(data, hasKey, target)
+ return p.bindQuery(request, routeParams, consumer, target)
case "header":
- data, custom, hasKey, err := p.readValue(runtime.Values(request.Header), target)
- if err != nil {
- return err
- }
- if custom {
- return nil
- }
- return p.bindValue(data, hasKey, target)
+ return p.bindHeader(request, routeParams, consumer, target)
case "path":
- data, custom, hasKey, err := p.readValue(routeParams, target)
- if err != nil {
- return err
- }
- if custom {
- return nil
- }
- return p.bindValue(data, hasKey, target)
+ return p.bindPath(request, routeParams, consumer, target)
case "formData":
- var err error
- var mt string
+ return p.bindFormData(request, routeParams, consumer, target)
- mt, _, e := runtime.ContentType(request.Header)
- if e != nil {
- // because of the interface conversion go thinks the error is not nil
- // so we first check for nil and then set the err var if it's not nil
- err = e
- }
+ case "body":
+ return p.bindBody(request, routeParams, consumer, target)
+ default:
+ return errors.New(http.StatusInternalServerError, "invalid parameter location: %q", p.parameter.In)
+ }
+}
- if err != nil {
- return errors.InvalidContentType("", []string{"multipart/form-data", "application/x-www-form-urlencoded"})
- }
+func (p *untypedParamBinder) bindQuery(request *http.Request, _ RouteParams, _ runtime.Consumer, target reflect.Value) error {
+ data, custom, hasKey, err := p.readValue(runtime.Values(request.URL.Query()), target)
+ if err != nil {
+ return err
+ }
+ if custom {
+ return nil
+ }
- if mt != "multipart/form-data" && mt != "application/x-www-form-urlencoded" {
- return errors.InvalidContentType(mt, []string{"multipart/form-data", "application/x-www-form-urlencoded"})
- }
+ return p.bindValue(data, hasKey, target)
+}
- if mt == "multipart/form-data" {
- if err = request.ParseMultipartForm(defaultMaxMemory); err != nil {
- return errors.NewParseError(p.Name, p.parameter.In, "", err)
- }
- }
+func (p *untypedParamBinder) bindHeader(request *http.Request, _ RouteParams, _ runtime.Consumer, target reflect.Value) error {
+ data, custom, hasKey, err := p.readValue(runtime.Values(request.Header), target)
+ if err != nil {
+ return err
+ }
+ if custom {
+ return nil
+ }
+ return p.bindValue(data, hasKey, target)
+}
- if err = request.ParseForm(); err != nil {
- return errors.NewParseError(p.Name, p.parameter.In, "", err)
- }
+func (p *untypedParamBinder) bindPath(_ *http.Request, routeParams RouteParams, _ runtime.Consumer, target reflect.Value) error {
+ data, custom, hasKey, err := p.readValue(routeParams, target)
+ if err != nil {
+ return err
+ }
+ if custom {
+ return nil
+ }
+ return p.bindValue(data, hasKey, target)
+}
- if p.parameter.Type == "file" {
- file, header, ffErr := request.FormFile(p.parameter.Name)
- if ffErr != nil {
- if p.parameter.Required {
- return errors.NewParseError(p.Name, p.parameter.In, "", ffErr)
- }
+func (p *untypedParamBinder) bindFormData(request *http.Request, _ RouteParams, _ runtime.Consumer, target reflect.Value) error {
+ mt, _, ctErr := runtime.ContentType(request.Header)
+ if ctErr != nil {
+ return errors.InvalidContentType("", []string{runtime.MultipartFormMime, runtime.URLencodedFormMime})
+ }
- return nil
- }
+ if mt != runtime.MultipartFormMime && mt != runtime.URLencodedFormMime {
+ return errors.InvalidContentType(mt, []string{runtime.MultipartFormMime, runtime.URLencodedFormMime})
+ }
- target.Set(reflect.ValueOf(runtime.File{Data: file, Header: header}))
- return nil
- }
+ // Parse via the shared helper. The helper routes on Content-Type
+ // (multipart/form-data → ParseMultipartForm; all non-multipart types,
+ // including application/x-www-form-urlencoded, → ParseForm)
+ // and applies the default 32 MiB body cap via http.MaxBytesReader.
+ // Idempotent across the per-parameter loop: stdlib short-circuits
+ // when r.MultipartForm / r.PostForm are already populated.
+ if _, perr := runtime.BindForm(request, runtime.BindFormMaxParseMemory(defaultMaxMemory)); perr != nil {
+ return perr
+ }
- if request.MultipartForm != nil {
- data, custom, hasKey, rvErr := p.readValue(runtime.Values(request.MultipartForm.Value), target)
- if rvErr != nil {
- return rvErr
- }
- if custom {
+ if p.parameter.Type == "file" {
+ // runtime.FormFile handles both multipart/form-data and
+ // application/x-www-form-urlencoded (OpenAPI 2.0 permits
+ // either consumes for `type: file`), and surfaces a
+ // missing field as http.ErrMissingFile under both.
+ file, header, ffErr := runtime.FormFile(request, p.parameter.Name)
+ if ffErr != nil {
+ if stderrors.Is(ffErr, http.ErrMissingFile) {
+ if p.parameter.Required {
+ return errors.NewParseError(p.Name, p.parameter.In, "", http.ErrMissingFile)
+ }
return nil
}
- return p.bindValue(data, hasKey, target)
+ return errors.NewParseError(p.Name, p.parameter.In, "", ffErr)
}
- data, custom, hasKey, err := p.readValue(runtime.Values(request.PostForm), target)
- if err != nil {
+
+ // Mirror the FileHeader.Filename length cap that BindForm
+ // applies to typed (codegen) paths through BindFormFile, so
+ // untyped formData bindings get the same protection.
+ if err := runtime.ValidateFilenameLength(p.Name, p.parameter.In, header.Filename,
+ runtime.DefaultMaxUploadFilenameLength); err != nil {
return err
}
+
+ target.Set(reflect.ValueOf(runtime.File{Data: file, Header: header}))
+ return nil
+ }
+
+ if request.MultipartForm != nil {
+ data, custom, hasKey, rvErr := p.readValue(runtime.Values(request.MultipartForm.Value), target)
+ if rvErr != nil {
+ return rvErr
+ }
if custom {
return nil
}
return p.bindValue(data, hasKey, target)
+ }
+ data, custom, hasKey, err := p.readValue(runtime.Values(request.PostForm), target)
+ if err != nil {
+ return err
+ }
+ if custom {
+ return nil
+ }
+ return p.bindValue(data, hasKey, target)
+}
- case "body":
- newValue := reflect.New(target.Type())
- if !runtime.HasBody(request) {
- if p.parameter.Default != nil {
- target.Set(reflect.ValueOf(p.parameter.Default))
- }
+func (p *untypedParamBinder) bindBody(request *http.Request, _ RouteParams, consumer runtime.Consumer, target reflect.Value) error {
+ newValue := reflect.New(target.Type())
+ if !runtime.HasBody(request) {
+ if p.parameter.Default != nil {
+ target.Set(reflect.ValueOf(p.parameter.Default))
+ }
+ return nil
+ }
+
+ if err := consumer.Consume(request.Body, newValue.Interface()); err != nil {
+ if stderrors.Is(err, io.EOF) && p.parameter.Default != nil {
+ target.Set(reflect.ValueOf(p.parameter.Default))
return nil
}
- if err := consumer.Consume(request.Body, newValue.Interface()); err != nil {
- if err == io.EOF && p.parameter.Default != nil {
- target.Set(reflect.ValueOf(p.parameter.Default))
- return nil
- }
- tpe := p.parameter.Type
- if p.parameter.Format != "" {
- tpe = p.parameter.Format
- }
- return errors.InvalidType(p.Name, p.parameter.In, tpe, nil)
+ tpe := p.parameter.Type
+ if p.parameter.Format != "" {
+ tpe = p.parameter.Format
}
- target.Set(reflect.Indirect(newValue))
- return nil
- default:
- return fmt.Errorf("%d: invalid parameter location %q", http.StatusInternalServerError, p.parameter.In)
+ return errors.InvalidType(p.Name, p.parameter.In, tpe, nil)
}
+
+ target.Set(reflect.Indirect(newValue))
+
+ return nil
}
func (p *untypedParamBinder) typeForSchema(tpe, format string, items *spec.Items) reflect.Type {
@@ -261,20 +288,51 @@ func (p *untypedParamBinder) bindValue(data []string, hasKey bool, target reflec
if p.parameter.Type == typeArray {
return p.setSliceFieldValue(target, p.parameter.Default, data, hasKey)
}
+
var d string
if len(data) > 0 {
d = data[len(data)-1]
}
+
return p.setFieldValue(target, p.parameter.Default, d, hasKey)
}
-func (p *untypedParamBinder) setFieldValue(target reflect.Value, defaultValue any, data string, hasKey bool) error { //nolint:gocyclo
+func (p *untypedParamBinder) isMissingAndRequired(hasKey bool, data string) bool {
+ return p.parameter.Required &&
+ p.parameter.Default == nil &&
+ (!hasKey || (!p.parameter.AllowEmptyValue && data == ""))
+}
+
+func (p *untypedParamBinder) setByte(target, defVal reflect.Value, tpe, data string) error {
+ if data == "" {
+ if target.CanSet() {
+ target.SetBytes(defVal.Bytes())
+ }
+
+ return nil
+ }
+
+ b, err := base64.StdEncoding.DecodeString(data)
+ if err != nil {
+ b, err = base64.URLEncoding.DecodeString(data)
+ if err != nil {
+ return errors.InvalidType(p.Name, p.parameter.In, tpe, data)
+ }
+ }
+ if target.CanSet() {
+ target.SetBytes(b)
+ }
+
+ return nil
+}
+
+func (p *untypedParamBinder) setFieldValue(target reflect.Value, defaultValue any, data string, hasKey bool) error {
tpe := p.parameter.Type
if p.parameter.Format != "" {
tpe = p.parameter.Format
}
- if (!hasKey || (!p.parameter.AllowEmptyValue && data == "")) && p.parameter.Required && p.parameter.Default == nil {
+ if p.isMissingAndRequired(hasKey, data) {
return errors.Required(p.Name, p.parameter.In, data)
}
@@ -292,27 +350,15 @@ func (p *untypedParamBinder) setFieldValue(target reflect.Value, defaultValue an
}
if tpe == "byte" {
- if data == "" {
- if target.CanSet() {
- target.SetBytes(defVal.Bytes())
- }
- return nil
- }
-
- b, err := base64.StdEncoding.DecodeString(data)
- if err != nil {
- b, err = base64.URLEncoding.DecodeString(data)
- if err != nil {
- return errors.InvalidType(p.Name, p.parameter.In, tpe, data)
- }
- }
- if target.CanSet() {
- target.SetBytes(b)
- }
- return nil
+ return p.setByte(target, defVal, tpe, data)
}
- switch target.Kind() { //nolint:exhaustive // we want to check only types that map from a swagger parameter
+ return p.setReflectFieldValue(target, defVal, tpe, data, hasKey)
+}
+
+//nolint:gocyclo,cyclop // not much we can simplify further significantly: the big case with all types is unavoidable.
+func (p *untypedParamBinder) setReflectFieldValue(target, defVal reflect.Value, tpe, data string, hasKey bool) error {
+ switch target.Kind() { // we want to check only types that map from a swagger parameter
case reflect.Bool:
if data == "" {
if target.CanSet() {
@@ -327,6 +373,7 @@ func (p *untypedParamBinder) setFieldValue(target reflect.Value, defaultValue an
if target.CanSet() {
target.SetBool(b)
}
+
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
if data == "" {
if target.CanSet() {
@@ -394,8 +441,8 @@ func (p *untypedParamBinder) setFieldValue(target reflect.Value, defaultValue an
target.SetString(value)
}
- case reflect.Ptr:
- if data == "" && defVal.Kind() == reflect.Ptr {
+ case reflect.Pointer:
+ if data == "" && defVal.Kind() == reflect.Pointer {
if target.CanSet() {
target.Set(defVal)
}
@@ -412,6 +459,7 @@ func (p *untypedParamBinder) setFieldValue(target reflect.Value, defaultValue an
default:
return errors.InvalidType(p.Name, p.parameter.In, tpe, data)
}
+
return nil
}
@@ -419,20 +467,30 @@ func (p *untypedParamBinder) tryUnmarshaler(target reflect.Value, defaultValue a
if !target.CanSet() {
return false, nil
}
+
// When a type implements encoding.TextUnmarshaler we'll use that instead of reflecting some more
- if reflect.PointerTo(target.Type()).Implements(textUnmarshalType) {
- if defaultValue != nil && len(data) == 0 {
- target.Set(reflect.ValueOf(defaultValue))
- return true, nil
- }
- value := reflect.New(target.Type())
- if err := value.Interface().(encoding.TextUnmarshaler).UnmarshalText([]byte(data)); err != nil {
- return true, err
- }
- target.Set(reflect.Indirect(value))
+ ttyp := target.Type()
+ if !reflect.PointerTo(ttyp).Implements(textUnmarshalType) {
+ return false, nil
+ }
+
+ if defaultValue != nil && len(data) == 0 {
+ target.Set(reflect.ValueOf(defaultValue))
return true, nil
}
- return false, nil
+
+ value := reflect.New(ttyp)
+ if !value.CanInterface() {
+ return false, nil
+ }
+
+ if err := value.Interface().(encoding.TextUnmarshaler).UnmarshalText([]byte(data)); err != nil { //nolint:forcetypeassert // this is guaranteed by the reflect check above
+ return true, err
+ }
+
+ target.Set(reflect.Indirect(value))
+
+ return true, nil
}
func (p *untypedParamBinder) readFormattedSliceFieldValue(data string, target reflect.Value) ([]string, bool, error) {
diff --git a/vendor/github.com/go-openapi/runtime/middleware/rapidoc.go b/vendor/github.com/go-openapi/runtime/middleware/rapidoc.go
deleted file mode 100644
index 1574defb41a..00000000000
--- a/vendor/github.com/go-openapi/runtime/middleware/rapidoc.go
+++ /dev/null
@@ -1,83 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
-// SPDX-License-Identifier: Apache-2.0
-
-package middleware
-
-import (
- "bytes"
- "fmt"
- "html/template"
- "net/http"
- "path"
-)
-
-// RapiDocOpts configures the [RapiDoc] middlewares.
-type RapiDocOpts struct {
- // BasePath for the UI, defaults to: /
- BasePath string
-
- // Path combines with BasePath to construct the path to the UI, defaults to: "docs".
- Path string
-
- // SpecURL is the URL of the spec document.
- //
- // Defaults to: /swagger.json
- SpecURL string
-
- // Title for the documentation site, default to: API documentation
- Title string
-
- // Template specifies a custom template to serve the UI
- Template string
-
- // RapiDocURL points to the js asset that generates the rapidoc site.
- //
- // Defaults to https://unpkg.com/rapidoc/dist/rapidoc-min.js
- RapiDocURL string
-}
-
-func (r *RapiDocOpts) EnsureDefaults() {
- common := toCommonUIOptions(r)
- common.EnsureDefaults()
- fromCommonToAnyOptions(common, r)
-
- // rapidoc-specifics
- if r.RapiDocURL == "" {
- r.RapiDocURL = rapidocLatest
- }
- if r.Template == "" {
- r.Template = rapidocTemplate
- }
-}
-
-// RapiDoc creates a [middleware] to serve a documentation site for a swagger spec.
-//
-// This allows for altering the spec before starting the [http] listener.
-func RapiDoc(opts RapiDocOpts, next http.Handler) http.Handler {
- opts.EnsureDefaults()
-
- pth := path.Join(opts.BasePath, opts.Path)
- tmpl := template.Must(template.New("rapidoc").Parse(opts.Template))
- assets := bytes.NewBuffer(nil)
- if err := tmpl.Execute(assets, opts); err != nil {
- panic(fmt.Errorf("cannot execute template: %w", err))
- }
-
- return serveUI(pth, assets.Bytes(), next)
-}
-
-const (
- rapidocLatest = "https://unpkg.com/rapidoc/dist/rapidoc-min.js"
- rapidocTemplate = `
-
-
- {{ .Title }}
-
-
-
-
-
-
-
-`
-)
diff --git a/vendor/github.com/go-openapi/runtime/middleware/redoc.go b/vendor/github.com/go-openapi/runtime/middleware/redoc.go
deleted file mode 100644
index 1007409a30b..00000000000
--- a/vendor/github.com/go-openapi/runtime/middleware/redoc.go
+++ /dev/null
@@ -1,97 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
-// SPDX-License-Identifier: Apache-2.0
-
-package middleware
-
-import (
- "bytes"
- "fmt"
- "html/template"
- "net/http"
- "path"
-)
-
-// RedocOpts configures the [Redoc] middlewares.
-type RedocOpts struct {
- // BasePath for the UI, defaults to: /
- BasePath string
-
- // Path combines with BasePath to construct the path to the UI, defaults to: "docs".
- Path string
-
- // SpecURL is the URL of the spec document.
- //
- // Defaults to: /swagger.json
- SpecURL string
-
- // Title for the documentation site, default to: API documentation
- Title string
-
- // Template specifies a custom template to serve the UI
- Template string
-
- // RedocURL points to the js that generates the redoc site.
- //
- // Defaults to: https://cdn.jsdelivr.net/npm/redoc/bundles/redoc.standalone.js
- RedocURL string
-}
-
-// EnsureDefaults in case some options are missing.
-func (r *RedocOpts) EnsureDefaults() {
- common := toCommonUIOptions(r)
- common.EnsureDefaults()
- fromCommonToAnyOptions(common, r)
-
- // redoc-specifics
- if r.RedocURL == "" {
- r.RedocURL = redocLatest
- }
- if r.Template == "" {
- r.Template = redocTemplate
- }
-}
-
-// Redoc creates a [middleware] to serve a documentation site for a swagger spec.
-//
-// This allows for altering the spec before starting the [http] listener.
-func Redoc(opts RedocOpts, next http.Handler) http.Handler {
- opts.EnsureDefaults()
-
- pth := path.Join(opts.BasePath, opts.Path)
- tmpl := template.Must(template.New("redoc").Parse(opts.Template))
- assets := bytes.NewBuffer(nil)
- if err := tmpl.Execute(assets, opts); err != nil {
- panic(fmt.Errorf("cannot execute template: %w", err))
- }
-
- return serveUI(pth, assets.Bytes(), next)
-}
-
-const (
- redocLatest = "https://cdn.jsdelivr.net/npm/redoc/bundles/redoc.standalone.js"
- redocTemplate = `
-
-
- {{ .Title }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-`
-)
diff --git a/vendor/github.com/go-openapi/runtime/middleware/request.go b/vendor/github.com/go-openapi/runtime/middleware/request.go
index ad781663b8b..08a0362da29 100644
--- a/vendor/github.com/go-openapi/runtime/middleware/request.go
+++ b/vendor/github.com/go-openapi/runtime/middleware/request.go
@@ -40,8 +40,25 @@ func NewUntypedRequestBinder(parameters map[string]spec.Parameter, spec *spec.Sw
// Bind perform the databinding and validation.
func (o *UntypedRequestBinder) Bind(request *http.Request, routeParams RouteParams, consumer runtime.Consumer, data any) error {
+ err := o.bind(request, routeParams, consumer, data)
+ if err == nil {
+ return nil // avoids returning a nil-interface
+ }
+
+ return err
+}
+
+// SetLogger allows for injecting a logger to catch debug entries.
+//
+// The logger is enabled in DEBUG mode only.
+func (o *UntypedRequestBinder) SetLogger(lg logger.Logger) {
+ o.debugLogf = debugLogfFunc(lg)
+}
+
+func (o *UntypedRequestBinder) bind(request *http.Request, routeParams RouteParams, consumer runtime.Consumer, data any) *errors.CompositeError {
val := reflect.Indirect(reflect.ValueOf(data))
isMap := val.Kind() == reflect.Map
+
var result []error
o.debugLogf("binding %d parameters for %s %s", len(o.Parameters), request.Method, request.URL.EscapedPath())
for fieldName, param := range o.Parameters {
@@ -94,13 +111,6 @@ func (o *UntypedRequestBinder) Bind(request *http.Request, routeParams RoutePara
return nil
}
-// SetLogger allows for injecting a logger to catch debug entries.
-//
-// The logger is enabled in DEBUG mode only.
-func (o *UntypedRequestBinder) SetLogger(lg logger.Logger) {
- o.debugLogf = debugLogfFunc(lg)
-}
-
func (o *UntypedRequestBinder) setDebugLogf(fn func(string, ...any)) {
o.debugLogf = fn
}
diff --git a/vendor/github.com/go-openapi/runtime/middleware/router.go b/vendor/github.com/go-openapi/runtime/middleware/router.go
index e828653be7a..939cf7337ab 100644
--- a/vendor/github.com/go-openapi/runtime/middleware/router.go
+++ b/vendor/github.com/go-openapi/runtime/middleware/router.go
@@ -21,6 +21,7 @@ import (
"github.com/go-openapi/spec"
"github.com/go-openapi/strfmt"
"github.com/go-openapi/swag/stringutils"
+ "github.com/go-openapi/swag/typeutils"
)
// RouteParam is a object to capture route params in a framework agnostic way.
@@ -292,7 +293,7 @@ func (ras RouteAuthenticators) Authenticate(req *http.Request, route *MatchedRou
continue
}
applies, usr, err := ra.Authenticate(req, route)
- if !applies || err != nil || usr == nil {
+ if !applies || err != nil || typeutils.IsZero(usr) {
if err != nil {
lastError = err
}
@@ -348,49 +349,62 @@ func (m *MatchedRoute) NeedsAuth() bool {
func (d *defaultRouter) Lookup(method, path string) (*MatchedRoute, bool) {
mth := strings.ToUpper(method)
d.debugLogf("looking up route for %s %s", method, path)
- if Debug {
- if len(d.routers) == 0 {
+ if len(d.routers) == 0 {
+ if Debug {
d.debugLogf("there are no known routers")
}
+ panic("internal error: no router is configured")
+ }
+
+ if Debug {
for meth := range d.routers {
d.debugLogf("got a router for %s", meth)
}
}
- if router, ok := d.routers[mth]; ok {
- if m, rp, ok := router.Lookup(fpath.Clean(path)); ok && m != nil {
- if entry, ok := m.(*routeEntry); ok {
- d.debugLogf("found a route for %s %s with %d parameters", method, path, len(entry.Parameters))
- var params RouteParams
- for _, p := range rp {
- v, err := url.PathUnescape(p.Value)
- if err != nil {
- d.debugLogf("failed to escape %q: %v", p.Value, err)
- v = p.Value
- }
- // a workaround to handle fragment/composing parameters until they are supported in denco router
- // check if this parameter is a fragment within a path segment
- const enclosureSize = 2
- if xpos := strings.Index(entry.PathPattern, fmt.Sprintf("{%s}", p.Name)) + len(p.Name) + enclosureSize; xpos < len(entry.PathPattern) && entry.PathPattern[xpos] != '/' {
- // extract fragment parameters
- ep := strings.Split(entry.PathPattern[xpos:], "/")[0]
- pnames, pvalues := decodeCompositParams(p.Name, v, ep, nil, nil)
- for i, pname := range pnames {
- params = append(params, RouteParam{Name: pname, Value: pvalues[i]})
- }
- } else {
- // use the parameter directly
- params = append(params, RouteParam{Name: p.Name, Value: v})
- }
- }
- return &MatchedRoute{routeEntry: *entry, Params: params}, true
+
+ router, ok := d.routers[mth]
+ if !ok {
+ d.debugLogf("couldn't find a route by method for %s %s", method, path)
+ return nil, false
+ }
+
+ m, rp, ok := router.Lookup(fpath.Clean(escapeLiteralColons(path)))
+ if !ok || m == nil {
+ d.debugLogf("couldn't find a route by path for %s %s", method, path)
+ return nil, false
+ }
+
+ entry, ok := m.(*routeEntry)
+ if !ok {
+ return nil, false
+ }
+
+ d.debugLogf("found a route for %s %s with %d parameters", method, path, len(entry.Parameters))
+ var params RouteParams
+ for _, p := range rp {
+ v, err := url.PathUnescape(p.Value)
+ if err != nil {
+ d.debugLogf("failed to escape %q: %v", p.Value, err)
+ v = p.Value
+ }
+
+ // a workaround to handle fragment/composing parameters until they are supported in denco router
+ // check if this parameter is a fragment within a path segment
+ const enclosureSize = 2
+ if xpos := strings.Index(entry.PathPattern, fmt.Sprintf("{%s}", p.Name)) + len(p.Name) + enclosureSize; xpos < len(entry.PathPattern) && entry.PathPattern[xpos] != '/' {
+ // extract fragment parameters
+ ep := strings.Split(entry.PathPattern[xpos:], "/")[0]
+ pnames, pvalues := decodeCompositParams(p.Name, v, ep, nil, nil)
+ for i, pname := range pnames {
+ params = append(params, RouteParam{Name: pname, Value: pvalues[i]})
}
} else {
- d.debugLogf("couldn't find a route by path for %s %s", method, path)
+ // use the parameter directly
+ params = append(params, RouteParam{Name: p.Name, Value: v})
}
- } else {
- d.debugLogf("couldn't find a route by method for %s %s", method, path)
}
- return nil, false
+
+ return &MatchedRoute{routeEntry: *entry, Params: params}, true
}
func (d *defaultRouter) OtherMethods(method, path string) []string {
@@ -398,7 +412,7 @@ func (d *defaultRouter) OtherMethods(method, path string) []string {
var methods []string
for k, v := range d.routers {
if k != mn {
- if _, _, ok := v.Lookup(fpath.Clean(path)); ok {
+ if _, _, ok := v.Lookup(fpath.Clean(escapeLiteralColons(path))); ok {
methods = append(methods, k)
continue
}
@@ -414,28 +428,39 @@ func (d *defaultRouter) SetLogger(lg logger.Logger) {
// convert swagger parameters per path segment into a denco parameter as multiple parameters per segment are not supported in denco.
var pathConverter = regexp.MustCompile(`{(.+?)}([^/]*)`)
+// escapeLiteralColons replaces literal ':' characters with their URL-encoded
+// equivalent "%3A". This prevents the denco router from misinterpreting ':'
+// in URL path segments as parameter delimiters. The ':' character is valid in
+// URL paths per RFC 3986 section 3.3.
+func escapeLiteralColons(path string) string {
+ return strings.ReplaceAll(path, ":", "%3A")
+}
+
func decodeCompositParams(name string, value string, pattern string, names []string, values []string) ([]string, []string) {
pleft := strings.Index(pattern, "{")
names = append(names, name)
+
if pleft < 0 {
if strings.HasSuffix(value, pattern) {
values = append(values, value[:len(value)-len(pattern)])
} else {
values = append(values, "")
}
+
+ return names, values
+ }
+
+ toskip := pattern[:pleft]
+ pright := strings.Index(pattern, "}")
+ vright := strings.Index(value, toskip)
+ if vright >= 0 {
+ values = append(values, value[:vright])
} else {
- toskip := pattern[:pleft]
- pright := strings.Index(pattern, "}")
- vright := strings.Index(value, toskip)
- if vright >= 0 {
- values = append(values, value[:vright])
- } else {
- values = append(values, "")
- value = ""
- }
- return decodeCompositParams(pattern[pleft+1:pright], value[vright+len(toskip):], pattern[pright+1:], names, values)
+ values = append(values, "")
+ value = ""
}
- return names, values
+
+ return decodeCompositParams(pattern[pleft+1:pright], value[vright+len(toskip):], pattern[pright+1:], names, values)
}
func (d *defaultRouteBuilder) AddRoute(method, path string, operation *spec.Operation) {
@@ -463,7 +488,7 @@ func (d *defaultRouteBuilder) AddRoute(method, path string, operation *spec.Oper
requestBinder := NewUntypedRequestBinder(parameters, d.spec.Spec(), d.api.Formats())
requestBinder.setDebugLogf(d.debugLogf)
- record := denco.NewRecord(pathConverter.ReplaceAllString(path, ":$1"), &routeEntry{
+ record := denco.NewRecord(pathConverter.ReplaceAllString(escapeLiteralColons(path), ":$1"), &routeEntry{
BasePath: bp,
PathPattern: path,
Operation: operation,
diff --git a/vendor/github.com/go-openapi/runtime/middleware/seam.go b/vendor/github.com/go-openapi/runtime/middleware/seam.go
new file mode 100644
index 00000000000..b234395f19c
--- /dev/null
+++ b/vendor/github.com/go-openapi/runtime/middleware/seam.go
@@ -0,0 +1,482 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package middleware
+
+import (
+ "net/http"
+ "path"
+ "strings"
+
+ "github.com/go-openapi/runtime/server-middleware/docui"
+ "github.com/go-openapi/runtime/server-middleware/negotiate"
+)
+
+/////////////////////////////////////////////////////////:
+// Seam to the negotiate options introduced in v0.29.5
+/////////////////////////////////////////////////////////:
+
+// NegotiateOption configures [NegotiateContentType] behaviour.
+//
+// Deprecated: moved to the [negotiate] package. Use [negotiate.Option] instead.
+type NegotiateOption = negotiate.Option
+
+// NegotiateContentType returns the best offered content type for the
+// request's Accept header.
+//
+// Deprecated: moved to the [negotiate] package. Use [negotiate.ContentType] instead.
+func NegotiateContentType(r *http.Request, offers []string, defaultOffer string, opts ...NegotiateOption) string {
+ return negotiate.ContentType(r, offers, defaultOffer, opts...)
+}
+
+// NegotiateContentEncoding returns the best offered content encoding for
+// the request's Accept-Encoding header.
+//
+// Deprecated: moved to the [negotiate] package. Use [negotiate.ContentEncoding] instead.
+func NegotiateContentEncoding(r *http.Request, offers []string) string {
+ return negotiate.ContentEncoding(r, offers)
+}
+
+// WithIgnoreParameters returns a [NegotiateOption] that strips MIME-type
+// parameters from both Accept entries and offers before matching,
+// restoring the pre-v0.30 behaviour.
+//
+// Deprecated: moved to the [negotiate] package. Use [negotiate.WithIgnoreParameters] instead.
+func WithIgnoreParameters(ignore bool) NegotiateOption {
+ return negotiate.WithIgnoreParameters(ignore)
+}
+
+/////////////////////////////////////////////////////////:
+// Seam to the UI options
+/////////////////////////////////////////////////////////:
+
+// RapiDoc creates a [http.Handler] to serve a documentation site for a swagger spec.
+//
+// This allows for altering the spec before starting the [http] listener.
+//
+// Deprecated: moved to the [docui] package. Use [docui.RapiDoc] instead.
+func RapiDoc(opts RapiDocOpts, next http.Handler) http.Handler {
+ return docui.RapiDoc(next, opts.toFuncOptions()...)
+}
+
+// Redoc creates a [http.Handler] to serve a documentation site for a swagger spec.
+//
+// This allows for altering the spec before starting the [http] listener.
+//
+// Deprecated: moved to the [docui] package. Use [docui.Redoc] instead.
+func Redoc(opts RedocOpts, next http.Handler) http.Handler {
+ return docui.Redoc(next, opts.toFuncOptions()...)
+}
+
+// SwaggerUI creates a [http.Handler] to serve a documentation site for a swagger spec.
+//
+// This allows for altering the spec before starting the [http] listener.
+//
+// Deprecated: moved to the [docui] package. Use [docui.SwaggerUI] instead.
+func SwaggerUI(opts SwaggerUIOpts, next http.Handler) http.Handler {
+ return docui.SwaggerUI(next, opts.toFuncOptions()...)
+}
+
+// SwaggerUIOAuth2Callback creates a middleware that serves the OAuth2 callback page used by Swagger UI.
+//
+// Deprecated: moved to the [docui] package. Use [docui.SwaggerUIOAuth2Callback] instead.
+func SwaggerUIOAuth2Callback(opts SwaggerUIOpts, next http.Handler) http.Handler {
+ return docui.SwaggerUIOAuth2Callback(next, opts.toFuncOptions()...)
+}
+
+/////////////////////////////////////////////////////////:
+// Seam to the spec middleware options
+/////////////////////////////////////////////////////////:
+
+// SpecOption can be applied to the [Spec] serving [middleware].
+//
+// Deprecated: moved to the [docui] package. Use [docui.SpecOption] instead.
+type SpecOption func(*specOptions)
+
+type specOptions struct {
+ BasePath string
+ Path string
+ Document string
+}
+
+func (o specOptions) fullPath() string {
+ return path.Join(o.BasePath, o.Path, o.Document)
+}
+
+func specOptionsWithDefaults(basePath string, opts []SpecOption) specOptions {
+ o := specOptions{
+ BasePath: "/",
+ Path: "",
+ Document: "swagger.json",
+ }
+
+ for _, apply := range opts {
+ apply(&o)
+ }
+ if basePath != "" {
+ o.BasePath = basePath
+ }
+
+ return o
+}
+
+// Spec creates a [middleware] to serve a swagger spec as a JSON document.
+//
+// This allows for altering the spec before starting the [http] listener.
+//
+// The basePath argument indicates the path of the spec document (defaults to "/").
+// Additional [SpecOption] can be used to change the name of the document (defaults to "swagger.json").
+//
+// Deprecated: moved to the [docui] package as [docui.ServeSpec].
+func Spec(basePath string, spec []byte, next http.Handler, opts ...SpecOption) http.Handler {
+ o := specOptionsWithDefaults(basePath, opts)
+
+ return docui.ServeSpec(spec, next, docui.WithSpecPath(o.fullPath()))
+
+}
+
+// WithSpecPath sets the path to be joined to the base path of the
+// spec-serving middleware (see [docui.ServeSpec]).
+//
+// This is empty by default.
+func WithSpecPath(pth string) SpecOption {
+ return func(o *specOptions) {
+ o.Path = pth
+ }
+}
+
+// WithSpecDocument sets the name of the JSON document served as a spec.
+//
+// By default, this is "swagger.json".
+func WithSpecDocument(doc string) SpecOption {
+ return func(o *specOptions) {
+ if doc == "" {
+ return
+ }
+
+ o.Document = doc
+ }
+}
+
+// UIOptions defines common options for UI serving middlewares.
+//
+// Deprecated: use instead the function options provided by [docui].
+type UIOptions struct {
+ // BasePath for the UI, defaults to: /
+ BasePath string
+
+ // Path combines with BasePath to construct the path to the UI, defaults to: "docs".
+ Path string
+
+ // SpecURL is the URL of the spec document.
+ //
+ // Defaults to: /swagger.json
+ SpecURL string
+
+ // Title for the documentation site, default to: API documentation
+ Title string
+
+ // Template specifies a custom template to serve the UI
+ Template string
+}
+
+// toFuncOptions bridges the deprecated options struct with the newer function options in [docui].
+func (o UIOptions) toFuncOptions() []docui.Option {
+ const structMembers = 5
+ opts := make([]docui.Option, 0, structMembers)
+
+ if o.BasePath != "" {
+ opts = append(opts, docui.WithUIBasePath(o.BasePath))
+ }
+
+ if o.Path != "" {
+ opts = append(opts, docui.WithUIPath(o.Path))
+ }
+
+ if o.SpecURL != "" {
+ opts = append(opts, docui.WithSpecURL(o.SpecURL))
+ }
+
+ if o.Title != "" {
+ opts = append(opts, docui.WithUITitle(o.Title))
+ }
+
+ if o.Template != "" {
+ opts = append(opts, docui.WithUITemplate(o.Template))
+ }
+
+ return opts
+}
+
+// RapiDocOpts configures the [RapiDoc] middlewares.
+//
+// Deprecated: use instead the function options provided by [docui].
+type RapiDocOpts struct {
+ // BasePath for the UI, defaults to: /
+ BasePath string
+
+ // Path combines with BasePath to construct the path to the UI, defaults to: "docs".
+ Path string
+
+ // SpecURL is the URL of the spec document.
+ //
+ // Defaults to: /swagger.json
+ SpecURL string
+
+ // Title for the documentation site, default to: API documentation
+ Title string
+
+ // Template specifies a custom template to serve the UI
+ Template string
+
+ // RapiDocURL points to the js asset that generates the rapidoc site.
+ //
+ // Defaults to https://unpkg.com/rapidoc/dist/rapidoc-min.js
+ RapiDocURL string
+}
+
+func (o RapiDocOpts) toFuncOptions() []docui.Option {
+ const structMembers = 6
+ opts := make([]docui.Option, 0, structMembers)
+
+ if o.BasePath != "" {
+ opts = append(opts, docui.WithUIBasePath(o.BasePath))
+ }
+
+ if o.Path != "" {
+ opts = append(opts, docui.WithUIPath(o.Path))
+ }
+
+ if o.SpecURL != "" {
+ opts = append(opts, docui.WithSpecURL(o.SpecURL))
+ }
+
+ if o.Title != "" {
+ opts = append(opts, docui.WithUITitle(o.Title))
+ }
+
+ if o.Template != "" {
+ opts = append(opts, docui.WithUITemplate(o.Template))
+ }
+
+ if o.RapiDocURL != "" {
+ opts = append(opts, docui.WithUIAssetsURL(o.RapiDocURL))
+ }
+
+ return opts
+}
+
+// RedocOpts configures the [Redoc] middlewares.
+//
+// Deprecated: use instead the function options provided by [docui].
+type RedocOpts struct {
+ // BasePath for the UI, defaults to: /
+ BasePath string
+
+ // Path combines with BasePath to construct the path to the UI, defaults to: "docs".
+ Path string
+
+ // SpecURL is the URL of the spec document.
+ //
+ // Defaults to: /swagger.json
+ SpecURL string
+
+ // Title for the documentation site, default to: API documentation
+ Title string
+
+ // Template specifies a custom template to serve the UI
+ Template string
+
+ // RedocURL points to the js that generates the redoc site.
+ //
+ // Defaults to: https://cdn.jsdelivr.net/npm/redoc/bundles/redoc.standalone.js
+ RedocURL string
+}
+
+func (o RedocOpts) toFuncOptions() []docui.Option {
+ const structMembers = 6
+ opts := make([]docui.Option, 0, structMembers)
+
+ if o.BasePath != "" {
+ opts = append(opts, docui.WithUIBasePath(o.BasePath))
+ }
+
+ if o.Path != "" {
+ opts = append(opts, docui.WithUIPath(o.Path))
+ }
+
+ if o.SpecURL != "" {
+ opts = append(opts, docui.WithSpecURL(o.SpecURL))
+ }
+
+ if o.Title != "" {
+ opts = append(opts, docui.WithUITitle(o.Title))
+ }
+
+ if o.Template != "" {
+ opts = append(opts, docui.WithUITemplate(o.Template))
+ }
+
+ if o.RedocURL != "" {
+ opts = append(opts, docui.WithUIAssetsURL(o.RedocURL))
+ }
+
+ return opts
+}
+
+// SwaggerUIOpts configures the [SwaggerUI] [middleware].
+//
+// Deprecated: use instead the function options provided by [docui].
+type SwaggerUIOpts struct {
+ // BasePath for the API, defaults to: /
+ BasePath string
+
+ // Path combines with BasePath to construct the path to the UI, defaults to: "docs".
+ Path string
+
+ // SpecURL is the URL of the spec document.
+ //
+ // Defaults to: /swagger.json
+ SpecURL string
+
+ // Title for the documentation site, default to: API documentation
+ Title string
+
+ // Template specifies a custom template to serve the UI
+ Template string
+
+ // OAuthCallbackURL the url called after OAuth2 login
+ //
+ // NOTE: in the new [docui.SwaggerUIOptions] type, this field is named `OAuth2CallbackURL`,
+ // which is more appropriate.
+ OAuthCallbackURL string
+
+ // The three components needed to embed swagger-ui
+
+ // SwaggerURL points to the js that generates the SwaggerUI site.
+ //
+ // Defaults to: https://unpkg.com/swagger-ui-dist/swagger-ui-bundle.js
+ SwaggerURL string
+
+ SwaggerPresetURL string
+ SwaggerStylesURL string
+
+ Favicon32 string
+ Favicon16 string
+}
+
+func (o SwaggerUIOpts) toFuncOptions() []docui.Option {
+ const structMembers = 6
+ opts := make([]docui.Option, 0, structMembers)
+
+ if o.BasePath != "" {
+ opts = append(opts, docui.WithUIBasePath(o.BasePath))
+ }
+
+ if o.Path != "" {
+ opts = append(opts, docui.WithUIPath(o.Path))
+ }
+
+ if o.SpecURL != "" {
+ opts = append(opts, docui.WithSpecURL(o.SpecURL))
+ }
+
+ if o.Title != "" {
+ opts = append(opts, docui.WithUITitle(o.Title))
+ }
+
+ if o.Template != "" {
+ opts = append(opts, docui.WithUITemplate(o.Template))
+ }
+
+ if o.SwaggerURL != "" {
+ opts = append(opts, docui.WithUIAssetsURL(o.SwaggerURL))
+ }
+
+ var empty SwaggerUIOpts
+ if o != empty {
+ swaggeruiOpts := docui.SwaggerUIOptions{
+ OAuth2CallbackURL: o.OAuthCallbackURL,
+ SwaggerPresetURL: o.SwaggerPresetURL,
+ SwaggerStylesURL: o.SwaggerStylesURL,
+ Favicon32: o.Favicon32,
+ Favicon16: o.Favicon16,
+ }
+ opts = append(opts, docui.WithSwaggerUIOptions(swaggeruiOpts))
+ }
+
+ return opts
+}
+
+// UIOption can be applied to UI serving [middleware] to alter the default
+// behavior.
+//
+// Deprecated: use instead the function options provided by [docui].
+type UIOption func(*UIOptions)
+
+// uiOptionsWithDefaults applies the given options on top of an empty
+// [UIOptions]. Per-flavor handlers ([SwaggerUI], [Redoc], [RapiDoc])
+// fill in the remaining defaults via [UIOptions.EnsureDefaults] when
+// the option struct is used.
+func uiOptionsWithDefaults(opts []UIOption) UIOptions {
+ var o UIOptions
+ for _, apply := range opts {
+ apply(&o)
+ }
+
+ return o
+}
+
+// WithUIBasePath sets the base path from where to serve the UI assets.
+//
+// Deprecated: use instead the function options provided by [docui].
+func WithUIBasePath(base string) UIOption {
+ return func(o *UIOptions) {
+ if !strings.HasPrefix(base, "/") {
+ base = "/" + base
+ }
+ o.BasePath = base
+ }
+}
+
+// WithUIPath sets the path from where to serve the UI assets (i.e. /{basepath}/{path}.
+//
+// Deprecated: use instead the function options provided by [docui].
+func WithUIPath(pth string) UIOption {
+ return func(o *UIOptions) {
+ o.Path = pth
+ }
+}
+
+// WithUISpecURL sets the path from where to serve swagger spec document.
+//
+// This may be specified as a full URL or a path.
+//
+// By default, this is "/swagger.json".
+//
+// Deprecated: use instead the function options provided by [docui].
+func WithUISpecURL(specURL string) UIOption {
+ return func(o *UIOptions) {
+ o.SpecURL = specURL
+ }
+}
+
+// WithUITitle sets the title of the UI.
+//
+// Deprecated: use instead the function options provided by [docui].
+func WithUITitle(title string) UIOption {
+ return func(o *UIOptions) {
+ o.Title = title
+ }
+}
+
+// WithTemplate allows to set a custom template for the UI.
+//
+// UI [middleware] will panic if the template does not parse or execute properly.
+//
+// Deprecated: use instead the function options provided by [docui].
+func WithTemplate(tpl string) UIOption {
+ return func(o *UIOptions) {
+ o.Template = tpl
+ }
+}
diff --git a/vendor/github.com/go-openapi/runtime/middleware/spec.go b/vendor/github.com/go-openapi/runtime/middleware/spec.go
deleted file mode 100644
index 0a64a9572b5..00000000000
--- a/vendor/github.com/go-openapi/runtime/middleware/spec.go
+++ /dev/null
@@ -1,91 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
-// SPDX-License-Identifier: Apache-2.0
-
-package middleware
-
-import (
- "net/http"
- "path"
-)
-
-const (
- contentTypeHeader = "Content-Type"
- applicationJSON = "application/json"
-)
-
-// SpecOption can be applied to the Spec serving [middleware].
-type SpecOption func(*specOptions)
-
-var defaultSpecOptions = specOptions{
- Path: "",
- Document: "swagger.json",
-}
-
-type specOptions struct {
- Path string
- Document string
-}
-
-func specOptionsWithDefaults(opts []SpecOption) specOptions {
- o := defaultSpecOptions
- for _, apply := range opts {
- apply(&o)
- }
-
- return o
-}
-
-// Spec creates a [middleware] to serve a swagger spec as a JSON document.
-//
-// This allows for altering the spec before starting the [http] listener.
-//
-// The basePath argument indicates the path of the spec document (defaults to "/").
-// Additional [SpecOption] can be used to change the name of the document (defaults to "swagger.json").
-func Spec(basePath string, b []byte, next http.Handler, opts ...SpecOption) http.Handler {
- if basePath == "" {
- basePath = "/"
- }
- o := specOptionsWithDefaults(opts)
- pth := path.Join(basePath, o.Path, o.Document)
-
- return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
- if path.Clean(r.URL.Path) == pth {
- rw.Header().Set(contentTypeHeader, applicationJSON)
- rw.WriteHeader(http.StatusOK)
- _, _ = rw.Write(b)
-
- return
- }
-
- if next != nil {
- next.ServeHTTP(rw, r)
-
- return
- }
-
- rw.Header().Set(contentTypeHeader, applicationJSON)
- rw.WriteHeader(http.StatusNotFound)
- })
-}
-
-// WithSpecPath sets the path to be joined to the base path of the Spec [middleware].
-//
-// This is empty by default.
-func WithSpecPath(pth string) SpecOption {
- return func(o *specOptions) {
- o.Path = pth
- }
-}
-
-// WithSpecDocument sets the name of the JSON document served as a spec.
-//
-// By default, this is "swagger.json".
-func WithSpecDocument(doc string) SpecOption {
- return func(o *specOptions) {
- if doc == "" {
- return
- }
-
- o.Document = doc
- }
-}
diff --git a/vendor/github.com/go-openapi/runtime/middleware/swaggerui.go b/vendor/github.com/go-openapi/runtime/middleware/swaggerui.go
deleted file mode 100644
index 14ed37ced69..00000000000
--- a/vendor/github.com/go-openapi/runtime/middleware/swaggerui.go
+++ /dev/null
@@ -1,178 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
-// SPDX-License-Identifier: Apache-2.0
-
-package middleware
-
-import (
- "bytes"
- "fmt"
- "html/template"
- "net/http"
- "path"
-)
-
-// SwaggerUIOpts configures the [SwaggerUI] [middleware].
-type SwaggerUIOpts struct {
- // BasePath for the API, defaults to: /
- BasePath string
-
- // Path combines with BasePath to construct the path to the UI, defaults to: "docs".
- Path string
-
- // SpecURL is the URL of the spec document.
- //
- // Defaults to: /swagger.json
- SpecURL string
-
- // Title for the documentation site, default to: API documentation
- Title string
-
- // Template specifies a custom template to serve the UI
- Template string
-
- // OAuthCallbackURL the url called after OAuth2 login
- OAuthCallbackURL string
-
- // The three components needed to embed swagger-ui
-
- // SwaggerURL points to the js that generates the SwaggerUI site.
- //
- // Defaults to: https://unpkg.com/swagger-ui-dist/swagger-ui-bundle.js
- SwaggerURL string
-
- SwaggerPresetURL string
- SwaggerStylesURL string
-
- Favicon32 string
- Favicon16 string
-}
-
-// EnsureDefaults in case some options are missing.
-func (r *SwaggerUIOpts) EnsureDefaults() {
- r.ensureDefaults()
-
- if r.Template == "" {
- r.Template = swaggeruiTemplate
- }
-}
-
-func (r *SwaggerUIOpts) EnsureDefaultsOauth2() {
- r.ensureDefaults()
-
- if r.Template == "" {
- r.Template = swaggerOAuthTemplate
- }
-}
-
-func (r *SwaggerUIOpts) ensureDefaults() {
- common := toCommonUIOptions(r)
- common.EnsureDefaults()
- fromCommonToAnyOptions(common, r)
-
- // swaggerui-specifics
- if r.OAuthCallbackURL == "" {
- r.OAuthCallbackURL = path.Join(r.BasePath, r.Path, "oauth2-callback")
- }
- if r.SwaggerURL == "" {
- r.SwaggerURL = swaggerLatest
- }
- if r.SwaggerPresetURL == "" {
- r.SwaggerPresetURL = swaggerPresetLatest
- }
- if r.SwaggerStylesURL == "" {
- r.SwaggerStylesURL = swaggerStylesLatest
- }
- if r.Favicon16 == "" {
- r.Favicon16 = swaggerFavicon16Latest
- }
- if r.Favicon32 == "" {
- r.Favicon32 = swaggerFavicon32Latest
- }
-}
-
-// SwaggerUI creates a [middleware] to serve a documentation site for a swagger spec.
-//
-// This allows for altering the spec before starting the [http] listener.
-func SwaggerUI(opts SwaggerUIOpts, next http.Handler) http.Handler {
- opts.EnsureDefaults()
-
- pth := path.Join(opts.BasePath, opts.Path)
- tmpl := template.Must(template.New("swaggerui").Parse(opts.Template))
- assets := bytes.NewBuffer(nil)
- if err := tmpl.Execute(assets, opts); err != nil {
- panic(fmt.Errorf("cannot execute template: %w", err))
- }
-
- return serveUI(pth, assets.Bytes(), next)
-}
-
-const (
- swaggerLatest = "https://unpkg.com/swagger-ui-dist/swagger-ui-bundle.js"
- swaggerPresetLatest = "https://unpkg.com/swagger-ui-dist/swagger-ui-standalone-preset.js"
- swaggerStylesLatest = "https://unpkg.com/swagger-ui-dist/swagger-ui.css"
- swaggerFavicon32Latest = "https://unpkg.com/swagger-ui-dist/favicon-32x32.png"
- swaggerFavicon16Latest = "https://unpkg.com/swagger-ui-dist/favicon-16x16.png"
- swaggeruiTemplate = `
-
-
-
-
- {{ .Title }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-`
-)
diff --git a/vendor/github.com/go-openapi/runtime/middleware/typeutils.go b/vendor/github.com/go-openapi/runtime/middleware/typeutils.go
new file mode 100644
index 00000000000..3f7d7976a1f
--- /dev/null
+++ b/vendor/github.com/go-openapi/runtime/middleware/typeutils.go
@@ -0,0 +1,30 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package middleware
+
+import "strings"
+
+// normalizeOffer strips the parameter section (";...") from a media-type
+// string.
+func normalizeOffer(orig string) string {
+ // NOTE(maintainers): Despite its name (kept for historical reasons), this helper is
+ // not about Accept negotiation — it is used to derive the bare type that
+ // keys the producer/consumer maps registered on a [RoutableAPI].
+ // Those maps are looked up by the bare media type, so an entry registered as
+ // "application/json" satisfies a route that declares "application/json;
+ // charset=utf-8" and vice-versa.
+ const maxParts = 2
+
+ return strings.SplitN(orig, ";", maxParts)[0]
+}
+
+// normalizeOffers is the slice form of [normalizeOffer].
+func normalizeOffers(orig []string) []string {
+ norm := make([]string, 0, len(orig))
+ for _, o := range orig {
+ norm = append(norm, normalizeOffer(o))
+ }
+
+ return norm
+}
diff --git a/vendor/github.com/go-openapi/runtime/middleware/ui_options.go b/vendor/github.com/go-openapi/runtime/middleware/ui_options.go
deleted file mode 100644
index ed255426ad8..00000000000
--- a/vendor/github.com/go-openapi/runtime/middleware/ui_options.go
+++ /dev/null
@@ -1,176 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
-// SPDX-License-Identifier: Apache-2.0
-
-package middleware
-
-import (
- "bytes"
- "encoding/gob"
- "fmt"
- "net/http"
- "path"
- "strings"
-)
-
-const (
- // constants that are common to all UI-serving middlewares.
- defaultDocsPath = "docs"
- defaultDocsURL = "/swagger.json"
- defaultDocsTitle = "API Documentation"
-)
-
-// uiOptions defines common options for UI serving middlewares.
-type uiOptions struct {
- // BasePath for the UI, defaults to: /
- BasePath string
-
- // Path combines with BasePath to construct the path to the UI, defaults to: "docs".
- Path string
-
- // SpecURL is the URL of the spec document.
- //
- // Defaults to: /swagger.json
- SpecURL string
-
- // Title for the documentation site, default to: API documentation
- Title string
-
- // Template specifies a custom template to serve the UI
- Template string
-}
-
-// toCommonUIOptions converts any UI option type to retain the common options.
-//
-// This uses gob encoding/decoding to convert common fields from one struct to another.
-func toCommonUIOptions(opts any) uiOptions {
- var buf bytes.Buffer
- enc := gob.NewEncoder(&buf)
- dec := gob.NewDecoder(&buf)
- var o uiOptions
- err := enc.Encode(opts)
- if err != nil {
- panic(err)
- }
-
- err = dec.Decode(&o)
- if err != nil {
- panic(err)
- }
-
- return o
-}
-
-func fromCommonToAnyOptions[T any](source uiOptions, target *T) {
- var buf bytes.Buffer
- enc := gob.NewEncoder(&buf)
- dec := gob.NewDecoder(&buf)
- err := enc.Encode(source)
- if err != nil {
- panic(err)
- }
-
- err = dec.Decode(target)
- if err != nil {
- panic(err)
- }
-}
-
-// UIOption can be applied to UI serving [middleware], such as Context.[APIHandler] or
-// Context.[APIHandlerSwaggerUI] to alter the default behavior.
-type UIOption func(*uiOptions)
-
-func uiOptionsWithDefaults(opts []UIOption) uiOptions {
- var o uiOptions
- for _, apply := range opts {
- apply(&o)
- }
-
- return o
-}
-
-// WithUIBasePath sets the base path from where to serve the UI assets.
-//
-// By default, Context [middleware] sets this value to the API base path.
-func WithUIBasePath(base string) UIOption {
- return func(o *uiOptions) {
- if !strings.HasPrefix(base, "/") {
- base = "/" + base
- }
- o.BasePath = base
- }
-}
-
-// WithUIPath sets the path from where to serve the UI assets (i.e. /{basepath}/{path}.
-func WithUIPath(pth string) UIOption {
- return func(o *uiOptions) {
- o.Path = pth
- }
-}
-
-// WithUISpecURL sets the path from where to serve swagger spec document.
-//
-// This may be specified as a full URL or a path.
-//
-// By default, this is "/swagger.json".
-func WithUISpecURL(specURL string) UIOption {
- return func(o *uiOptions) {
- o.SpecURL = specURL
- }
-}
-
-// WithUITitle sets the title of the UI.
-//
-// By default, Context [middleware] sets this value to the title found in the API spec.
-func WithUITitle(title string) UIOption {
- return func(o *uiOptions) {
- o.Title = title
- }
-}
-
-// WithTemplate allows to set a custom template for the UI.
-//
-// UI [middleware] will panic if the template does not parse or execute properly.
-func WithTemplate(tpl string) UIOption {
- return func(o *uiOptions) {
- o.Template = tpl
- }
-}
-
-// EnsureDefaults in case some options are missing.
-func (r *uiOptions) EnsureDefaults() {
- if r.BasePath == "" {
- r.BasePath = "/"
- }
- if r.Path == "" {
- r.Path = defaultDocsPath
- }
- if r.SpecURL == "" {
- r.SpecURL = defaultDocsURL
- }
- if r.Title == "" {
- r.Title = defaultDocsTitle
- }
-}
-
-// serveUI creates a middleware that serves a templated asset as text/html.
-func serveUI(pth string, assets []byte, next http.Handler) http.Handler {
- return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
- if path.Clean(r.URL.Path) == pth {
- rw.Header().Set(contentTypeHeader, "text/html; charset=utf-8")
- rw.WriteHeader(http.StatusOK)
- _, _ = rw.Write(assets)
-
- return
- }
-
- if next != nil {
- next.ServeHTTP(rw, r)
-
- return
- }
-
- rw.Header().Set(contentTypeHeader, "text/plain")
- rw.WriteHeader(http.StatusNotFound)
- _, _ = fmt.Fprintf(rw, "%q not found", pth)
- })
-}
diff --git a/vendor/github.com/go-openapi/runtime/middleware/validation.go b/vendor/github.com/go-openapi/runtime/middleware/validation.go
index 8a56490639e..63a78d482a8 100644
--- a/vendor/github.com/go-openapi/runtime/middleware/validation.go
+++ b/vendor/github.com/go-openapi/runtime/middleware/validation.go
@@ -4,13 +4,14 @@
package middleware
import (
- "mime"
+ stderrors "errors"
"net/http"
"strings"
"github.com/go-openapi/errors"
+
"github.com/go-openapi/runtime"
- "github.com/go-openapi/swag/stringutils"
+ "github.com/go-openapi/runtime/server-middleware/mediatype"
)
type validation struct {
@@ -21,24 +22,28 @@ type validation struct {
bound map[string]any
}
-// ContentType validates the content type of a request.
-func validateContentType(allowed []string, actual string) error {
+// validateContentType maps [mediatype.MatchFirst] to the runtime's
+// validation errors:
+//
+// - actual fails to parse → HTTP 400 ([errors.NewParseError]).
+// - actual is well-formed but
+// no allowed entry accepts it → HTTP 415 ([errors.InvalidContentType]).
+//
+// In the standard runtime flow, malformed Content-Type headers are
+// already caught upstream by [runtime.ContentType] (which itself returns
+// a 400 [errors.ParseError]). This function therefore only sees the
+// malformed case when invoked directly by callers that have bypassed
+// that step.
+func validateContentType(allowed []string, actual string, opts ...mediatype.MatchOption) error {
if len(allowed) == 0 {
return nil
}
- mt, _, err := mime.ParseMediaType(actual)
- if err != nil {
- return errors.InvalidContentType(actual, allowed)
- }
- if stringutils.ContainsStringsCI(allowed, mt) {
- return nil
- }
- if stringutils.ContainsStringsCI(allowed, "*/*") {
+ _, ok, err := mediatype.MatchFirst(allowed, actual, opts...)
+ if ok {
return nil
}
- parts := strings.Split(actual, "/")
- if len(parts) == 2 && stringutils.ContainsStringsCI(allowed, parts[0]+"/*") {
- return nil
+ if err != nil {
+ return errors.NewParseError(runtime.HeaderContentType, "header", actual, err)
}
return errors.InvalidContentType(actual, allowed)
}
@@ -69,46 +74,53 @@ func (v *validation) debugLogf(format string, args ...any) {
func (v *validation) parameters() {
v.debugLogf("validating request parameters for %s %s", v.request.Method, v.request.URL.EscapedPath())
- if result := v.route.Binder.Bind(v.request, v.route.Params, v.route.Consumer, v.bound); result != nil {
- if result.Error() == "validation failure list" {
- for _, e := range result.(*errors.Validation).Value.([]any) {
- v.result = append(v.result, e.(error))
- }
- return
+ result := v.route.Binder.bind(v.request, v.route.Params, v.route.Consumer, v.bound)
+ if result == nil {
+ return
+ }
+
+ for _, e := range result.Errors {
+ var validationErr *errors.Validation
+ if stderrors.As(e, &validationErr) {
+ v.result = append(v.result, validationErr)
}
- v.result = append(v.result, result)
}
}
func (v *validation) contentType() {
- if len(v.result) == 0 && runtime.HasBody(v.request) {
- v.debugLogf("validating body content type for %s %s", v.request.Method, v.request.URL.EscapedPath())
- ct, _, req, err := v.context.ContentType(v.request)
- if err != nil {
+ if len(v.result) > 0 || !runtime.HasBody(v.request) {
+ return
+ }
+
+ v.debugLogf("validating body content type for %s %s", v.request.Method, v.request.URL.EscapedPath())
+ ct, _, req, err := v.context.ContentType(v.request)
+ if err != nil {
+ v.result = append(v.result, err)
+ } else {
+ v.request = req
+ }
+
+ if len(v.result) == 0 {
+ v.debugLogf("validating content type for %q against [%s]", ct, strings.Join(v.route.Consumes, ", "))
+ if err := validateContentType(v.route.Consumes, ct, v.context.matchOpts()...); err != nil {
v.result = append(v.result, err)
- } else {
- v.request = req
}
+ }
- if len(v.result) == 0 {
- v.debugLogf("validating content type for %q against [%s]", ct, strings.Join(v.route.Consumes, ", "))
- if err := validateContentType(v.route.Consumes, ct); err != nil {
- v.result = append(v.result, err)
- }
- }
- if ct != "" && v.route.Consumer == nil {
- cons, ok := v.route.Consumers[ct]
- if !ok {
- v.result = append(v.result, errors.New(http.StatusInternalServerError, "no consumer registered for %s", ct))
- } else {
- v.route.Consumer = cons
- }
- }
+ if ct == "" || v.route.Consumer != nil {
+ return
+ }
+
+ cons, ok := mediatype.Lookup(v.route.Consumers, ct, v.context.matchOpts()...)
+ if !ok {
+ v.result = append(v.result, errors.New(http.StatusInternalServerError, "no consumer registered for %s", ct))
+ } else {
+ v.route.Consumer = cons
}
}
func (v *validation) responseFormat() {
- // if the route provides values for Produces and no format could be identify then return an error.
+ // if the route provides values for Produces and no format could be identified then return an error.
// if the route does not specify values for Produces then treat request as valid since the API designer
// choose not to specify the format for responses.
if str, rCtx := v.context.ResponseFormat(v.request, v.route.Produces); str == "" && len(v.route.Produces) > 0 {
diff --git a/vendor/github.com/go-openapi/runtime/security/authenticator.go b/vendor/github.com/go-openapi/runtime/security/authenticator.go
index 4c091018265..e521d95ef16 100644
--- a/vendor/github.com/go-openapi/runtime/security/authenticator.go
+++ b/vendor/github.com/go-openapi/runtime/security/authenticator.go
@@ -19,8 +19,8 @@ const (
accessTokenParam = "access_token"
)
-// HttpAuthenticator is a function that authenticates a HTTP request.
-func HttpAuthenticator(handler func(*http.Request) (bool, any, error)) runtime.Authenticator { //nolint:revive
+// HTTPAuthenticator is a function that authenticates a HTTP request.
+func HTTPAuthenticator(handler func(*http.Request) (bool, any, error)) runtime.Authenticator {
return runtime.AuthenticatorFunc(func(params any) (bool, any, error) {
if request, ok := params.(*http.Request); ok {
return handler(request)
@@ -32,7 +32,14 @@ func HttpAuthenticator(handler func(*http.Request) (bool, any, error)) runtime.A
})
}
-// ScopedAuthenticator is a function that authenticates a HTTP request against a list of valid scopes.
+// HttpAuthenticator aliases [HTTPAuthenticator] for backward-compatibility.
+//
+// Deprecated: use [HTTPAuthenticator] instead.
+func HttpAuthenticator(handler func(*http.Request) (bool, any, error)) runtime.Authenticator { //nolint:revive
+ return HTTPAuthenticator(handler)
+}
+
+// ScopedAuthenticator is a function that authenticates an [http.Request] against a list of valid scopes.
func ScopedAuthenticator(handler func(*ScopedAuthRequest) (bool, any, error)) runtime.Authenticator {
return runtime.AuthenticatorFunc(func(params any) (bool, any, error) {
if request, ok := params.(*ScopedAuthRequest); ok {
@@ -42,22 +49,42 @@ func ScopedAuthenticator(handler func(*ScopedAuthRequest) (bool, any, error)) ru
})
}
-// UserPassAuthentication authentication function.
+// UserPassAuthentication validates a basic-auth credential.
+//
+// Implementations comparing the password (or any derived secret) against a
+// known value MUST use [crypto/subtle.ConstantTimeCompare]: the runtime
+// extracts the credential from the request and delegates the comparison
+// here, and does not enforce a constant-time posture on the caller's behalf.
type UserPassAuthentication func(string, string) (any, error)
-// UserPassAuthenticationCtx authentication function with [context.Context].
+// UserPassAuthenticationCtx is the [context.Context]-aware variant of
+// [UserPassAuthentication]. The same constant-time-comparison guidance
+// applies.
type UserPassAuthenticationCtx func(context.Context, string, string) (context.Context, any, error)
-// TokenAuthentication authentication function.
+// TokenAuthentication validates an API-key token.
+//
+// Implementations comparing the token against a known value MUST use
+// [crypto/subtle.ConstantTimeCompare]; the runtime delegates the comparison
+// here and does not enforce a constant-time posture on the caller's behalf.
type TokenAuthentication func(string) (any, error)
-// TokenAuthenticationCtx authentication function with [context.Context].
+// TokenAuthenticationCtx is the [context.Context]-aware variant of
+// [TokenAuthentication]. The same constant-time-comparison guidance
+// applies.
type TokenAuthenticationCtx func(context.Context, string) (context.Context, any, error)
-// ScopedTokenAuthentication authentication function.
+// ScopedTokenAuthentication validates a bearer/OAuth2 token along with the
+// scopes required for the operation.
+//
+// Implementations comparing the token against a known value MUST use
+// [crypto/subtle.ConstantTimeCompare]; the runtime delegates the comparison
+// here and does not enforce a constant-time posture on the caller's behalf.
type ScopedTokenAuthentication func(string, []string) (any, error)
-// ScopedTokenAuthenticationCtx authentication function with [context.Context].
+// ScopedTokenAuthenticationCtx is the [context.Context]-aware variant of
+// [ScopedTokenAuthentication]. The same constant-time-comparison guidance
+// applies.
type ScopedTokenAuthenticationCtx func(context.Context, string, []string) (context.Context, any, error)
var DefaultRealmName = "API"
@@ -199,7 +226,7 @@ func APIKeyAuthCtx(name, in string, authenticate TokenAuthenticationCtx) runtime
})
}
-// ScopedAuthRequest contains both a [http] request and the required scopes for a particular operation.
+// ScopedAuthRequest contains both the [http.Request] and the required scopes for a particular operation.
type ScopedAuthRequest struct {
Request *http.Request
RequiredScopes []string
diff --git a/vendor/github.com/go-openapi/runtime/server-middleware/LICENSE b/vendor/github.com/go-openapi/runtime/server-middleware/LICENSE
new file mode 100644
index 00000000000..d6456956733
--- /dev/null
+++ b/vendor/github.com/go-openapi/runtime/server-middleware/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/vendor/github.com/go-openapi/runtime/server-middleware/docui/doc.go b/vendor/github.com/go-openapi/runtime/server-middleware/docui/doc.go
new file mode 100644
index 00000000000..809296d5c4f
--- /dev/null
+++ b/vendor/github.com/go-openapi/runtime/server-middleware/docui/doc.go
@@ -0,0 +1,12 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+// Package docui provides standalone HTTP middlewares that serve OpenAPI
+// documentation UIs (Swagger UI, ReDoc, RapiDoc) and the spec document
+// itself.
+//
+// The package is stdlib-only and has no transitive dependency on any
+// OpenAPI spec, loading or validation library, so it may be imported by
+// any net/http application that simply wants to mount a documentation
+// site.
+package docui
diff --git a/vendor/github.com/go-openapi/runtime/server-middleware/docui/options.go b/vendor/github.com/go-openapi/runtime/server-middleware/docui/options.go
new file mode 100644
index 00000000000..c9e45f77946
--- /dev/null
+++ b/vendor/github.com/go-openapi/runtime/server-middleware/docui/options.go
@@ -0,0 +1,253 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package docui
+
+import (
+ "net/http"
+ "net/url"
+ "strings"
+)
+
+const (
+ // constants that are common to all UI-serving middlewares.
+ defaultDocsPath = "docs"
+ defaultDocsURL = "/swagger.json"
+ defaultDocsTitle = "API Documentation"
+
+ contentTypeHeader = "Content-Type"
+ applicationJSON = "application/json"
+)
+
+// UIMiddleware is a function returning a http middleware which accepts UI [Option].
+type UIMiddleware func(...Option) func(http.Handler) http.Handler
+
+// Option to tune your swagger documentation UI middleware.
+//
+// Options may be combined to alter the route at which the UI asset is served,
+// the URL of the spec document, the source URL of the UI asset and the title of the UI page.
+//
+// The embedded js scriptlet served may be modified using [WithUITemplate].
+type Option func(*options)
+
+// SpecOption can be applied to the [ServeSpec] middleware.
+type SpecOption func(*specOptions)
+
+// SwaggerUIOptions define a group of extra options specific to the SwaggerUI component.
+type SwaggerUIOptions struct {
+ // OAuth2CallbackURL sets the URL called after OAuth2 login
+ OAuth2CallbackURL string
+
+ // Defines the URL of the swagger UI assets with presets.
+ //
+ // Default: https://unpkg.com/swagger-ui-dist/swagger-ui-standalone-preset.js
+ SwaggerPresetURL string
+
+ // Defines style sheet URL.
+ //
+ // Default: https://unpkg.com/swagger-ui-dist/swagger-ui.css
+ SwaggerStylesURL string
+
+ // Define the favicons URLs.
+ //
+ // Defaults:
+ //
+ // - 16x16: https://unpkg.com/swagger-ui-dist/favicon-16x16.png
+ // - 32x32: https://unpkg.com/swagger-ui-dist/favicon-32x32.png
+ Favicon32 string
+ Favicon16 string
+}
+
+func (o *SwaggerUIOptions) applySwaggerUIDefaults() {
+ if o.SwaggerPresetURL == "" {
+ o.SwaggerPresetURL = swaggerPresetLatest
+ }
+ if o.SwaggerStylesURL == "" {
+ o.SwaggerStylesURL = swaggerStylesLatest
+ }
+ if o.Favicon16 == "" || o.Favicon32 == "" {
+ o.Favicon16 = swaggerFavicon16Latest
+ o.Favicon32 = swaggerFavicon32Latest
+ }
+}
+
+type (
+ options struct {
+ SwaggerUIOptions
+
+ // BasePath for the UI, defaults to: /
+ BasePath string
+
+ // Path combines with BasePath to construct the path to the UI, defaults to: "docs".
+ Path string
+
+ // SpecURL is the URL of the spec document.
+ SpecURL string
+
+ // Title for the documentation site, default to: API documentation
+ Title string
+
+ // Template specifies a custom template to serve the UI
+ Template string
+
+ // AssetsURL points to the js asset that generates the documentation page.
+ AssetsURL string
+ }
+
+ specOptions struct {
+ Path string
+ Document string
+ }
+)
+
+////////////////////////////////////////////////////////////
+// Common UI options
+////////////////////////////////////////////////////////////
+
+// WithUIBasePath sets the base path from where to serve the UI assets.
+//
+// Default: "/"
+func WithUIBasePath(base string) Option {
+ return func(o *options) {
+ if !strings.HasPrefix(base, "/") {
+ base = "/" + base
+ }
+ o.BasePath = base
+ }
+}
+
+// WithUIPath sets the path from where to serve the UI assets (i.e. /{basepath}/{path}).
+//
+// Default: "docs"
+func WithUIPath(pth string) Option {
+ return func(o *options) {
+ o.Path = pth
+ }
+}
+
+// WithUITitle sets the title of the UI.
+//
+// Default: "API documentation"
+func WithUITitle(title string) Option {
+ return func(o *options) {
+ o.Title = title
+ }
+}
+
+// WithUIAssetsURL sets the URL from where to fetch the js assets.
+//
+// Defaults:
+//
+// - for Redoc: https://cdn.jsdelivr.net/npm/redoc/bundles/redoc.standalone.js
+// - for RapiDoc, this defaults to: https://unpkg.com/rapidoc/dist/rapidoc-min.js
+// - for SwaggerUI: https://unpkg.com/swagger-ui-dist/swagger-ui-bundle.js
+func WithUIAssetsURL(assets string) Option {
+ return func(o *options) {
+ o.AssetsURL = assets
+ }
+}
+
+// WithUITemplate allows to set a custom template for the UI.
+//
+// This allows the caller to fully customize the rendered UI, using the advanced options
+// provided by any UI.
+//
+// The UI [middleware] will panic if the template does not parse or execute properly.
+//
+// Reference documentations to customize your js scriptlet:
+//
+// - for Redoc: https://github.com/Redocly/redoc/blob/main/docs/deployment/html.md
+// - for RapiDoc: https://github.com/rapi-doc/RapiDoc
+// - for SwaggerUI: https://github.com/swagger-api/swagger-ui
+func WithUITemplate[StringOrBytes ~string | ~[]byte](tpl StringOrBytes) Option {
+ return func(o *options) {
+ o.Template = string(tpl)
+ }
+}
+
+// WithSpecURL sets the URL of the spec document.
+//
+// Defaults to: /swagger.json
+func WithSpecURL(u string) Option {
+ return func(o *options) {
+ o.SpecURL = u
+ }
+}
+
+////////////////////////////////////////////////////////////
+// SwaggerUI UI options
+////////////////////////////////////////////////////////////
+
+func WithSwaggerUIOptions(opts SwaggerUIOptions) Option {
+ return func(o *options) {
+ o.SwaggerUIOptions = opts
+ }
+}
+
+////////////////////////////////////////////////////////////
+// Spec options
+////////////////////////////////////////////////////////////
+
+// WithSpecPath sets the path of the spec document.
+//
+// This is "/swagger.json" by default.
+func WithSpecPath(pth string) SpecOption {
+ return func(o *specOptions) {
+ if pth == "" {
+ return
+ }
+
+ o.Path = pth
+ }
+}
+
+// WithSpecPathFromOptions reuses the same SpecPath as the one specified in
+// a set of UI [Option] (extract the path from the URL provided by [WithSpecURL]).
+func WithSpecPathFromOptions(opts ...Option) SpecOption {
+ return func(o *specOptions) {
+ uiOpts := optionsWithDefaults(opts)
+
+ // If the spec URL is provided, there is a non-default path to serve the spec.
+ //
+ // This makes sure that the UI middleware is aligned with the Spec middleware.
+ u, _ := url.Parse(uiOpts.SpecURL)
+
+ if u.Path == "" {
+ return
+ }
+
+ o.Path = u.Path
+ }
+}
+
+func optionsWithDefaults(opts []Option, prepend ...Option) options {
+ o := options{
+ BasePath: "/",
+ Path: defaultDocsPath,
+ SpecURL: defaultDocsURL,
+ Title: defaultDocsTitle,
+ }
+
+ prepend = append(prepend, opts...)
+ for _, apply := range prepend {
+ apply(&o)
+ }
+
+ return o
+}
+
+func specOptionsWithDefaults(opts []SpecOption) specOptions {
+ o := specOptions{
+ Path: defaultDocsURL,
+ }
+
+ for _, apply := range opts {
+ apply(&o)
+ }
+
+ if !strings.HasPrefix(o.Path, "/") {
+ o.Path = "/" + o.Path
+ }
+
+ return o
+}
diff --git a/vendor/github.com/go-openapi/runtime/server-middleware/docui/rapidoc.go b/vendor/github.com/go-openapi/runtime/server-middleware/docui/rapidoc.go
new file mode 100644
index 00000000000..c050331b4b0
--- /dev/null
+++ b/vendor/github.com/go-openapi/runtime/server-middleware/docui/rapidoc.go
@@ -0,0 +1,67 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package docui
+
+import (
+ "bytes"
+ "fmt"
+ "html/template"
+ "net/http"
+ "path"
+)
+
+// UseRapiDoc creates a middleware to serve a documentation site for a swagger spec using [RapidDoc].
+//
+// [RapiDoc]: https://github.com/rapi-doc/RapiDoc
+func UseRapiDoc(opts ...Option) func(next http.Handler) http.Handler {
+ pth, assets := rapiDocSetup(opts)
+ return func(next http.Handler) http.Handler {
+ return serveUI(pth, assets, next)
+ }
+}
+
+// RapiDoc creates a [http.Handler] to serve a documentation site for a swagger spec using [RapidDoc].
+//
+// By default, the UI is served at route "/docs"
+//
+// This allows for altering the spec before starting the [http] listener.
+//
+// [RapiDoc]: https://github.com/rapi-doc/RapiDoc
+func RapiDoc(next http.Handler, opts ...Option) http.Handler {
+ pth, assets := rapiDocSetup(opts)
+
+ return serveUI(pth, assets, next)
+}
+
+func rapiDocSetup(opts []Option) (pth string, assets []byte) {
+ o := optionsWithDefaults(opts,
+ // defaults for rapiDoc
+ WithUITemplate(rapidocTemplate),
+ WithUIAssetsURL(rapidocLatest),
+ )
+ pth = path.Join(o.BasePath, o.Path)
+ tmpl := template.Must(template.New("rapidoc").Parse(o.Template))
+ buf := bytes.NewBuffer(nil)
+ if err := tmpl.Execute(buf, o); err != nil {
+ panic(fmt.Errorf("cannot execute template: %w", err))
+ }
+
+ return pth, buf.Bytes()
+}
+
+const (
+ rapidocLatest = "https://unpkg.com/rapidoc/dist/rapidoc-min.js"
+ rapidocTemplate = `
+
+
+ {{ .Title }}
+
+
+
+
+
+
+
+`
+)
diff --git a/vendor/github.com/go-openapi/runtime/server-middleware/docui/redoc.go b/vendor/github.com/go-openapi/runtime/server-middleware/docui/redoc.go
new file mode 100644
index 00000000000..31054a2476e
--- /dev/null
+++ b/vendor/github.com/go-openapi/runtime/server-middleware/docui/redoc.go
@@ -0,0 +1,82 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package docui
+
+import (
+ "bytes"
+ "fmt"
+ "html/template"
+ "net/http"
+ "path"
+)
+
+// UseRedoc creates a middleware to serve a documentation site for a swagger spec using [Redoc].
+//
+// [Redoc]: https://redocly.com/docs/redoc
+func UseRedoc(opts ...Option) func(next http.Handler) http.Handler {
+ pth, assets := redocSetup(opts)
+
+ return func(next http.Handler) http.Handler {
+ return serveUI(pth, assets, next)
+ }
+}
+
+// Redoc creates a [http.Handler] to serve a documentation site for a swagger spec using [Redoc].
+//
+// By default, the UI is served at route "/docs"
+//
+// This allows for altering the spec before starting the [http] listener.
+//
+// [Redoc]: https://redocly.com/docs/redoc
+func Redoc(next http.Handler, opts ...Option) http.Handler {
+ pth, assets := redocSetup(opts)
+
+ return serveUI(pth, assets, next)
+}
+
+func redocSetup(opts []Option) (pth string, assets []byte) {
+ o := optionsWithDefaults(opts,
+ // defaults for redoc
+ WithUITemplate(redocTemplate),
+ WithUIAssetsURL(redocLatest),
+ )
+
+ pth = path.Join(o.BasePath, o.Path)
+ tmpl := template.Must(template.New("redoc").Parse(o.Template))
+ buf := bytes.NewBuffer(nil)
+ if err := tmpl.Execute(buf, o); err != nil {
+ panic(fmt.Errorf("cannot execute template: %w", err))
+ }
+
+ return pth, buf.Bytes()
+}
+
+const (
+ redocLatest = "https://cdn.redoc.ly/redoc/latest/bundles/redoc.standalone.js" // "https://cdn.jsdelivr.net/npm/redoc/bundles/redoc.standalone.js"
+ redocTemplate = `
+
+
+ {{ .Title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+`
+)
diff --git a/vendor/github.com/go-openapi/runtime/server-middleware/docui/render.go b/vendor/github.com/go-openapi/runtime/server-middleware/docui/render.go
new file mode 100644
index 00000000000..1fb744fd005
--- /dev/null
+++ b/vendor/github.com/go-openapi/runtime/server-middleware/docui/render.go
@@ -0,0 +1,33 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package docui
+
+import (
+ "fmt"
+ "net/http"
+ "path"
+)
+
+// serveUI creates a [http.Handler] that serves a templated asset as text/html.
+func serveUI(pth string, assets []byte, next http.Handler) http.Handler {
+ return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
+ if path.Clean(r.URL.Path) == pth {
+ rw.Header().Set(contentTypeHeader, "text/html; charset=utf-8")
+ rw.WriteHeader(http.StatusOK)
+ _, _ = rw.Write(assets)
+
+ return
+ }
+
+ if next != nil {
+ next.ServeHTTP(rw, r)
+
+ return
+ }
+
+ rw.Header().Set(contentTypeHeader, "text/plain")
+ rw.WriteHeader(http.StatusNotFound)
+ _, _ = fmt.Fprintf(rw, "%q not found", pth)
+ })
+}
diff --git a/vendor/github.com/go-openapi/runtime/server-middleware/docui/spec.go b/vendor/github.com/go-openapi/runtime/server-middleware/docui/spec.go
new file mode 100644
index 00000000000..59780199d5b
--- /dev/null
+++ b/vendor/github.com/go-openapi/runtime/server-middleware/docui/spec.go
@@ -0,0 +1,50 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package docui
+
+import (
+ "net/http"
+ "path"
+)
+
+// UseSpec creates a middleware to serve a swagger spec as a JSON document.
+func UseSpec(spec []byte, opts ...SpecOption) func(next http.Handler) http.Handler {
+ o := specOptionsWithDefaults(opts)
+
+ return func(next http.Handler) http.Handler {
+ return handleSpec(o.Path, spec, next)
+ }
+}
+
+// ServeSpec creates a [http.Handler] to serve a swagger spec as a JSON document.
+//
+// This allows for altering the spec before starting the [http] listener.
+//
+// Additional [SpecOption] can be used to change the path and the name of the document (defaults to "/swagger.json").
+func ServeSpec(spec []byte, next http.Handler, opts ...SpecOption) http.Handler {
+ o := specOptionsWithDefaults(opts)
+
+ return handleSpec(o.Path, spec, next)
+}
+
+func handleSpec(pth string, spec []byte, next http.Handler) http.Handler {
+ return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
+ if path.Clean(r.URL.Path) == pth {
+ rw.Header().Set(contentTypeHeader, applicationJSON)
+ rw.WriteHeader(http.StatusOK)
+ _, _ = rw.Write(spec)
+
+ return
+ }
+
+ if next != nil {
+ next.ServeHTTP(rw, r)
+
+ return
+ }
+
+ rw.Header().Set(contentTypeHeader, applicationJSON)
+ rw.WriteHeader(http.StatusNotFound)
+ })
+}
diff --git a/vendor/github.com/go-openapi/runtime/server-middleware/docui/swaggerui.go b/vendor/github.com/go-openapi/runtime/server-middleware/docui/swaggerui.go
new file mode 100644
index 00000000000..db0aa05e6ab
--- /dev/null
+++ b/vendor/github.com/go-openapi/runtime/server-middleware/docui/swaggerui.go
@@ -0,0 +1,138 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package docui
+
+import (
+ "bytes"
+ "fmt"
+ "html/template"
+ "net/http"
+ "path"
+)
+
+// UseSwaggerUI creates a middleware to serve a documentation site for a swagger spec using [SwaggerUI].
+//
+// [SwaggerUI]: https://swagger.io/tools/swagger-ui
+func UseSwaggerUI(opts ...Option) func(next http.Handler) http.Handler {
+ pth, assets := swaggeruiSetup(opts)
+
+ return func(next http.Handler) http.Handler {
+ return serveUI(pth, assets, next)
+ }
+}
+
+// SwaggerUI creates a [http.Handler] to serve a documentation site for a swagger spec using [SwaggerUI].
+//
+// By default, the UI is served at route "/docs"
+//
+// This allows for altering the spec before starting the [http] listener.
+//
+// [SwaggerUI]: https://swagger.io/tools/swagger-ui
+func SwaggerUI(next http.Handler, opts ...Option) http.Handler {
+ pth, assets := swaggeruiSetup(opts)
+
+ return serveUI(pth, assets, next)
+}
+
+func swaggeruiSetup(opts []Option) (pth string, assets []byte) {
+ o := optionsWithDefaults(opts,
+ // defaults for SwaggerUI
+ WithUITemplate(swaggeruiTemplate),
+ WithUIAssetsURL(swaggerLatest),
+ )
+ o.applySwaggerUIDefaults()
+ if o.OAuth2CallbackURL == "" {
+ o.OAuth2CallbackURL = path.Join(o.BasePath, o.Path, "oauth2-callback")
+ }
+
+ pth = path.Join(o.BasePath, o.Path)
+ tmpl := template.Must(template.New("swaggerui").Parse(o.Template))
+ buf := bytes.NewBuffer(nil)
+ if err := tmpl.Execute(buf, o); err != nil {
+ panic(fmt.Errorf("cannot execute template: %w", err))
+ }
+
+ return pth, buf.Bytes()
+}
+
+const (
+ swaggerLatest = "https://unpkg.com/swagger-ui-dist/swagger-ui-bundle.js"
+ swaggerPresetLatest = "https://unpkg.com/swagger-ui-dist/swagger-ui-standalone-preset.js"
+ swaggerStylesLatest = "https://unpkg.com/swagger-ui-dist/swagger-ui.css"
+ swaggerFavicon32Latest = "https://unpkg.com/swagger-ui-dist/favicon-32x32.png"
+ swaggerFavicon16Latest = "https://unpkg.com/swagger-ui-dist/favicon-16x16.png"
+ swaggeruiTemplate = `
+
+
+
+
+ {{ .Title }}
+
+ {{- if .SwaggerStylesURL }}
+
+ {{- end }}
+ {{- if .Favicon32 }}
+
+ {{- end }}
+ {{- if .Favicon16 }}
+
+ {{- end }}
+
+
+
+
+
+
+
+ {{- if .SwaggerPresetURL }}
+
+ {{- end }}
+
+
+
+`
+)
diff --git a/vendor/github.com/go-openapi/runtime/middleware/swaggerui_oauth2.go b/vendor/github.com/go-openapi/runtime/server-middleware/docui/swaggerui_oauth2.go
similarity index 70%
rename from vendor/github.com/go-openapi/runtime/middleware/swaggerui_oauth2.go
rename to vendor/github.com/go-openapi/runtime/server-middleware/docui/swaggerui_oauth2.go
index 879bdbaadea..a38e408f153 100644
--- a/vendor/github.com/go-openapi/runtime/middleware/swaggerui_oauth2.go
+++ b/vendor/github.com/go-openapi/runtime/server-middleware/docui/swaggerui_oauth2.go
@@ -1,30 +1,56 @@
// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
// SPDX-License-Identifier: Apache-2.0
-package middleware
+package docui
import (
"bytes"
"fmt"
"net/http"
+ "path"
"text/template"
)
-func SwaggerUIOAuth2Callback(opts SwaggerUIOpts, next http.Handler) http.Handler {
- opts.EnsureDefaultsOauth2()
+// UseSwaggerUIOAuth2Callback creates a middleware that serves a callback URL to complete
+// a OAuth2 token handshake.
+func UseSwaggerUIOAuth2Callback(opts ...Option) func(next http.Handler) http.Handler {
+ pth, assets := swaggeruiOAuth2Setup(opts)
- pth := opts.OAuthCallbackURL
- tmpl := template.Must(template.New("swaggeroauth").Parse(opts.Template))
- assets := bytes.NewBuffer(nil)
- if err := tmpl.Execute(assets, opts); err != nil {
+ return func(next http.Handler) http.Handler {
+ return serveUI(pth, assets, next)
+ }
+}
+
+// SwaggerUIOAuth2Callback creates a [http.Handler] that serves a callback URL to complete
+// a OAuth2 token handshake.
+func SwaggerUIOAuth2Callback(next http.Handler, opts ...Option) http.Handler {
+ pth, assets := swaggeruiOAuth2Setup(opts)
+
+ return serveUI(pth, assets, next)
+}
+
+func swaggeruiOAuth2Setup(opts []Option) (pth string, assets []byte) {
+ o := optionsWithDefaults(opts,
+ // defaults for SwaggerUI OAuth2 callback endpoint
+ WithUITemplate(swaggerOAuth2Template),
+ WithUIAssetsURL(swaggerLatest),
+ )
+ o.applySwaggerUIDefaults()
+ if o.OAuth2CallbackURL == "" {
+ o.OAuth2CallbackURL = path.Join(o.BasePath, o.Path, "oauth2-callback")
+ }
+
+ pth = o.OAuth2CallbackURL
+ tmpl := template.Must(template.New("swaggeroauth2").Parse(o.Template))
+ buf := bytes.NewBuffer(nil)
+ if err := tmpl.Execute(buf, o); err != nil {
panic(fmt.Errorf("cannot execute template: %w", err))
}
- return serveUI(pth, assets.Bytes(), next)
+ return pth, buf.Bytes()
}
-const (
- swaggerOAuthTemplate = `
+const swaggerOAuth2Template = `
@@ -105,4 +131,3 @@ const (
`
-)
diff --git a/vendor/github.com/go-openapi/runtime/server-middleware/mediatype/doc.go b/vendor/github.com/go-openapi/runtime/server-middleware/mediatype/doc.go
new file mode 100644
index 00000000000..6f8aa313523
--- /dev/null
+++ b/vendor/github.com/go-openapi/runtime/server-middleware/mediatype/doc.go
@@ -0,0 +1,30 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+// Package mediatype provides a typed value for media types
+// defined by RFC 7231 and RFC 2045.
+//
+// The matching/selection primitives used by both server-side
+// validation and Accept-header negotiation.
+//
+// The package is stdlib-only.
+//
+// # The matching rule
+//
+// [MediaType.Matches] is asymmetric. The receiver acts as the "bound"
+// (an allowed entry on the server side, or a candidate offer when
+// matching against an Accept entry); the argument is the constraint
+// (the actual incoming request, or the Accept entry being satisfied).
+//
+// - bare type/subtype must agree, with wildcard handling on either
+// side ("*/*" matches anything; "type/*" matches any subtype);
+// - if the receiver carries no parameters, any constraint is
+// accepted regardless of its parameters;
+// - otherwise every (key,value) pair on the constraint must be
+// present on the receiver, with case-insensitive value
+// comparison. The receiver may carry additional parameters the
+// constraint does not list.
+//
+// q-values are NOT considered by [MediaType.Matches] — they are the
+// negotiator's concern, handled inside [Set.BestMatch].
+package mediatype
diff --git a/vendor/github.com/go-openapi/runtime/server-middleware/mediatype/lookup.go b/vendor/github.com/go-openapi/runtime/server-middleware/mediatype/lookup.go
new file mode 100644
index 00000000000..598b60aca35
--- /dev/null
+++ b/vendor/github.com/go-openapi/runtime/server-middleware/mediatype/lookup.go
@@ -0,0 +1,116 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package mediatype
+
+// Lookup finds the entry in m matching mediaType, with alias-aware
+// fallback. It is the canonical seam for codec-map lookups in both
+// the client and server runtimes — placing the fallback policy here
+// keeps alias definitions (and any future lookup tolerances) in one
+// place.
+//
+// Lookup tries the following, in order, returning the first hit:
+//
+// 1. mediaType verbatim (fast path for callers that already pass a
+// canonical, parameter-free string and store map keys in the
+// same form).
+// 2. An alias-aware walk against the parsed "type/subtype" form:
+// a direct map hit on the parsed key, on its alias canonical
+// if any, and finally an O(len(m)) scan returning any map
+// entry whose key alias-canonicalizes to the same target.
+// Catches both "map keyed by canonical, query uses alias" and
+// "map keyed by one alias, query uses another alias of the
+// same canonical".
+// 3. When [AllowSuffix] is passed in opts: the same alias-aware
+// walk against the RFC 6839 structured-syntax suffix base.
+// Catches the "spec/traffic divergence" case (request for
+// application/vnd.api+json finds a JSON consumer registered
+// under application/json). Query-side suffix fold only — no
+// map-side suffix folding.
+//
+// Lookup does NOT fall back to "*/*". Callers that want wildcard
+// behavior (the historical resolveConsumer pattern in the client
+// runtime) chain that themselves after a Lookup miss — keeping
+// wildcard semantics explicit at each call site.
+//
+// Map keys are expected in canonical "type/subtype" form (no
+// parameters). The runtime's default Consumers / Producers maps
+// follow this convention.
+//
+// Returns (zero, false) when:
+//
+// - m is empty;
+// - mediaType fails to parse and is not present verbatim;
+// - none of the active steps hits.
+//
+// The malformed-vs-not-found distinction is intentionally elided:
+// codec-lookup callers treat both as the same "no codec" error path.
+func Lookup[T any](m map[string]T, mediaType string, opts ...MatchOption) (T, bool) {
+ var zero T
+ if len(m) == 0 {
+ return zero, false
+ }
+ o := applyMatchOptions(opts)
+ // Fast path: raw key (preserves any caller behaviour that stored
+ // non-canonical strings as map keys, and skips parsing in the
+ // common already-canonical case).
+ if v, ok := m[mediaType]; ok {
+ return v, true
+ }
+ mt, err := Parse(mediaType)
+ if err != nil {
+ return zero, false
+ }
+ key := mt.Type + "/" + mt.Subtype
+ if v, ok := findByCanonical(m, key); ok {
+ return v, true
+ }
+ if o.allowSuffix && mt.Suffix != "" {
+ base := mt.Base()
+ if baseKey := base.Type + "/" + base.Subtype; baseKey != key {
+ if v, ok := findByCanonical(m, baseKey); ok {
+ return v, true
+ }
+ }
+ }
+ return zero, false
+}
+
+// findByCanonical returns the first entry in m whose key
+// alias-canonicalizes to the same value as target.
+//
+// Tries direct hits before the O(len(m)) walk:
+//
+// 1. m[target] — map keyed by the same string.
+// 2. m[aliases[target]] — map keyed by the canonical when target
+// is an alias.
+// 3. Walk m: return any entry where canonical(k) == canonical(target).
+// Catches the "map keyed by an alias different from the query
+// side" case (e.g. registered under text/yaml, queried as
+// application/x-yaml — both canonicalize to application/yaml).
+//
+// Map size is single-digit for the runtime's codec maps, so the
+// walk is negligible.
+func findByCanonical[T any](m map[string]T, target string) (T, bool) {
+ if v, ok := m[target]; ok {
+ return v, true
+ }
+ canonTarget := target
+ if canon, ok := aliases[target]; ok {
+ canonTarget = canon
+ if v, ok := m[canonTarget]; ok {
+ return v, true
+ }
+ }
+ for k, v := range m {
+ kCanon := k
+ if c, ok := aliases[k]; ok {
+ kCanon = c
+ }
+ if kCanon == canonTarget {
+ return v, true
+ }
+ }
+ var zero T
+ return zero, false
+}
diff --git a/vendor/github.com/go-openapi/runtime/server-middleware/mediatype/match.go b/vendor/github.com/go-openapi/runtime/server-middleware/mediatype/match.go
new file mode 100644
index 00000000000..6a16d0b6f2e
--- /dev/null
+++ b/vendor/github.com/go-openapi/runtime/server-middleware/mediatype/match.go
@@ -0,0 +1,65 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package mediatype
+
+// MatchFirst reports whether actual matches any entry in allowed,
+// using [MediaType.Match] — the param-aware RFC 7231 rule plus the
+// alias bridge from the package-internal alias table.
+//
+// The scan is multi-pass and tier-ordered: the first pass returns
+// the first allowed entry that matches under [MatchExact] (RFC 7231
+// semantics); the second pass looks for a [MatchAlias] match; when
+// [AllowSuffix] is in opts a third pass looks for a [MatchSuffix]
+// match. This preserves the "stronger tier wins" ordering from
+// [Set.BestMatch] while keeping the "first match wins" semantics
+// within each tier.
+//
+// Return values:
+//
+// - (matched, true, nil) — the first allowed entry that
+// matches, with exact matches preferred over alias matches.
+// - (zero, false, nil) — actual is well-formed but no
+// allowed entry accepts it. Maps to an HTTP 415 outcome.
+// - (zero, false, err) — actual fails to parse. err
+// wraps [ErrMalformed], so callers can use [errors.Is] to
+// distinguish this case. Maps to an HTTP 400 outcome.
+//
+// Allowed entries that themselves fail to parse are skipped (they
+// cannot match any well-formed actual), and no error is surfaced
+// for them.
+//
+// An empty allowed list returns (zero, false, nil). MatchFirst is
+// the primitive; callers decide what no-constraints means in their
+// context.
+func MatchFirst(allowed []string, actual string, opts ...MatchOption) (MediaType, bool, error) {
+ if len(allowed) == 0 {
+ return MediaType{}, false, nil
+ }
+ actualMT, err := Parse(actual)
+ if err != nil {
+ return MediaType{}, false, err
+ }
+ o := applyMatchOptions(opts)
+ // Tier-ordered passes over the allowed list. The list is
+ // typically short (an operation's Consumes set), so re-parsing
+ // each entry on every pass is cheaper than caching parses across
+ // passes.
+ tiers := []MatchKind{MatchExact, MatchAlias}
+ if o.allowSuffix {
+ tiers = append(tiers, MatchSuffix)
+ }
+ for _, want := range tiers {
+ for _, a := range allowed {
+ allowedMT, perr := Parse(a)
+ if perr != nil {
+ continue
+ }
+ if allowedMT.Match(actualMT) == want {
+ return allowedMT, true, nil
+ }
+ }
+ }
+
+ return MediaType{}, false, nil
+}
diff --git a/vendor/github.com/go-openapi/runtime/server-middleware/mediatype/mediatype.go b/vendor/github.com/go-openapi/runtime/server-middleware/mediatype/mediatype.go
new file mode 100644
index 00000000000..41a32a160a8
--- /dev/null
+++ b/vendor/github.com/go-openapi/runtime/server-middleware/mediatype/mediatype.go
@@ -0,0 +1,392 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package mediatype
+
+import (
+ "fmt"
+ "mime"
+ "strconv"
+ "strings"
+)
+
+const wildcard = "*"
+
+// Internal constants for the suffixBase table and any future
+// in-package references to the well-known base media types.
+const (
+ typeApplication = "application"
+ subtypeJSON = "json"
+ subtypeXML = "xml"
+ subtypeYAML = "yaml"
+
+ mtYAML = typeApplication + "/" + subtypeYAML
+)
+
+// Specificity scores returned by [MediaType.Specificity], ordered from
+// least to most specific.
+const (
+ SpecificityAny = iota // "*/*"
+ SpecificityType // "type/*"
+ SpecificityExact // "type/subtype" (no params)
+ SpecificityExactWithParams // "type/subtype;k=v"
+)
+
+// MatchKind classifies the strength of a match between two media
+// types. Larger values represent stronger matches and win in
+// negotiation tie-breaks.
+//
+// MatchExact covers direct subtype or wildcard agreement under RFC
+// 7231 rules; MatchAlias is returned when the strict comparison
+// fails but the two values agree after canonicalization through the
+// internal alias table (see [MediaType.Canonical]); MatchSuffix is
+// returned only when both alias and exact comparisons fail but the
+// two values agree after folding the RFC 6839 structured-syntax
+// suffix (see [MediaType.Base]).
+//
+// MatchSuffix matches are off by default at the negotiation /
+// lookup callers — they count only when [AllowSuffix] is passed to
+// [Set.BestMatch], [MatchFirst], or [Lookup]. The opt-in is the
+// single user-visible knob; [MediaType.Match] itself always returns
+// the strongest tier that succeeds.
+type MatchKind int
+
+// MatchKind values. Returned by [MediaType.Match].
+const (
+ MatchNone MatchKind = iota // no match
+ MatchSuffix // matched via the RFC 6839 suffix base
+ MatchAlias // matched via the alias table
+ MatchExact // matched directly (RFC 7231 semantics)
+)
+
+// MatchOption configures the matching tolerances used by
+// [Set.BestMatch], [MatchFirst], and [Lookup]. The zero behaviour
+// is strict: only [MatchAlias] and [MatchExact] count.
+type MatchOption func(*matchOptions)
+
+type matchOptions struct {
+ allowSuffix bool
+}
+
+func applyMatchOptions(opts []MatchOption) matchOptions {
+ var o matchOptions
+ for _, opt := range opts {
+ opt(&o)
+ }
+ return o
+}
+
+// AllowSuffix returns a [MatchOption] that lets the caller count
+// [MatchSuffix] results as valid matches. Use this to opt into
+// RFC 6839 structured-syntax suffix tolerance for situations where
+// the client/server traffic does not strictly abide by the spec
+// (typical example: server returning application/problem+json
+// against operations that only declare application/json in
+// produces).
+func AllowSuffix() MatchOption {
+ return func(o *matchOptions) {
+ o.allowSuffix = true
+ }
+}
+
+type mediaTypeError string
+
+func (e mediaTypeError) Error() string {
+ return string(e)
+}
+
+// ErrMalformed is the sentinel returned (wrapped) by [Parse] when its input
+// cannot be parsed as an RFC 7231 media type.
+//
+// Callers can test for it with [errors.Is] to distinguish a client-side
+// malformed Content-Type header (an HTTP 400 outcome) from a well-formed
+// value that simply matches no allowed entry (an HTTP 415 outcome).
+const ErrMalformed mediaTypeError = "mediatype: malformed"
+
+// MediaType is a parsed RFC 7231 media type with optional parameters and
+// an optional q-value (used by Accept negotiation).
+//
+// Type, Subtype and the keys of Params are lowercased. Parameter values
+// are preserved verbatim; comparisons are case-insensitive (matching the
+// pre-v0.30 behaviour and the common convention for charset, version, etc.).
+//
+// Suffix exposes the RFC 6839 structured syntax suffix (the token after
+// the final '+' in Subtype) as a parallel hint. Subtype itself retains
+// the full wire value, so existing callers comparing Subtype against a
+// string see no change.
+type MediaType struct {
+ Type string
+ Subtype string
+ Suffix string
+ Params map[string]string
+ Q float64
+}
+
+// suffixBase maps a known RFC 6839 / RFC 9512 structured syntax
+// suffix (without the leading '+', lowercased) to its base media
+// type. It is the authoritative table consulted by [MediaType.Base].
+//
+// The table is intentionally small: only suffixes whose base type
+// has a codec in the default runtime maps are listed. CBOR, zip,
+// BER, DER, FastInfoset and WBXML are registered by IANA but have
+// no default codec in this runtime; adding them is gated on having
+// something to do with them.
+//
+// Package-internal by design: the external API is [MediaType.Base].
+// If users ever need to extend the table, a Register-style function
+// is the right answer, not an exported mutable map.
+var suffixBase = map[string]MediaType{
+ subtypeJSON: {Type: typeApplication, Subtype: subtypeJSON},
+ subtypeXML: {Type: typeApplication, Subtype: subtypeXML},
+ subtypeYAML: {Type: typeApplication, Subtype: subtypeYAML},
+}
+
+// aliases maps a deprecated or legacy media-type name to its
+// canonical registered equivalent. Keys are the lowercased
+// "type/subtype" form with no parameters; values are the canonical
+// "type/subtype" form, also without parameters.
+//
+// Entries are limited to media types whose authoritative RFC
+// explicitly names the alias. The seed entries cite RFC 9512 §2.1,
+// which enumerates "Deprecated alias names for this type:
+// application/x-yaml, text/yaml, and text/x-yaml" as part of the
+// IANA registration template for application/yaml.
+//
+// Pull requests adding entries need an analogous citation in the
+// commit message; entries without authoritative backing belong in
+// caller-side canonicalization, not here.
+//
+// Package-internal by design: the external API is
+// [MediaType.Canonical] and [MediaType.Match]. If users ever need
+// to register their own aliases, a Register-style function is the
+// right answer, not an exported mutable map.
+var aliases = map[string]string{
+ "application/x-yaml": mtYAML, // RFC 9512 §2.1
+ "text/yaml": mtYAML, // RFC 9512 §2.1
+ "text/x-yaml": mtYAML, // RFC 9512 §2.1
+}
+
+// Parse parses a single media type. The input may carry parameters and a
+// q-value; the q-value is extracted into [MediaType.Q] and removed from
+// [MediaType.Params].
+//
+// An empty input returns an error.
+func Parse(s string) (MediaType, error) {
+ s = strings.TrimSpace(s)
+ if s == "" {
+ return MediaType{}, fmt.Errorf("%w: empty value", ErrMalformed)
+ }
+ full, params, err := mime.ParseMediaType(s)
+ if err != nil {
+ return MediaType{}, fmt.Errorf("%w: %w", ErrMalformed, err)
+ }
+ slash := strings.IndexByte(full, '/')
+ if slash <= 0 || slash == len(full)-1 {
+ return MediaType{}, fmt.Errorf("%w: %q has no subtype", ErrMalformed, s)
+ }
+ mt := MediaType{
+ Type: full[:slash],
+ Subtype: full[slash+1:],
+ Q: 1.0,
+ }
+ // RFC 6839: structured syntax suffix is the trailing '+'-delimited
+ // token of the subtype. Only the last '+' counts ("foo+bar+json" →
+ // suffix "json"). A trailing '+' with nothing after it is not a
+ // valid suffix and is ignored. mime.ParseMediaType has already
+ // lowercased the subtype, so no further ToLower is needed.
+ if plus := strings.LastIndexByte(mt.Subtype, '+'); plus >= 0 && plus < len(mt.Subtype)-1 {
+ mt.Suffix = mt.Subtype[plus+1:]
+ }
+
+ if q, ok := params["q"]; ok {
+ if qf, isFloat := boundedQ(q); isFloat {
+ mt.Q = qf
+ }
+ delete(params, "q")
+ }
+
+ if len(params) > 0 {
+ mt.Params = params
+ }
+
+ return mt, nil
+}
+
+// String renders the canonical "type/subtype;k=v;k=v" form. Parameters are
+// emitted in lexicographic key order (the standard library guarantees this)
+// so the result is stable. The q-value is NOT emitted — it is meta, not
+// part of the media type identity.
+func (m MediaType) String() string {
+ if m.Type == "" && m.Subtype == "" {
+ return ""
+ }
+
+ return mime.FormatMediaType(m.Type+"/"+m.Subtype, m.Params)
+}
+
+// Matches reports whether the receiver accepts other, per the package
+// documentation: the receiver is the bound, other is the constraint.
+func (m MediaType) Matches(other MediaType) bool {
+ if !typeAgrees(m.Type, other.Type) {
+ return false
+ }
+ if !subtypeAgrees(m.Type, m.Subtype, other.Type, other.Subtype) {
+ return false
+ }
+ if len(m.Params) == 0 {
+ return true
+ }
+ for k, v := range other.Params {
+ sv, ok := m.Params[k]
+ if !ok || !strings.EqualFold(sv, v) {
+ return false
+ }
+ }
+
+ return true
+}
+
+// Specificity returns a numeric score for ordering matches. Higher is more
+// specific. The returned value is one of [SpecificityAny],
+// [SpecificityType], [SpecificityExact] or [SpecificityExactWithParams].
+func (m MediaType) Specificity() int {
+ if m.Type == wildcard && m.Subtype == wildcard {
+ return SpecificityAny
+ }
+ if m.Subtype == wildcard {
+ return SpecificityType
+ }
+ if len(m.Params) == 0 {
+ return SpecificityExact
+ }
+
+ return SpecificityExactWithParams
+}
+
+func boundedQ(q string) (float64, bool) {
+ qf, err := strconv.ParseFloat(q, 64)
+ if err != nil {
+ return 0, false
+ }
+
+ if qf < 0 {
+ qf = 0
+ }
+
+ if qf > 1 {
+ qf = 1
+ }
+
+ return qf, true
+}
+
+// typeAgrees reports whether two top-level types match, allowing "*" on
+// either side. A type of "*" without a "*" subtype is rejected per RFC
+// 7231 §5.3.2 ("*/sub" is not valid), but Parse never produces such a
+// shape — it goes through mime.ParseMediaType.
+func typeAgrees(a, b string) bool {
+ return a == wildcard || b == wildcard || a == b
+}
+
+// subtypeAgrees handles the "type/*" wildcard: the bare type must match
+// (a "*/*" pair has already been accepted by typeAgrees above).
+func subtypeAgrees(at, asub, bt, bsub string) bool {
+ if at == wildcard || bt == wildcard {
+ // at least one side is "*/*" or "*/sub". With typeAgrees having
+ // returned true, we accept.
+ return true
+ }
+ if asub == wildcard || bsub == wildcard {
+ return true
+ }
+
+ return asub == bsub
+}
+
+// StripParams returns a copy of m with no parameters. Q is preserved
+// because it drives negotiation ordering, not media-type identity.
+//
+// Useful for the legacy "ignore parameters" negotiation mode.
+func (m MediaType) StripParams() MediaType {
+ return MediaType{Type: m.Type, Subtype: m.Subtype, Suffix: m.Suffix, Q: m.Q}
+}
+
+// Base returns the base media type implied by the RFC 6839 structured
+// syntax suffix, or m unchanged when:
+//
+// - Suffix is empty;
+// - Suffix is not present in the package-internal suffix→base table.
+//
+// The returned value represents the structural base only: it carries
+// no parameters and no q-value. Use it to find a codec for the
+// underlying wire format — for example, "application/vnd.api+json"
+// resolves to "application/json".
+//
+// Base does not mutate the receiver.
+func (m MediaType) Base() MediaType {
+ if m.Suffix == "" {
+ return m
+ }
+ base, ok := suffixBase[m.Suffix]
+ if !ok {
+ return m
+ }
+ return base
+}
+
+// Canonical returns m rewritten to its canonical media type via
+// the package-internal alias table, or m unchanged when
+// (Type, Subtype) is not a known alias. Params and Q are preserved on the returned value; Suffix
+// is recomputed from the canonical Subtype (none of the current
+// entries carry a suffix, but the contract is forward-safe).
+//
+// Canonical does not mutate the receiver.
+func (m MediaType) Canonical() MediaType {
+ key := m.Type + "/" + m.Subtype
+ canon, ok := aliases[key]
+ if !ok {
+ return m
+ }
+ slash := strings.IndexByte(canon, '/')
+ out := m
+ out.Type = canon[:slash]
+ out.Subtype = canon[slash+1:]
+ out.Suffix = ""
+ if plus := strings.LastIndexByte(out.Subtype, '+'); plus >= 0 && plus < len(out.Subtype)-1 {
+ out.Suffix = out.Subtype[plus+1:]
+ }
+ return out
+}
+
+// Match reports how m matches other, classifying the result by
+// [MatchKind]. Used by negotiation to rank candidate offers:
+// stronger tiers win when both apply.
+//
+// Returns, strongest first:
+//
+// - MatchExact when m.Matches(other) is true under the strict
+// RFC 7231 rules (including wildcards and the param subset
+// rule).
+// - MatchAlias when m.Canonical().Matches(other.Canonical())
+// is true but the strict comparison failed.
+// - MatchSuffix when m.Base().Canonical().Matches(
+// other.Base().Canonical()) is true but the alias comparison
+// failed (RFC 6839 structured-syntax suffix fold).
+// - MatchNone otherwise.
+//
+// The asymmetric "bound vs constraint" rule of [MediaType.Matches]
+// is preserved at every tier. Match itself is always lenient — the
+// opt-in to count MatchSuffix lives one level up at [Set.BestMatch],
+// [MatchFirst], and [Lookup] via [AllowSuffix].
+func (m MediaType) Match(other MediaType) MatchKind {
+ if m.Matches(other) {
+ return MatchExact
+ }
+ if m.Canonical().Matches(other.Canonical()) {
+ return MatchAlias
+ }
+ if m.Base().Canonical().Matches(other.Base().Canonical()) {
+ return MatchSuffix
+ }
+ return MatchNone
+}
diff --git a/vendor/github.com/go-openapi/runtime/server-middleware/mediatype/set.go b/vendor/github.com/go-openapi/runtime/server-middleware/mediatype/set.go
new file mode 100644
index 00000000000..70f62a18d41
--- /dev/null
+++ b/vendor/github.com/go-openapi/runtime/server-middleware/mediatype/set.go
@@ -0,0 +1,138 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package mediatype
+
+import (
+ "strings"
+)
+
+// Set is a list of media types — typically the parsed value of an Accept
+// header, or a list of server-side offers.
+type Set []MediaType
+
+// ParseAccept parses a comma-separated list of media types, as found in
+// the Accept, Accept-Charset (etc.) HTTP headers. Malformed entries are
+// skipped silently — be liberal in what you accept.
+//
+// An empty input returns nil.
+func ParseAccept(s string) Set {
+ parts := splitTopLevel(s)
+ if len(parts) == 0 {
+ return nil
+ }
+ out := make(Set, 0, len(parts))
+ for _, p := range parts {
+ mt, err := Parse(p)
+ if err != nil {
+ continue
+ }
+ out = append(out, mt)
+ }
+
+ return out
+}
+
+// BestMatch picks the offer most acceptable to the receiver's Accept
+// entries. Selection follows RFC 7231 §5.3.2 plus tier-aware
+// ranking:
+//
+// - highest q-value wins;
+// - ties on q broken by the highest [MediaType.Specificity] of the
+// matching Accept entry;
+// - ties on specificity broken by [MatchKind] (MatchExact beats
+// MatchAlias beats MatchSuffix);
+// - ties on match kind broken by earliest position in offered.
+//
+// Accept entries with q=0 are treated as exclusions and never match.
+// MatchSuffix results are only counted when [AllowSuffix] is passed.
+// Returns ok=false if no offer matched any non-zero-q entry.
+func (s Set) BestMatch(offered Set, opts ...MatchOption) (best MediaType, ok bool) {
+ if len(s) == 0 || len(offered) == 0 {
+ return MediaType{}, false
+ }
+ o := applyMatchOptions(opts)
+ bestQ := -1.0
+ bestSpec := -1
+ bestKind := MatchNone
+ bestIdx := -1
+ for i, offer := range offered {
+ for _, entry := range s {
+ if entry.Q == 0 {
+ continue
+ }
+ kind := offer.Match(entry)
+ if kind == MatchNone {
+ continue
+ }
+ if kind == MatchSuffix && !o.allowSuffix {
+ continue
+ }
+ spec := entry.Specificity()
+ switch {
+ case entry.Q > bestQ:
+ best, ok = offer, true
+ bestQ = entry.Q
+ bestSpec = spec
+ bestKind = kind
+ bestIdx = i
+ case entry.Q < bestQ:
+ // not better
+ case spec > bestSpec:
+ best, ok = offer, true
+ bestSpec = spec
+ bestKind = kind
+ bestIdx = i
+ case spec < bestSpec:
+ // not better
+ case kind > bestKind:
+ best, ok = offer, true
+ bestKind = kind
+ bestIdx = i
+ case kind < bestKind:
+ // not better
+ case bestIdx < 0 || i < bestIdx:
+ best, ok = offer, true
+ bestIdx = i
+ }
+ }
+ }
+
+ return best, ok
+}
+
+// splitTopLevel splits s on top-level commas, respecting double-quoted
+// strings (RFC 7230 §3.2.6 — quoted-string).
+func splitTopLevel(s string) []string {
+ if strings.IndexByte(s, ',') < 0 {
+ if t := strings.TrimSpace(s); t != "" {
+ return []string{t}
+ }
+ return nil
+ }
+ var out []string
+ start := 0
+ inQuote := false
+ escape := false
+ for i := range len(s) {
+ c := s[i]
+ switch {
+ case escape:
+ escape = false
+ case inQuote && c == '\\':
+ escape = true
+ case c == '"':
+ inQuote = !inQuote
+ case c == ',' && !inQuote:
+ if t := strings.TrimSpace(s[start:i]); t != "" {
+ out = append(out, t)
+ }
+ start = i + 1
+ }
+ }
+ if t := strings.TrimSpace(s[start:]); t != "" {
+ out = append(out, t)
+ }
+
+ return out
+}
diff --git a/vendor/github.com/go-openapi/runtime/server-middleware/negotiate/doc.go b/vendor/github.com/go-openapi/runtime/server-middleware/negotiate/doc.go
new file mode 100644
index 00000000000..a9f278c31b1
--- /dev/null
+++ b/vendor/github.com/go-openapi/runtime/server-middleware/negotiate/doc.go
@@ -0,0 +1,13 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+// Package negotiate provides server-side HTTP content negotiation
+// helpers — selecting the response Content-Type from an Accept header
+// and the response Content-Encoding from an Accept-Encoding header.
+//
+// The package is stdlib-only (modulo the typed [mediatype.MediaType]
+// values it consumes).
+//
+// The exported [ContentType] honours MIME-type parameters by default;
+// use [WithIgnoreParameters] to restore the pre-v0.30 looser match.
+package negotiate
diff --git a/vendor/github.com/go-openapi/runtime/middleware/header/header.go b/vendor/github.com/go-openapi/runtime/server-middleware/negotiate/header/header.go
similarity index 97%
rename from vendor/github.com/go-openapi/runtime/middleware/header/header.go
rename to vendor/github.com/go-openapi/runtime/server-middleware/negotiate/header/header.go
index 6ce870d8936..6f3c3f00382 100644
--- a/vendor/github.com/go-openapi/runtime/middleware/header/header.go
+++ b/vendor/github.com/go-openapi/runtime/server-middleware/negotiate/header/header.go
@@ -300,7 +300,13 @@ func expectQuality(s string) (q float64, rest string) {
n = n*10 + int(b) - '0'
d *= 10
}
- return q + float64(n)/float64(d), s[i:]
+ result := q + float64(n)/float64(d)
+ // RFC 7231 §5.3.1: qvalue is in [0, 1]. Inputs like "1.1"
+ // would otherwise yield > 1; reject as malformed.
+ if result > 1 {
+ return -1, s[i:]
+ }
+ return result, s[i:]
}
func expectTokenOrQuoted(s string) (value string, rest string) {
diff --git a/vendor/github.com/go-openapi/runtime/server-middleware/negotiate/negotiate.go b/vendor/github.com/go-openapi/runtime/server-middleware/negotiate/negotiate.go
new file mode 100644
index 00000000000..3c932a1969d
--- /dev/null
+++ b/vendor/github.com/go-openapi/runtime/server-middleware/negotiate/negotiate.go
@@ -0,0 +1,215 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package negotiate
+
+import (
+ "net/http"
+ "strings"
+
+ "github.com/go-openapi/runtime/server-middleware/mediatype"
+ "github.com/go-openapi/runtime/server-middleware/negotiate/header"
+)
+
+// Option configures [ContentType] behaviour.
+type Option func(*options)
+
+type options struct {
+ ignoreParameters bool
+ matchSuffix bool
+}
+
+func optionsWithDefaults(opts []Option) options {
+ var o options
+ for _, apply := range opts {
+ apply(&o)
+ }
+
+ return o
+}
+
+// WithIgnoreParameters returns an [Option] that strips MIME-type
+// parameters from both Accept entries and offers before matching, restoring
+// the behaviour the runtime had before v0.30.
+//
+// New code should leave parameters honoured (the default). This option
+// exists for applications that depend on the looser pre-v0.30 match —
+// most often because their producers and Accept clients use mismatched
+// charset or version params that they treat as informational.
+//
+// Example — per-call opt-out:
+//
+// chosen := negotiate.ContentType(r, offers, "",
+// negotiate.WithIgnoreParameters(true),
+// )
+//
+// Example — server-wide opt-out (via [middleware.Context]):
+//
+// ctx := middleware.NewContext(spec, api, nil).SetIgnoreParameters(true)
+func WithIgnoreParameters(ignore bool) Option {
+ return func(o *options) {
+ o.ignoreParameters = ignore
+ }
+}
+
+// WithMatchSuffix returns an [Option] that extends content
+// negotiation to tolerate RFC 6839 structured-syntax suffix media
+// types. When enabled, an Accept entry of "application/json"
+// matches an offer of "application/vnd.api+json" and vice versa,
+// for the suffixes recognised by the runtime (+json, +xml, +yaml).
+//
+// Default: strict (false). Use only when interoperating with
+// clients or servers that do not strictly abide by the spec — for
+// example, servers returning application/problem+json error
+// responses against operations that only declare application/json
+// in produces.
+//
+// Suffix matches always lose to exact and alias matches when those
+// are on offer; see [mediatype.MatchKind] for the tier ordering.
+//
+// Example — per-call opt-in:
+//
+// chosen := negotiate.ContentType(r, offers, "",
+// negotiate.WithMatchSuffix(true),
+// )
+//
+// Example — server-wide opt-in (via [middleware.Context]):
+//
+// ctx := middleware.NewContext(spec, api, nil).SetMatchSuffix(true)
+func WithMatchSuffix(enable bool) Option {
+ return func(o *options) {
+ o.matchSuffix = enable
+ }
+}
+
+// ContentEncoding returns the best offered content encoding for the
+// request's Accept-Encoding header. If two offers match with equal
+// weight then the offer earlier in the list is preferred. If no offers
+// are acceptable, then "" is returned.
+//
+// Encoding tokens have no parameters, so this function is unaffected by
+// the v0.30 parameter-honouring change to [ContentType].
+//
+// Deprecated: ContentEncoding negotiation is not used by the components
+// of this project.
+//
+// This historical addition has never been associated with proper
+// compression middleware and is thus half a feature.
+// The runtime does not ship compression.
+// Use github.com/CAFxX/httpcompression or github.com/klauspost/compress/gzhttp
+// at the http.Handler level, or github.com/klauspost/compress/* for client
+// transport wrapping. See docs/examples/middleware for a recipe.
+func ContentEncoding(r *http.Request, offers []string) string {
+ bestOffer := "identity"
+ bestQ := -1.0
+ specs := header.ParseAccept(r.Header, "Accept-Encoding")
+ for _, offer := range offers {
+ for _, spec := range specs {
+ if spec.Q > bestQ &&
+ (spec.Value == "*" || spec.Value == offer) {
+ bestQ = spec.Q
+ bestOffer = offer
+ }
+ }
+ }
+ if bestQ == 0 {
+ bestOffer = ""
+ }
+
+ return bestOffer
+}
+
+// ContentType returns the best offered content type for the request's
+// Accept header. If two offers match with equal weight, then the more
+// specific offer is preferred (text/* trumps */*; type/subtype trumps
+// type/*). If two offers match with equal weight and specificity, then
+// the offer earlier in the list is preferred. If no offers match, then
+// defaultOffer is returned.
+//
+// As of v0.30 the matching rule honours MIME-type parameters: an Accept
+// entry of "text/plain;charset=utf-8" matches an offer of bare
+// "text/plain" (offer carries no constraint), but it does NOT match an
+// offer of "text/plain;charset=ascii" (charset values disagree). Pass
+// [WithIgnoreParameters](true) to restore the pre-v0.30 behaviour where
+// parameters were stripped before matching — see [WithIgnoreParameters]
+// for details and an example.
+//
+// When the Accept header is absent, the first offer is returned
+// unchanged (param-stripping is irrelevant in that case).
+func ContentType(r *http.Request, offers []string, defaultOffer string, opts ...Option) string {
+ if len(offers) == 0 {
+ return defaultOffer
+ }
+ o := optionsWithDefaults(opts)
+
+ // Per RFC 7230 §3.2.2, multiple Accept headers are equivalent to a
+ // single comma-joined value. Join before parsing so we don't drop
+ // later entries.
+ acceptValues := r.Header.Values("Accept")
+ if len(acceptValues) == 0 {
+ return offers[0]
+ }
+ acceptSet := mediatype.ParseAccept(strings.Join(acceptValues, ", "))
+ if len(acceptSet) == 0 {
+ return defaultOffer
+ }
+
+ offerSet := make(mediatype.Set, 0, len(offers))
+ rawByIdx := make([]string, 0, len(offers))
+ for _, raw := range offers {
+ mt, err := mediatype.Parse(raw)
+ if err != nil {
+ continue
+ }
+ offerSet = append(offerSet, mt)
+ rawByIdx = append(rawByIdx, raw)
+ }
+ if len(offerSet) == 0 {
+ return defaultOffer
+ }
+
+ if o.ignoreParameters {
+ acceptSet = stripSet(acceptSet)
+ offerSet = stripSet(offerSet)
+ }
+
+ var matchOpts []mediatype.MatchOption
+ if o.matchSuffix {
+ matchOpts = append(matchOpts, mediatype.AllowSuffix())
+ }
+ best, ok := acceptSet.BestMatch(offerSet, matchOpts...)
+ if !ok {
+ return defaultOffer
+ }
+ // Return the original raw offer string so callers receive the value
+ // they declared, with its parameters preserved.
+ for i, mt := range offerSet {
+ if mt.Type == best.Type && mt.Subtype == best.Subtype && sameParams(mt.Params, best.Params) {
+ return rawByIdx[i]
+ }
+ }
+
+ return best.String()
+}
+
+func stripSet(s mediatype.Set) mediatype.Set {
+ out := make(mediatype.Set, len(s))
+ for i, m := range s {
+ out[i] = m.StripParams()
+ }
+
+ return out
+}
+
+func sameParams(a, b map[string]string) bool {
+ if len(a) != len(b) {
+ return false
+ }
+ for k, v := range a {
+ if b[k] != v {
+ return false
+ }
+ }
+
+ return true
+}
diff --git a/vendor/github.com/go-openapi/runtime/statuses.go b/vendor/github.com/go-openapi/runtime/statuses.go
index c0f3e6b4477..273d9c6ced3 100644
--- a/vendor/github.com/go-openapi/runtime/statuses.go
+++ b/vendor/github.com/go-openapi/runtime/statuses.go
@@ -60,7 +60,7 @@ var Statuses = map[int]string{
444: "No Response",
449: "Retry With",
450: "Blocked by Windows Parental Controls",
- 451: "Wrong Exchange Server",
+ 451: "Unavailable For Legal Reasons",
499: "Client Closed Request",
500: "Internal Server Error",
501: "Not Implemented",
diff --git a/vendor/github.com/go-openapi/runtime/text.go b/vendor/github.com/go-openapi/runtime/text.go
index 1252ac88c71..3764a87fe51 100644
--- a/vendor/github.com/go-openapi/runtime/text.go
+++ b/vendor/github.com/go-openapi/runtime/text.go
@@ -36,14 +36,14 @@ func TextConsumer() Consumer {
if tu, ok := data.(encoding.TextUnmarshaler); ok {
err := tu.UnmarshalText(b)
if err != nil {
- return fmt.Errorf("text consumer: %v", err)
+ return fmt.Errorf("text consumer: %w", err)
}
return nil
}
t := reflect.TypeOf(data)
- if data != nil && t.Kind() == reflect.Ptr {
+ if data != nil && t.Kind() == reflect.Pointer {
v := reflect.Indirect(reflect.ValueOf(data))
if t.Elem().Kind() == reflect.String {
v.SetString(string(b))
@@ -70,7 +70,7 @@ func TextProducer() Producer {
if tm, ok := data.(encoding.TextMarshaler); ok {
txt, err := tm.MarshalText()
if err != nil {
- return fmt.Errorf("text producer: %v", err)
+ return fmt.Errorf("text producer: %w", err)
}
_, err = writer.Write(txt)
return err
diff --git a/vendor/github.com/go-openapi/runtime/yamlpc/yaml.go b/vendor/github.com/go-openapi/runtime/yamlpc/yaml.go
index ca71edbb1ba..b7fab88906c 100644
--- a/vendor/github.com/go-openapi/runtime/yamlpc/yaml.go
+++ b/vendor/github.com/go-openapi/runtime/yamlpc/yaml.go
@@ -6,8 +6,9 @@ package yamlpc
import (
"io"
- "github.com/go-openapi/runtime"
yaml "go.yaml.in/yaml/v3"
+
+ "github.com/go-openapi/runtime"
)
// YAMLConsumer creates a consumer for [yaml] data.
diff --git a/vendor/github.com/go-openapi/spec/.gitignore b/vendor/github.com/go-openapi/spec/.gitignore
index 885dc27ab0b..d8f4186fe59 100644
--- a/vendor/github.com/go-openapi/spec/.gitignore
+++ b/vendor/github.com/go-openapi/spec/.gitignore
@@ -3,4 +3,3 @@
.idea
.env
.mcp.json
-.claude/
diff --git a/vendor/github.com/go-openapi/spec/.golangci.yml b/vendor/github.com/go-openapi/spec/.golangci.yml
index dc7c96053de..9d2733176ea 100644
--- a/vendor/github.com/go-openapi/spec/.golangci.yml
+++ b/vendor/github.com/go-openapi/spec/.golangci.yml
@@ -4,7 +4,10 @@ linters:
disable:
- depguard
- funlen
+ - goconst
- godox
+ - gomodguard
+ - gomodguard_v2
- exhaustruct
- nlreturn
- nonamedreturns
diff --git a/vendor/github.com/go-openapi/spec/CONTRIBUTORS.md b/vendor/github.com/go-openapi/spec/CONTRIBUTORS.md
index 2967e3cedd9..2fd257bbeeb 100644
--- a/vendor/github.com/go-openapi/spec/CONTRIBUTORS.md
+++ b/vendor/github.com/go-openapi/spec/CONTRIBUTORS.md
@@ -4,12 +4,12 @@
| Total Contributors | Total Contributions |
| --- | --- |
-| 38 | 392 |
+| 38 | 398 |
| Username | All Time Contribution Count | All Commits |
| --- | --- | --- |
| @casualjim | 191 | |
-| @fredbi | 90 | |
+| @fredbi | 96 | |
| @pytlesk4 | 26 | |
| @kul-amr | 10 | |
| @keramix | 10 | |
@@ -47,4 +47,4 @@
| @ChandanChainani | 1 | |
| @bvwells | 1 | |
- _this file was generated by the [Contributors GitHub Action](https://github.com/github/contributors)_
+ _this file was generated by the [Contributors GitHub Action](https://github.com/github-community-projects/contributors)_
diff --git a/vendor/github.com/go-openapi/spec/README.md b/vendor/github.com/go-openapi/spec/README.md
index 134809fd77a..7c96eb9a586 100644
--- a/vendor/github.com/go-openapi/spec/README.md
+++ b/vendor/github.com/go-openapi/spec/README.md
@@ -18,12 +18,9 @@ The object model for OpenAPI v2 specification documents.
* **2025-12-19** : new community chat on discord
* a new discord community channel is available to be notified of changes and support users
- * our venerable Slack channel remains open, and will be eventually discontinued on **2026-03-31**
You may join the discord community by clicking the invite link on the discord badge (also above). [![Discord Channel][discord-badge]][discord-url]
-Or join our Slack channel: [![Slack Channel][slack-logo]![slack-badge]][slack-url]
-
## Status
API is stable.
@@ -95,9 +92,9 @@ This library ships under the [SPDX-License-Identifier: Apache-2.0](./LICENSE).
## Other documentation
* [All-time contributors](./CONTRIBUTORS.md)
-* [Contributing guidelines](.github/CONTRIBUTING.md)
-* [Maintainers documentation](docs/MAINTAINERS.md)
-* [Code style](docs/STYLE.md)
+* [Contributing guidelines][contributing-doc-site]
+* [Maintainers documentation][maintainers-doc-site]
+* [Code style][style-doc-site]
## Cutting a new release
@@ -132,11 +129,8 @@ Maintainers can cut a new release by either:
[doc-url]: https://goswagger.io/go-openapi
[godoc-badge]: https://pkg.go.dev/badge/github.com/go-openapi/spec
[godoc-url]: http://pkg.go.dev/github.com/go-openapi/spec
-[slack-logo]: https://a.slack-edge.com/e6a93c1/img/icons/favicon-32.png
-[slack-badge]: https://img.shields.io/badge/slack-blue?link=https%3A%2F%2Fgoswagger.slack.com%2Farchives%2FC04R30YM
-[slack-url]: https://goswagger.slack.com/archives/C04R30YMU
[discord-badge]: https://img.shields.io/discord/1446918742398341256?logo=discord&label=discord&color=blue
-[discord-url]: https://discord.gg/twZ9BwT3
+[discord-url]: https://discord.gg/FfnFYaC3k5
[license-badge]: http://img.shields.io/badge/license-Apache%20v2-orange.svg
@@ -146,3 +140,7 @@ Maintainers can cut a new release by either:
[goversion-url]: https://github.com/go-openapi/spec/blob/master/go.mod
[top-badge]: https://img.shields.io/github/languages/top/go-openapi/spec
[commits-badge]: https://img.shields.io/github/commits-since/go-openapi/spec/latest
+
+[contributing-doc-site]: https://go-openapi.github.io/doc-site/contributing/contributing/index.html
+[maintainers-doc-site]: https://go-openapi.github.io/doc-site/maintainers/index.html
+[style-doc-site]: https://go-openapi.github.io/doc-site/contributing/style/index.html
diff --git a/vendor/github.com/go-openapi/spec/header.go b/vendor/github.com/go-openapi/spec/header.go
index 599ba2c5d7e..f656e0789a1 100644
--- a/vendor/github.com/go-openapi/spec/header.go
+++ b/vendor/github.com/go-openapi/spec/header.go
@@ -150,7 +150,11 @@ func (h Header) MarshalJSON() ([]byte, error) {
if err != nil {
return nil, err
}
- return jsonutils.ConcatJSON(b1, b2, b3), nil
+ b4, err := json.Marshal(h.VendorExtensible)
+ if err != nil {
+ return nil, err
+ }
+ return jsonutils.ConcatJSON(b1, b2, b3, b4), nil
}
// UnmarshalJSON unmarshals this header from JSON.
diff --git a/vendor/github.com/go-openapi/spec/schema_loader.go b/vendor/github.com/go-openapi/spec/schema_loader.go
index 0894c932c6b..1e346069e2d 100644
--- a/vendor/github.com/go-openapi/spec/schema_loader.go
+++ b/vendor/github.com/go-openapi/spec/schema_loader.go
@@ -117,7 +117,7 @@ func (r *schemaLoader) updateBasePath(transitive *schemaLoader, basePath string)
func (r *schemaLoader) resolveRef(ref *Ref, target any, basePath string) error {
tgt := reflect.ValueOf(target)
- if tgt.Kind() != reflect.Ptr {
+ if tgt.Kind() != reflect.Pointer {
return ErrResolveRefNeedsAPointer
}
diff --git a/vendor/github.com/go-openapi/strfmt/.gitignore b/vendor/github.com/go-openapi/strfmt/.gitignore
index 885dc27ab0b..bbdffea78a0 100644
--- a/vendor/github.com/go-openapi/strfmt/.gitignore
+++ b/vendor/github.com/go-openapi/strfmt/.gitignore
@@ -3,4 +3,4 @@
.idea
.env
.mcp.json
-.claude/
+go.work.sum
diff --git a/vendor/github.com/go-openapi/strfmt/CONTRIBUTORS.md b/vendor/github.com/go-openapi/strfmt/CONTRIBUTORS.md
index e49700d4d25..b6d62d76eb0 100644
--- a/vendor/github.com/go-openapi/strfmt/CONTRIBUTORS.md
+++ b/vendor/github.com/go-openapi/strfmt/CONTRIBUTORS.md
@@ -4,12 +4,12 @@
| Total Contributors | Total Contributions |
| --- | --- |
-| 40 | 225 |
+| 40 | 234 |
| Username | All Time Contribution Count | All Commits |
| --- | --- | --- |
| @casualjim | 88 | |
-| @fredbi | 57 | |
+| @fredbi | 66 | |
| @youyuanwu | 13 | |
| @jlambatl | 9 | |
| @GlenDC | 5 | |
diff --git a/vendor/github.com/go-openapi/strfmt/README.md b/vendor/github.com/go-openapi/strfmt/README.md
index a0cf6427541..4afef43733d 100644
--- a/vendor/github.com/go-openapi/strfmt/README.md
+++ b/vendor/github.com/go-openapi/strfmt/README.md
@@ -16,14 +16,6 @@ Golang support for string formats defined by JSON Schema and OpenAPI.
## Announcements
-* **2025-12-19** : new community chat on discord
- * a new discord community channel is available to be notified of changes and support users
- * our venerable Slack channel remains open, and will be eventually discontinued on **2026-03-31**
-
-You may join the discord community by clicking the invite link on the discord badge (also above). [![Discord Channel][discord-badge]][discord-url]
-
-Or join our Slack channel: [![Slack Channel][slack-logo]![slack-badge]][slack-url]
-
* **2026-03-07** : v0.26.0 **dropped dependency to the mongodb driver**
* mongodb users can still use this package without any change
* however, we have frozen the back-compatible support for mongodb driver at v2.5.0
@@ -177,9 +169,9 @@ This library ships under the [SPDX-License-Identifier: Apache-2.0](./LICENSE).
## Other documentation
* [All-time contributors](./CONTRIBUTORS.md)
-* [Contributing guidelines](.github/CONTRIBUTING.md)
-* [Maintainers documentation](docs/MAINTAINERS.md)
-* [Code style](docs/STYLE.md)
+* [Contributing guidelines][contributing-doc-site]
+* [Maintainers documentation][maintainers-doc-site]
+* [Code style][style-doc-site]
## Cutting a new release
@@ -214,9 +206,6 @@ Maintainers can cut a new release by either:
[doc-url]: https://goswagger.io/go-openapi
[godoc-badge]: https://pkg.go.dev/badge/github.com/go-openapi/strfmt
[godoc-url]: http://pkg.go.dev/github.com/go-openapi/strfmt
-[slack-logo]: https://a.slack-edge.com/e6a93c1/img/icons/favicon-32.png
-[slack-badge]: https://img.shields.io/badge/slack-blue?link=https%3A%2F%2Fgoswagger.slack.com%2Farchives%2FC04R30YM
-[slack-url]: https://goswagger.slack.com/archives/C04R30YMU
[discord-badge]: https://img.shields.io/discord/1446918742398341256?logo=discord&label=discord&color=blue
[discord-url]: https://discord.gg/FfnFYaC3k5
@@ -228,3 +217,7 @@ Maintainers can cut a new release by either:
[goversion-url]: https://github.com/go-openapi/strfmt/blob/master/go.mod
[top-badge]: https://img.shields.io/github/languages/top/go-openapi/strfmt
[commits-badge]: https://img.shields.io/github/commits-since/go-openapi/strfmt/latest
+
+[contributing-doc-site]: https://go-openapi.github.io/doc-site/contributing/contributing/index.html
+[maintainers-doc-site]: https://go-openapi.github.io/doc-site/maintainers/index.html
+[style-doc-site]: https://go-openapi.github.io/doc-site/contributing/style/index.html
diff --git a/vendor/github.com/go-openapi/strfmt/duration.go b/vendor/github.com/go-openapi/strfmt/duration.go
index b710bfbf53c..f2ab7ff8348 100644
--- a/vendor/github.com/go-openapi/strfmt/duration.go
+++ b/vendor/github.com/go-openapi/strfmt/duration.go
@@ -7,11 +7,9 @@ import (
"database/sql/driver"
"encoding/json"
"fmt"
- "math"
- "regexp"
- "strconv"
"strings"
"time"
+ "unicode"
)
func init() { //nolint:gochecknoinits // registers duration format in the default registry
@@ -22,34 +20,62 @@ func init() { //nolint:gochecknoinits // registers duration format in the defaul
const (
hoursInDay = 24
daysInWeek = 7
+ nanos = uint64(time.Nanosecond)
+ micros = uint64(time.Microsecond)
+ millis = uint64(time.Millisecond)
+ seconds = uint64(time.Second)
+ minutes = uint64(time.Minute)
+ hours = uint64(time.Hour)
+ days = uint64(hoursInDay * time.Hour)
+ weeks = uint64(hoursInDay * daysInWeek * time.Hour)
+ maxUint64 = uint64(1 << 63)
)
+// timeMultiplier holds all supported aliases for duration units, including their plural form.
+//
//nolint:gochecknoglobals // package-level lookup tables for duration parsing
-var (
- timeUnits = [][]string{
- {"ns", "nano"},
- {"us", "µs", "micro"},
- {"ms", "milli"},
- {"s", "sec"},
- {"m", "min"},
- {"h", "hr", "hour"},
- {"d", "day"},
- {"w", "wk", "week"},
- }
-
- timeMultiplier = map[string]time.Duration{
- "ns": time.Nanosecond,
- "us": time.Microsecond,
- "ms": time.Millisecond,
- "s": time.Second,
- "m": time.Minute,
- "h": time.Hour,
- "d": hoursInDay * time.Hour,
- "w": hoursInDay * daysInWeek * time.Hour,
- }
-
- durationMatcher = regexp.MustCompile(`^(((?:-\s?)?\d+)(\.\d+)?\s*([A-Za-zµ]+))`)
-)
+var timeMultiplier = map[string]uint64{
+ "ns": nanos,
+ "nano": nanos,
+ "nanosecond": nanos,
+ "nanoseconds": nanos,
+ "nanos": nanos,
+ "us": micros,
+ "µs": micros, // U+00B5 = micro symbol
+ "μs": micros, // U+03BC = Greek letter mu
+ "micro": micros,
+ "micros": micros,
+ "microsecond": micros,
+ "microseconds": micros,
+ "ms": millis,
+ "milli": millis,
+ "millis": millis,
+ "millisecond": millis,
+ "milliseconds": millis,
+ "s": seconds,
+ "sec": seconds,
+ "secs": seconds,
+ "second": seconds,
+ "seconds": seconds,
+ "m": minutes,
+ "min": minutes,
+ "mins": minutes,
+ "minute": minutes,
+ "minutes": minutes,
+ "h": hours,
+ "hr": hours,
+ "hrs": hours,
+ "hour": hours,
+ "hours": hours,
+ "d": days,
+ "day": days,
+ "days": days,
+ "w": weeks,
+ "wk": weeks,
+ "wks": weeks,
+ "week": weeks,
+ "weeks": weeks,
+}
// IsDuration returns true if the provided string is a valid duration.
func IsDuration(str string) bool {
@@ -80,64 +106,157 @@ func (d *Duration) UnmarshalText(data []byte) error { // validation is performed
return nil
}
-// ParseDuration parses a duration from a string, compatible with scala duration syntax.
-func ParseDuration(cand string) (time.Duration, error) {
- if dur, err := time.ParseDuration(cand); err == nil {
- return dur, nil
+// ParseDuration parses a duration from a string
+//
+// It is similar to [time.ParseDuration] but support additional units like days and weeks,
+// additional abreviations for units and is more tolerant on the presence of blank spaces.
+//
+// A duration may be negative or fractional.
+//
+// # Differences with [time.ParseDuration]
+//
+// - more supported units and aliases (see below)
+// - sign followed by blank space is tolerated
+// - tolerates blanks between duration and unit (e.g. "300 ms")
+//
+// # Supported units
+//
+// Units may be specified using aliases or a plural form.
+//
+// - "ns", "nano", "nanosecond", "nanoseconds", "nanos"
+// - "us", "µs" (U+00B5 = micro symbol), "μs" (U+03BC = Greek letter mu), "micro", "micros", "microsecond", "microseconds"
+// - "ms", "milli", "millis", "millisecond", "milliseconds"
+// - "s", "sec", "secs", "second", "seconds"
+// - "m", "min", "mins", "minute", "minutes"
+// - "h", "hr", "hrs", "hour", "hours"
+// - "d", "day", "days"
+// - "w", "wk", "wks", "week", "weeks"
+//
+// NOTE: inspired by scala duration syntax.
+//
+// # Examples
+//
+// "300ms", "-1.5h", "2h45m",
+// ".5 week",
+// "2 minutes 45 seconds".
+//
+//nolint:gocognit,gocyclo,cyclop // complexity is only slightly above the usual level, may be tolerated as it mimicks the stdlib.
+func ParseDuration(s string) (time.Duration, error) {
+ // NOTE: this code is largely inspired by the standard library.
+ orig := s
+ var d uint64
+ neg := false
+
+ // Consume [-+]?
+ if s != "" {
+ c := s[0]
+ if c == '-' || c == '+' {
+ neg = c == '-'
+ s = s[1:]
+ }
}
- var dur time.Duration
- ok := false
- const expectGroups = 4
- for _, match := range durationMatcher.FindAllStringSubmatch(cand, -1) {
- if len(match) < expectGroups {
- continue
+ // Consume space
+ s = strings.TrimLeftFunc(s, unicode.IsSpace)
+
+ // Special case: if all that is left is "0", this is zero.
+ if s == "0" {
+ return 0, nil
+ }
+
+ if s == "" {
+ return 0, parseDurationError(orig, "empty duration")
+ }
+
+ for s != "" {
+ var (
+ v, f uint64 // integers before, after decimal point
+ scale float64 = 1 // value = v + f/scale
+ )
+ s = strings.TrimLeftFunc(s, unicode.IsSpace)
+
+ // The next character must be 0-9.]
+ if s[0] != '.' && ('0' > s[0] || s[0] > '9') {
+ return 0, parseDurationError(orig, fmt.Sprintf("expected a numerical value, but got %q", s[0]))
+ }
+
+ // Consume integer part [0-9]*
+ pl := len(s)
+ var ok bool
+ v, s, ok = leadingInt(s)
+ if !ok {
+ return 0, parseDurationError(orig, "expected a leading integer part")
}
+ pre := pl != len(s) // whether we consumed anything before a period
- // remove possible leading - and spaces
- value, negative := strings.CutPrefix(match[2], "-")
+ // Consume fractional part (\.[0-9]*)?
+ post := false
+ if s != "" && s[0] == '.' {
+ s = s[1:]
+ pl := len(s)
+ f, scale, s = leadingFraction(s)
+ post = pl != len(s)
+ }
- // if the duration contains a decimal separator determine a divising factor
- const neutral = 1.0
- divisor := neutral
- decimal, hasDecimal := strings.CutPrefix(match[3], ".")
- if hasDecimal {
- divisor = math.Pow10(len(decimal))
- value += decimal // consider the value as an integer: will change units later on
+ if !pre && !post {
+ // no digits (e.g. ".s" or "-.s")
+ return 0, parseDurationError(orig, "expected digits")
}
- // if the string is a valid duration, parse it
- factor, err := strconv.Atoi(strings.TrimSpace(value)) // converts string to int
- if err != nil {
- return 0, err
+ // Consume space.
+ s = strings.TrimLeftFunc(s, unicode.IsSpace)
+
+ // Consume unit.
+ i := 0
+ for ; i < len(s); i++ {
+ c := s[i]
+ if c == '.' || '0' <= c && c <= '9' || unicode.IsSpace(rune(c)) {
+ break
+ }
}
- if negative {
- factor = -factor
+ if i == 0 {
+ return 0, parseDurationError(orig, "missing unit in duration")
}
- unit := strings.ToLower(strings.TrimSpace(match[4]))
+ u := s[:i]
+ s = s[i:]
+ unit, ok := timeMultiplier[u]
+ if !ok {
+ return 0, parseDurationError(orig, fmt.Sprintf("unknown unit %q in duration", u))
+ }
- for _, variants := range timeUnits {
- last := len(variants) - 1
- multiplier := timeMultiplier[variants[0]]
+ if v > maxUint64/unit {
+ // overflow
+ return 0, parseDurationError(orig, "numerical overflow")
+ }
- for i, variant := range variants {
- if (last == i && strings.HasPrefix(unit, variant)) || strings.EqualFold(variant, unit) {
- ok = true
- if divisor != neutral {
- multiplier = time.Duration(float64(multiplier) / divisor) // convert to duration only after having reduced the scale
- }
- dur += (time.Duration(factor) * multiplier)
- }
+ v *= unit
+ if f > 0 {
+ // float64 is needed to be nanosecond accurate for fractions of hours.
+ // v >= 0 && (f*unit/scale) <= 3.6e+12 (ns/h, h is the largest unit)
+ v += uint64(float64(f) * (float64(unit) / scale))
+ if v > maxUint64 {
+ // overflow
+ return 0, parseDurationError(orig, "numerical overflow")
}
}
+
+ d += v
+ if d > maxUint64 {
+ return 0, parseDurationError(orig, "numerical overflow")
+ }
}
- if ok {
- return dur, nil
+ if neg {
+ return -time.Duration(d), nil
}
- return 0, fmt.Errorf("unable to parse %s as duration: %w", cand, ErrFormat)
+
+ if d > maxUint64-1 {
+ return 0, parseDurationError(orig, "numerical overflow")
+ }
+
+ return time.Duration(d), nil
}
// Scan reads a Duration value from database driver type.
@@ -204,3 +323,70 @@ func (d *Duration) DeepCopy() *Duration {
d.DeepCopyInto(out)
return out
}
+
+func parseDurationError(s, msg string) error {
+ if msg == "" {
+ return fmt.Errorf("invalid duration: %s: %w", s, ErrFormat)
+ }
+
+ return fmt.Errorf("invalid duration: %s: %s: %w", s, msg, ErrFormat)
+}
+
+// leadingInt consumes the leading [0-9]* from s.
+func leadingInt[bytes []byte | string](s bytes) (x uint64, rem bytes, ok bool) { //nolint:ireturn // false positive
+ i := 0
+ for ; i < len(s); i++ {
+ c := s[i]
+ if c < '0' || c > '9' {
+ break
+ }
+
+ if x > maxUint64/10 { // overflow
+ return 0, rem, false
+ }
+
+ x = x*10 + uint64(c) - '0'
+ if x > maxUint64 { // overflow
+ return 0, rem, false
+ }
+ }
+
+ return x, s[i:], true
+}
+
+// leadingFraction consumes the leading [0-9]* from s.
+// //
+// It is used only for fractions, so it does not return an error on overflow,
+// it just stops accumulating precision.
+func leadingFraction(s string) (x uint64, scale float64, rem string) {
+ i := 0
+ scale = 1
+ overflow := false
+ for ; i < len(s); i++ {
+ c := s[i]
+ if c < '0' || c > '9' {
+ break
+ }
+
+ if overflow {
+ continue
+ }
+
+ if x > (maxUint64-1)/10 {
+ // It's possible for overflow to give a positive number, so take care.
+ overflow = true
+ continue
+ }
+
+ y := x*10 + uint64(c) - '0'
+ if y > maxUint64 {
+ overflow = true
+ continue
+ }
+
+ x = y
+ scale *= 10
+ }
+
+ return x, scale, s[i:]
+}
diff --git a/vendor/github.com/go-openapi/strfmt/go.work b/vendor/github.com/go-openapi/strfmt/go.work
index 288e7655d45..f233e74cfd0 100644
--- a/vendor/github.com/go-openapi/strfmt/go.work
+++ b/vendor/github.com/go-openapi/strfmt/go.work
@@ -4,4 +4,4 @@ use (
./internal/testintegration
)
-go 1.24.0
+go 1.25.0
diff --git a/vendor/github.com/go-openapi/strfmt/go.work.sum b/vendor/github.com/go-openapi/strfmt/go.work.sum
deleted file mode 100644
index 33dac969b64..00000000000
--- a/vendor/github.com/go-openapi/strfmt/go.work.sum
+++ /dev/null
@@ -1,16 +0,0 @@
-github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
-github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
-github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30 h1:BHT1/DKsYDGkUgQ2jmMaozVcdk+sVfz0+1ZJq4zkWgw=
-github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=
-github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE=
-golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c=
-golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU=
-golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k=
-golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
-golang.org/x/term v0.40.0 h1:36e4zGLqU4yhjlmxEaagx2KuYbJq3EwY8K943ZsHcvg=
-golang.org/x/term v0.40.0/go.mod h1:w2P8uVp06p2iyKKuvXIm7N/y0UCRt3UfJTfZ7oOpglM=
-golang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc=
-golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg=
-golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc=
-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=
diff --git a/vendor/github.com/go-openapi/swag/.gitignore b/vendor/github.com/go-openapi/swag/.gitignore
index a0a95a96b3f..1680db44c01 100644
--- a/vendor/github.com/go-openapi/swag/.gitignore
+++ b/vendor/github.com/go-openapi/swag/.gitignore
@@ -4,4 +4,3 @@ Godeps
.idea
*.out
.mcp.json
-.claude/
diff --git a/vendor/github.com/go-openapi/swag/CONTRIBUTORS.md b/vendor/github.com/go-openapi/swag/CONTRIBUTORS.md
index bc76fe820c0..ef1a735293e 100644
--- a/vendor/github.com/go-openapi/swag/CONTRIBUTORS.md
+++ b/vendor/github.com/go-openapi/swag/CONTRIBUTORS.md
@@ -4,11 +4,11 @@
| Total Contributors | Total Contributions |
| --- | --- |
-| 24 | 235 |
+| 24 | 246 |
| Username | All Time Contribution Count | All Commits |
| --- | --- | --- |
-| @fredbi | 105 | |
+| @fredbi | 116 | |
| @casualjim | 98 | |
| @alexandear | 4 | |
| @orisano | 3 | |
@@ -33,4 +33,4 @@
| @davidalpert | 1 | |
| @Xe | 1 | |
- _this file was generated by the [Contributors GitHub Action](https://github.com/github/contributors)_
+ _this file was generated by the [Contributors GitHub Action](https://github.com/github-community-projects/contributors)_
diff --git a/vendor/github.com/go-openapi/swag/README.md b/vendor/github.com/go-openapi/swag/README.md
index 834eb2ffb9c..ddbd8735ced 100644
--- a/vendor/github.com/go-openapi/swag/README.md
+++ b/vendor/github.com/go-openapi/swag/README.md
@@ -34,12 +34,9 @@ You may also use it standalone for your projects.
* **2025-12-19** : new community chat on discord
* a new discord community channel is available to be notified of changes and support users
- * our venerable Slack channel remains open, and will be eventually discontinued on **2026-03-31**
You may join the discord community by clicking the invite link on the discord badge (also above). [![Discord Channel][discord-badge]][discord-url]
-Or join our Slack channel: [![Slack Channel][slack-logo]![slack-badge]][slack-url]
-
## Status
API is stable.
@@ -171,9 +168,9 @@ on top of which it has been built.
## Other documentation
* [All-time contributors](./CONTRIBUTORS.md)
-* [Contributing guidelines](.github/CONTRIBUTING.md)
-* [Maintainers documentation](docs/MAINTAINERS.md)
-* [Code style](docs/STYLE.md)
+* [Contributing guidelines][contributing-doc-site]
+* [Maintainers documentation][maintainers-doc-site]
+* [Code style][style-doc-site]
## Cutting a new release
@@ -208,11 +205,8 @@ Maintainers can cut a new release by either:
[doc-url]: https://goswagger.io/go-openapi
[godoc-badge]: https://pkg.go.dev/badge/github.com/go-openapi/swag
[godoc-url]: http://pkg.go.dev/github.com/go-openapi/swag
-[slack-logo]: https://a.slack-edge.com/e6a93c1/img/icons/favicon-32.png
-[slack-badge]: https://img.shields.io/badge/slack-blue?link=https%3A%2F%2Fgoswagger.slack.com%2Farchives%2FC04R30YM
-[slack-url]: https://goswagger.slack.com/archives/C04R30YMU
[discord-badge]: https://img.shields.io/discord/1446918742398341256?logo=discord&label=discord&color=blue
-[discord-url]: https://discord.gg/twZ9BwT3
+[discord-url]: https://discord.gg/FfnFYaC3k5
[license-badge]: http://img.shields.io/badge/license-Apache%20v2-orange.svg
@@ -222,3 +216,7 @@ Maintainers can cut a new release by either:
[goversion-url]: https://github.com/go-openapi/swag/blob/master/go.mod
[top-badge]: https://img.shields.io/github/languages/top/go-openapi/swag
[commits-badge]: https://img.shields.io/github/commits-since/go-openapi/swag/latest
+
+[contributing-doc-site]: https://go-openapi.github.io/doc-site/contributing/contributing/index.html
+[maintainers-doc-site]: https://go-openapi.github.io/doc-site/maintainers/index.html
+[style-doc-site]: https://go-openapi.github.io/doc-site/contributing/style/index.html
diff --git a/vendor/github.com/go-openapi/swag/SECURITY.md b/vendor/github.com/go-openapi/swag/SECURITY.md
index 72296a83135..1fea2c5736a 100644
--- a/vendor/github.com/go-openapi/swag/SECURITY.md
+++ b/vendor/github.com/go-openapi/swag/SECURITY.md
@@ -6,14 +6,32 @@ This policy outlines the commitment and practices of the go-openapi maintainers
| Version | Supported |
| ------- | ------------------ |
-| 0.25.x | :white_check_mark: |
+| O.x | :white_check_mark: |
+
+## Vulnerability checks in place
+
+This repository uses automated vulnerability scans, at every merged commit and at least once a week.
+
+We use:
+
+* [`GitHub CodeQL`][codeql-url]
+* [`trivy`][trivy-url]
+* [`govulncheck`][govulncheck-url]
+
+Reports are centralized in github security reports and visible only to the maintainers.
## Reporting a vulnerability
If you become aware of a security vulnerability that affects the current repository,
-please report it privately to the maintainers.
+**please report it privately to the maintainers**
+rather than opening a publicly visible GitHub issue.
+
+Please follow the instructions provided by github to [Privately report a security vulnerability][github-guidance-url].
-Please follow the instructions provided by github to
-[Privately report a security vulnerability](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing-information-about-vulnerabilities/privately-reporting-a-security-vulnerability#privately-reporting-a-security-vulnerability).
+> [!NOTE]
+> On Github, navigate to the project's "Security" tab then click on "Report a vulnerability".
-TL;DR: on Github, navigate to the project's "Security" tab then click on "Report a vulnerability".
+[codeql-url]: https://github.com/github/codeql
+[trivy-url]: https://trivy.dev/docs/latest/getting-started
+[govulncheck-url]: https://go.dev/blog/govulncheck
+[github-guidance-url]: https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing-information-about-vulnerabilities/privately-reporting-a-security-vulnerability#privately-reporting-a-security-vulnerability
diff --git a/vendor/github.com/go-openapi/swag/go.work b/vendor/github.com/go-openapi/swag/go.work
index 1e537f0749b..8537cb2a76a 100644
--- a/vendor/github.com/go-openapi/swag/go.work
+++ b/vendor/github.com/go-openapi/swag/go.work
@@ -17,4 +17,4 @@ use (
./yamlutils
)
-go 1.24.0
+go 1.25.0
diff --git a/vendor/github.com/go-openapi/swag/jsonname/go_name_provider.go b/vendor/github.com/go-openapi/swag/jsonname/go_name_provider.go
new file mode 100644
index 00000000000..adc4426873c
--- /dev/null
+++ b/vendor/github.com/go-openapi/swag/jsonname/go_name_provider.go
@@ -0,0 +1,286 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package jsonname
+
+import (
+ "reflect"
+ "strings"
+ "sync"
+)
+
+var _ providerIface = (*GoNameProvider)(nil)
+
+// GoNameProvider resolves json property names to go struct field names following
+// the same rules as the standard library's [encoding/json] package.
+//
+// Contrary to [NameProvider], it considers exported fields without a json tag,
+// and promotes fields from anonymous embedded struct types.
+//
+// Rules (aligned with encoding/json):
+//
+// - unexported fields are ignored;
+// - a field tagged `json:"-"` is ignored;
+// - a field tagged `json:"-,"` is kept under the json name "-" (stdlib quirk);
+// - a field tagged `json:""` or with no json tag at all keeps its Go name as json name;
+// - anonymous struct fields without an explicit json tag have their fields
+// promoted into the parent, following breadth-first depth rules:
+// a shallower field wins over a deeper one; at equal depth, a conflict
+// discards all conflicting fields unless exactly one has an explicit json tag.
+//
+// This type is safe for concurrent use.
+type GoNameProvider struct {
+ lock sync.Mutex
+ index map[reflect.Type]nameIndex
+}
+
+// NewGoNameProvider creates a new [GoNameProvider].
+func NewGoNameProvider() *GoNameProvider {
+ return &GoNameProvider{
+ index: make(map[reflect.Type]nameIndex),
+ }
+}
+
+// GetJSONNames gets all the json property names for a type.
+func (n *GoNameProvider) GetJSONNames(subject any) []string {
+ n.lock.Lock()
+ defer n.lock.Unlock()
+
+ tpe := reflect.Indirect(reflect.ValueOf(subject)).Type()
+ names := n.nameIndexFor(tpe)
+
+ res := make([]string, 0, len(names.jsonNames))
+ for k := range names.jsonNames {
+ res = append(res, k)
+ }
+
+ return res
+}
+
+// GetJSONName gets the json name for a go property name.
+func (n *GoNameProvider) GetJSONName(subject any, name string) (string, bool) {
+ tpe := reflect.Indirect(reflect.ValueOf(subject)).Type()
+
+ return n.GetJSONNameForType(tpe, name)
+}
+
+// GetJSONNameForType gets the json name for a go property name on a given type.
+func (n *GoNameProvider) GetJSONNameForType(tpe reflect.Type, name string) (string, bool) {
+ n.lock.Lock()
+ defer n.lock.Unlock()
+
+ names := n.nameIndexFor(tpe)
+ nme, ok := names.goNames[name]
+
+ return nme, ok
+}
+
+// GetGoName gets the go name for a json property name.
+func (n *GoNameProvider) GetGoName(subject any, name string) (string, bool) {
+ tpe := reflect.Indirect(reflect.ValueOf(subject)).Type()
+
+ return n.GetGoNameForType(tpe, name)
+}
+
+// GetGoNameForType gets the go name for a given type for a json property name.
+func (n *GoNameProvider) GetGoNameForType(tpe reflect.Type, name string) (string, bool) {
+ n.lock.Lock()
+ defer n.lock.Unlock()
+
+ names := n.nameIndexFor(tpe)
+ nme, ok := names.jsonNames[name]
+
+ return nme, ok
+}
+
+func (n *GoNameProvider) nameIndexFor(tpe reflect.Type) nameIndex {
+ if names, ok := n.index[tpe]; ok {
+ return names
+ }
+
+ names := buildGoNameIndex(tpe)
+ n.index[tpe] = names
+
+ return names
+}
+
+// fieldEntry captures a candidate field discovered while walking a struct
+// along with the indirection path from the root type (used to resolve conflicts
+// by depth in the same way encoding/json does).
+type fieldEntry struct {
+ goName string
+ jsonName string
+ index []int
+ tagged bool
+}
+
+func buildGoNameIndex(tpe reflect.Type) nameIndex {
+ fields := collectGoFields(tpe)
+
+ idx := make(map[string]string, len(fields))
+ reverseIdx := make(map[string]string, len(fields))
+ for _, f := range fields {
+ idx[f.jsonName] = f.goName
+ reverseIdx[f.goName] = f.jsonName
+ }
+
+ return nameIndex{jsonNames: idx, goNames: reverseIdx}
+}
+
+// collectGoFields walks tpe breadth-first along anonymous struct fields,
+// reproducing the field selection performed by encoding/json.typeFields.
+func collectGoFields(tpe reflect.Type) []fieldEntry {
+ if tpe.Kind() != reflect.Struct {
+ return nil
+ }
+
+ type queued struct {
+ typ reflect.Type
+ index []int
+ }
+
+ current := []queued{}
+ next := []queued{{typ: tpe}}
+ visited := map[reflect.Type]bool{tpe: true}
+
+ var (
+ candidates []fieldEntry
+ count = map[string]int{}
+ nextCount = map[string]int{}
+ )
+
+ for len(next) > 0 {
+ current, next = next, current[:0]
+ count, nextCount = nextCount, count
+ for k := range nextCount {
+ delete(nextCount, k)
+ }
+
+ for _, q := range current {
+ for i := 0; i < q.typ.NumField(); i++ {
+ sf := q.typ.Field(i)
+
+ if sf.Anonymous {
+ ft := sf.Type
+ if ft.Kind() == reflect.Ptr {
+ ft = ft.Elem()
+ }
+ if !sf.IsExported() && ft.Kind() != reflect.Struct {
+ continue
+ }
+ } else if !sf.IsExported() {
+ continue
+ }
+
+ tag := sf.Tag.Get("json")
+ if tag == "-" {
+ continue
+ }
+ jsonName, _ := parseJSONTag(tag)
+ tagged := jsonName != ""
+
+ ft := sf.Type
+ if ft.Kind() == reflect.Ptr {
+ ft = ft.Elem()
+ }
+
+ if sf.Anonymous && ft.Kind() == reflect.Struct && !tagged {
+ if visited[ft] {
+ continue
+ }
+ visited[ft] = true
+
+ index := make([]int, len(q.index)+1)
+ copy(index, q.index)
+ index[len(q.index)] = i
+ next = append(next, queued{typ: ft, index: index})
+
+ continue
+ }
+
+ name := jsonName
+ if name == "" {
+ name = sf.Name
+ }
+
+ index := make([]int, len(q.index)+1)
+ copy(index, q.index)
+ index[len(q.index)] = i
+
+ candidates = append(candidates, fieldEntry{
+ goName: sf.Name,
+ jsonName: name,
+ index: index,
+ tagged: tagged,
+ })
+ nextCount[name]++
+ }
+ }
+ }
+
+ return dominantFields(candidates)
+}
+
+// dominantFields applies the Go encoding/json conflict resolution rules:
+// at each JSON name, the shallowest field wins; at equal depth, a uniquely
+// tagged candidate wins; otherwise all candidates for that name are dropped.
+func dominantFields(candidates []fieldEntry) []fieldEntry {
+ byName := make(map[string][]fieldEntry, len(candidates))
+ for _, c := range candidates {
+ byName[c.jsonName] = append(byName[c.jsonName], c)
+ }
+
+ out := make([]fieldEntry, 0, len(byName))
+ for _, group := range byName {
+ if len(group) == 1 {
+ out = append(out, group[0])
+
+ continue
+ }
+
+ minDepth := len(group[0].index)
+ for _, c := range group[1:] {
+ if len(c.index) < minDepth {
+ minDepth = len(c.index)
+ }
+ }
+
+ var shallow []fieldEntry
+ for _, c := range group {
+ if len(c.index) == minDepth {
+ shallow = append(shallow, c)
+ }
+ }
+
+ if len(shallow) == 1 {
+ out = append(out, shallow[0])
+
+ continue
+ }
+
+ var tagged []fieldEntry
+ for _, c := range shallow {
+ if c.tagged {
+ tagged = append(tagged, c)
+ }
+ }
+ if len(tagged) == 1 {
+ out = append(out, tagged[0])
+ }
+ }
+
+ return out
+}
+
+// parseJSONTag returns the name component of a json struct tag and whether
+// it carried any non-name option (kept for future-proofing, e.g. "omitempty").
+func parseJSONTag(tag string) (string, string) {
+ if tag == "" {
+ return "", ""
+ }
+ if idx := strings.IndexByte(tag, ','); idx >= 0 {
+ return tag[:idx], tag[idx+1:]
+ }
+
+ return tag, ""
+}
diff --git a/vendor/github.com/go-openapi/swag/jsonname/ifaces.go b/vendor/github.com/go-openapi/swag/jsonname/ifaces.go
new file mode 100644
index 00000000000..812ace5639f
--- /dev/null
+++ b/vendor/github.com/go-openapi/swag/jsonname/ifaces.go
@@ -0,0 +1,14 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package jsonname
+
+import "reflect"
+
+// providerIface is an unexported compile-time contract that every name provider
+// in this package is expected to satisfy.
+// It mirrors the interface declared by the main consumer of this module: [github.com/go-openapi/jsonpointer.NameProvider].
+type providerIface interface {
+ GetGoName(subject any, name string) (string, bool)
+ GetGoNameForType(tpe reflect.Type, name string) (string, bool)
+}
diff --git a/vendor/github.com/go-openapi/swag/jsonname/name_provider.go b/vendor/github.com/go-openapi/swag/jsonname/name_provider.go
index 8eaf1bece8d..9f5da7a0165 100644
--- a/vendor/github.com/go-openapi/swag/jsonname/name_provider.go
+++ b/vendor/github.com/go-openapi/swag/jsonname/name_provider.go
@@ -12,6 +12,8 @@ import (
// DefaultJSONNameProvider is the default cache for types.
var DefaultJSONNameProvider = NewNameProvider()
+var _ providerIface = (*NameProvider)(nil)
+
// NameProvider represents an object capable of translating from go property names
// to json property names.
//
diff --git a/vendor/github.com/go-openapi/swag/loading/doc.go b/vendor/github.com/go-openapi/swag/loading/doc.go
index 8cf7bcb8b9d..112c49968b8 100644
--- a/vendor/github.com/go-openapi/swag/loading/doc.go
+++ b/vendor/github.com/go-openapi/swag/loading/doc.go
@@ -2,4 +2,28 @@
// SPDX-License-Identifier: Apache-2.0
// Package loading provides tools to load a file from http or from a local file system.
+//
+// # Security
+//
+// By default, the local loader reads any path the process can access, including absolute
+// paths and "file://" URIs (for example "file:///etc/passwd"). Applications that pass
+// untrusted input to [LoadFromFileOrHTTP], [JSONDoc] (or to downstream consumers such as
+// go-openapi/loads) must confine local loading to a trusted directory.
+//
+// Use [WithRoot] to do so: it resolves every requested path relative to a chosen directory
+// and rejects anything that escapes it, including via symlink. It is built on [os.Root]
+// and is therefore safer than passing an [os.DirFS] to [WithFS], which does not block
+// symlink escapes.
+//
+// Remote loading uses a standard [net/http] client.
+// By default it follows redirects and performs no destination filtering — exactly like [net/http.DefaultClient].
+//
+// A caller-controlled URL may therefore reach internal services or cloud metadata endpoints
+// (server-side request forgery).
+//
+// This package does not, and should not, embed a network policy:
+// when the URL may derive from untrusted input, supply a restricted client with
+// [WithHTTPClient] whose transport rejects unwanted destinations at dial time — which also
+// covers redirects and DNS rebinding.
+// See the example on [LoadFromFileOrHTTP].
package loading
diff --git a/vendor/github.com/go-openapi/swag/loading/loading.go b/vendor/github.com/go-openapi/swag/loading/loading.go
index 269fb74d167..0b38ac1e384 100644
--- a/vendor/github.com/go-openapi/swag/loading/loading.go
+++ b/vendor/github.com/go-openapi/swag/loading/loading.go
@@ -17,7 +17,11 @@ import (
"strings"
)
-// LoadFromFileOrHTTP loads the bytes from a file or a remote http server based on the path passed in
+// LoadFromFileOrHTTP loads the bytes from a file or a remote http server based on the path passed in.
+//
+// Security: by default a local path is read with no confinement, so a caller-controlled path
+// (including a "file://" URI or an absolute path) may read any file the process can access.
+// When the path may derive from untrusted input, confine local loading with [WithRoot].
func LoadFromFileOrHTTP(pth string, opts ...Option) ([]byte, error) {
o := optionsWithDefaults(opts)
return LoadStrategy(pth, o.ReadFileFunc(), loadHTTPBytes(opts...), opts...)(pth)
@@ -54,11 +58,14 @@ func LoadFromFileOrHTTP(pth string, opts ...Option) ([]byte, error) {
// - `file:///c:/folder/file` becomes `C:\folder\file`
// - `file://c:/folder/file` is tolerated (without leading `/`) and becomes `c:\folder\file`
func LoadStrategy(pth string, local, remote func(string) ([]byte, error), opts ...Option) func(string) ([]byte, error) {
- if strings.HasPrefix(pth, "http") {
+ if hasHTTPScheme(pth) {
return remote
}
o := optionsWithDefaults(opts)
_, isEmbedFS := o.fs.(embed.FS)
+ // any loader backed by an fs.FS or an os.Root consumes forward-slash paths on every
+ // platform, so it must not go through the windows-native file:// preprocessing below.
+ isFSBacked := o.fs != nil || o.root != ""
return func(p string) ([]byte, error) {
upth, err := url.PathUnescape(p)
@@ -67,14 +74,20 @@ func LoadStrategy(pth string, local, remote func(string) ([]byte, error), opts .
}
cpth, hasPrefix := strings.CutPrefix(upth, "file://")
- if !hasPrefix || isEmbedFS || runtime.GOOS != "windows" {
+ if !hasPrefix || isFSBacked || runtime.GOOS != "windows" {
// crude processing: trim the file:// prefix. This leaves full URIs with a host with a (mostly) unexpected result
// regular file path provided: just normalize slashes
if isEmbedFS {
- // on windows, we need to slash the path if FS is an embed FS.
+ // embed.FS always uses "/" as separator, even on windows, and rejects leading "./" or "/".
return local(strings.TrimLeft(filepath.ToSlash(cpth), "./")) // remove invalid leading characters for embed FS
}
+ if isFSBacked {
+ // other fs.FS (e.g. os.DirFS) and os.Root loaders also use "/" on every platform.
+ // Escaping paths (absolute, "..", escaping symlinks) are rejected by the loader, not rewritten here.
+ return local(filepath.ToSlash(cpth))
+ }
+
return local(filepath.FromSlash(cpth))
}
@@ -113,6 +126,21 @@ func LoadStrategy(pth string, local, remote func(string) ([]byte, error), opts .
}
}
+// hasHTTPScheme reports whether pth is an absolute URL with an http or https scheme,
+// selecting the remote loader. The comparison is case-insensitive, as URL schemes are.
+//
+// Requiring the "://" separator (rather than a bare "http" prefix) avoids misrouting a
+// local file whose name merely starts with "http" (e.g. "httpbin.json") to the remote loader.
+func hasHTTPScheme(pth string) bool {
+ for _, scheme := range [...]string{"http://", "https://"} {
+ if len(pth) >= len(scheme) && strings.EqualFold(pth[:len(scheme)], scheme) {
+ return true
+ }
+ }
+
+ return false
+}
+
func loadHTTPBytes(opts ...Option) func(path string) ([]byte, error) {
o := optionsWithDefaults(opts)
diff --git a/vendor/github.com/go-openapi/swag/loading/options.go b/vendor/github.com/go-openapi/swag/loading/options.go
index 6674ac69e62..2c128231728 100644
--- a/vendor/github.com/go-openapi/swag/loading/options.go
+++ b/vendor/github.com/go-openapi/swag/loading/options.go
@@ -4,6 +4,7 @@
package loading
import (
+ "errors"
"io/fs"
"net/http"
"os"
@@ -23,7 +24,8 @@ type (
}
fileOptions struct {
- fs fs.ReadFileFS
+ fs fs.ReadFileFS
+ root string // when non-empty, local reads are confined to this directory via os.Root
}
options struct {
@@ -33,6 +35,20 @@ type (
)
func (fo fileOptions) ReadFileFunc() func(string) ([]byte, error) {
+ if fo.root != "" {
+ root := fo.root
+
+ return func(name string) ([]byte, error) {
+ r, err := os.OpenRoot(root)
+ if err != nil {
+ return nil, errors.Join(err, ErrLoader)
+ }
+ defer func() { _ = r.Close() }()
+
+ return r.ReadFile(name)
+ }
+ }
+
if fo.fs == nil {
return os.ReadFile
}
@@ -87,8 +103,15 @@ func WithHTTPClient(client *http.Client) Option {
// By default, the file system is the one provided by the os package.
//
// For example, this may be set to consume from an embedded file system, or a rooted FS.
+//
+// WithFS and [WithRoot] are mutually exclusive: the last one applied wins.
+//
+// Security note: a file system built from [os.DirFS] confines paths but does NOT protect
+// against symlinks that escape the root. To load from a directory derived from untrusted
+// input, prefer [WithRoot], which is symlink-escape resistant.
func WithFS(filesystem fs.FS) Option {
return func(o *options) {
+ o.root = "" // last-wins vs WithRoot
if rfs, ok := filesystem.(fs.ReadFileFS); ok {
o.fs = rfs
@@ -98,6 +121,28 @@ func WithFS(filesystem fs.FS) Option {
}
}
+// WithRoot confines local file loading to dir.
+//
+// Every requested path is resolved relative to dir, and any path that would escape dir —
+// whether through an absolute path, ".." traversal, or a symlink pointing outside dir — is
+// rejected. This is built on [os.Root] and is therefore resistant to the symlink escapes
+// that a plain [os.DirFS] does not prevent.
+//
+// WithRoot is the recommended option when loading specs from a location derived from
+// untrusted input. It applies to local loading only and has no effect on remote
+// (http/https) loading. WithRoot and [WithFS] are mutually exclusive: the last one applied
+// wins.
+//
+// Note: [os.Root] confines path resolution but does not, by itself, protect against
+// traversal of mount/bind boundaries, /proc special files, or device files. Point WithRoot
+// at a directory that holds only the documents you intend to expose.
+func WithRoot(dir string) Option {
+ return func(o *options) {
+ o.root = dir
+ o.fs = nil // last-wins vs WithFS
+ }
+}
+
type readFileFS struct {
fs.FS
}
diff --git a/vendor/github.com/go-openapi/validate/CONTRIBUTORS.md b/vendor/github.com/go-openapi/validate/CONTRIBUTORS.md
index 7b79b765dc3..0f5497c8bbf 100644
--- a/vendor/github.com/go-openapi/validate/CONTRIBUTORS.md
+++ b/vendor/github.com/go-openapi/validate/CONTRIBUTORS.md
@@ -4,12 +4,12 @@
| Total Contributors | Total Contributions |
| --- | --- |
-| 31 | 295 |
+| 31 | 305 |
| Username | All Time Contribution Count | All Commits |
| --- | --- | --- |
| @casualjim | 169 | |
-| @fredbi | 58 | |
+| @fredbi | 68 | |
| @sttts | 11 | |
| @youyuanwu | 9 | |
| @keramix | 8 | |
@@ -40,4 +40,4 @@
| @dadgar | 1 | |
| @elakito | 1 | |
- _this file was generated by the [Contributors GitHub Action](https://github.com/github/contributors)_
+ _this file was generated by the [Contributors GitHub Action](https://github.com/github-community-projects/contributors)_
diff --git a/vendor/github.com/go-openapi/validate/README.md b/vendor/github.com/go-openapi/validate/README.md
index fec42b7c6ed..b814a2ef126 100644
--- a/vendor/github.com/go-openapi/validate/README.md
+++ b/vendor/github.com/go-openapi/validate/README.md
@@ -18,12 +18,9 @@ A validator for OpenAPI v2 specifications and JSON schema draft 4.
* **2025-12-19** : new community chat on discord
* a new discord community channel is available to be notified of changes and support users
- * our venerable Slack channel remains open, and will be eventually discontinued on **2026-03-31**
You may join the discord community by clicking the invite link on the discord badge (also above). [![Discord Channel][discord-badge]][discord-url]
-Or join our Slack channel: [![Slack Channel][slack-logo]![slack-badge]][slack-url]
-
## Status
API is stable.
@@ -75,9 +72,9 @@ This library ships under the [SPDX-License-Identifier: Apache-2.0](./LICENSE).
## Other documentation
* [All-time contributors](./CONTRIBUTORS.md)
-* [Contributing guidelines](.github/CONTRIBUTING.md)
-* [Maintainers documentation](docs/MAINTAINERS.md)
-* [Code style](docs/STYLE.md)
+* [Contributing guidelines][contributing-doc-site]
+* [Maintainers documentation][maintainers-doc-site]
+* [Code style][style-doc-site]
## Cutting a new release
@@ -108,11 +105,8 @@ Maintainers can cut a new release by either:
[godoc-badge]: https://pkg.go.dev/badge/github.com/go-openapi/validate
[godoc-url]: http://pkg.go.dev/github.com/go-openapi/validate
-[slack-logo]: https://a.slack-edge.com/e6a93c1/img/icons/favicon-32.png
-[slack-badge]: https://img.shields.io/badge/slack-blue?link=https%3A%2F%2Fgoswagger.slack.com%2Farchives%2FC04R30YM
-[slack-url]: https://goswagger.slack.com/archives/C04R30YMU
[discord-badge]: https://img.shields.io/discord/1446918742398341256?logo=discord&label=discord&color=blue
-[discord-url]: https://discord.gg/twZ9BwT3
+[discord-url]: https://discord.gg/FfnFYaC3k5
[license-badge]: http://img.shields.io/badge/license-Apache%20v2-orange.svg
@@ -122,3 +116,7 @@ Maintainers can cut a new release by either:
[goversion-url]: https://github.com/go-openapi/validate/blob/master/go.mod
[top-badge]: https://img.shields.io/github/languages/top/go-openapi/validate
[commits-badge]: https://img.shields.io/github/commits-since/go-openapi/validate/latest
+
+[contributing-doc-site]: https://go-openapi.github.io/doc-site/contributing/contributing/index.html
+[maintainers-doc-site]: https://go-openapi.github.io/doc-site/maintainers/index.html
+[style-doc-site]: https://go-openapi.github.io/doc-site/contributing/style/index.html
diff --git a/vendor/github.com/go-openapi/validate/spec.go b/vendor/github.com/go-openapi/validate/spec.go
index b85432f92b1..0849e47ea58 100644
--- a/vendor/github.com/go-openapi/validate/spec.go
+++ b/vendor/github.com/go-openapi/validate/spec.go
@@ -146,7 +146,8 @@ func (s *SpecValidator) Validate(data any) (*Result, *Result) {
errs.Merge(s.validateNonEmptyPathParamNames())
// errs.Merge(s.validateRefNoSibling()) // warning only
- errs.Merge(s.validateReferenced()) // warning only
+ errs.Merge(s.validateReferenced()) // warning only
+ errs.Merge(s.validateDubiousRefs()) // warning only
return errs, warnings
}
@@ -553,8 +554,12 @@ DEFINITIONS:
if schema.Required != nil { // Safeguard
for _, pn := range schema.Required {
red := s.validateRequiredProperties(pn, d, &schema) //#nosec
+ // NOTE: capture validity before merging: Merge may redeem `red` to the
+ // pool (wantsRedeemOnMerge), after which reading it races with a concurrent
+ // BorrowResult().cleared() in another goroutine sharing the global pool.
+ isValid := red.IsValid()
res.Merge(red)
- if !red.IsValid() && !s.Options.ContinueOnErrors {
+ if !isValid && !s.Options.ContinueOnErrors {
break DEFINITIONS // there is an error, let's stop that bleeding
}
}
diff --git a/vendor/github.com/go-openapi/validate/spec_messages.go b/vendor/github.com/go-openapi/validate/spec_messages.go
index 42ce3602852..eeb8a869518 100644
--- a/vendor/github.com/go-openapi/validate/spec_messages.go
+++ b/vendor/github.com/go-openapi/validate/spec_messages.go
@@ -177,6 +177,18 @@ const (
// UnusedResponseWarning ...
UnusedResponseWarning = "response %q is not used anywhere"
+ // DubiousAbsoluteRefWarning flags a $ref pointing to an absolute local file location that escapes the
+ // spec's base path. Absolute local references are legitimate when they stay beneath the base path
+ // (flattening/expansion introduces such anchors for cyclical $refs), but an absolute reference that
+ // escapes the base path - or a file:// reference in a spec with no known base - may indicate an
+ // unsafe or adversarial spec.
+ DubiousAbsoluteRefWarning = "$ref %q points to an absolute or local file location that escapes the spec's base path: this may be unsafe with adversarial specs"
+
+ // DubiousMultipleHostsWarning flags a spec whose remote $refs resolve to several distinct hosts.
+ // A single consistent remote host is common and legitimate; references spread across multiple hosts
+ // may indicate an unsafe or adversarial spec.
+ DubiousMultipleHostsWarning = "$ref values point to %d distinct remote hosts (%s): a spec referencing multiple hosts may be unsafe"
+
InvalidObject = "expected an object in %q.%s"
)
@@ -404,3 +416,11 @@ func someParametersBrokenMsg(path, method, operationID string) errors.Error {
func refShouldNotHaveSiblingsMsg(path, operationID string) errors.Error {
return errors.New(errors.CompositeErrorCode, RefShouldNotHaveSiblingsWarning, operationID, path)
}
+
+func dubiousAbsoluteRefMsg(ref string) errors.Error {
+ return errors.New(errors.CompositeErrorCode, DubiousAbsoluteRefWarning, ref)
+}
+
+func dubiousMultipleHostsMsg(count int, hosts string) errors.Error {
+ return errors.New(errors.CompositeErrorCode, DubiousMultipleHostsWarning, count, hosts)
+}
diff --git a/vendor/github.com/go-openapi/validate/spec_ref_warnings.go b/vendor/github.com/go-openapi/validate/spec_ref_warnings.go
new file mode 100644
index 00000000000..49c72314c94
--- /dev/null
+++ b/vendor/github.com/go-openapi/validate/spec_ref_warnings.go
@@ -0,0 +1,209 @@
+// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
+// SPDX-License-Identifier: Apache-2.0
+
+package validate
+
+import (
+ "net/url"
+ "path"
+ "sort"
+ "strings"
+
+ "github.com/go-openapi/spec"
+)
+
+// minDistinctHostsToWarn is the number of distinct remote hosts among $refs at or above which
+// Rule 2 emits a host-spread warning. A single consistent remote host is legitimate.
+const minDistinctHostsToWarn = 2
+
+// validateDubiousRefs emits warnings (never errors) when $ref locations match patterns
+// that may indicate an unsafe or adversarial spec. It inspects refs as authored, on the
+// UNEXPANDED spec, so it must run before expansion flattens them away.
+//
+// Two rules are applied over s.analyzer.AllRefs():
+//
+// - Rule 1 (absolute local escape): a $ref pointing to an absolute local file location
+// (file:// scheme, a Unix absolute path, or a Windows drive path such as C:\) is dubious
+// UNLESS it stays beneath the spec's base path. Absolute refs beneath the base are
+// legitimate: flattening/expansion in go-openapi/spec and analysis introduces absolute
+// anchors to resolve cyclical $refs. Relative and fragment-only refs are always exempt.
+//
+// - Rule 2 (host spread): when remote (http/https, or protocol-relative) refs resolve to
+// two or more distinct hosts, a single aggregate warning lists them. A single consistent
+// remote host is common and legitimate, so it is not flagged.
+//
+// All findings are warnings: they do not affect validity (see Result.IsValid).
+func (s *SpecValidator) validateDubiousRefs() *Result {
+ res := pools.poolOfResults.BorrowResult()
+
+ baseDir, hasBase := s.localBaseDir()
+
+ remoteHosts := make(map[string]struct{})
+ for _, r := range s.analyzer.AllRefs() {
+ u := r.GetURL()
+ if u == nil { // Safeguard: a valid spec always yields parseable refs
+ continue
+ }
+
+ // Rule 1: absolute local reference escaping the base path.
+ if refPath, isLocalAbs := absoluteLocalRefPath(r, u); isLocalAbs {
+ if !hasBase || !isBeneathBase(refPath, baseDir) {
+ res.AddWarnings(dubiousAbsoluteRefMsg(r.String()))
+ }
+ continue
+ }
+
+ // Rule 2: gather remote hosts (http/https and protocol-relative //host/...).
+ if host := remoteRefHost(u); host != "" {
+ remoteHosts[host] = struct{}{}
+ }
+ }
+
+ if len(remoteHosts) >= minDistinctHostsToWarn {
+ hosts := make([]string, 0, len(remoteHosts))
+ for h := range remoteHosts {
+ hosts = append(hosts, h)
+ }
+ sort.Strings(hosts)
+ res.AddWarnings(dubiousMultipleHostsMsg(len(hosts), strings.Join(hosts, ", ")))
+ }
+
+ return res
+}
+
+// absoluteLocalRefPath reports whether r is an absolute LOCAL file reference and, if so,
+// returns the cleaned path it points to (without scheme/fragment, drive letter lower-cased).
+//
+// Classification order matters (see the empirical jsonreference flag behavior):
+// - file:// scheme is local, including UNC file://host/share (inherently dubious).
+// - a non-empty Host with no file scheme means remote (http/https or protocol-relative
+// //host/path) - NOT local; handled by Rule 2. This must be checked before the Unix
+// branch, because protocol-relative refs also set HasFullFilePath.
+// - len(u.Scheme) == 1 is a Windows drive path (C:\ or C:/), whose drive+path land in
+// Scheme/Opaque/Path rather than Path. Checked before the Unix branch because C:/x also
+// sets HasFullFilePath, and reconstructed from the authored ref string to keep the drive.
+// - !r.HasFullURL && r.HasFullFilePath is a plain Unix absolute path (/abs/models.json).
+//
+// Relative (./x.json) and fragment-only (#/definitions/X) refs return false.
+func absoluteLocalRefPath(r spec.Ref, u *url.URL) (string, bool) {
+ switch {
+ case r.HasFileScheme:
+ return fileRefPath(u), true
+ case u.Host != "":
+ // Remote (http/https) or protocol-relative //host/path: handled by Rule 2.
+ return "", false
+ case len(u.Scheme) == 1:
+ // Windows drive letter: reconstruct from the authored ref string.
+ return cleanRefPath(r.String()), true
+ case !r.HasFullURL && r.HasFullFilePath:
+ return cleanRefPath(u.Path), true
+ default:
+ return "", false
+ }
+}
+
+// remoteRefHost returns the host of a remote reference (http/https), or of a protocol-relative
+// reference (//host/path). It returns "" for local and fragment-only refs. file:// hosts (UNC)
+// are deliberately excluded: those are handled as local-absolute refs by Rule 1.
+func remoteRefHost(u *url.URL) string {
+ switch u.Scheme {
+ case "http", "https":
+ return u.Host
+ case "":
+ // Protocol-relative //host/path: empty scheme but a host is present.
+ return u.Host
+ default:
+ return ""
+ }
+}
+
+// localBaseDir returns the directory of the spec file, slash-normalized, when the spec was
+// loaded from a local path. It returns ok=false when the base is unknown (in-memory spec) or
+// remote (http/https), in which case absolute-local refs cannot be proven beneath a base and
+// are treated as dubious.
+func (s *SpecValidator) localBaseDir() (string, bool) {
+ specPath := s.spec.SpecFilePath()
+ if specPath == "" {
+ return "", false
+ }
+
+ // Strip a file:// scheme if present; reject remote bases.
+ if u, err := url.Parse(specPath); err == nil && u.Scheme != "" {
+ switch {
+ case u.Scheme == "file":
+ specPath = u.Path
+ case len(u.Scheme) == 1: // Windows drive letter, treat as local
+ // keep specPath as-is (authored path)
+ default: // http, https, ... : no local base
+ return "", false
+ }
+ }
+
+ return path.Dir(cleanRefPath(specPath)), true
+}
+
+// isBeneathBase reports whether the cleaned target path is located within baseDir, i.e. it does
+// not escape baseDir via "..". Comparison is purely lexical on cleaned paths, which is sufficient
+// (and cross-platform safe) for a non-fatal warning. Both sides are expected to already be
+// cleanRefPath-normalized (slashes, drive-letter case).
+func isBeneathBase(target, baseDir string) bool {
+ if baseDir == "" {
+ return false
+ }
+ if target == baseDir {
+ return true
+ }
+ if !strings.HasSuffix(baseDir, "/") {
+ baseDir += "/"
+ }
+ return strings.HasPrefix(target, baseDir)
+}
+
+// fileRefPath extracts the local path a file:// reference points to, accounting for the way
+// Windows file URLs parse:
+// - file:///abs/x -> /abs/x (empty host)
+// - file:///C:/dir/x -> /c:/dir/x (empty host; drive sits in the path)
+// - file://D:/a/x -> d:/a/x (drive letter lands in Host, rejoin it)
+// - file://host/share -> /host/share/x (real UNC host kept visible so it cannot match a
+// local base and stays flagged as dubious)
+func fileRefPath(u *url.URL) string {
+ switch {
+ case u.Host == "":
+ return cleanRefPath(u.Path)
+ case isDriveHost(u.Host):
+ // Windows path authored as file://D:/... : the drive landed in Host (e.g. "d:").
+ return cleanRefPath(u.Host + u.Path)
+ default:
+ // Real remote/UNC host: keep it in the path so it never matches a local base.
+ return cleanRefPath("//" + u.Host + u.Path)
+ }
+}
+
+// isDriveHost reports whether a URL host is actually a Windows drive letter (e.g. "d:"), which
+// happens when a Windows path is authored as a two-slash file URL: file://D:/path.
+func isDriveHost(host string) bool {
+ h := strings.TrimSuffix(host, ":")
+ if len(h) != 1 {
+ return false
+ }
+ c := h[0]
+ return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
+}
+
+// cleanRefPath normalizes a ref or base path for lexical comparison: backslashes to forward
+// slashes, path.Clean, and a lower-cased leading Windows drive letter (matching the behavior of
+// go-openapi/spec's normalizer). Plain Unix paths are unaffected, preserving case-sensitivity.
+func cleanRefPath(p string) string {
+ p = path.Clean(strings.ReplaceAll(p, `\`, `/`))
+ switch {
+ case len(p) >= 2 && p[1] == ':':
+ // drive-letter form: C:/dir -> c:/dir
+ p = strings.ToLower(p[:1]) + p[1:]
+ case len(p) >= 3 && p[0] == '/' && p[2] == ':':
+ // slash-prefixed drive form from canonical file:// URLs: /C:/dir -> c:/dir.
+ // The leading slash is dropped so this matches the base path derived from
+ // SpecFilePath (which has no leading slash), and the bare-drive form.
+ p = strings.ToLower(p[1:2]) + p[2:]
+ }
+ return p
+}
diff --git a/vendor/github.com/google/btree/LICENSE b/vendor/github.com/google/btree/LICENSE
new file mode 100644
index 00000000000..d6456956733
--- /dev/null
+++ b/vendor/github.com/google/btree/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/vendor/github.com/google/btree/README.md b/vendor/github.com/google/btree/README.md
new file mode 100644
index 00000000000..eab5dbf7ba7
--- /dev/null
+++ b/vendor/github.com/google/btree/README.md
@@ -0,0 +1,10 @@
+# BTree implementation for Go
+
+This package provides an in-memory B-Tree implementation for Go, useful as
+an ordered, mutable data structure.
+
+The API is based off of the wonderful
+http://godoc.org/github.com/petar/GoLLRB/llrb, and is meant to allow btree to
+act as a drop-in replacement for gollrb trees.
+
+See http://godoc.org/github.com/google/btree for documentation.
diff --git a/vendor/github.com/google/btree/btree.go b/vendor/github.com/google/btree/btree.go
new file mode 100644
index 00000000000..6f5184fef7d
--- /dev/null
+++ b/vendor/github.com/google/btree/btree.go
@@ -0,0 +1,893 @@
+// Copyright 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//go:build !go1.18
+// +build !go1.18
+
+// Package btree implements in-memory B-Trees of arbitrary degree.
+//
+// btree implements an in-memory B-Tree for use as an ordered data structure.
+// It is not meant for persistent storage solutions.
+//
+// It has a flatter structure than an equivalent red-black or other binary tree,
+// which in some cases yields better memory usage and/or performance.
+// See some discussion on the matter here:
+// http://google-opensource.blogspot.com/2013/01/c-containers-that-save-memory-and-time.html
+// Note, though, that this project is in no way related to the C++ B-Tree
+// implementation written about there.
+//
+// Within this tree, each node contains a slice of items and a (possibly nil)
+// slice of children. For basic numeric values or raw structs, this can cause
+// efficiency differences when compared to equivalent C++ template code that
+// stores values in arrays within the node:
+// * Due to the overhead of storing values as interfaces (each
+// value needs to be stored as the value itself, then 2 words for the
+// interface pointing to that value and its type), resulting in higher
+// memory use.
+// * Since interfaces can point to values anywhere in memory, values are
+// most likely not stored in contiguous blocks, resulting in a higher
+// number of cache misses.
+// These issues don't tend to matter, though, when working with strings or other
+// heap-allocated structures, since C++-equivalent structures also must store
+// pointers and also distribute their values across the heap.
+//
+// This implementation is designed to be a drop-in replacement to gollrb.LLRB
+// trees, (http://github.com/petar/gollrb), an excellent and probably the most
+// widely used ordered tree implementation in the Go ecosystem currently.
+// Its functions, therefore, exactly mirror those of
+// llrb.LLRB where possible. Unlike gollrb, though, we currently don't
+// support storing multiple equivalent values.
+package btree
+
+import (
+ "fmt"
+ "io"
+ "sort"
+ "strings"
+ "sync"
+)
+
+// Item represents a single object in the tree.
+type Item interface {
+ // Less tests whether the current item is less than the given argument.
+ //
+ // This must provide a strict weak ordering.
+ // If !a.Less(b) && !b.Less(a), we treat this to mean a == b (i.e. we can only
+ // hold one of either a or b in the tree).
+ Less(than Item) bool
+}
+
+const (
+ DefaultFreeListSize = 32
+)
+
+var (
+ nilItems = make(items, 16)
+ nilChildren = make(children, 16)
+)
+
+// FreeList represents a free list of btree nodes. By default each
+// BTree has its own FreeList, but multiple BTrees can share the same
+// FreeList.
+// Two Btrees using the same freelist are safe for concurrent write access.
+type FreeList struct {
+ mu sync.Mutex
+ freelist []*node
+}
+
+// NewFreeList creates a new free list.
+// size is the maximum size of the returned free list.
+func NewFreeList(size int) *FreeList {
+ return &FreeList{freelist: make([]*node, 0, size)}
+}
+
+func (f *FreeList) newNode() (n *node) {
+ f.mu.Lock()
+ index := len(f.freelist) - 1
+ if index < 0 {
+ f.mu.Unlock()
+ return new(node)
+ }
+ n = f.freelist[index]
+ f.freelist[index] = nil
+ f.freelist = f.freelist[:index]
+ f.mu.Unlock()
+ return
+}
+
+// freeNode adds the given node to the list, returning true if it was added
+// and false if it was discarded.
+func (f *FreeList) freeNode(n *node) (out bool) {
+ f.mu.Lock()
+ if len(f.freelist) < cap(f.freelist) {
+ f.freelist = append(f.freelist, n)
+ out = true
+ }
+ f.mu.Unlock()
+ return
+}
+
+// ItemIterator allows callers of Ascend* to iterate in-order over portions of
+// the tree. When this function returns false, iteration will stop and the
+// associated Ascend* function will immediately return.
+type ItemIterator func(i Item) bool
+
+// New creates a new B-Tree with the given degree.
+//
+// New(2), for example, will create a 2-3-4 tree (each node contains 1-3 items
+// and 2-4 children).
+func New(degree int) *BTree {
+ return NewWithFreeList(degree, NewFreeList(DefaultFreeListSize))
+}
+
+// NewWithFreeList creates a new B-Tree that uses the given node free list.
+func NewWithFreeList(degree int, f *FreeList) *BTree {
+ if degree <= 1 {
+ panic("bad degree")
+ }
+ return &BTree{
+ degree: degree,
+ cow: ©OnWriteContext{freelist: f},
+ }
+}
+
+// items stores items in a node.
+type items []Item
+
+// insertAt inserts a value into the given index, pushing all subsequent values
+// forward.
+func (s *items) insertAt(index int, item Item) {
+ *s = append(*s, nil)
+ if index < len(*s) {
+ copy((*s)[index+1:], (*s)[index:])
+ }
+ (*s)[index] = item
+}
+
+// removeAt removes a value at a given index, pulling all subsequent values
+// back.
+func (s *items) removeAt(index int) Item {
+ item := (*s)[index]
+ copy((*s)[index:], (*s)[index+1:])
+ (*s)[len(*s)-1] = nil
+ *s = (*s)[:len(*s)-1]
+ return item
+}
+
+// pop removes and returns the last element in the list.
+func (s *items) pop() (out Item) {
+ index := len(*s) - 1
+ out = (*s)[index]
+ (*s)[index] = nil
+ *s = (*s)[:index]
+ return
+}
+
+// truncate truncates this instance at index so that it contains only the
+// first index items. index must be less than or equal to length.
+func (s *items) truncate(index int) {
+ var toClear items
+ *s, toClear = (*s)[:index], (*s)[index:]
+ for len(toClear) > 0 {
+ toClear = toClear[copy(toClear, nilItems):]
+ }
+}
+
+// find returns the index where the given item should be inserted into this
+// list. 'found' is true if the item already exists in the list at the given
+// index.
+func (s items) find(item Item) (index int, found bool) {
+ i := sort.Search(len(s), func(i int) bool {
+ return item.Less(s[i])
+ })
+ if i > 0 && !s[i-1].Less(item) {
+ return i - 1, true
+ }
+ return i, false
+}
+
+// children stores child nodes in a node.
+type children []*node
+
+// insertAt inserts a value into the given index, pushing all subsequent values
+// forward.
+func (s *children) insertAt(index int, n *node) {
+ *s = append(*s, nil)
+ if index < len(*s) {
+ copy((*s)[index+1:], (*s)[index:])
+ }
+ (*s)[index] = n
+}
+
+// removeAt removes a value at a given index, pulling all subsequent values
+// back.
+func (s *children) removeAt(index int) *node {
+ n := (*s)[index]
+ copy((*s)[index:], (*s)[index+1:])
+ (*s)[len(*s)-1] = nil
+ *s = (*s)[:len(*s)-1]
+ return n
+}
+
+// pop removes and returns the last element in the list.
+func (s *children) pop() (out *node) {
+ index := len(*s) - 1
+ out = (*s)[index]
+ (*s)[index] = nil
+ *s = (*s)[:index]
+ return
+}
+
+// truncate truncates this instance at index so that it contains only the
+// first index children. index must be less than or equal to length.
+func (s *children) truncate(index int) {
+ var toClear children
+ *s, toClear = (*s)[:index], (*s)[index:]
+ for len(toClear) > 0 {
+ toClear = toClear[copy(toClear, nilChildren):]
+ }
+}
+
+// node is an internal node in a tree.
+//
+// It must at all times maintain the invariant that either
+// * len(children) == 0, len(items) unconstrained
+// * len(children) == len(items) + 1
+type node struct {
+ items items
+ children children
+ cow *copyOnWriteContext
+}
+
+func (n *node) mutableFor(cow *copyOnWriteContext) *node {
+ if n.cow == cow {
+ return n
+ }
+ out := cow.newNode()
+ if cap(out.items) >= len(n.items) {
+ out.items = out.items[:len(n.items)]
+ } else {
+ out.items = make(items, len(n.items), cap(n.items))
+ }
+ copy(out.items, n.items)
+ // Copy children
+ if cap(out.children) >= len(n.children) {
+ out.children = out.children[:len(n.children)]
+ } else {
+ out.children = make(children, len(n.children), cap(n.children))
+ }
+ copy(out.children, n.children)
+ return out
+}
+
+func (n *node) mutableChild(i int) *node {
+ c := n.children[i].mutableFor(n.cow)
+ n.children[i] = c
+ return c
+}
+
+// split splits the given node at the given index. The current node shrinks,
+// and this function returns the item that existed at that index and a new node
+// containing all items/children after it.
+func (n *node) split(i int) (Item, *node) {
+ item := n.items[i]
+ next := n.cow.newNode()
+ next.items = append(next.items, n.items[i+1:]...)
+ n.items.truncate(i)
+ if len(n.children) > 0 {
+ next.children = append(next.children, n.children[i+1:]...)
+ n.children.truncate(i + 1)
+ }
+ return item, next
+}
+
+// maybeSplitChild checks if a child should be split, and if so splits it.
+// Returns whether or not a split occurred.
+func (n *node) maybeSplitChild(i, maxItems int) bool {
+ if len(n.children[i].items) < maxItems {
+ return false
+ }
+ first := n.mutableChild(i)
+ item, second := first.split(maxItems / 2)
+ n.items.insertAt(i, item)
+ n.children.insertAt(i+1, second)
+ return true
+}
+
+// insert inserts an item into the subtree rooted at this node, making sure
+// no nodes in the subtree exceed maxItems items. Should an equivalent item be
+// be found/replaced by insert, it will be returned.
+func (n *node) insert(item Item, maxItems int) Item {
+ i, found := n.items.find(item)
+ if found {
+ out := n.items[i]
+ n.items[i] = item
+ return out
+ }
+ if len(n.children) == 0 {
+ n.items.insertAt(i, item)
+ return nil
+ }
+ if n.maybeSplitChild(i, maxItems) {
+ inTree := n.items[i]
+ switch {
+ case item.Less(inTree):
+ // no change, we want first split node
+ case inTree.Less(item):
+ i++ // we want second split node
+ default:
+ out := n.items[i]
+ n.items[i] = item
+ return out
+ }
+ }
+ return n.mutableChild(i).insert(item, maxItems)
+}
+
+// get finds the given key in the subtree and returns it.
+func (n *node) get(key Item) Item {
+ i, found := n.items.find(key)
+ if found {
+ return n.items[i]
+ } else if len(n.children) > 0 {
+ return n.children[i].get(key)
+ }
+ return nil
+}
+
+// min returns the first item in the subtree.
+func min(n *node) Item {
+ if n == nil {
+ return nil
+ }
+ for len(n.children) > 0 {
+ n = n.children[0]
+ }
+ if len(n.items) == 0 {
+ return nil
+ }
+ return n.items[0]
+}
+
+// max returns the last item in the subtree.
+func max(n *node) Item {
+ if n == nil {
+ return nil
+ }
+ for len(n.children) > 0 {
+ n = n.children[len(n.children)-1]
+ }
+ if len(n.items) == 0 {
+ return nil
+ }
+ return n.items[len(n.items)-1]
+}
+
+// toRemove details what item to remove in a node.remove call.
+type toRemove int
+
+const (
+ removeItem toRemove = iota // removes the given item
+ removeMin // removes smallest item in the subtree
+ removeMax // removes largest item in the subtree
+)
+
+// remove removes an item from the subtree rooted at this node.
+func (n *node) remove(item Item, minItems int, typ toRemove) Item {
+ var i int
+ var found bool
+ switch typ {
+ case removeMax:
+ if len(n.children) == 0 {
+ return n.items.pop()
+ }
+ i = len(n.items)
+ case removeMin:
+ if len(n.children) == 0 {
+ return n.items.removeAt(0)
+ }
+ i = 0
+ case removeItem:
+ i, found = n.items.find(item)
+ if len(n.children) == 0 {
+ if found {
+ return n.items.removeAt(i)
+ }
+ return nil
+ }
+ default:
+ panic("invalid type")
+ }
+ // If we get to here, we have children.
+ if len(n.children[i].items) <= minItems {
+ return n.growChildAndRemove(i, item, minItems, typ)
+ }
+ child := n.mutableChild(i)
+ // Either we had enough items to begin with, or we've done some
+ // merging/stealing, because we've got enough now and we're ready to return
+ // stuff.
+ if found {
+ // The item exists at index 'i', and the child we've selected can give us a
+ // predecessor, since if we've gotten here it's got > minItems items in it.
+ out := n.items[i]
+ // We use our special-case 'remove' call with typ=maxItem to pull the
+ // predecessor of item i (the rightmost leaf of our immediate left child)
+ // and set it into where we pulled the item from.
+ n.items[i] = child.remove(nil, minItems, removeMax)
+ return out
+ }
+ // Final recursive call. Once we're here, we know that the item isn't in this
+ // node and that the child is big enough to remove from.
+ return child.remove(item, minItems, typ)
+}
+
+// growChildAndRemove grows child 'i' to make sure it's possible to remove an
+// item from it while keeping it at minItems, then calls remove to actually
+// remove it.
+//
+// Most documentation says we have to do two sets of special casing:
+// 1) item is in this node
+// 2) item is in child
+// In both cases, we need to handle the two subcases:
+// A) node has enough values that it can spare one
+// B) node doesn't have enough values
+// For the latter, we have to check:
+// a) left sibling has node to spare
+// b) right sibling has node to spare
+// c) we must merge
+// To simplify our code here, we handle cases #1 and #2 the same:
+// If a node doesn't have enough items, we make sure it does (using a,b,c).
+// We then simply redo our remove call, and the second time (regardless of
+// whether we're in case 1 or 2), we'll have enough items and can guarantee
+// that we hit case A.
+func (n *node) growChildAndRemove(i int, item Item, minItems int, typ toRemove) Item {
+ if i > 0 && len(n.children[i-1].items) > minItems {
+ // Steal from left child
+ child := n.mutableChild(i)
+ stealFrom := n.mutableChild(i - 1)
+ stolenItem := stealFrom.items.pop()
+ child.items.insertAt(0, n.items[i-1])
+ n.items[i-1] = stolenItem
+ if len(stealFrom.children) > 0 {
+ child.children.insertAt(0, stealFrom.children.pop())
+ }
+ } else if i < len(n.items) && len(n.children[i+1].items) > minItems {
+ // steal from right child
+ child := n.mutableChild(i)
+ stealFrom := n.mutableChild(i + 1)
+ stolenItem := stealFrom.items.removeAt(0)
+ child.items = append(child.items, n.items[i])
+ n.items[i] = stolenItem
+ if len(stealFrom.children) > 0 {
+ child.children = append(child.children, stealFrom.children.removeAt(0))
+ }
+ } else {
+ if i >= len(n.items) {
+ i--
+ }
+ child := n.mutableChild(i)
+ // merge with right child
+ mergeItem := n.items.removeAt(i)
+ mergeChild := n.children.removeAt(i + 1).mutableFor(n.cow)
+ child.items = append(child.items, mergeItem)
+ child.items = append(child.items, mergeChild.items...)
+ child.children = append(child.children, mergeChild.children...)
+ n.cow.freeNode(mergeChild)
+ }
+ return n.remove(item, minItems, typ)
+}
+
+type direction int
+
+const (
+ descend = direction(-1)
+ ascend = direction(+1)
+)
+
+// iterate provides a simple method for iterating over elements in the tree.
+//
+// When ascending, the 'start' should be less than 'stop' and when descending,
+// the 'start' should be greater than 'stop'. Setting 'includeStart' to true
+// will force the iterator to include the first item when it equals 'start',
+// thus creating a "greaterOrEqual" or "lessThanEqual" rather than just a
+// "greaterThan" or "lessThan" queries.
+func (n *node) iterate(dir direction, start, stop Item, includeStart bool, hit bool, iter ItemIterator) (bool, bool) {
+ var ok, found bool
+ var index int
+ switch dir {
+ case ascend:
+ if start != nil {
+ index, _ = n.items.find(start)
+ }
+ for i := index; i < len(n.items); i++ {
+ if len(n.children) > 0 {
+ if hit, ok = n.children[i].iterate(dir, start, stop, includeStart, hit, iter); !ok {
+ return hit, false
+ }
+ }
+ if !includeStart && !hit && start != nil && !start.Less(n.items[i]) {
+ hit = true
+ continue
+ }
+ hit = true
+ if stop != nil && !n.items[i].Less(stop) {
+ return hit, false
+ }
+ if !iter(n.items[i]) {
+ return hit, false
+ }
+ }
+ if len(n.children) > 0 {
+ if hit, ok = n.children[len(n.children)-1].iterate(dir, start, stop, includeStart, hit, iter); !ok {
+ return hit, false
+ }
+ }
+ case descend:
+ if start != nil {
+ index, found = n.items.find(start)
+ if !found {
+ index = index - 1
+ }
+ } else {
+ index = len(n.items) - 1
+ }
+ for i := index; i >= 0; i-- {
+ if start != nil && !n.items[i].Less(start) {
+ if !includeStart || hit || start.Less(n.items[i]) {
+ continue
+ }
+ }
+ if len(n.children) > 0 {
+ if hit, ok = n.children[i+1].iterate(dir, start, stop, includeStart, hit, iter); !ok {
+ return hit, false
+ }
+ }
+ if stop != nil && !stop.Less(n.items[i]) {
+ return hit, false // continue
+ }
+ hit = true
+ if !iter(n.items[i]) {
+ return hit, false
+ }
+ }
+ if len(n.children) > 0 {
+ if hit, ok = n.children[0].iterate(dir, start, stop, includeStart, hit, iter); !ok {
+ return hit, false
+ }
+ }
+ }
+ return hit, true
+}
+
+// Used for testing/debugging purposes.
+func (n *node) print(w io.Writer, level int) {
+ fmt.Fprintf(w, "%sNODE:%v\n", strings.Repeat(" ", level), n.items)
+ for _, c := range n.children {
+ c.print(w, level+1)
+ }
+}
+
+// BTree is an implementation of a B-Tree.
+//
+// BTree stores Item instances in an ordered structure, allowing easy insertion,
+// removal, and iteration.
+//
+// Write operations are not safe for concurrent mutation by multiple
+// goroutines, but Read operations are.
+type BTree struct {
+ degree int
+ length int
+ root *node
+ cow *copyOnWriteContext
+}
+
+// copyOnWriteContext pointers determine node ownership... a tree with a write
+// context equivalent to a node's write context is allowed to modify that node.
+// A tree whose write context does not match a node's is not allowed to modify
+// it, and must create a new, writable copy (IE: it's a Clone).
+//
+// When doing any write operation, we maintain the invariant that the current
+// node's context is equal to the context of the tree that requested the write.
+// We do this by, before we descend into any node, creating a copy with the
+// correct context if the contexts don't match.
+//
+// Since the node we're currently visiting on any write has the requesting
+// tree's context, that node is modifiable in place. Children of that node may
+// not share context, but before we descend into them, we'll make a mutable
+// copy.
+type copyOnWriteContext struct {
+ freelist *FreeList
+}
+
+// Clone clones the btree, lazily. Clone should not be called concurrently,
+// but the original tree (t) and the new tree (t2) can be used concurrently
+// once the Clone call completes.
+//
+// The internal tree structure of b is marked read-only and shared between t and
+// t2. Writes to both t and t2 use copy-on-write logic, creating new nodes
+// whenever one of b's original nodes would have been modified. Read operations
+// should have no performance degredation. Write operations for both t and t2
+// will initially experience minor slow-downs caused by additional allocs and
+// copies due to the aforementioned copy-on-write logic, but should converge to
+// the original performance characteristics of the original tree.
+func (t *BTree) Clone() (t2 *BTree) {
+ // Create two entirely new copy-on-write contexts.
+ // This operation effectively creates three trees:
+ // the original, shared nodes (old b.cow)
+ // the new b.cow nodes
+ // the new out.cow nodes
+ cow1, cow2 := *t.cow, *t.cow
+ out := *t
+ t.cow = &cow1
+ out.cow = &cow2
+ return &out
+}
+
+// maxItems returns the max number of items to allow per node.
+func (t *BTree) maxItems() int {
+ return t.degree*2 - 1
+}
+
+// minItems returns the min number of items to allow per node (ignored for the
+// root node).
+func (t *BTree) minItems() int {
+ return t.degree - 1
+}
+
+func (c *copyOnWriteContext) newNode() (n *node) {
+ n = c.freelist.newNode()
+ n.cow = c
+ return
+}
+
+type freeType int
+
+const (
+ ftFreelistFull freeType = iota // node was freed (available for GC, not stored in freelist)
+ ftStored // node was stored in the freelist for later use
+ ftNotOwned // node was ignored by COW, since it's owned by another one
+)
+
+// freeNode frees a node within a given COW context, if it's owned by that
+// context. It returns what happened to the node (see freeType const
+// documentation).
+func (c *copyOnWriteContext) freeNode(n *node) freeType {
+ if n.cow == c {
+ // clear to allow GC
+ n.items.truncate(0)
+ n.children.truncate(0)
+ n.cow = nil
+ if c.freelist.freeNode(n) {
+ return ftStored
+ } else {
+ return ftFreelistFull
+ }
+ } else {
+ return ftNotOwned
+ }
+}
+
+// ReplaceOrInsert adds the given item to the tree. If an item in the tree
+// already equals the given one, it is removed from the tree and returned.
+// Otherwise, nil is returned.
+//
+// nil cannot be added to the tree (will panic).
+func (t *BTree) ReplaceOrInsert(item Item) Item {
+ if item == nil {
+ panic("nil item being added to BTree")
+ }
+ if t.root == nil {
+ t.root = t.cow.newNode()
+ t.root.items = append(t.root.items, item)
+ t.length++
+ return nil
+ } else {
+ t.root = t.root.mutableFor(t.cow)
+ if len(t.root.items) >= t.maxItems() {
+ item2, second := t.root.split(t.maxItems() / 2)
+ oldroot := t.root
+ t.root = t.cow.newNode()
+ t.root.items = append(t.root.items, item2)
+ t.root.children = append(t.root.children, oldroot, second)
+ }
+ }
+ out := t.root.insert(item, t.maxItems())
+ if out == nil {
+ t.length++
+ }
+ return out
+}
+
+// Delete removes an item equal to the passed in item from the tree, returning
+// it. If no such item exists, returns nil.
+func (t *BTree) Delete(item Item) Item {
+ return t.deleteItem(item, removeItem)
+}
+
+// DeleteMin removes the smallest item in the tree and returns it.
+// If no such item exists, returns nil.
+func (t *BTree) DeleteMin() Item {
+ return t.deleteItem(nil, removeMin)
+}
+
+// DeleteMax removes the largest item in the tree and returns it.
+// If no such item exists, returns nil.
+func (t *BTree) DeleteMax() Item {
+ return t.deleteItem(nil, removeMax)
+}
+
+func (t *BTree) deleteItem(item Item, typ toRemove) Item {
+ if t.root == nil || len(t.root.items) == 0 {
+ return nil
+ }
+ t.root = t.root.mutableFor(t.cow)
+ out := t.root.remove(item, t.minItems(), typ)
+ if len(t.root.items) == 0 && len(t.root.children) > 0 {
+ oldroot := t.root
+ t.root = t.root.children[0]
+ t.cow.freeNode(oldroot)
+ }
+ if out != nil {
+ t.length--
+ }
+ return out
+}
+
+// AscendRange calls the iterator for every value in the tree within the range
+// [greaterOrEqual, lessThan), until iterator returns false.
+func (t *BTree) AscendRange(greaterOrEqual, lessThan Item, iterator ItemIterator) {
+ if t.root == nil {
+ return
+ }
+ t.root.iterate(ascend, greaterOrEqual, lessThan, true, false, iterator)
+}
+
+// AscendLessThan calls the iterator for every value in the tree within the range
+// [first, pivot), until iterator returns false.
+func (t *BTree) AscendLessThan(pivot Item, iterator ItemIterator) {
+ if t.root == nil {
+ return
+ }
+ t.root.iterate(ascend, nil, pivot, false, false, iterator)
+}
+
+// AscendGreaterOrEqual calls the iterator for every value in the tree within
+// the range [pivot, last], until iterator returns false.
+func (t *BTree) AscendGreaterOrEqual(pivot Item, iterator ItemIterator) {
+ if t.root == nil {
+ return
+ }
+ t.root.iterate(ascend, pivot, nil, true, false, iterator)
+}
+
+// Ascend calls the iterator for every value in the tree within the range
+// [first, last], until iterator returns false.
+func (t *BTree) Ascend(iterator ItemIterator) {
+ if t.root == nil {
+ return
+ }
+ t.root.iterate(ascend, nil, nil, false, false, iterator)
+}
+
+// DescendRange calls the iterator for every value in the tree within the range
+// [lessOrEqual, greaterThan), until iterator returns false.
+func (t *BTree) DescendRange(lessOrEqual, greaterThan Item, iterator ItemIterator) {
+ if t.root == nil {
+ return
+ }
+ t.root.iterate(descend, lessOrEqual, greaterThan, true, false, iterator)
+}
+
+// DescendLessOrEqual calls the iterator for every value in the tree within the range
+// [pivot, first], until iterator returns false.
+func (t *BTree) DescendLessOrEqual(pivot Item, iterator ItemIterator) {
+ if t.root == nil {
+ return
+ }
+ t.root.iterate(descend, pivot, nil, true, false, iterator)
+}
+
+// DescendGreaterThan calls the iterator for every value in the tree within
+// the range [last, pivot), until iterator returns false.
+func (t *BTree) DescendGreaterThan(pivot Item, iterator ItemIterator) {
+ if t.root == nil {
+ return
+ }
+ t.root.iterate(descend, nil, pivot, false, false, iterator)
+}
+
+// Descend calls the iterator for every value in the tree within the range
+// [last, first], until iterator returns false.
+func (t *BTree) Descend(iterator ItemIterator) {
+ if t.root == nil {
+ return
+ }
+ t.root.iterate(descend, nil, nil, false, false, iterator)
+}
+
+// Get looks for the key item in the tree, returning it. It returns nil if
+// unable to find that item.
+func (t *BTree) Get(key Item) Item {
+ if t.root == nil {
+ return nil
+ }
+ return t.root.get(key)
+}
+
+// Min returns the smallest item in the tree, or nil if the tree is empty.
+func (t *BTree) Min() Item {
+ return min(t.root)
+}
+
+// Max returns the largest item in the tree, or nil if the tree is empty.
+func (t *BTree) Max() Item {
+ return max(t.root)
+}
+
+// Has returns true if the given key is in the tree.
+func (t *BTree) Has(key Item) bool {
+ return t.Get(key) != nil
+}
+
+// Len returns the number of items currently in the tree.
+func (t *BTree) Len() int {
+ return t.length
+}
+
+// Clear removes all items from the btree. If addNodesToFreelist is true,
+// t's nodes are added to its freelist as part of this call, until the freelist
+// is full. Otherwise, the root node is simply dereferenced and the subtree
+// left to Go's normal GC processes.
+//
+// This can be much faster
+// than calling Delete on all elements, because that requires finding/removing
+// each element in the tree and updating the tree accordingly. It also is
+// somewhat faster than creating a new tree to replace the old one, because
+// nodes from the old tree are reclaimed into the freelist for use by the new
+// one, instead of being lost to the garbage collector.
+//
+// This call takes:
+// O(1): when addNodesToFreelist is false, this is a single operation.
+// O(1): when the freelist is already full, it breaks out immediately
+// O(freelist size): when the freelist is empty and the nodes are all owned
+// by this tree, nodes are added to the freelist until full.
+// O(tree size): when all nodes are owned by another tree, all nodes are
+// iterated over looking for nodes to add to the freelist, and due to
+// ownership, none are.
+func (t *BTree) Clear(addNodesToFreelist bool) {
+ if t.root != nil && addNodesToFreelist {
+ t.root.reset(t.cow)
+ }
+ t.root, t.length = nil, 0
+}
+
+// reset returns a subtree to the freelist. It breaks out immediately if the
+// freelist is full, since the only benefit of iterating is to fill that
+// freelist up. Returns true if parent reset call should continue.
+func (n *node) reset(c *copyOnWriteContext) bool {
+ for _, child := range n.children {
+ if !child.reset(c) {
+ return false
+ }
+ }
+ return c.freeNode(n) != ftFreelistFull
+}
+
+// Int implements the Item interface for integers.
+type Int int
+
+// Less returns true if int(a) < int(b).
+func (a Int) Less(b Item) bool {
+ return a < b.(Int)
+}
diff --git a/vendor/github.com/google/btree/btree_generic.go b/vendor/github.com/google/btree/btree_generic.go
new file mode 100644
index 00000000000..e44a0f48804
--- /dev/null
+++ b/vendor/github.com/google/btree/btree_generic.go
@@ -0,0 +1,1083 @@
+// Copyright 2014-2022 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//go:build go1.18
+// +build go1.18
+
+// In Go 1.18 and beyond, a BTreeG generic is created, and BTree is a specific
+// instantiation of that generic for the Item interface, with a backwards-
+// compatible API. Before go1.18, generics are not supported,
+// and BTree is just an implementation based around the Item interface.
+
+// Package btree implements in-memory B-Trees of arbitrary degree.
+//
+// btree implements an in-memory B-Tree for use as an ordered data structure.
+// It is not meant for persistent storage solutions.
+//
+// It has a flatter structure than an equivalent red-black or other binary tree,
+// which in some cases yields better memory usage and/or performance.
+// See some discussion on the matter here:
+// http://google-opensource.blogspot.com/2013/01/c-containers-that-save-memory-and-time.html
+// Note, though, that this project is in no way related to the C++ B-Tree
+// implementation written about there.
+//
+// Within this tree, each node contains a slice of items and a (possibly nil)
+// slice of children. For basic numeric values or raw structs, this can cause
+// efficiency differences when compared to equivalent C++ template code that
+// stores values in arrays within the node:
+// * Due to the overhead of storing values as interfaces (each
+// value needs to be stored as the value itself, then 2 words for the
+// interface pointing to that value and its type), resulting in higher
+// memory use.
+// * Since interfaces can point to values anywhere in memory, values are
+// most likely not stored in contiguous blocks, resulting in a higher
+// number of cache misses.
+// These issues don't tend to matter, though, when working with strings or other
+// heap-allocated structures, since C++-equivalent structures also must store
+// pointers and also distribute their values across the heap.
+//
+// This implementation is designed to be a drop-in replacement to gollrb.LLRB
+// trees, (http://github.com/petar/gollrb), an excellent and probably the most
+// widely used ordered tree implementation in the Go ecosystem currently.
+// Its functions, therefore, exactly mirror those of
+// llrb.LLRB where possible. Unlike gollrb, though, we currently don't
+// support storing multiple equivalent values.
+//
+// There are two implementations; those suffixed with 'G' are generics, usable
+// for any type, and require a passed-in "less" function to define their ordering.
+// Those without this prefix are specific to the 'Item' interface, and use
+// its 'Less' function for ordering.
+package btree
+
+import (
+ "fmt"
+ "io"
+ "sort"
+ "strings"
+ "sync"
+)
+
+// Item represents a single object in the tree.
+type Item interface {
+ // Less tests whether the current item is less than the given argument.
+ //
+ // This must provide a strict weak ordering.
+ // If !a.Less(b) && !b.Less(a), we treat this to mean a == b (i.e. we can only
+ // hold one of either a or b in the tree).
+ Less(than Item) bool
+}
+
+const (
+ DefaultFreeListSize = 32
+)
+
+// FreeListG represents a free list of btree nodes. By default each
+// BTree has its own FreeList, but multiple BTrees can share the same
+// FreeList, in particular when they're created with Clone.
+// Two Btrees using the same freelist are safe for concurrent write access.
+type FreeListG[T any] struct {
+ mu sync.Mutex
+ freelist []*node[T]
+}
+
+// NewFreeListG creates a new free list.
+// size is the maximum size of the returned free list.
+func NewFreeListG[T any](size int) *FreeListG[T] {
+ return &FreeListG[T]{freelist: make([]*node[T], 0, size)}
+}
+
+func (f *FreeListG[T]) newNode() (n *node[T]) {
+ f.mu.Lock()
+ index := len(f.freelist) - 1
+ if index < 0 {
+ f.mu.Unlock()
+ return new(node[T])
+ }
+ n = f.freelist[index]
+ f.freelist[index] = nil
+ f.freelist = f.freelist[:index]
+ f.mu.Unlock()
+ return
+}
+
+func (f *FreeListG[T]) freeNode(n *node[T]) (out bool) {
+ f.mu.Lock()
+ if len(f.freelist) < cap(f.freelist) {
+ f.freelist = append(f.freelist, n)
+ out = true
+ }
+ f.mu.Unlock()
+ return
+}
+
+// ItemIteratorG allows callers of {A/De}scend* to iterate in-order over portions of
+// the tree. When this function returns false, iteration will stop and the
+// associated Ascend* function will immediately return.
+type ItemIteratorG[T any] func(item T) bool
+
+// Ordered represents the set of types for which the '<' operator work.
+type Ordered interface {
+ ~int | ~int8 | ~int16 | ~int32 | ~int64 | ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~float32 | ~float64 | ~string
+}
+
+// Less[T] returns a default LessFunc that uses the '<' operator for types that support it.
+func Less[T Ordered]() LessFunc[T] {
+ return func(a, b T) bool { return a < b }
+}
+
+// NewOrderedG creates a new B-Tree for ordered types.
+func NewOrderedG[T Ordered](degree int) *BTreeG[T] {
+ return NewG[T](degree, Less[T]())
+}
+
+// NewG creates a new B-Tree with the given degree.
+//
+// NewG(2), for example, will create a 2-3-4 tree (each node contains 1-3 items
+// and 2-4 children).
+//
+// The passed-in LessFunc determines how objects of type T are ordered.
+func NewG[T any](degree int, less LessFunc[T]) *BTreeG[T] {
+ return NewWithFreeListG(degree, less, NewFreeListG[T](DefaultFreeListSize))
+}
+
+// NewWithFreeListG creates a new B-Tree that uses the given node free list.
+func NewWithFreeListG[T any](degree int, less LessFunc[T], f *FreeListG[T]) *BTreeG[T] {
+ if degree <= 1 {
+ panic("bad degree")
+ }
+ return &BTreeG[T]{
+ degree: degree,
+ cow: ©OnWriteContext[T]{freelist: f, less: less},
+ }
+}
+
+// items stores items in a node.
+type items[T any] []T
+
+// insertAt inserts a value into the given index, pushing all subsequent values
+// forward.
+func (s *items[T]) insertAt(index int, item T) {
+ var zero T
+ *s = append(*s, zero)
+ if index < len(*s) {
+ copy((*s)[index+1:], (*s)[index:])
+ }
+ (*s)[index] = item
+}
+
+// removeAt removes a value at a given index, pulling all subsequent values
+// back.
+func (s *items[T]) removeAt(index int) T {
+ item := (*s)[index]
+ copy((*s)[index:], (*s)[index+1:])
+ var zero T
+ (*s)[len(*s)-1] = zero
+ *s = (*s)[:len(*s)-1]
+ return item
+}
+
+// pop removes and returns the last element in the list.
+func (s *items[T]) pop() (out T) {
+ index := len(*s) - 1
+ out = (*s)[index]
+ var zero T
+ (*s)[index] = zero
+ *s = (*s)[:index]
+ return
+}
+
+// truncate truncates this instance at index so that it contains only the
+// first index items. index must be less than or equal to length.
+func (s *items[T]) truncate(index int) {
+ var toClear items[T]
+ *s, toClear = (*s)[:index], (*s)[index:]
+ var zero T
+ for i := 0; i < len(toClear); i++ {
+ toClear[i] = zero
+ }
+}
+
+// find returns the index where the given item should be inserted into this
+// list. 'found' is true if the item already exists in the list at the given
+// index.
+func (s items[T]) find(item T, less func(T, T) bool) (index int, found bool) {
+ i := sort.Search(len(s), func(i int) bool {
+ return less(item, s[i])
+ })
+ if i > 0 && !less(s[i-1], item) {
+ return i - 1, true
+ }
+ return i, false
+}
+
+// node is an internal node in a tree.
+//
+// It must at all times maintain the invariant that either
+// * len(children) == 0, len(items) unconstrained
+// * len(children) == len(items) + 1
+type node[T any] struct {
+ items items[T]
+ children items[*node[T]]
+ cow *copyOnWriteContext[T]
+}
+
+func (n *node[T]) mutableFor(cow *copyOnWriteContext[T]) *node[T] {
+ if n.cow == cow {
+ return n
+ }
+ out := cow.newNode()
+ if cap(out.items) >= len(n.items) {
+ out.items = out.items[:len(n.items)]
+ } else {
+ out.items = make(items[T], len(n.items), cap(n.items))
+ }
+ copy(out.items, n.items)
+ // Copy children
+ if cap(out.children) >= len(n.children) {
+ out.children = out.children[:len(n.children)]
+ } else {
+ out.children = make(items[*node[T]], len(n.children), cap(n.children))
+ }
+ copy(out.children, n.children)
+ return out
+}
+
+func (n *node[T]) mutableChild(i int) *node[T] {
+ c := n.children[i].mutableFor(n.cow)
+ n.children[i] = c
+ return c
+}
+
+// split splits the given node at the given index. The current node shrinks,
+// and this function returns the item that existed at that index and a new node
+// containing all items/children after it.
+func (n *node[T]) split(i int) (T, *node[T]) {
+ item := n.items[i]
+ next := n.cow.newNode()
+ next.items = append(next.items, n.items[i+1:]...)
+ n.items.truncate(i)
+ if len(n.children) > 0 {
+ next.children = append(next.children, n.children[i+1:]...)
+ n.children.truncate(i + 1)
+ }
+ return item, next
+}
+
+// maybeSplitChild checks if a child should be split, and if so splits it.
+// Returns whether or not a split occurred.
+func (n *node[T]) maybeSplitChild(i, maxItems int) bool {
+ if len(n.children[i].items) < maxItems {
+ return false
+ }
+ first := n.mutableChild(i)
+ item, second := first.split(maxItems / 2)
+ n.items.insertAt(i, item)
+ n.children.insertAt(i+1, second)
+ return true
+}
+
+// insert inserts an item into the subtree rooted at this node, making sure
+// no nodes in the subtree exceed maxItems items. Should an equivalent item be
+// be found/replaced by insert, it will be returned.
+func (n *node[T]) insert(item T, maxItems int) (_ T, _ bool) {
+ i, found := n.items.find(item, n.cow.less)
+ if found {
+ out := n.items[i]
+ n.items[i] = item
+ return out, true
+ }
+ if len(n.children) == 0 {
+ n.items.insertAt(i, item)
+ return
+ }
+ if n.maybeSplitChild(i, maxItems) {
+ inTree := n.items[i]
+ switch {
+ case n.cow.less(item, inTree):
+ // no change, we want first split node
+ case n.cow.less(inTree, item):
+ i++ // we want second split node
+ default:
+ out := n.items[i]
+ n.items[i] = item
+ return out, true
+ }
+ }
+ return n.mutableChild(i).insert(item, maxItems)
+}
+
+// get finds the given key in the subtree and returns it.
+func (n *node[T]) get(key T) (_ T, _ bool) {
+ i, found := n.items.find(key, n.cow.less)
+ if found {
+ return n.items[i], true
+ } else if len(n.children) > 0 {
+ return n.children[i].get(key)
+ }
+ return
+}
+
+// min returns the first item in the subtree.
+func min[T any](n *node[T]) (_ T, found bool) {
+ if n == nil {
+ return
+ }
+ for len(n.children) > 0 {
+ n = n.children[0]
+ }
+ if len(n.items) == 0 {
+ return
+ }
+ return n.items[0], true
+}
+
+// max returns the last item in the subtree.
+func max[T any](n *node[T]) (_ T, found bool) {
+ if n == nil {
+ return
+ }
+ for len(n.children) > 0 {
+ n = n.children[len(n.children)-1]
+ }
+ if len(n.items) == 0 {
+ return
+ }
+ return n.items[len(n.items)-1], true
+}
+
+// toRemove details what item to remove in a node.remove call.
+type toRemove int
+
+const (
+ removeItem toRemove = iota // removes the given item
+ removeMin // removes smallest item in the subtree
+ removeMax // removes largest item in the subtree
+)
+
+// remove removes an item from the subtree rooted at this node.
+func (n *node[T]) remove(item T, minItems int, typ toRemove) (_ T, _ bool) {
+ var i int
+ var found bool
+ switch typ {
+ case removeMax:
+ if len(n.children) == 0 {
+ return n.items.pop(), true
+ }
+ i = len(n.items)
+ case removeMin:
+ if len(n.children) == 0 {
+ return n.items.removeAt(0), true
+ }
+ i = 0
+ case removeItem:
+ i, found = n.items.find(item, n.cow.less)
+ if len(n.children) == 0 {
+ if found {
+ return n.items.removeAt(i), true
+ }
+ return
+ }
+ default:
+ panic("invalid type")
+ }
+ // If we get to here, we have children.
+ if len(n.children[i].items) <= minItems {
+ return n.growChildAndRemove(i, item, minItems, typ)
+ }
+ child := n.mutableChild(i)
+ // Either we had enough items to begin with, or we've done some
+ // merging/stealing, because we've got enough now and we're ready to return
+ // stuff.
+ if found {
+ // The item exists at index 'i', and the child we've selected can give us a
+ // predecessor, since if we've gotten here it's got > minItems items in it.
+ out := n.items[i]
+ // We use our special-case 'remove' call with typ=maxItem to pull the
+ // predecessor of item i (the rightmost leaf of our immediate left child)
+ // and set it into where we pulled the item from.
+ var zero T
+ n.items[i], _ = child.remove(zero, minItems, removeMax)
+ return out, true
+ }
+ // Final recursive call. Once we're here, we know that the item isn't in this
+ // node and that the child is big enough to remove from.
+ return child.remove(item, minItems, typ)
+}
+
+// growChildAndRemove grows child 'i' to make sure it's possible to remove an
+// item from it while keeping it at minItems, then calls remove to actually
+// remove it.
+//
+// Most documentation says we have to do two sets of special casing:
+// 1) item is in this node
+// 2) item is in child
+// In both cases, we need to handle the two subcases:
+// A) node has enough values that it can spare one
+// B) node doesn't have enough values
+// For the latter, we have to check:
+// a) left sibling has node to spare
+// b) right sibling has node to spare
+// c) we must merge
+// To simplify our code here, we handle cases #1 and #2 the same:
+// If a node doesn't have enough items, we make sure it does (using a,b,c).
+// We then simply redo our remove call, and the second time (regardless of
+// whether we're in case 1 or 2), we'll have enough items and can guarantee
+// that we hit case A.
+func (n *node[T]) growChildAndRemove(i int, item T, minItems int, typ toRemove) (T, bool) {
+ if i > 0 && len(n.children[i-1].items) > minItems {
+ // Steal from left child
+ child := n.mutableChild(i)
+ stealFrom := n.mutableChild(i - 1)
+ stolenItem := stealFrom.items.pop()
+ child.items.insertAt(0, n.items[i-1])
+ n.items[i-1] = stolenItem
+ if len(stealFrom.children) > 0 {
+ child.children.insertAt(0, stealFrom.children.pop())
+ }
+ } else if i < len(n.items) && len(n.children[i+1].items) > minItems {
+ // steal from right child
+ child := n.mutableChild(i)
+ stealFrom := n.mutableChild(i + 1)
+ stolenItem := stealFrom.items.removeAt(0)
+ child.items = append(child.items, n.items[i])
+ n.items[i] = stolenItem
+ if len(stealFrom.children) > 0 {
+ child.children = append(child.children, stealFrom.children.removeAt(0))
+ }
+ } else {
+ if i >= len(n.items) {
+ i--
+ }
+ child := n.mutableChild(i)
+ // merge with right child
+ mergeItem := n.items.removeAt(i)
+ mergeChild := n.children.removeAt(i + 1)
+ child.items = append(child.items, mergeItem)
+ child.items = append(child.items, mergeChild.items...)
+ child.children = append(child.children, mergeChild.children...)
+ n.cow.freeNode(mergeChild)
+ }
+ return n.remove(item, minItems, typ)
+}
+
+type direction int
+
+const (
+ descend = direction(-1)
+ ascend = direction(+1)
+)
+
+type optionalItem[T any] struct {
+ item T
+ valid bool
+}
+
+func optional[T any](item T) optionalItem[T] {
+ return optionalItem[T]{item: item, valid: true}
+}
+func empty[T any]() optionalItem[T] {
+ return optionalItem[T]{}
+}
+
+// iterate provides a simple method for iterating over elements in the tree.
+//
+// When ascending, the 'start' should be less than 'stop' and when descending,
+// the 'start' should be greater than 'stop'. Setting 'includeStart' to true
+// will force the iterator to include the first item when it equals 'start',
+// thus creating a "greaterOrEqual" or "lessThanEqual" rather than just a
+// "greaterThan" or "lessThan" queries.
+func (n *node[T]) iterate(dir direction, start, stop optionalItem[T], includeStart bool, hit bool, iter ItemIteratorG[T]) (bool, bool) {
+ var ok, found bool
+ var index int
+ switch dir {
+ case ascend:
+ if start.valid {
+ index, _ = n.items.find(start.item, n.cow.less)
+ }
+ for i := index; i < len(n.items); i++ {
+ if len(n.children) > 0 {
+ if hit, ok = n.children[i].iterate(dir, start, stop, includeStart, hit, iter); !ok {
+ return hit, false
+ }
+ }
+ if !includeStart && !hit && start.valid && !n.cow.less(start.item, n.items[i]) {
+ hit = true
+ continue
+ }
+ hit = true
+ if stop.valid && !n.cow.less(n.items[i], stop.item) {
+ return hit, false
+ }
+ if !iter(n.items[i]) {
+ return hit, false
+ }
+ }
+ if len(n.children) > 0 {
+ if hit, ok = n.children[len(n.children)-1].iterate(dir, start, stop, includeStart, hit, iter); !ok {
+ return hit, false
+ }
+ }
+ case descend:
+ if start.valid {
+ index, found = n.items.find(start.item, n.cow.less)
+ if !found {
+ index = index - 1
+ }
+ } else {
+ index = len(n.items) - 1
+ }
+ for i := index; i >= 0; i-- {
+ if start.valid && !n.cow.less(n.items[i], start.item) {
+ if !includeStart || hit || n.cow.less(start.item, n.items[i]) {
+ continue
+ }
+ }
+ if len(n.children) > 0 {
+ if hit, ok = n.children[i+1].iterate(dir, start, stop, includeStart, hit, iter); !ok {
+ return hit, false
+ }
+ }
+ if stop.valid && !n.cow.less(stop.item, n.items[i]) {
+ return hit, false // continue
+ }
+ hit = true
+ if !iter(n.items[i]) {
+ return hit, false
+ }
+ }
+ if len(n.children) > 0 {
+ if hit, ok = n.children[0].iterate(dir, start, stop, includeStart, hit, iter); !ok {
+ return hit, false
+ }
+ }
+ }
+ return hit, true
+}
+
+// print is used for testing/debugging purposes.
+func (n *node[T]) print(w io.Writer, level int) {
+ fmt.Fprintf(w, "%sNODE:%v\n", strings.Repeat(" ", level), n.items)
+ for _, c := range n.children {
+ c.print(w, level+1)
+ }
+}
+
+// BTreeG is a generic implementation of a B-Tree.
+//
+// BTreeG stores items of type T in an ordered structure, allowing easy insertion,
+// removal, and iteration.
+//
+// Write operations are not safe for concurrent mutation by multiple
+// goroutines, but Read operations are.
+type BTreeG[T any] struct {
+ degree int
+ length int
+ root *node[T]
+ cow *copyOnWriteContext[T]
+}
+
+// LessFunc[T] determines how to order a type 'T'. It should implement a strict
+// ordering, and should return true if within that ordering, 'a' < 'b'.
+type LessFunc[T any] func(a, b T) bool
+
+// copyOnWriteContext pointers determine node ownership... a tree with a write
+// context equivalent to a node's write context is allowed to modify that node.
+// A tree whose write context does not match a node's is not allowed to modify
+// it, and must create a new, writable copy (IE: it's a Clone).
+//
+// When doing any write operation, we maintain the invariant that the current
+// node's context is equal to the context of the tree that requested the write.
+// We do this by, before we descend into any node, creating a copy with the
+// correct context if the contexts don't match.
+//
+// Since the node we're currently visiting on any write has the requesting
+// tree's context, that node is modifiable in place. Children of that node may
+// not share context, but before we descend into them, we'll make a mutable
+// copy.
+type copyOnWriteContext[T any] struct {
+ freelist *FreeListG[T]
+ less LessFunc[T]
+}
+
+// Clone clones the btree, lazily. Clone should not be called concurrently,
+// but the original tree (t) and the new tree (t2) can be used concurrently
+// once the Clone call completes.
+//
+// The internal tree structure of b is marked read-only and shared between t and
+// t2. Writes to both t and t2 use copy-on-write logic, creating new nodes
+// whenever one of b's original nodes would have been modified. Read operations
+// should have no performance degredation. Write operations for both t and t2
+// will initially experience minor slow-downs caused by additional allocs and
+// copies due to the aforementioned copy-on-write logic, but should converge to
+// the original performance characteristics of the original tree.
+func (t *BTreeG[T]) Clone() (t2 *BTreeG[T]) {
+ // Create two entirely new copy-on-write contexts.
+ // This operation effectively creates three trees:
+ // the original, shared nodes (old b.cow)
+ // the new b.cow nodes
+ // the new out.cow nodes
+ cow1, cow2 := *t.cow, *t.cow
+ out := *t
+ t.cow = &cow1
+ out.cow = &cow2
+ return &out
+}
+
+// maxItems returns the max number of items to allow per node.
+func (t *BTreeG[T]) maxItems() int {
+ return t.degree*2 - 1
+}
+
+// minItems returns the min number of items to allow per node (ignored for the
+// root node).
+func (t *BTreeG[T]) minItems() int {
+ return t.degree - 1
+}
+
+func (c *copyOnWriteContext[T]) newNode() (n *node[T]) {
+ n = c.freelist.newNode()
+ n.cow = c
+ return
+}
+
+type freeType int
+
+const (
+ ftFreelistFull freeType = iota // node was freed (available for GC, not stored in freelist)
+ ftStored // node was stored in the freelist for later use
+ ftNotOwned // node was ignored by COW, since it's owned by another one
+)
+
+// freeNode frees a node within a given COW context, if it's owned by that
+// context. It returns what happened to the node (see freeType const
+// documentation).
+func (c *copyOnWriteContext[T]) freeNode(n *node[T]) freeType {
+ if n.cow == c {
+ // clear to allow GC
+ n.items.truncate(0)
+ n.children.truncate(0)
+ n.cow = nil
+ if c.freelist.freeNode(n) {
+ return ftStored
+ } else {
+ return ftFreelistFull
+ }
+ } else {
+ return ftNotOwned
+ }
+}
+
+// ReplaceOrInsert adds the given item to the tree. If an item in the tree
+// already equals the given one, it is removed from the tree and returned,
+// and the second return value is true. Otherwise, (zeroValue, false)
+//
+// nil cannot be added to the tree (will panic).
+func (t *BTreeG[T]) ReplaceOrInsert(item T) (_ T, _ bool) {
+ if t.root == nil {
+ t.root = t.cow.newNode()
+ t.root.items = append(t.root.items, item)
+ t.length++
+ return
+ } else {
+ t.root = t.root.mutableFor(t.cow)
+ if len(t.root.items) >= t.maxItems() {
+ item2, second := t.root.split(t.maxItems() / 2)
+ oldroot := t.root
+ t.root = t.cow.newNode()
+ t.root.items = append(t.root.items, item2)
+ t.root.children = append(t.root.children, oldroot, second)
+ }
+ }
+ out, outb := t.root.insert(item, t.maxItems())
+ if !outb {
+ t.length++
+ }
+ return out, outb
+}
+
+// Delete removes an item equal to the passed in item from the tree, returning
+// it. If no such item exists, returns (zeroValue, false).
+func (t *BTreeG[T]) Delete(item T) (T, bool) {
+ return t.deleteItem(item, removeItem)
+}
+
+// DeleteMin removes the smallest item in the tree and returns it.
+// If no such item exists, returns (zeroValue, false).
+func (t *BTreeG[T]) DeleteMin() (T, bool) {
+ var zero T
+ return t.deleteItem(zero, removeMin)
+}
+
+// DeleteMax removes the largest item in the tree and returns it.
+// If no such item exists, returns (zeroValue, false).
+func (t *BTreeG[T]) DeleteMax() (T, bool) {
+ var zero T
+ return t.deleteItem(zero, removeMax)
+}
+
+func (t *BTreeG[T]) deleteItem(item T, typ toRemove) (_ T, _ bool) {
+ if t.root == nil || len(t.root.items) == 0 {
+ return
+ }
+ t.root = t.root.mutableFor(t.cow)
+ out, outb := t.root.remove(item, t.minItems(), typ)
+ if len(t.root.items) == 0 && len(t.root.children) > 0 {
+ oldroot := t.root
+ t.root = t.root.children[0]
+ t.cow.freeNode(oldroot)
+ }
+ if outb {
+ t.length--
+ }
+ return out, outb
+}
+
+// AscendRange calls the iterator for every value in the tree within the range
+// [greaterOrEqual, lessThan), until iterator returns false.
+func (t *BTreeG[T]) AscendRange(greaterOrEqual, lessThan T, iterator ItemIteratorG[T]) {
+ if t.root == nil {
+ return
+ }
+ t.root.iterate(ascend, optional[T](greaterOrEqual), optional[T](lessThan), true, false, iterator)
+}
+
+// AscendLessThan calls the iterator for every value in the tree within the range
+// [first, pivot), until iterator returns false.
+func (t *BTreeG[T]) AscendLessThan(pivot T, iterator ItemIteratorG[T]) {
+ if t.root == nil {
+ return
+ }
+ t.root.iterate(ascend, empty[T](), optional(pivot), false, false, iterator)
+}
+
+// AscendGreaterOrEqual calls the iterator for every value in the tree within
+// the range [pivot, last], until iterator returns false.
+func (t *BTreeG[T]) AscendGreaterOrEqual(pivot T, iterator ItemIteratorG[T]) {
+ if t.root == nil {
+ return
+ }
+ t.root.iterate(ascend, optional[T](pivot), empty[T](), true, false, iterator)
+}
+
+// Ascend calls the iterator for every value in the tree within the range
+// [first, last], until iterator returns false.
+func (t *BTreeG[T]) Ascend(iterator ItemIteratorG[T]) {
+ if t.root == nil {
+ return
+ }
+ t.root.iterate(ascend, empty[T](), empty[T](), false, false, iterator)
+}
+
+// DescendRange calls the iterator for every value in the tree within the range
+// [lessOrEqual, greaterThan), until iterator returns false.
+func (t *BTreeG[T]) DescendRange(lessOrEqual, greaterThan T, iterator ItemIteratorG[T]) {
+ if t.root == nil {
+ return
+ }
+ t.root.iterate(descend, optional[T](lessOrEqual), optional[T](greaterThan), true, false, iterator)
+}
+
+// DescendLessOrEqual calls the iterator for every value in the tree within the range
+// [pivot, first], until iterator returns false.
+func (t *BTreeG[T]) DescendLessOrEqual(pivot T, iterator ItemIteratorG[T]) {
+ if t.root == nil {
+ return
+ }
+ t.root.iterate(descend, optional[T](pivot), empty[T](), true, false, iterator)
+}
+
+// DescendGreaterThan calls the iterator for every value in the tree within
+// the range [last, pivot), until iterator returns false.
+func (t *BTreeG[T]) DescendGreaterThan(pivot T, iterator ItemIteratorG[T]) {
+ if t.root == nil {
+ return
+ }
+ t.root.iterate(descend, empty[T](), optional[T](pivot), false, false, iterator)
+}
+
+// Descend calls the iterator for every value in the tree within the range
+// [last, first], until iterator returns false.
+func (t *BTreeG[T]) Descend(iterator ItemIteratorG[T]) {
+ if t.root == nil {
+ return
+ }
+ t.root.iterate(descend, empty[T](), empty[T](), false, false, iterator)
+}
+
+// Get looks for the key item in the tree, returning it. It returns
+// (zeroValue, false) if unable to find that item.
+func (t *BTreeG[T]) Get(key T) (_ T, _ bool) {
+ if t.root == nil {
+ return
+ }
+ return t.root.get(key)
+}
+
+// Min returns the smallest item in the tree, or (zeroValue, false) if the tree is empty.
+func (t *BTreeG[T]) Min() (_ T, _ bool) {
+ return min(t.root)
+}
+
+// Max returns the largest item in the tree, or (zeroValue, false) if the tree is empty.
+func (t *BTreeG[T]) Max() (_ T, _ bool) {
+ return max(t.root)
+}
+
+// Has returns true if the given key is in the tree.
+func (t *BTreeG[T]) Has(key T) bool {
+ _, ok := t.Get(key)
+ return ok
+}
+
+// Len returns the number of items currently in the tree.
+func (t *BTreeG[T]) Len() int {
+ return t.length
+}
+
+// Clear removes all items from the btree. If addNodesToFreelist is true,
+// t's nodes are added to its freelist as part of this call, until the freelist
+// is full. Otherwise, the root node is simply dereferenced and the subtree
+// left to Go's normal GC processes.
+//
+// This can be much faster
+// than calling Delete on all elements, because that requires finding/removing
+// each element in the tree and updating the tree accordingly. It also is
+// somewhat faster than creating a new tree to replace the old one, because
+// nodes from the old tree are reclaimed into the freelist for use by the new
+// one, instead of being lost to the garbage collector.
+//
+// This call takes:
+// O(1): when addNodesToFreelist is false, this is a single operation.
+// O(1): when the freelist is already full, it breaks out immediately
+// O(freelist size): when the freelist is empty and the nodes are all owned
+// by this tree, nodes are added to the freelist until full.
+// O(tree size): when all nodes are owned by another tree, all nodes are
+// iterated over looking for nodes to add to the freelist, and due to
+// ownership, none are.
+func (t *BTreeG[T]) Clear(addNodesToFreelist bool) {
+ if t.root != nil && addNodesToFreelist {
+ t.root.reset(t.cow)
+ }
+ t.root, t.length = nil, 0
+}
+
+// reset returns a subtree to the freelist. It breaks out immediately if the
+// freelist is full, since the only benefit of iterating is to fill that
+// freelist up. Returns true if parent reset call should continue.
+func (n *node[T]) reset(c *copyOnWriteContext[T]) bool {
+ for _, child := range n.children {
+ if !child.reset(c) {
+ return false
+ }
+ }
+ return c.freeNode(n) != ftFreelistFull
+}
+
+// Int implements the Item interface for integers.
+type Int int
+
+// Less returns true if int(a) < int(b).
+func (a Int) Less(b Item) bool {
+ return a < b.(Int)
+}
+
+// BTree is an implementation of a B-Tree.
+//
+// BTree stores Item instances in an ordered structure, allowing easy insertion,
+// removal, and iteration.
+//
+// Write operations are not safe for concurrent mutation by multiple
+// goroutines, but Read operations are.
+type BTree BTreeG[Item]
+
+var itemLess LessFunc[Item] = func(a, b Item) bool {
+ return a.Less(b)
+}
+
+// New creates a new B-Tree with the given degree.
+//
+// New(2), for example, will create a 2-3-4 tree (each node contains 1-3 items
+// and 2-4 children).
+func New(degree int) *BTree {
+ return (*BTree)(NewG[Item](degree, itemLess))
+}
+
+// FreeList represents a free list of btree nodes. By default each
+// BTree has its own FreeList, but multiple BTrees can share the same
+// FreeList.
+// Two Btrees using the same freelist are safe for concurrent write access.
+type FreeList FreeListG[Item]
+
+// NewFreeList creates a new free list.
+// size is the maximum size of the returned free list.
+func NewFreeList(size int) *FreeList {
+ return (*FreeList)(NewFreeListG[Item](size))
+}
+
+// NewWithFreeList creates a new B-Tree that uses the given node free list.
+func NewWithFreeList(degree int, f *FreeList) *BTree {
+ return (*BTree)(NewWithFreeListG[Item](degree, itemLess, (*FreeListG[Item])(f)))
+}
+
+// ItemIterator allows callers of Ascend* to iterate in-order over portions of
+// the tree. When this function returns false, iteration will stop and the
+// associated Ascend* function will immediately return.
+type ItemIterator ItemIteratorG[Item]
+
+// Clone clones the btree, lazily. Clone should not be called concurrently,
+// but the original tree (t) and the new tree (t2) can be used concurrently
+// once the Clone call completes.
+//
+// The internal tree structure of b is marked read-only and shared between t and
+// t2. Writes to both t and t2 use copy-on-write logic, creating new nodes
+// whenever one of b's original nodes would have been modified. Read operations
+// should have no performance degredation. Write operations for both t and t2
+// will initially experience minor slow-downs caused by additional allocs and
+// copies due to the aforementioned copy-on-write logic, but should converge to
+// the original performance characteristics of the original tree.
+func (t *BTree) Clone() (t2 *BTree) {
+ return (*BTree)((*BTreeG[Item])(t).Clone())
+}
+
+// Delete removes an item equal to the passed in item from the tree, returning
+// it. If no such item exists, returns nil.
+func (t *BTree) Delete(item Item) Item {
+ i, _ := (*BTreeG[Item])(t).Delete(item)
+ return i
+}
+
+// DeleteMax removes the largest item in the tree and returns it.
+// If no such item exists, returns nil.
+func (t *BTree) DeleteMax() Item {
+ i, _ := (*BTreeG[Item])(t).DeleteMax()
+ return i
+}
+
+// DeleteMin removes the smallest item in the tree and returns it.
+// If no such item exists, returns nil.
+func (t *BTree) DeleteMin() Item {
+ i, _ := (*BTreeG[Item])(t).DeleteMin()
+ return i
+}
+
+// Get looks for the key item in the tree, returning it. It returns nil if
+// unable to find that item.
+func (t *BTree) Get(key Item) Item {
+ i, _ := (*BTreeG[Item])(t).Get(key)
+ return i
+}
+
+// Max returns the largest item in the tree, or nil if the tree is empty.
+func (t *BTree) Max() Item {
+ i, _ := (*BTreeG[Item])(t).Max()
+ return i
+}
+
+// Min returns the smallest item in the tree, or nil if the tree is empty.
+func (t *BTree) Min() Item {
+ i, _ := (*BTreeG[Item])(t).Min()
+ return i
+}
+
+// Has returns true if the given key is in the tree.
+func (t *BTree) Has(key Item) bool {
+ return (*BTreeG[Item])(t).Has(key)
+}
+
+// ReplaceOrInsert adds the given item to the tree. If an item in the tree
+// already equals the given one, it is removed from the tree and returned.
+// Otherwise, nil is returned.
+//
+// nil cannot be added to the tree (will panic).
+func (t *BTree) ReplaceOrInsert(item Item) Item {
+ i, _ := (*BTreeG[Item])(t).ReplaceOrInsert(item)
+ return i
+}
+
+// AscendRange calls the iterator for every value in the tree within the range
+// [greaterOrEqual, lessThan), until iterator returns false.
+func (t *BTree) AscendRange(greaterOrEqual, lessThan Item, iterator ItemIterator) {
+ (*BTreeG[Item])(t).AscendRange(greaterOrEqual, lessThan, (ItemIteratorG[Item])(iterator))
+}
+
+// AscendLessThan calls the iterator for every value in the tree within the range
+// [first, pivot), until iterator returns false.
+func (t *BTree) AscendLessThan(pivot Item, iterator ItemIterator) {
+ (*BTreeG[Item])(t).AscendLessThan(pivot, (ItemIteratorG[Item])(iterator))
+}
+
+// AscendGreaterOrEqual calls the iterator for every value in the tree within
+// the range [pivot, last], until iterator returns false.
+func (t *BTree) AscendGreaterOrEqual(pivot Item, iterator ItemIterator) {
+ (*BTreeG[Item])(t).AscendGreaterOrEqual(pivot, (ItemIteratorG[Item])(iterator))
+}
+
+// Ascend calls the iterator for every value in the tree within the range
+// [first, last], until iterator returns false.
+func (t *BTree) Ascend(iterator ItemIterator) {
+ (*BTreeG[Item])(t).Ascend((ItemIteratorG[Item])(iterator))
+}
+
+// DescendRange calls the iterator for every value in the tree within the range
+// [lessOrEqual, greaterThan), until iterator returns false.
+func (t *BTree) DescendRange(lessOrEqual, greaterThan Item, iterator ItemIterator) {
+ (*BTreeG[Item])(t).DescendRange(lessOrEqual, greaterThan, (ItemIteratorG[Item])(iterator))
+}
+
+// DescendLessOrEqual calls the iterator for every value in the tree within the range
+// [pivot, first], until iterator returns false.
+func (t *BTree) DescendLessOrEqual(pivot Item, iterator ItemIterator) {
+ (*BTreeG[Item])(t).DescendLessOrEqual(pivot, (ItemIteratorG[Item])(iterator))
+}
+
+// DescendGreaterThan calls the iterator for every value in the tree within
+// the range [last, pivot), until iterator returns false.
+func (t *BTree) DescendGreaterThan(pivot Item, iterator ItemIterator) {
+ (*BTreeG[Item])(t).DescendGreaterThan(pivot, (ItemIteratorG[Item])(iterator))
+}
+
+// Descend calls the iterator for every value in the tree within the range
+// [last, first], until iterator returns false.
+func (t *BTree) Descend(iterator ItemIterator) {
+ (*BTreeG[Item])(t).Descend((ItemIteratorG[Item])(iterator))
+}
+
+// Len returns the number of items currently in the tree.
+func (t *BTree) Len() int {
+ return (*BTreeG[Item])(t).Len()
+}
+
+// Clear removes all items from the btree. If addNodesToFreelist is true,
+// t's nodes are added to its freelist as part of this call, until the freelist
+// is full. Otherwise, the root node is simply dereferenced and the subtree
+// left to Go's normal GC processes.
+//
+// This can be much faster
+// than calling Delete on all elements, because that requires finding/removing
+// each element in the tree and updating the tree accordingly. It also is
+// somewhat faster than creating a new tree to replace the old one, because
+// nodes from the old tree are reclaimed into the freelist for use by the new
+// one, instead of being lost to the garbage collector.
+//
+// This call takes:
+// O(1): when addNodesToFreelist is false, this is a single operation.
+// O(1): when the freelist is already full, it breaks out immediately
+// O(freelist size): when the freelist is empty and the nodes are all owned
+// by this tree, nodes are added to the freelist until full.
+// O(tree size): when all nodes are owned by another tree, all nodes are
+// iterated over looking for nodes to add to the freelist, and due to
+// ownership, none are.
+func (t *BTree) Clear(addNodesToFreelist bool) {
+ (*BTreeG[Item])(t).Clear(addNodesToFreelist)
+}
diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/mux.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/mux.go
index 4e684c7de6c..69edf5eff8d 100644
--- a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/mux.go
+++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/mux.go
@@ -71,6 +71,7 @@ type ServeMux struct {
streamErrorHandler StreamErrorHandlerFunc
routingErrorHandler RoutingErrorHandlerFunc
disablePathLengthFallback bool
+ disableHTTPMethodOverride bool
unescapingMode UnescapingMode
writeContentLength bool
disableChunkedEncoding bool
@@ -271,6 +272,19 @@ func WithDisablePathLengthFallback() ServeMuxOption {
}
}
+// WithDisableHTTPMethodOverride returns a ServeMuxOption that disables the
+// X-HTTP-Method-Override header handling.
+//
+// When this option is used, the mux will no longer allow POST requests with
+// the X-HTTP-Method-Override header to override the HTTP method. The path
+// length fallback (POST with application/x-www-form-urlencoded falling back
+// to a matching GET handler) is not affected by this option.
+func WithDisableHTTPMethodOverride() ServeMuxOption {
+ return func(serveMux *ServeMux) {
+ serveMux.disableHTTPMethodOverride = true
+ }
+}
+
// WithWriteContentLength returns a ServeMuxOption to enable writing content length on non-streaming responses
func WithWriteContentLength() ServeMuxOption {
return func(serveMux *ServeMux) {
@@ -405,7 +419,7 @@ func (s *ServeMux) ServeHTTP(w http.ResponseWriter, r *http.Request) {
path = r.URL.RawPath
}
- if override := r.Header.Get("X-HTTP-Method-Override"); override != "" && s.isPathLengthFallback(r) {
+ if override := r.Header.Get("X-HTTP-Method-Override"); override != "" && !s.disableHTTPMethodOverride && s.isPathLengthFallback(r) {
if err := r.ParseForm(); err != nil {
_, outboundMarshaler := MarshalerForRequest(s, r)
sterr := status.Error(codes.InvalidArgument, err.Error())
@@ -467,6 +481,7 @@ func (s *ServeMux) ServeHTTP(w http.ResponseWriter, r *http.Request) {
HTTPStatus: http.StatusBadRequest,
Err: mse,
})
+ return
}
continue
}
@@ -509,6 +524,7 @@ func (s *ServeMux) ServeHTTP(w http.ResponseWriter, r *http.Request) {
HTTPStatus: http.StatusBadRequest,
Err: mse,
})
+ return
}
continue
}
diff --git a/vendor/github.com/hashicorp/errwrap/LICENSE b/vendor/github.com/hashicorp/errwrap/LICENSE
new file mode 100644
index 00000000000..c33dcc7c928
--- /dev/null
+++ b/vendor/github.com/hashicorp/errwrap/LICENSE
@@ -0,0 +1,354 @@
+Mozilla Public License, version 2.0
+
+1. Definitions
+
+1.1. “Contributor”
+
+ means each individual or legal entity that creates, contributes to the
+ creation of, or owns Covered Software.
+
+1.2. “Contributor Version”
+
+ means the combination of the Contributions of others (if any) used by a
+ Contributor and that particular Contributor’s Contribution.
+
+1.3. “Contribution”
+
+ means Covered Software of a particular Contributor.
+
+1.4. “Covered Software”
+
+ means Source Code Form to which the initial Contributor has attached the
+ notice in Exhibit A, the Executable Form of such Source Code Form, and
+ Modifications of such Source Code Form, in each case including portions
+ thereof.
+
+1.5. “Incompatible With Secondary Licenses”
+ means
+
+ a. that the initial Contributor has attached the notice described in
+ Exhibit B to the Covered Software; or
+
+ b. that the Covered Software was made available under the terms of version
+ 1.1 or earlier of the License, but not also under the terms of a
+ Secondary License.
+
+1.6. “Executable Form”
+
+ means any form of the work other than Source Code Form.
+
+1.7. “Larger Work”
+
+ means a work that combines Covered Software with other material, in a separate
+ file or files, that is not Covered Software.
+
+1.8. “License”
+
+ means this document.
+
+1.9. “Licensable”
+
+ means having the right to grant, to the maximum extent possible, whether at the
+ time of the initial grant or subsequently, any and all of the rights conveyed by
+ this License.
+
+1.10. “Modifications”
+
+ means any of the following:
+
+ a. any file in Source Code Form that results from an addition to, deletion
+ from, or modification of the contents of Covered Software; or
+
+ b. any new file in Source Code Form that contains any Covered Software.
+
+1.11. “Patent Claims” of a Contributor
+
+ means any patent claim(s), including without limitation, method, process,
+ and apparatus claims, in any patent Licensable by such Contributor that
+ would be infringed, but for the grant of the License, by the making,
+ using, selling, offering for sale, having made, import, or transfer of
+ either its Contributions or its Contributor Version.
+
+1.12. “Secondary License”
+
+ means either the GNU General Public License, Version 2.0, the GNU Lesser
+ General Public License, Version 2.1, the GNU Affero General Public
+ License, Version 3.0, or any later versions of those licenses.
+
+1.13. “Source Code Form”
+
+ means the form of the work preferred for making modifications.
+
+1.14. “You” (or “Your”)
+
+ means an individual or a legal entity exercising rights under this
+ License. For legal entities, “You” includes any entity that controls, is
+ controlled by, or is under common control with You. For purposes of this
+ definition, “control” means (a) the power, direct or indirect, to cause
+ the direction or management of such entity, whether by contract or
+ otherwise, or (b) ownership of more than fifty percent (50%) of the
+ outstanding shares or beneficial ownership of such entity.
+
+
+2. License Grants and Conditions
+
+2.1. Grants
+
+ Each Contributor hereby grants You a world-wide, royalty-free,
+ non-exclusive license:
+
+ a. under intellectual property rights (other than patent or trademark)
+ Licensable by such Contributor to use, reproduce, make available,
+ modify, display, perform, distribute, and otherwise exploit its
+ Contributions, either on an unmodified basis, with Modifications, or as
+ part of a Larger Work; and
+
+ b. under Patent Claims of such Contributor to make, use, sell, offer for
+ sale, have made, import, and otherwise transfer either its Contributions
+ or its Contributor Version.
+
+2.2. Effective Date
+
+ The licenses granted in Section 2.1 with respect to any Contribution become
+ effective for each Contribution on the date the Contributor first distributes
+ such Contribution.
+
+2.3. Limitations on Grant Scope
+
+ The licenses granted in this Section 2 are the only rights granted under this
+ License. No additional rights or licenses will be implied from the distribution
+ or licensing of Covered Software under this License. Notwithstanding Section
+ 2.1(b) above, no patent license is granted by a Contributor:
+
+ a. for any code that a Contributor has removed from Covered Software; or
+
+ b. for infringements caused by: (i) Your and any other third party’s
+ modifications of Covered Software, or (ii) the combination of its
+ Contributions with other software (except as part of its Contributor
+ Version); or
+
+ c. under Patent Claims infringed by Covered Software in the absence of its
+ Contributions.
+
+ This License does not grant any rights in the trademarks, service marks, or
+ logos of any Contributor (except as may be necessary to comply with the
+ notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+ No Contributor makes additional grants as a result of Your choice to
+ distribute the Covered Software under a subsequent version of this License
+ (see Section 10.2) or under the terms of a Secondary License (if permitted
+ under the terms of Section 3.3).
+
+2.5. Representation
+
+ Each Contributor represents that the Contributor believes its Contributions
+ are its original creation(s) or it has sufficient rights to grant the
+ rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+ This License is not intended to limit any rights You have under applicable
+ copyright doctrines of fair use, fair dealing, or other equivalents.
+
+2.7. Conditions
+
+ Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in
+ Section 2.1.
+
+
+3. Responsibilities
+
+3.1. Distribution of Source Form
+
+ All distribution of Covered Software in Source Code Form, including any
+ Modifications that You create or to which You contribute, must be under the
+ terms of this License. You must inform recipients that the Source Code Form
+ of the Covered Software is governed by the terms of this License, and how
+ they can obtain a copy of this License. You may not attempt to alter or
+ restrict the recipients’ rights in the Source Code Form.
+
+3.2. Distribution of Executable Form
+
+ If You distribute Covered Software in Executable Form then:
+
+ a. such Covered Software must also be made available in Source Code Form,
+ as described in Section 3.1, and You must inform recipients of the
+ Executable Form how they can obtain a copy of such Source Code Form by
+ reasonable means in a timely manner, at a charge no more than the cost
+ of distribution to the recipient; and
+
+ b. You may distribute such Executable Form under the terms of this License,
+ or sublicense it under different terms, provided that the license for
+ the Executable Form does not attempt to limit or alter the recipients’
+ rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+ You may create and distribute a Larger Work under terms of Your choice,
+ provided that You also comply with the requirements of this License for the
+ Covered Software. If the Larger Work is a combination of Covered Software
+ with a work governed by one or more Secondary Licenses, and the Covered
+ Software is not Incompatible With Secondary Licenses, this License permits
+ You to additionally distribute such Covered Software under the terms of
+ such Secondary License(s), so that the recipient of the Larger Work may, at
+ their option, further distribute the Covered Software under the terms of
+ either this License or such Secondary License(s).
+
+3.4. Notices
+
+ You may not remove or alter the substance of any license notices (including
+ copyright notices, patent notices, disclaimers of warranty, or limitations
+ of liability) contained within the Source Code Form of the Covered
+ Software, except that You may alter any license notices to the extent
+ required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+ You may choose to offer, and to charge a fee for, warranty, support,
+ indemnity or liability obligations to one or more recipients of Covered
+ Software. However, You may do so only on Your own behalf, and not on behalf
+ of any Contributor. You must make it absolutely clear that any such
+ warranty, support, indemnity, or liability obligation is offered by You
+ alone, and You hereby agree to indemnify every Contributor for any
+ liability incurred by such Contributor as a result of warranty, support,
+ indemnity or liability terms You offer. You may include additional
+ disclaimers of warranty and limitations of liability specific to any
+ jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+
+ If it is impossible for You to comply with any of the terms of this License
+ with respect to some or all of the Covered Software due to statute, judicial
+ order, or regulation then You must: (a) comply with the terms of this License
+ to the maximum extent possible; and (b) describe the limitations and the code
+ they affect. Such description must be placed in a text file included with all
+ distributions of the Covered Software under this License. Except to the
+ extent prohibited by statute or regulation, such description must be
+ sufficiently detailed for a recipient of ordinary skill to be able to
+ understand it.
+
+5. Termination
+
+5.1. The rights granted under this License will terminate automatically if You
+ fail to comply with any of its terms. However, if You become compliant,
+ then the rights granted under this License from a particular Contributor
+ are reinstated (a) provisionally, unless and until such Contributor
+ explicitly and finally terminates Your grants, and (b) on an ongoing basis,
+ if such Contributor fails to notify You of the non-compliance by some
+ reasonable means prior to 60 days after You have come back into compliance.
+ Moreover, Your grants from a particular Contributor are reinstated on an
+ ongoing basis if such Contributor notifies You of the non-compliance by
+ some reasonable means, this is the first time You have received notice of
+ non-compliance with this License from such Contributor, and You become
+ compliant prior to 30 days after Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+ infringement claim (excluding declaratory judgment actions, counter-claims,
+ and cross-claims) alleging that a Contributor Version directly or
+ indirectly infringes any patent, then the rights granted to You by any and
+ all Contributors for the Covered Software under Section 2.1 of this License
+ shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user
+ license agreements (excluding distributors and resellers) which have been
+ validly granted by You or Your distributors under this License prior to
+ termination shall survive termination.
+
+6. Disclaimer of Warranty
+
+ Covered Software is provided under this License on an “as is” basis, without
+ warranty of any kind, either expressed, implied, or statutory, including,
+ without limitation, warranties that the Covered Software is free of defects,
+ merchantable, fit for a particular purpose or non-infringing. The entire
+ risk as to the quality and performance of the Covered Software is with You.
+ Should any Covered Software prove defective in any respect, You (not any
+ Contributor) assume the cost of any necessary servicing, repair, or
+ correction. This disclaimer of warranty constitutes an essential part of this
+ License. No use of any Covered Software is authorized under this License
+ except under this disclaimer.
+
+7. Limitation of Liability
+
+ Under no circumstances and under no legal theory, whether tort (including
+ negligence), contract, or otherwise, shall any Contributor, or anyone who
+ distributes Covered Software as permitted above, be liable to You for any
+ direct, indirect, special, incidental, or consequential damages of any
+ character including, without limitation, damages for lost profits, loss of
+ goodwill, work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses, even if such party shall have been
+ informed of the possibility of such damages. This limitation of liability
+ shall not apply to liability for death or personal injury resulting from such
+ party’s negligence to the extent applicable law prohibits such limitation.
+ Some jurisdictions do not allow the exclusion or limitation of incidental or
+ consequential damages, so this exclusion and limitation may not apply to You.
+
+8. Litigation
+
+ Any litigation relating to this License may be brought only in the courts of
+ a jurisdiction where the defendant maintains its principal place of business
+ and such litigation shall be governed by laws of that jurisdiction, without
+ reference to its conflict-of-law provisions. Nothing in this Section shall
+ prevent a party’s ability to bring cross-claims or counter-claims.
+
+9. Miscellaneous
+
+ This License represents the complete agreement concerning the subject matter
+ hereof. If any provision of this License is held to be unenforceable, such
+ provision shall be reformed only to the extent necessary to make it
+ enforceable. Any law or regulation which provides that the language of a
+ contract shall be construed against the drafter shall not be used to construe
+ this License against a Contributor.
+
+
+10. Versions of the License
+
+10.1. New Versions
+
+ Mozilla Foundation is the license steward. Except as provided in Section
+ 10.3, no one other than the license steward has the right to modify or
+ publish new versions of this License. Each version will be given a
+ distinguishing version number.
+
+10.2. Effect of New Versions
+
+ You may distribute the Covered Software under the terms of the version of
+ the License under which You originally received the Covered Software, or
+ under the terms of any subsequent version published by the license
+ steward.
+
+10.3. Modified Versions
+
+ If you create software not governed by this License, and you want to
+ create a new license for such software, you may create and use a modified
+ version of this License if you rename the license and remove any
+ references to the name of the license steward (except to note that such
+ modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses
+ If You choose to distribute Source Code Form that is Incompatible With
+ Secondary Licenses under the terms of this version of the License, the
+ notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+
+ This Source Code Form is subject to the
+ terms of the Mozilla Public License, v.
+ 2.0. If a copy of the MPL was not
+ distributed with this file, You can
+ obtain one at
+ http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular file, then
+You may include the notice in a location (such as a LICENSE file in a relevant
+directory) where a recipient would be likely to look for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - “Incompatible With Secondary Licenses” Notice
+
+ This Source Code Form is “Incompatible
+ With Secondary Licenses”, as defined by
+ the Mozilla Public License, v. 2.0.
+
diff --git a/vendor/github.com/hashicorp/errwrap/README.md b/vendor/github.com/hashicorp/errwrap/README.md
new file mode 100644
index 00000000000..444df08f8e7
--- /dev/null
+++ b/vendor/github.com/hashicorp/errwrap/README.md
@@ -0,0 +1,89 @@
+# errwrap
+
+`errwrap` is a package for Go that formalizes the pattern of wrapping errors
+and checking if an error contains another error.
+
+There is a common pattern in Go of taking a returned `error` value and
+then wrapping it (such as with `fmt.Errorf`) before returning it. The problem
+with this pattern is that you completely lose the original `error` structure.
+
+Arguably the _correct_ approach is that you should make a custom structure
+implementing the `error` interface, and have the original error as a field
+on that structure, such [as this example](http://golang.org/pkg/os/#PathError).
+This is a good approach, but you have to know the entire chain of possible
+rewrapping that happens, when you might just care about one.
+
+`errwrap` formalizes this pattern (it doesn't matter what approach you use
+above) by giving a single interface for wrapping errors, checking if a specific
+error is wrapped, and extracting that error.
+
+## Installation and Docs
+
+Install using `go get github.com/hashicorp/errwrap`.
+
+Full documentation is available at
+http://godoc.org/github.com/hashicorp/errwrap
+
+## Usage
+
+#### Basic Usage
+
+Below is a very basic example of its usage:
+
+```go
+// A function that always returns an error, but wraps it, like a real
+// function might.
+func tryOpen() error {
+ _, err := os.Open("/i/dont/exist")
+ if err != nil {
+ return errwrap.Wrapf("Doesn't exist: {{err}}", err)
+ }
+
+ return nil
+}
+
+func main() {
+ err := tryOpen()
+
+ // We can use the Contains helpers to check if an error contains
+ // another error. It is safe to do this with a nil error, or with
+ // an error that doesn't even use the errwrap package.
+ if errwrap.Contains(err, "does not exist") {
+ // Do something
+ }
+ if errwrap.ContainsType(err, new(os.PathError)) {
+ // Do something
+ }
+
+ // Or we can use the associated `Get` functions to just extract
+ // a specific error. This would return nil if that specific error doesn't
+ // exist.
+ perr := errwrap.GetType(err, new(os.PathError))
+}
+```
+
+#### Custom Types
+
+If you're already making custom types that properly wrap errors, then
+you can get all the functionality of `errwraps.Contains` and such by
+implementing the `Wrapper` interface with just one function. Example:
+
+```go
+type AppError {
+ Code ErrorCode
+ Err error
+}
+
+func (e *AppError) WrappedErrors() []error {
+ return []error{e.Err}
+}
+```
+
+Now this works:
+
+```go
+err := &AppError{Err: fmt.Errorf("an error")}
+if errwrap.ContainsType(err, fmt.Errorf("")) {
+ // This will work!
+}
+```
diff --git a/vendor/github.com/hashicorp/errwrap/errwrap.go b/vendor/github.com/hashicorp/errwrap/errwrap.go
new file mode 100644
index 00000000000..44e368e5692
--- /dev/null
+++ b/vendor/github.com/hashicorp/errwrap/errwrap.go
@@ -0,0 +1,178 @@
+// Package errwrap implements methods to formalize error wrapping in Go.
+//
+// All of the top-level functions that take an `error` are built to be able
+// to take any error, not just wrapped errors. This allows you to use errwrap
+// without having to type-check and type-cast everywhere.
+package errwrap
+
+import (
+ "errors"
+ "reflect"
+ "strings"
+)
+
+// WalkFunc is the callback called for Walk.
+type WalkFunc func(error)
+
+// Wrapper is an interface that can be implemented by custom types to
+// have all the Contains, Get, etc. functions in errwrap work.
+//
+// When Walk reaches a Wrapper, it will call the callback for every
+// wrapped error in addition to the wrapper itself. Since all the top-level
+// functions in errwrap use Walk, this means that all those functions work
+// with your custom type.
+type Wrapper interface {
+ WrappedErrors() []error
+}
+
+// Wrap defines that outer wraps inner, returning an error type that
+// can be cleanly used with the other methods in this package, such as
+// Contains, GetAll, etc.
+//
+// This function won't modify the error message at all (the outer message
+// will be used).
+func Wrap(outer, inner error) error {
+ return &wrappedError{
+ Outer: outer,
+ Inner: inner,
+ }
+}
+
+// Wrapf wraps an error with a formatting message. This is similar to using
+// `fmt.Errorf` to wrap an error. If you're using `fmt.Errorf` to wrap
+// errors, you should replace it with this.
+//
+// format is the format of the error message. The string '{{err}}' will
+// be replaced with the original error message.
+//
+// Deprecated: Use fmt.Errorf()
+func Wrapf(format string, err error) error {
+ outerMsg := "