Compare commits

...

193 Commits

Author SHA1 Message Date
Kubernetes Prow Robot 9ed63e10f7
Merge pull request #17599 from kubernetes/dependabot/github_actions/actions/dependency-review-action-4.7.3
build(deps): bump actions/dependency-review-action from 4.7.2 to 4.7.3
2025-08-31 08:51:09 -07:00
dependabot[bot] 416f9f5034
build(deps): bump actions/dependency-review-action from 4.7.2 to 4.7.3
Bumps [actions/dependency-review-action](https://github.com/actions/dependency-review-action) from 4.7.2 to 4.7.3.
- [Release notes](https://github.com/actions/dependency-review-action/releases)
- [Commits](bc41886e18...595b5aeba7)

---
updated-dependencies:
- dependency-name: actions/dependency-review-action
  dependency-version: 4.7.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-31 06:01:14 +00:00
Kubernetes Prow Robot 4d977166f3
Merge pull request #17598 from hakman/remove-k8s-1-28
chore: Remove support for Kubernetes 1.28 in kOps 1.34
2025-08-30 09:49:10 -07:00
Ciprian Hacman 04fd259a7d Skip failing tests
Signed-off-by: Ciprian Hacman <ciprian@hakman.dev>
2025-08-30 16:57:49 +03:00
Kubernetes Prow Robot 1a8ce9b027
Merge pull request #17597 from hakman/release-notes-1.33
Update release notes for kOps 1.33
2025-08-30 06:41:09 -07:00
Kubernetes Prow Robot 447395427f
Merge pull request #17596 from hakman/bump-channels
chore: Bump channels with the latest releases
2025-08-30 05:49:08 -07:00
Ciprian Hacman 092073eb0c hack/update-expected.sh
Signed-off-by: Ciprian Hacman <ciprian@hakman.dev>
2025-08-30 15:37:49 +03:00
Ciprian Hacman d3b5bfceff chore: Remove support for Kubernetes 1.28
Signed-off-by: Ciprian Hacman <ciprian@hakman.dev>
2025-08-30 15:37:09 +03:00
Ciprian Hacman 285e110ed2 chore: Bump channels with the latest releases
Signed-off-by: Ciprian Hacman <ciprian@hakman.dev>
2025-08-30 14:56:48 +03:00
Kubernetes Prow Robot adfdc7797e
Merge pull request #17592 from hakman/update-asset-hashe
Update Kubernetes hashes with latest releases
2025-08-29 23:55:09 -07:00
Ciprian Hacman 6ede243f40 Update release notes for kOps 1.33
Signed-off-by: Ciprian Hacman <ciprian@hakman.dev>
2025-08-30 09:33:37 +03:00
Ciprian Hacman 66bc1860e8 Update Kubernetes hashes with latest releases 2025-08-30 08:11:17 +03:00
Kubernetes Prow Robot 7769558a63
Merge pull request #17588 from ameukam/1-34-note-packages-removal
Update 1.34 release notes
2025-08-29 21:41:09 -07:00
Arnaud Meukam 5391dbced8
Update 1.34 release notes
Follow-up of:
 - https://github.com/kubernetes/kops/pull/17587

Signed-off-by: Arnaud Meukam <ameukam@gmail.com>
2025-08-29 22:08:31 +02:00
Kubernetes Prow Robot 6bd7b39827
Merge pull request #17587 from ameukam/drop-ebtables-socat
Drop ebtables, ethtool and socat
2025-08-29 12:47:09 -07:00
Kubernetes Prow Robot 62ed422629
Merge pull request #17586 from hakman/amazon-ec2-instance-selector-v3.1.1
Update amazon-ec2-instance-selector to v3.1.1
2025-08-29 08:05:10 -07:00
Arnaud Meukam 25519c973f
Drop ebtables, ethtool and socat
Those packages are no longer required according to:
 - https://github.com/kubernetes/kubernetes/pull/127151
 - https://github.com/kubernetes/kubernetes/pull/129131

Signed-off-by: Arnaud Meukam <ameukam@gmail.com>
2025-08-29 16:57:05 +02:00
Ciprian Hacman 60ab99c154 Update amazon-ec2-instance-selector to v3.1.1 2025-08-29 17:09:37 +03:00
Kubernetes Prow Robot cd4d7ae8e4
Merge pull request #17583 from ameukam/add-nftables-package
Add nftables package
2025-08-29 03:37:09 -07:00
Arnaud Meukam 3940478b9a
Add nftables package
NFtables proxy mode is GA in Kubernetes 1.33. See: https://kubernetes.io/blog/2025/02/28/nftables-kube-proxy/
We ensure the nftables package is installed if the cluster is created if
kube-proxy mode is `nftables`.

Signed-off-by: Arnaud Meukam <ameukam@gmail.com>
2025-08-29 11:38:12 +02:00
Kubernetes Prow Robot 72d999e22d
Merge pull request #17554 from hakman/fix-coredns
coredns: Relax zonal topologySpreadConstraints
2025-08-29 00:45:09 -07:00
Ciprian Hacman 4eeb347aaa hack/update-expected.sh 2025-08-29 09:45:52 +03:00
Ciprian Hacman cbd4667d38 coredns: Relax zonal topologySpreadConstraints 2025-08-29 09:45:52 +03:00
Kubernetes Prow Robot 665265a338
Merge pull request #17547 from hakman/no-crictl-nerdctl
containerd: Don't install crictl and nerdctl by default
2025-08-28 12:45:11 -07:00
Ciprian Hacman e8419e29c4 Update docs 2025-08-28 18:58:17 +03:00
Ciprian Hacman 5bce5f397a hack/update-expected.sh 2025-08-28 18:58:17 +03:00
Ciprian Hacman 96a7fd8988 containerd: Don't install crictl and nerdctl by default 2025-08-28 18:53:20 +03:00
Arnaud M. a8001b8fba
Remove unused const, variables and function reported by Golangci-lint (#17582)
* Remove unused const, variables and function reported by Golangci-lint

Signed-off-by: Arnaud Meukam <ameukam@gmail.com>

* make gomod executed
Signed-off-by: Arnaud Meukam <ameukam@gmail.com>

---------

Signed-off-by: Arnaud Meukam <ameukam@gmail.com>
2025-08-28 07:53:13 -07:00
Kubernetes Prow Robot d8a9697152
Merge pull request #17581 from ameukam/custom-install-cgrougfs-mount
Install cgroupfs-mount for distros lower than Debian Trixie
2025-08-28 05:03:10 -07:00
Arnaud Meukam b336829add
Add detection of Debian distribution
Signed-off-by: Arnaud Meukam <ameukam@gmail.com>
2025-08-28 12:35:29 +02:00
Arnaud Meukam ddc21c750f
Install cgroupfs-mount for distros lower than Debian Trixie
According to https://tracker.debian.org/pkg/cgroupfs-mount, the package
has been removed starting with Debian 13.
Based on this, we believe it's unlikely it make it to Ubuntu 26.04.

Signed-off-by: Arnaud Meukam <ameukam@gmail.com>
2025-08-28 12:34:38 +02:00
Kubernetes Prow Robot 7850359c2f
Merge pull request #17577 from hakman/simplify-nodeup-template
nodeup: Simplify the template by removing split-commas
2025-08-24 23:51:08 -07:00
Ciprian Hacman b058094b78 hack/update-expected.sh 2025-08-25 00:25:45 +03:00
Ciprian Hacman 4e008ffe7a nodeup: Simplify the template by removing split-commas 2025-08-25 00:25:45 +03:00
Kubernetes Prow Robot 633a9b757b
Merge pull request #17571 from cloud303-pdavis/master
Upgrade AWS Load Balancer Controller to v2.13.4
2025-08-24 10:53:06 -07:00
Kubernetes Prow Robot 237479701a
Merge pull request #17562 from ameukam/bump-golangci-lint
Bump golangci-lint to v2
2025-08-24 07:39:05 -07:00
Arnaud Meukam 60895f55d7
Bump golangci-lint to v2
bumping golangci-lint to a version that support Go 1.25

Signed-off-by: Arnaud Meukam <ameukam@gmail.com>
2025-08-24 15:46:08 +02:00
Kubernetes Prow Robot dec7d23d10
Merge pull request #17576 from kubernetes/dependabot/github_actions/actions/dependency-review-action-4.7.2
build(deps): bump actions/dependency-review-action from 4.7.1 to 4.7.2
2025-08-24 01:19:06 -07:00
dependabot[bot] 47592cb53e
build(deps): bump actions/dependency-review-action from 4.7.1 to 4.7.2
Bumps [actions/dependency-review-action](https://github.com/actions/dependency-review-action) from 4.7.1 to 4.7.2.
- [Release notes](https://github.com/actions/dependency-review-action/releases)
- [Commits](da24556b54...bc41886e18)

---
updated-dependencies:
- dependency-name: actions/dependency-review-action
  dependency-version: 4.7.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-24 06:50:52 +00:00
Kubernetes Prow Robot 91e5ba54ea
Merge pull request #17557 from ConnorJC3/fix-al2-dnf
Use yum instead of dnf on Amazon Linux 2
2025-08-23 03:09:08 -07:00
Kubernetes Prow Robot d3a7607637
Merge pull request #17573 from rifelpet/golangcilint-fixes
Golangci-lint v2 fixes
2025-08-23 00:07:05 -07:00
Peter Rifel 2de74a73ce
Consolidate for expressions 2025-08-22 20:56:54 -05:00
Peter Rifel c98fb47eb8
Merge conditional boolean assignments 2025-08-22 20:56:53 -05:00
Peter Rifel 24f2701152
Use ReplaceAll 2025-08-22 20:52:44 -05:00
Peter Rifel 05099d65d3
Use fmt.Fprintf 2025-08-22 20:41:50 -05:00
Peter Rifel 4569dd4f98
Remove unnecessary declaration 2025-08-22 20:36:11 -05:00
Peter Rifel dc8f27f356
Remove redundant type assertions 2025-08-22 20:36:10 -05:00
Peter Rifel 669c47c4ed
Simplify boolean returns 2025-08-22 20:36:09 -05:00
Peter Rifel b9448cabe5
Remove redundant nil checks 2025-08-22 20:36:08 -05:00
Peter Rifel 3f519b48c3
Append lists 2025-08-22 20:36:07 -05:00
Peter Rifel 0338832c51
Remove redundant return 2025-08-22 20:36:07 -05:00
Peter Rifel 7694fce7cd
Simplify boolean expression 2025-08-22 20:36:06 -05:00
Peter Rifel 9d41b64f2e
Use sort.Strings 2025-08-22 20:36:05 -05:00
Peter Rifel ec67c4acdc
Simplify boolean conditionals 2025-08-22 20:36:04 -05:00
Peter Rifel 701f01a26b
Use switch/case statement 2025-08-22 20:36:02 -05:00
Peter Rifel af86a55c81
Remove duplicate imports 2025-08-22 20:05:59 -05:00
Kubernetes Prow Robot 3b3df48117
Merge pull request #17569 from ameukam/ai-agent-avoiding-loop
Add instructions to avoid loops
2025-08-22 09:15:06 -07:00
cloud303-pdavis 99b8ff05df ./hack/update-expected.sh 2025-08-21 16:07:32 -06:00
cloud303-pdavis df39d62034 Upgrade LBC manifest to v2.13.4 2025-08-21 16:03:50 -06:00
Arnaud Meukam 5c0e35e4e2
Add instructions to avoid loops
In some cases, the AI agent will loop on the same tasks.

Signed-off-by: Arnaud Meukam <ameukam@gmail.com>
2025-08-20 13:09:34 +02:00
Kubernetes Prow Robot bd203fb693
Merge pull request #17566 from kubernetes/dependabot/github_actions/actions/checkout-5.0.0
build(deps): bump actions/checkout from 4.2.2 to 5.0.0
2025-08-17 02:29:08 -07:00
dependabot[bot] 6d8aeb0144
build(deps): bump actions/checkout from 4.2.2 to 5.0.0
Bumps [actions/checkout](https://github.com/actions/checkout) from 4.2.2 to 5.0.0.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](11bd71901b...08c6903cd8)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 5.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-17 06:50:33 +00:00
Kubernetes Prow Robot 1c64206d0e
Merge pull request #17561 from ameukam/introduce-agents
Add AGENTS.md
2025-08-14 13:37:07 -07:00
Kubernetes Prow Robot cac9dcfca0
Merge pull request #17560 from ameukam/bump-golang-1.25
Bump Golang to 1.25
2025-08-14 07:45:09 -07:00
Arnaud Meukam 1ad9b17968
Add AGENTS.md
Provide a starting place for AI code assistance.

Add a baseline AGENTS.md file.
Add symlinks for Gemini, Claude and Qwen

Signed-off-by: Arnaud Meukam <ameukam@gmail.com>
2025-08-14 15:23:37 +02:00
Arnaud Meukam 237b19ef44
Bump Golang to 1.25
Signed-off-by: Arnaud Meukam <ameukam@gmail.com>
2025-08-14 15:03:37 +02:00
Kubernetes Prow Robot a0b5174c85
Merge pull request #17559 from ameukam/bump-ko-build
Bump ko-build
2025-08-14 05:25:12 -07:00
Arnaud Meukam 4aaeb5f92f
Bump ko-build
See changes: https://github.com/ko-build/ko/compare/v0.14.1...v0.18.0

Signed-off-by: Arnaud Meukam <ameukam@gmail.com>
2025-08-14 12:44:47 +02:00
Connor Catlett d4fe130e78
Use yum instead of dnf on Amazon Linux 2
Signed-off-by: Connor Catlett <conncatl@amazon.com>
2025-08-13 20:08:04 +00:00
Kubernetes Prow Robot fb666c7924
Merge pull request #17553 from hakman/fix-image-volumes
etcd-manager: Keep the ImageVolume feature gate for K8s 1.35
2025-08-11 12:09:09 -07:00
Ciprian Hacman 8c6ac690b1 Bump skip.regex for failing tests to 1.35 2025-08-11 20:16:15 +03:00
Kubernetes Prow Robot 896dbb28d9
Merge pull request #17552 from hakman/ebs-csi-driver-1.47.0
aws: Update EBS CSI driver to v1.47.0
2025-08-11 09:53:09 -07:00
Ciprian Hacman 9547347a04 etcd-manager: Keep the ImageVolume feature gate for K8s 1.35 2025-08-11 19:07:06 +03:00
Ciprian Hacman b97df8de6e hack/update-expected.sh 2025-08-11 18:49:46 +03:00
Ciprian Hacman e54132c827 aws: Update EBS CSI driver to v1.47.0 2025-08-11 18:49:46 +03:00
Kubernetes Prow Robot 93c7490597
Merge pull request #17550 from rifelpet/debian13
Recognize Debian 13
2025-08-10 19:31:54 -07:00
Peter Rifel d38b89e0c5
Recognize Debian 13 2025-08-10 16:26:47 -05:00
Kubernetes Prow Robot a758ae0e9f
Merge pull request #17539 from hakman/etcd-manager-image-volumes
etcd-manager: Use image volumes to mount etcd images
2025-08-10 07:29:53 -07:00
Ciprian Hacman da4af99967 hack/update-expected.sh 2025-08-10 16:17:05 +03:00
Ciprian Hacman 3f99d04ca5 etcd-manager: Use image volumes to mount etcd images 2025-08-10 16:17:05 +03:00
Ciprian Hacman 5e8e2329ad
Release 1.34.0-alpha.1 (#17548) 2025-08-10 05:45:53 -07:00
Kubernetes Prow Robot 20023e5596
Merge pull request #17549 from hakman/skip-metal-ipv6
Skip tests-e2e-scenarios-bare-metal-ipv6 when `version.go` changes
2025-08-10 04:39:43 -07:00
Ciprian Hacman dac3598ee5 Skip tests-e2e-scenarios-bare-metal-ipv6 when version.go changes 2025-08-10 08:42:04 +03:00
Kubernetes Prow Robot 200ce48045
Merge pull request #17540 from hakman/etcd-manager-3.0.20250803
Update etcd-manager to v3.0.20250803
2025-08-03 12:49:39 -07:00
Ciprian Hacman cd04b07b80 hack/update-expected.sh 2025-08-03 19:16:04 +03:00
Ciprian Hacman 126dafe079 Update etcd-manager to v3.0.20250803 2025-08-03 19:13:48 +03:00
Kubernetes Prow Robot f1c5d36d1a
Merge pull request #17538 from hakman/azure-fix-rooling-update
azure: Fix rolling-update error
2025-08-03 04:49:39 -07:00
Ciprian Hacman 1702a4d248 azure: Fix rolling-update error 2025-08-03 13:48:11 +03:00
Kubernetes Prow Robot 08bb87bfa1
Merge pull request #17537 from kubernetes/dependabot/github_actions/actions/setup-go-5.5.0
build(deps): bump actions/setup-go from 5.1.0 to 5.5.0
2025-08-03 00:03:37 -07:00
dependabot[bot] 7ddb153995
build(deps): bump actions/setup-go from 5.1.0 to 5.5.0
Bumps [actions/setup-go](https://github.com/actions/setup-go) from 5.1.0 to 5.5.0.
- [Release notes](https://github.com/actions/setup-go/releases)
- [Commits](https://github.com/actions/setup-go/compare/v5.1.0...d35c59abb061a4a6fb18e82ac0862c26744d6ab5)

---
updated-dependencies:
- dependency-name: actions/setup-go
  dependency-version: 5.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-03 06:04:17 +00:00
Kubernetes Prow Robot 97277b86c4
Merge pull request #17533 from hakman/fix-failing-tests
tests: Skip failing CNI tests
2025-08-02 21:09:37 -07:00
Kubernetes Prow Robot d93d488125
Merge pull request #17532 from hakman/containerd-2.1.4
Update containerd to v2.1.4
2025-08-02 12:55:38 -07:00
Ciprian Hacman bc1013e481 tests: Fix failing CNI tests 2025-08-02 21:16:56 +03:00
Ciprian Hacman 1d0caedfc1 hack/update-expected.sh 2025-08-02 18:09:53 +03:00
Ciprian Hacman 938656b5d5 Update containerd to v2.1.4 2025-08-02 18:09:53 +03:00
Kubernetes Prow Robot 3bf473b17a
Merge pull request #17531 from hakman/update-debian-bare-metal
metal: Update Debian image
2025-08-02 02:03:36 -07:00
Kubernetes Prow Robot 661d44185a
Merge pull request #17485 from hakman/etcd-use-official-images
Use official etcd images from `registry.k8s.io`
2025-08-01 23:27:37 -07:00
Ciprian Hacman 1f7de4f495
Update saved image name
Co-authored-by: Arnaud M. <ameukam@gmail.com>
2025-08-02 09:27:28 +03:00
Ciprian Hacman b246e43a0b metal: Update Debian image 2025-08-02 08:44:39 +03:00
Ciprian Hacman 57a990d7ec hack/update-expected.sh 2025-08-02 00:46:42 +03:00
Ciprian Hacman 384b65d7a0 Use official etcd images from registry.k8s.io 2025-08-02 00:43:56 +03:00
Kubernetes Prow Robot df49b6859a
Merge pull request #17527 from hakman/update-hashes
Update containerd to v1.7.28
2025-08-01 03:19:39 -07:00
Ciprian Hacman 42e01a9694 hack/update-expected.sh 2025-08-01 09:18:32 +03:00
Ciprian Hacman 284d721633 hack/generate-asset-hashes.sh 2025-08-01 09:18:32 +03:00
Ciprian Hacman e0e6dddb03 Update containerd to v1.7.28 2025-08-01 09:18:32 +03:00
Kubernetes Prow Robot 042fd35824
Merge pull request #17526 from justinsb/enable_roundtrip_tests_2
Add round-trip tests / PodCIDR to all versions
2025-07-31 08:11:16 -07:00
justinsb fe436a4665 tests: add test for APIs not in internal version 2025-07-31 10:18:09 -04:00
justinsb 26831cd565 api: Add Host PodCIDRs (to all versions) 2025-07-31 10:15:34 -04:00
justinsb 2ebc871c89 autogen: generate apimachinery 2025-07-31 10:15:34 -04:00
justinsb ccfd48e58b Add Host to internal API version 2025-07-31 10:15:34 -04:00
justinsb 12d2f2439c autogen: update vendor 2025-07-31 10:15:34 -04:00
justinsb 63b991795c apimachinery: Enable round-trip tests now we have two versions in play
Will help us catch problems where values don't convert correctly.

Starting with just the Hosts type
2025-07-31 10:15:34 -04:00
Kubernetes Prow Robot e4c04c763f
Merge pull request #17525 from rifelpet/lbc-ami
Use ssm parameter for AMI ID in LBC scenario
2025-07-29 21:42:27 -07:00
Kubernetes Prow Robot 3e6894ed58
Merge pull request #17524 from rifelpet/tf-fatal
Add more context to terraform fatal log
2025-07-29 20:38:27 -07:00
Peter Rifel 37d4314653
Use ssm parameter for AMI ID in LBC scenario 2025-07-29 20:33:14 -05:00
Peter Rifel 83d61f0d97
Add more context to terraform fatal log 2025-07-29 20:18:31 -05:00
Kubernetes Prow Robot 7ae0bae6fc
Merge pull request #17521 from mtulio/cloud-provider-aws-pull-1214
aws: added permissions to RW*TargetGroupAttributes to CCM
2025-07-29 13:48:26 -07:00
Kubernetes Prow Robot f28b11cd4b
Merge pull request #17519 from sats-23/sup-image-tag
Add support for passing image for nvidia-k8s-device-plugin
2025-07-29 06:42:27 -07:00
Marco Braga 04ce51ab56
feat/ccm-aws/gen: generated files by hack/update-expected.sh 2025-07-29 10:03:16 -03:00
Kubernetes Prow Robot dde2cfd792
Merge pull request #16593 from rsafonseca/containerd_ecr_mirrors
aws: Add support for using ECR as pull-through image cache
2025-07-29 04:02:01 -07:00
Kubernetes Prow Robot 5a0fce0f6b
Merge pull request #17523 from hakman/fix-e2e-job-name
testing: Fix e2e test job name
2025-07-29 02:42:01 -07:00
Ciprian Hacman 04e6c19435 testing: Skip broken test that depends on expired credential 2025-07-29 10:53:08 +03:00
Ciprian Hacman ba29e4b272 testing: Fix e2e test job name 2025-07-29 08:08:32 +03:00
Marco Braga 1dffab2729
feat/ccm-aws: added permissions to RW*TargetGroupAttributes
Added permission to read and write/modify Target Group Attributes on
clusters of cloud-provider-aws (CCM) project.

The modify permission is conditional for targget clusters.

This permission is required to be able to test the new requirement,
modify target group attributes, through e2e CI clusters.

More information: https://github.com/kubernetes/cloud-provider-aws/pull/1214
Example of CI job without this permission:
https://prow.k8s.io/view/gs/kubernetes-ci-logs/pr-logs/pull/cloud-provider-aws/1214/pull-cloud-provider-aws-e2e/1948477553773645824
2025-07-28 17:31:42 -03:00
Kubernetes Prow Robot dad816791c
Merge pull request #16944 from justinsb/bare-metal-ipv6
(Experimental) bare-metal with IPv6
2025-07-28 09:06:30 -07:00
Rafael da Fonseca 1794614c19 Add support for using ECR as pull-through image cache
Signed-off-by: Rafael da Fonseca <rafael.fonseca@wildlifestudios.com>
2025-07-28 12:45:53 +01:00
Sathvik 98090bc10a Add support for passing image for nvidia-k8s-device-plugin 2025-07-27 17:22:47 +05:30
justinsb 3f25b1eee1 metal: split host creation from enrollment
This is needeed for bootstrapping the control plane,
because it's a CRD so can't be registered until the control plane is running.

It's also quite nice because we might want to review the contents of the
host CRD, e.g. to verify the key out-of-band.
2025-07-26 20:01:12 -04:00
justinsb 7086bd3e29 Fix IPv6 routes and use kube 1.32 2025-07-26 20:01:12 -04:00
justinsb e3d6a9ae4a metal: don't set CCM external always for IPv6
While we do require CCM for IPv6, we should configure the appropriate CCM.
2025-07-26 20:01:12 -04:00
justinsb 05f8618306 metal: simple IPAM for IPv6 2025-07-26 20:01:12 -04:00
justinsb 6b88da4376 tests: add test for bare-metal with ipv6
IPv6 brings some new complexities, particularly around IPAM.
2025-07-26 20:01:12 -04:00
Kubernetes Prow Robot 5f564fe1ab
Merge pull request #17517 from hakman/azure-test
azure: Fix periodic tests
2025-07-26 13:30:27 -07:00
Ciprian Hacman 96a89b5ec3 azure: Remove `-publicipconfig` suffix for VMSS piblic IP configuration 2025-07-26 21:22:56 +03:00
Ciprian Hacman 402f74c9ca azure: Remove `-ipconfig` suffix for VMSS IP configuration 2025-07-26 21:09:10 +03:00
Ciprian Hacman c95f297c06 azure: Fix subscription ID check 2025-07-26 20:43:16 +03:00
Ciprian Hacman a025a56287 azure: Remove `-netconfig` suffix for VMSS network configuration 2025-07-26 20:30:26 +03:00
Ciprian Hacman 553509bd46 azure: Remove DNS domain for generated cluster names 2025-07-26 20:29:26 +03:00
Kubernetes Prow Robot e66fc0a494
Merge pull request #17516 from hakman/id_ed25519
Prefer using `id_ed25519.pub` instead of `id_rsa.pub`
2025-07-25 15:08:27 -07:00
Ciprian Hacman 1521dda087 Prefer using id_ed25519.pub instead of id_rsa.pub 2025-07-25 23:26:09 +03:00
Kubernetes Prow Robot 47e378870a
Merge pull request #17515 from hakman/dns-none-validation
Don't require `.` in `dns=none` cluster names
2025-07-25 12:22:27 -07:00
Ciprian Hacman bb226313e3 Don't require . in dns=none cluster names 2025-07-25 20:35:34 +03:00
Kubernetes Prow Robot 09b0b5dde7
Merge pull request #17512 from ouillie/master
Wait for GCE disk creation operation
2025-07-22 23:00:27 -07:00
Will Noble d1449d2f1a Wait for the GCE disk creation operation to finish 2025-07-22 20:50:49 -07:00
Kubernetes Prow Robot 3a9e01b8f8
Merge pull request #17509 from hakman/azure-test
protokube: Initialize CloudProvider only with Gossip
2025-07-21 16:22:26 -07:00
Ciprian Hacman 9533de8546 protokube: Simplify CloudProvider initialization 2025-07-21 19:01:35 +03:00
Ciprian Hacman ae52927a36 protokube: Initialize CloudProvider only with Gossip 2025-07-21 18:03:44 +03:00
Kubernetes Prow Robot 6ba41fbcf7
Merge pull request #17507 from hakman/azure-test
azure: Use creation timestamp tag in e2e tests
2025-07-21 07:58:28 -07:00
Ciprian Hacman 8bcaa7e93d azure: Fix protokube tags parsing 2025-07-21 16:13:22 +03:00
Ciprian Hacman 75a7373246 azure: Use creation timestamp tag in e2e tests 2025-07-21 13:09:00 +03:00
Kubernetes Prow Robot b00fdd10dd
Merge pull request #17506 from hakman/azure-test
azure: Use `kops` as the default admin user
2025-07-21 03:04:27 -07:00
Ciprian Hacman d08c94e54e azure: Use `kops` as the default admin user 2025-07-21 07:00:07 +03:00
Kubernetes Prow Robot 8e83ad6dcd
Merge pull request #17505 from hakman/azure-test
chore: Use constants for default network CIDRs
2025-07-20 20:20:26 -07:00
Ciprian Hacman 2663df7e25 chore: Use constants for default network CIDRs 2025-07-20 21:26:24 +03:00
Kubernetes Prow Robot 1a0d074510
Merge pull request #17504 from hakman/azure-test
azure: Add defaults for network CIDR and subscription ID
2025-07-20 03:48:26 -07:00
Ciprian Hacman 29fb3d3587 azure: Use AZURE_SUBSCRIPTION_ID env var as fallback 2025-07-20 09:09:26 +03:00
Ciprian Hacman fb814b5a84 azure: Set default network CIDR to 10.0.0.0/16 2025-07-20 08:51:52 +03:00
Kubernetes Prow Robot 4570455f78
Merge pull request #17497 from hakman/azure-test
azure: Add e2e testing
2025-07-19 22:18:26 -07:00
Ciprian Hacman 78dff76545 azure: Add e2e testing 2025-07-19 18:12:51 +03:00
Ciprian Hacman 20b24078d4 azure: Add e2e testing 2025-07-19 16:26:14 +03:00
Kubernetes Prow Robot 2ba473f833
Merge pull request #17500 from rifelpet/sgr-panic
Fix invalid filters for describing security group rules
2025-07-18 15:22:25 -07:00
Peter Rifel 0e172e9813
Fix invalid filters for describing security group rules
The Describe SGR API doesn't support filtering by VPC ID or group name.
Therefore if we dont have a SG ID we'll just skip trying to delete SGRs
2025-07-18 16:12:12 -05:00
Kubernetes Prow Robot 0e39e38a32
Merge pull request #17498 from rifelpet/upgrade-log
Reduce verbosity of k8s version warning
2025-07-17 01:16:25 -07:00
Peter Rifel 3ea4a5dadd
Reduce verbosity of k8s version warning
This warning isnt particularly actionable - it is expected behavior for `kops create cluster` and any `kops update cluster` that experiences this (due to a broken cluster) will proceed as normal.
The user's subsequent `kops validate cluster` would surface any such errors
2025-07-16 19:35:09 -05:00
Kubernetes Prow Robot 6ac7fcc2fa
Merge pull request #17144 from rifelpet/warmpool-containerproxy
Normalize the hardcoded images used for warmpool pre-pulling
2025-07-16 04:22:26 -07:00
Peter Rifel 9fe0a2e811
./hack/update-expected.sh 2025-07-15 22:18:05 -05:00
Peter Rifel 40e8b0f10a
Add containerProxy to integration test 2025-07-15 22:17:51 -05:00
Peter Rifel f209d34166
Normalize the hardcoded images used for warmpool pre-pulling 2025-07-15 22:00:31 -05:00
Peter Rifel 02a2fb9dc6
Extract image normalizing into separate function 2025-07-15 22:00:31 -05:00
Peter Rifel c2ad571ecb
remove unnecessary error from function signature 2025-07-15 22:00:29 -05:00
Kubernetes Prow Robot cd69582a51
Merge pull request #17494 from justinsb/use_kubeconfig
Introduce flag use-kubeconfig which allows loading from the local kubeconfig
2025-07-12 13:51:47 -07:00
Kubernetes Prow Robot ac33de5193
Merge pull request #17493 from hakman/azure-delete-by-resourceid
azure: Track resources by ID during deletion
2025-07-12 09:59:28 -07:00
justinsb be5c325918 Introduce flag use-kubeconfig which allows loading from the local kubeconfig
This supports workflows that modify the local kubeconfig for advanced configurations,
which were accidentally broken by trying to always generate the config.

Issue #17262
2025-07-12 12:54:15 -04:00
Ciprian Hacman f742fff65e azure: Track resources by ID during deletion 2025-07-12 18:43:12 +03:00
Kubernetes Prow Robot 93d0bed9ae
Merge pull request #17490 from rsafonseca/update_nodelocaldns
Upgrade node-local-dns from 1.23.0 to 1.26.0
2025-07-11 04:57:29 -07:00
Kubernetes Prow Robot 29dafcf2a8
Merge pull request #17491 from rsafonseca/fix_asssets
Update ecr-credential-provider checksums
2025-07-11 03:57:28 -07:00
Rafael da Fonseca fd7bb5bdc5 Update ecr-credential-provider checksums 2025-07-11 10:55:37 +01:00
Kubernetes Prow Robot 12058687dd
Merge pull request #17486 from hakman/bump-ecr-cred-provider
aws: Update ecr-credential-provider to v1.31.7
2025-07-11 02:03:27 -07:00
Rafael da Fonseca afcac8bfe3 Upgrade node-local-dns from 1.23.0 to 1.26.0 2025-07-11 10:00:30 +01:00
Ciprian Hacman 464af61dfb hack/update-expected.sh 2025-07-11 09:59:15 +03:00
Ciprian Hacman 83ed12de4a aws: Update ecr-credential-provider to v1.31.7 2025-07-11 09:54:10 +03:00
Kubernetes Prow Robot 01d75db71d
Merge pull request #17481 from hakman/fix-rel-notes-deprecations
docs: Fix release notes deprecations
2025-07-10 09:33:28 -07:00
Ciprian Hacman 3def208629 docs: Fix release notes deprecations 2025-07-10 16:38:51 +03:00
Kubernetes Prow Robot 1fa7b705f4
Merge pull request #17482 from hakman/fis-cloud-provider
Fix `--cloud-provider` flag for K8s 1.31+
2025-07-10 04:23:29 -07:00
Kubernetes Prow Robot af44040484
Merge pull request #17483 from hakman/azure-cloud-node
azure: Deploy cloud-node-manager for K8s 1.31+
2025-07-10 01:57:28 -07:00
Ciprian Hacman 9c057c3f53 azure: Deploy cloud-node-manager for K8s 1.31+ 2025-07-10 10:03:03 +03:00
Ciprian Hacman 97c631b05b Fix cloud-provider flag for K8s 1.31+ 2025-07-10 09:42:11 +03:00
Kubernetes Prow Robot 06b3e845cb
Merge pull request #17478 from hakman/azure-fix-role-assignment
azure: Fix small issues related to role assignments
2025-07-09 02:37:27 -07:00
Kubernetes Prow Robot c5881f5811
Merge pull request #17479 from hakman/fix-azure-image
channels: Bump Azure image
2025-07-08 23:35:27 -07:00
Ciprian Hacman e5c8df3abe channels: Bump Azure image 2025-07-09 08:30:39 +03:00
Ciprian Hacman 5018458047 Fix role assignment deletion creation 2025-07-09 08:19:43 +03:00
Ciprian Hacman 38af61248c Fix nit in role assignment creation 2025-07-09 08:18:42 +03:00
Ciprian Hacman eff3d586be Fix role assignment for cluster resource group 2025-07-09 08:18:07 +03:00
1859 changed files with 52580 additions and 44491 deletions

View File

@ -14,6 +14,6 @@ jobs:
runs-on: ubuntu-24.04
steps:
- name: 'Checkout Repository'
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8
- name: 'Review Dependencies'
uses: actions/dependency-review-action@da24556b548a50705dd671f47852072ea4c105d9
uses: actions/dependency-review-action@595b5aeba73380359d98a5e087f648dbb0edce1b

View File

@ -17,7 +17,7 @@ jobs:
runs-on: ubuntu-24.04
timeout-minutes: 70
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8
with:
path: ${{ env.GOPATH }}/src/k8s.io/kops
fetch-depth: 3
@ -46,3 +46,36 @@ jobs:
with:
name: tests-e2e-scenarios-bare-metal
path: /tmp/artifacts/
tests-e2e-scenarios-bare-metal-ipv6:
runs-on: ubuntu-24.04
timeout-minutes: 70
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8
with:
path: ${{ env.GOPATH }}/src/k8s.io/kops
fetch-depth: 3
- name: Set up go
uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5
with:
go-version-file: '${{ env.GOPATH }}/src/k8s.io/kops/go.mod'
- name: tests/e2e/scenarios/bare-metal/run-test
working-directory: ${{ env.GOPATH }}/src/k8s.io/kops
run: |
CHANGED_VERSION=$(git diff --name-only HEAD~2 | grep -E '^kops-version\.go$' || true)
if [ -z "${CHANGED_VERSION}" ]
then
timeout 60m tests/e2e/scenarios/bare-metal/scenario-ipv6
else
echo "kops-version.go has been modified, skipping test"
fi
env:
ARTIFACTS: /tmp/artifacts
- name: Archive production artifacts
if: always()
uses: actions/upload-artifact@v4
with:
name: tests-e2e-scenarios-bare-metal-ipv6
path: /tmp/artifacts/

View File

@ -26,7 +26,7 @@ jobs:
name: build-linux-${{ matrix.os.arch }}
runs-on: ${{ matrix.os.runs-on }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8
with:
path: ${{ env.GOPATH }}/src/k8s.io/kops
@ -43,7 +43,7 @@ jobs:
build-macos-amd64:
runs-on: macos-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8
with:
path: ${{ env.GOPATH }}/src/k8s.io/kops
@ -60,7 +60,7 @@ jobs:
build-windows-amd64:
runs-on: windows-2022
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8
with:
path: ${{ env.GOPATH }}/src/k8s.io/kops
@ -87,7 +87,7 @@ jobs:
name: verify-${{ matrix.os.arch }}
runs-on: ${{ matrix.os.runs-on }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8
with:
path: ${{ env.GOPATH }}/src/k8s.io/kops

View File

@ -17,7 +17,7 @@ jobs:
contents: write
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8
- run: /usr/bin/git config --global user.email actions@github.com
- run: /usr/bin/git config --global user.name 'GitHub Actions Release Tagger'
- run: hack/tag-release.sh

View File

@ -1,35 +1,46 @@
version: "2"
run:
timeout: 30m
go: "1.24"
issues:
max-same-issues: 0
# Excluding configuration per-path, per-linter, per-text and per-source
exclude-rules:
# exclude ineffassing linter for generated files for conversion
- path: conversion\.go
linters:
- ineffassign
exclude-files:
- "^zz_generated.*"
go: "1.25"
linters:
disable-all: true
default: none
enable:
- govet
- ineffassign
- staticcheck
- tenv
linters-settings: # please keep this alphabetized
staticcheck:
checks: [
"all",
"-ST1000", # Incorrect or missing package comment
"-ST1003", # Poorly chosen identifier
"-ST1005", # Incorrectly formatted error string
"-ST1006", # Poorly chosen receiver name
"-ST1012", # Poorly chosen name for error variable
"-ST1016", # Use consistent method receiver names
"-SA1019", # Using a deprecated function, variable, constant or field
]
settings:
staticcheck:
checks:
- all
- -QF1008 # ignore omit embbed fields from selector expressions
- -ST1000 # Incorrect or missing package comment
- -ST1003 # Poorly chosen identifier
- -ST1005 # Incorrectly formatted error string
- -ST1006 # Poorly chosen receiver name
- -ST1012 # Poorly chosen name for error variable
- -ST1016 # Use consistent method receiver names
- -SA1019 # Using a deprecated function, variable, constant or field
exclusions:
generated: lax
presets:
- comments
- common-false-positives
- legacy
- std-error-handling
rules:
- linters:
- ineffassign
path: conversion\.go
paths:
- ^zz_generated.*
- third_party$
- builtin$
- examples$
issues:
max-same-issues: 0
formatters:
exclusions:
generated: lax
paths:
- third_party$
- builtin$
- examples$

115
AGENTS.md Normal file
View File

@ -0,0 +1,115 @@
# kOps Project Overview
kOps is a command-line tool for creating, destroying, upgrading, and maintaining production-grade, highly available Kubernetes clusters. It is written in Go and supports multiple cloud providers, including AWS, GCP, DigitalOcean, Hetzner, OpenStack, and Azure.
The project is well-structured, with a clear separation of concerns between the different packages. The `cmd` directory contains the main entry points for the `kops` CLI and other related commands. The `pkg` directory contains the core logic for managing clusters, and the `upup` directory contains the code for provisioning cloud infrastructure.
The project has a comprehensive test suite, including unit tests, integration tests, and end-to-end tests. It also has a robust CI/CD pipeline that runs these tests on every pull request.
## Building and Running
### Prerequisites
* `make`
### Building
To build the `kops` binary, run the following command:
```bash
make kops
```
This will create the `kops` binary in the `.build/dist/<os>/<arch>` directory.
To build all the binaries, including `kops`, `protokube`, `nodeup`, and `channels`, run the following command:
```bash
make all
```
### Running
To run the `kops` binary, you can either run it directly from the `dist` directory or install it to your `$GOPATH/bin` directory by running the following command:
```bash
make install
```
### Testing
To run the unit tests, run the following command:
```bash
make test
```
To run the verification scripts, run the following command:
```bash
make verify
```
To run the full suite of CI checks, run the following command:
```bash
make ci
```
## Development Conventions
### Guidelines for Programming Assistance
When assisting with programming tasks, you will adhere to the following principles:
* **Follow Requirements**: Carefully follow the user's requirements to the letter.
* **Plan First**: For any non-trivial change, first describe a detailed, step-by-step plan, including the files you intend to modify and the tests you will add or update.
* **Test Thoroughly**: Implement comprehensive tests to ensure correctness and prevent regressions.
* **Comment Intelligently**: Add comments to explain the "why" behind complex or non-obvious code, keeping in mind that the reader may not be a Kubernetes expert.
* **No TODOs**: Leave no `TODO` comments, placeholders, or incomplete implementations.
* **Prioritize Correctness**: Always prioritize security, scalability, and maintainability in your implementations.
### Avoiding Loops
When performing complex tasks, especially those involving code modifications and verification, it's important to avoid getting into loops. A loop can occur when the agent repeatedly tries the same action without success, or when it gets stuck in a cycle of analysis, action, and failure.
To avoid loops:
* **Analyze the problem carefully**: Before taking any action, make sure you understand the problem and have a clear plan to solve it.
* **Break down the problem**: Break down complex problems into smaller, more manageable steps.
* **Verify each step**: After each step, verify that it was successful before moving on to the next one.
* **Don't repeat failed actions**: If an action fails, don't just repeat it. Analyze the cause of the failure and try a different approach.
* **Ask for help**: If you're stuck, don't hesitate to ask for help from the user.
### Code Style
The project follows the standard Go code style and the official [Kubernetes coding conventions](https://www.k8s.dev/docs/guide/coding-convention/). All code should be formatted with `gofmt` and `goimports`. You can format the code by running the following commands:
```bash
make gofmt
make goimports
```
### Linting
The project uses `golangci-lint` to lint the code. You can run the linter by running the following command:
```bash
make verify-golangci-lint
```
### Dependencies
The project uses Go modules to manage dependencies. To add a new dependency, add it to the `go.mod` file and then run the following command:
```bash
make gomod
```
### Commits
The project follows the conventional commit message format.
### Contributions
Contributions are welcome! Before submitting a pull request, please open an issue to discuss your proposed changes. All pull requests must be reviewed and approved by a maintainer before they can be merged.

1
CLAUDE.md Normal file
View File

@ -0,0 +1 @@
AGENTS.md

1
GEMINI.md Normal file
View File

@ -0,0 +1 @@
AGENTS.md

View File

@ -42,7 +42,7 @@ endif
# CODEGEN_VERSION is the version of k8s.io/code-generator to use
CODEGEN_VERSION=v0.29.0
KO=go run github.com/google/ko@v0.14.1
KO=go run github.com/google/ko@v0.18.0
UPLOAD_CMD=$(KOPS_ROOT)/hack/upload ${UPLOAD_ARGS}
@ -66,16 +66,16 @@ GITSHA := $(shell cd ${KOPS_ROOT}; git describe --always)
# We lock the versions of our controllers also
# We need to keep in sync with:
# pkg/model/components/etcdmanager/model.go
KOPS_UTILS_CP_TAG=1.33.0-beta.1
KOPS_UTILS_CP_TAG=1.34.0-alpha.1
KOPS_UTILS_CP_PUSH_TAG=$(shell tools/get_workspace_status.sh | grep STABLE_KOPS_UTILS_CP_TAG | awk '{print $$2}')
# upup/models/cloudup/resources/addons/dns-controller/
DNS_CONTROLLER_TAG=1.33.0-beta.1
DNS_CONTROLLER_TAG=1.34.0-alpha.1
DNS_CONTROLLER_PUSH_TAG=$(shell tools/get_workspace_status.sh | grep STABLE_DNS_CONTROLLER_TAG | awk '{print $$2}')
# upup/models/cloudup/resources/addons/kops-controller.addons.k8s.io/
KOPS_CONTROLLER_TAG=1.33.0-beta.1
KOPS_CONTROLLER_TAG=1.34.0-alpha.1
KOPS_CONTROLLER_PUSH_TAG=$(shell tools/get_workspace_status.sh | grep STABLE_KOPS_CONTROLLER_TAG | awk '{print $$2}')
# pkg/model/components/kubeapiserver/model.go
KUBE_APISERVER_HEALTHCHECK_TAG=1.33.0-beta.1
KUBE_APISERVER_HEALTHCHECK_TAG=1.34.0-alpha.1
KUBE_APISERVER_HEALTHCHECK_PUSH_TAG=$(shell tools/get_workspace_status.sh | grep STABLE_KUBE_APISERVER_HEALTHCHECK_TAG | awk '{print $$2}')
CGO_ENABLED=0

1
QWEN.md Normal file
View File

@ -0,0 +1 @@
AGENTS.md

View File

@ -110,7 +110,7 @@ spec:
providerID: azure
architectureID: amd64
kubernetesVersion: ">=1.27.0 <1.32.0"
- name: Canonical:ubuntu-24_04-lts:server:24.04.20250606
- name: Canonical:ubuntu-24_04-lts:server:24.04.202507010
providerID: azure
architectureID: amd64
kubernetesVersion: ">=1.32.0"
@ -119,14 +119,20 @@ spec:
networking:
kubenet: {}
kubernetesVersions:
- range: ">=1.34.0"
recommendedVersion: 1.34.0
requiredVersion: 1.34.0
- range: ">=1.33.0"
recommendedVersion: 1.33.4
requiredVersion: 1.33.0
- range: ">=1.32.0"
recommendedVersion: 1.32.4
recommendedVersion: 1.32.8
requiredVersion: 1.32.0
- range: ">=1.31.0"
recommendedVersion: 1.31.8
recommendedVersion: 1.31.12
requiredVersion: 1.31.0
- range: ">=1.30.0"
recommendedVersion: 1.30.12
recommendedVersion: 1.30.14
requiredVersion: 1.30.0
- range: ">=1.29.0"
recommendedVersion: 1.29.15
@ -189,36 +195,44 @@ spec:
recommendedVersion: 1.11.10
requiredVersion: 1.11.10
kopsVersions:
- range: ">=1.34.0-alpha.1"
recommendedVersion: "1.33.1"
#requiredVersion: 1.34.0
kubernetesVersion: 1.34.0
- range: ">=1.33.0-alpha.1"
recommendedVersion: "1.33.1"
#requiredVersion: 1.33.0
kubernetesVersion: 1.33.4
- range: ">=1.32.0-alpha.1"
recommendedVersion: "1.31.0-beta.1"
recommendedVersion: "1.33.1"
#requiredVersion: 1.32.0
kubernetesVersion: 1.32.4
kubernetesVersion: 1.32.8
- range: ">=1.31.0-alpha.1"
recommendedVersion: "1.31.0-beta.1"
recommendedVersion: "1.33.1"
#requiredVersion: 1.31.0
kubernetesVersion: 1.31.8
kubernetesVersion: 1.31.12
- range: ">=1.30.0-alpha.1"
recommendedVersion: "1.30.3"
recommendedVersion: "1.33.1"
#requiredVersion: 1.30.0
kubernetesVersion: 1.30.12
kubernetesVersion: 1.30.14
- range: ">=1.29.0-alpha.1"
recommendedVersion: "1.30.3"
recommendedVersion: "1.33.1"
#requiredVersion: 1.29.0
kubernetesVersion: 1.29.15
- range: ">=1.28.0-alpha.1"
recommendedVersion: "1.30.3"
recommendedVersion: "1.33.1"
#requiredVersion: 1.28.0
kubernetesVersion: 1.28.15
- range: ">=1.27.0-alpha.1"
recommendedVersion: "1.30.3"
recommendedVersion: "1.32.2"
#requiredVersion: 1.27.0
kubernetesVersion: 1.27.16
- range: ">=1.26.0-alpha.1"
recommendedVersion: "1.30.3"
recommendedVersion: "1.31.0"
#requiredVersion: 1.26.0
kubernetesVersion: 1.26.15
- range: ">=1.25.0-alpha.1"
recommendedVersion: "1.30.3"
recommendedVersion: "1.30.4"
#requiredVersion: 1.25.0
kubernetesVersion: 1.25.16
- range: ">=1.24.0-alpha.1"

View File

@ -24,12 +24,10 @@ import (
"os"
"github.com/blang/semver/v4"
"github.com/cert-manager/cert-manager/pkg/client/clientset/versioned"
certmanager "github.com/cert-manager/cert-manager/pkg/client/clientset/versioned"
"github.com/spf13/cobra"
"go.uber.org/multierr"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/cli-runtime/pkg/genericclioptions"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/restmapper"
@ -41,8 +39,6 @@ import (
type ApplyChannelOptions struct {
Yes bool
configFlags genericclioptions.ConfigFlags
}
func NewCmdApplyChannel(f *ChannelsFactory, out io.Writer) *cobra.Command {
@ -120,7 +116,7 @@ func RunApplyChannel(ctx context.Context, f *ChannelsFactory, out io.Writer, opt
return applyMenu(ctx, menu, f.VFSContext(), k8sClient, cmClient, dynamicClient, restMapper, options.Yes)
}
func applyMenu(ctx context.Context, menu *channels.AddonMenu, vfsContext *vfs.VFSContext, k8sClient kubernetes.Interface, cmClient versioned.Interface, dynamicClient dynamic.Interface, restMapper *restmapper.DeferredDiscoveryRESTMapper, apply bool) error {
func applyMenu(ctx context.Context, menu *channels.AddonMenu, vfsContext *vfs.VFSContext, k8sClient kubernetes.Interface, cmClient certmanager.Interface, dynamicClient dynamic.Interface, restMapper *restmapper.DeferredDiscoveryRESTMapper, apply bool) error {
// channelVersions is the list of installed addons in the cluster.
// It is keyed by <namespace>:<addon name>.
channelVersions, err := getChannelVersions(ctx, k8sClient)
@ -198,7 +194,7 @@ func applyMenu(ctx context.Context, menu *channels.AddonMenu, vfsContext *vfs.VF
return merr
}
func getUpdates(ctx context.Context, menu *channels.AddonMenu, k8sClient kubernetes.Interface, cmClient versioned.Interface, channelVersions map[string]*channels.ChannelVersion) ([]*channels.AddonUpdate, []*channels.Addon, error) {
func getUpdates(ctx context.Context, menu *channels.AddonMenu, k8sClient kubernetes.Interface, cmClient certmanager.Interface, channelVersions map[string]*channels.ChannelVersion) ([]*channels.AddonUpdate, []*channels.Addon, error) {
var updates []*channels.AddonUpdate
var needUpdates []*channels.Addon
for _, addon := range menu.Addons {

View File

@ -110,7 +110,7 @@ spec:
providerID: azure
architectureID: amd64
kubernetesVersion: ">=1.27.0 <1.32.0"
- name: Canonical:ubuntu-24_04-lts:server:24.04.20250606
- name: Canonical:ubuntu-24_04-lts:server:24.04.202507010
providerID: azure
architectureID: amd64
kubernetesVersion: ">=1.32.0"
@ -119,14 +119,20 @@ spec:
networking:
kubenet: {}
kubernetesVersions:
- range: ">=1.34.0"
recommendedVersion: 1.34.0
requiredVersion: 1.34.0
- range: ">=1.33.0"
recommendedVersion: 1.33.4
requiredVersion: 1.33.0
- range: ">=1.32.0"
recommendedVersion: 1.32.4
recommendedVersion: 1.32.8
requiredVersion: 1.32.0
- range: ">=1.31.0"
recommendedVersion: 1.31.8
recommendedVersion: 1.31.12
requiredVersion: 1.31.0
- range: ">=1.30.0"
recommendedVersion: 1.30.12
recommendedVersion: 1.30.14
requiredVersion: 1.30.0
- range: ">=1.29.0"
recommendedVersion: 1.29.15
@ -189,36 +195,44 @@ spec:
recommendedVersion: 1.11.10
requiredVersion: 1.11.10
kopsVersions:
- range: ">=1.34.0-alpha.1"
recommendedVersion: "1.33.1"
#requiredVersion: 1.34.0
kubernetesVersion: 1.34.0
- range: ">=1.33.0-alpha.1"
recommendedVersion: "1.33.1"
#requiredVersion: 1.33.0
kubernetesVersion: 1.33.4
- range: ">=1.32.0-alpha.1"
recommendedVersion: "1.31.0-beta.1"
recommendedVersion: "1.33.1"
#requiredVersion: 1.32.0
kubernetesVersion: 1.32.4
kubernetesVersion: 1.32.8
- range: ">=1.31.0-alpha.1"
recommendedVersion: "1.31.0-beta.1"
recommendedVersion: "1.33.1"
#requiredVersion: 1.31.0
kubernetesVersion: 1.31.8
kubernetesVersion: 1.31.12
- range: ">=1.30.0-alpha.1"
recommendedVersion: "1.30.3"
recommendedVersion: "1.33.1"
#requiredVersion: 1.30.0
kubernetesVersion: 1.30.12
kubernetesVersion: 1.30.14
- range: ">=1.29.0-alpha.1"
recommendedVersion: "1.30.3"
recommendedVersion: "1.33.1"
#requiredVersion: 1.29.0
kubernetesVersion: 1.29.15
- range: ">=1.28.0-alpha.1"
recommendedVersion: "1.30.3"
recommendedVersion: "1.33.1"
#requiredVersion: 1.28.0
kubernetesVersion: 1.28.15
- range: ">=1.27.0-alpha.1"
recommendedVersion: "1.30.3"
recommendedVersion: "1.32.2"
#requiredVersion: 1.27.0
kubernetesVersion: 1.27.16
- range: ">=1.26.0-alpha.1"
recommendedVersion: "1.30.3"
recommendedVersion: "1.31.0"
#requiredVersion: 1.26.0
kubernetesVersion: 1.26.15
- range: ">=1.25.0-alpha.1"
recommendedVersion: "1.30.3"
recommendedVersion: "1.30.4"
#requiredVersion: 1.25.0
kubernetesVersion: 1.25.16
- range: ">=1.24.0-alpha.1"

View File

@ -5,7 +5,7 @@ options:
machineType: "E2_HIGHCPU_32"
steps:
# Push the images
- name: "mirror.gcr.io/library/golang:1.24.4-bookworm"
- name: "mirror.gcr.io/library/golang:1.25.0-trixie"
id: images
entrypoint: make
env:
@ -21,7 +21,7 @@ steps:
- dns-controller-push
- kube-apiserver-healthcheck-push
# Push the artifacts
- name: "mirror.gcr.io/library/golang:1.24.4-bookworm"
- name: "mirror.gcr.io/library/golang:1.25.0-trixie"
id: artifacts
entrypoint: make
env:
@ -36,7 +36,7 @@ steps:
args:
- gcs-upload-and-tag
# Build cloudbuild artifacts (for attestation)
- name: "mirror.gcr.io/library/golang:1.24.4-bookworm"
- name: "mirror.gcr.io/library/golang:1.25.0-trixie"
id: cloudbuild-artifacts
entrypoint: make
env:

View File

@ -20,8 +20,6 @@ import (
"net/http/httptest"
"sync"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/instanceactions"
"github.com/gophercloud/gophercloud/v2"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/flavors"
@ -37,13 +35,12 @@ type MockClient struct {
openstack.MockOpenstackServer
mutex sync.Mutex
serverGroups map[string]servergroups.ServerGroup
servers map[string]servers.Server
keyPairs map[string]keypairs.KeyPair
images map[string]images.Image
flavors map[string]flavors.Flavor
instanceActions map[string]instanceactions.InstanceAction
networkClient *gophercloud.ServiceClient
serverGroups map[string]servergroups.ServerGroup
servers map[string]servers.Server
keyPairs map[string]keypairs.KeyPair
images map[string]images.Image
flavors map[string]flavors.Flavor
networkClient *gophercloud.ServiceClient
}
// CreateClient will create a new mock networking client

View File

@ -181,7 +181,8 @@ func (m *MockClient) routerInterface(w http.ResponseWriter, r *http.Request) {
if err != nil {
panic("error decoding create router interface request")
}
if parts[2] == "add_router_interface" {
switch parts[2] {
case "add_router_interface":
subnet := m.subnets[createInterface.SubnetID]
interfaces := m.routerInterfaces[routerID]
interfaces = append(interfaces, routers.InterfaceInfo{
@ -201,7 +202,7 @@ func (m *MockClient) routerInterface(w http.ResponseWriter, r *http.Request) {
},
}
m.ports[port.ID] = port
} else if parts[2] == "remove_router_interface" {
case "remove_router_interface":
interfaces := make([]routers.InterfaceInfo, 0)
for _, i := range m.routerInterfaces[routerID] {
if i.SubnetID != createInterface.SubnetID {
@ -209,7 +210,7 @@ func (m *MockClient) routerInterface(w http.ResponseWriter, r *http.Request) {
}
}
m.routerInterfaces[routerID] = interfaces
} else {
default:
w.WriteHeader(http.StatusBadRequest)
return
}

View File

@ -107,7 +107,7 @@ func (f *FakeDomainAPI) UpdateDNSZoneRecords(req *domain.UpdateDNSZoneRecordsReq
break
}
}
if found == false {
if !found {
return nil, fmt.Errorf("could not find record %s to delete", *change.Delete.ID)
}

View File

@ -56,7 +56,7 @@ func NewGCEIPAMReconciler(mgr manager.Manager) (*GCEIPAMReconciler, error) {
return r, nil
}
// GCEIPAMReconciler observes Node objects, assigning their`PodCIDRs` from the instance's `ExternalIpv6`.
// GCEIPAMReconciler observes Node objects, assigning their `PodCIDRs` from the instance's `ExternalIpv6`.
type GCEIPAMReconciler struct {
// client is the controller-runtime client
client client.Client

View File

@ -0,0 +1,115 @@
/*
Copyright 2024 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package controllers
import (
"context"
"fmt"
"github.com/go-logr/logr"
corev1 "k8s.io/api/core/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/types"
corev1client "k8s.io/client-go/kubernetes/typed/core/v1"
"k8s.io/klog/v2"
kopsapi "k8s.io/kops/pkg/apis/kops/v1alpha2"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/manager"
)
// NewMetalIPAMReconciler is the constructor for a MetalIPAMReconciler
func NewMetalIPAMReconciler(ctx context.Context, mgr manager.Manager) (*MetalIPAMReconciler, error) {
klog.Info("starting metal ipam controller")
r := &MetalIPAMReconciler{
client: mgr.GetClient(),
log: ctrl.Log.WithName("controllers").WithName("metal_ipam"),
}
coreClient, err := corev1client.NewForConfig(mgr.GetConfig())
if err != nil {
return nil, fmt.Errorf("building corev1 client: %w", err)
}
r.coreV1Client = coreClient
return r, nil
}
// MetalIPAMReconciler observes Node objects, assigning their `PodCIDRs` from the instance's `ExternalIpv6`.
type MetalIPAMReconciler struct {
// client is the controller-runtime client
client client.Client
// log is a logr
log logr.Logger
// coreV1Client is a client-go client for patching nodes
coreV1Client *corev1client.CoreV1Client
}
// +kubebuilder:rbac:groups=,resources=nodes,verbs=get;list;watch;patch
// Reconcile is the main reconciler function that observes node changes.
func (r *MetalIPAMReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
log := klog.FromContext(ctx)
node := &corev1.Node{}
if err := r.client.Get(ctx, req.NamespacedName, node); err != nil {
if apierrors.IsNotFound(err) {
// we'll ignore not-found errors, since they can't be fixed by an immediate
// requeue (we'll need to wait for a new notification), and we can get them
// on deleted requests.
return ctrl.Result{}, nil
}
log.Error(err, "unable to fetch node", "node.name", node.Name)
return ctrl.Result{}, err
}
host := &kopsapi.Host{}
id := types.NamespacedName{
Namespace: "kops-system",
Name: node.Name,
}
if err := r.client.Get(ctx, id, host); err != nil {
log.Error(err, "unable to fetch host", "id", id)
return ctrl.Result{}, err
}
if len(node.Spec.PodCIDRs) != 0 && len(host.Spec.PodCIDRs) > 0 {
log.V(2).Info("node has pod cidrs, skipping", "node.name", node.Name)
return ctrl.Result{}, nil
}
if len(host.Spec.PodCIDRs) == 0 {
log.Info("host record has no pod cidrs, cannot assign pod cidrs to node", "node.name", node.Name)
return ctrl.Result{}, nil
}
log.Info("assigning pod cidrs to node", "node.name", node.Name, "pod.cidrs", host.Spec.PodCIDRs)
if err := patchNodePodCIDRs(r.coreV1Client, ctx, node, host.Spec.PodCIDRs); err != nil {
log.Error(err, "unable to patch node", "node.name", node.Name)
return ctrl.Result{}, err
}
return ctrl.Result{}, nil
}
func (r *MetalIPAMReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
Named("metal_ipam").
For(&corev1.Node{}).
Complete(r)
}

View File

@ -392,6 +392,12 @@ func setupCloudIPAM(ctx context.Context, mgr manager.Manager, opt *config.Option
return fmt.Errorf("creating gce IPAM controller: %w", err)
}
controller = ipamController
case "metal":
ipamController, err := controllers.NewMetalIPAMReconciler(ctx, mgr)
if err != nil {
return fmt.Errorf("creating metal IPAM controller: %w", err)
}
controller = ipamController
default:
return fmt.Errorf("kOps IPAM controller is not supported on cloud %q", opt.Cloud)
}

View File

@ -161,7 +161,7 @@ func (s *Server) bootstrap(w http.ResponseWriter, r *http.Request) {
if err != nil {
klog.Infof("bootstrap %s read err: %v", r.RemoteAddr, err)
w.WriteHeader(http.StatusBadRequest)
_, _ = w.Write([]byte(fmt.Sprintf("bootstrap %s failed to read body: %v", r.RemoteAddr, err)))
_, _ = fmt.Fprintf(w, "bootstrap %s failed to read body: %v", r.RemoteAddr, err)
return
}
@ -208,7 +208,7 @@ func (s *Server) bootstrap(w http.ResponseWriter, r *http.Request) {
if err := json.Unmarshal(body, req); err != nil {
klog.Infof("bootstrap %s decode err: %v", r.RemoteAddr, err)
w.WriteHeader(http.StatusBadRequest)
_, _ = w.Write([]byte(fmt.Sprintf("failed to decode: %v", err)))
_, _ = fmt.Fprintf(w, "failed to decode: %v", err)
return
}
@ -264,7 +264,7 @@ func (s *Server) bootstrap(w http.ResponseWriter, r *http.Request) {
if err != nil {
klog.Infof("bootstrap %s cert %q issue err: %v", r.RemoteAddr, name, err)
w.WriteHeader(http.StatusBadRequest)
_, _ = w.Write([]byte(fmt.Sprintf("failed to issue %q: %v", name, err)))
_, _ = fmt.Fprintf(w, "failed to issue %q: %v", name, err)
return
}
resp.Certs[name] = cert

View File

@ -536,6 +536,12 @@ func RunCreateCluster(ctx context.Context, f *util.Factory, out io.Writer, c *Cr
c.NetworkID = c.OpenstackNetworkID
}
if featureflag.Azure.Enabled() {
if c.CloudProvider == "azure" && c.AzureSubscriptionID == "" {
return fmt.Errorf("--azure-subscription-id is required")
}
}
clusterResult, err := cloudup.NewCluster(&c.NewClusterOptions, clientset)
if err != nil {
return err
@ -756,8 +762,8 @@ func RunCreateCluster(ctx context.Context, f *util.Factory, out io.Writer, c *Cr
if autoloadSSHPublicKeys {
// Load from default locations, if found
sshPublicKeyPaths := []string{
"~/.ssh/id_rsa.pub",
"~/.ssh/id_ed25519.pub",
"~/.ssh/id_rsa.pub",
}
var merr error
for _, sshPublicKeyPath := range sshPublicKeyPaths {
@ -852,7 +858,7 @@ func parseCloudLabels(s string) (map[string]string, error) {
// Replace commas with newlines to allow a single pass with csv.Reader.
// We can't use csv.Reader for the initial split because it would see each key=value record as a single field
// and significantly complicates using quoted fields as keys or values.
records := strings.Replace(s, ",", "\n", -1)
records := strings.ReplaceAll(s, ",", "\n")
// Let the CSV library do the heavy-lifting in handling nested ='s
r := csv.NewReader(strings.NewReader(records))

View File

@ -46,8 +46,6 @@ var MagicTimestamp = metav1.Time{Time: time.Date(2017, 1, 1, 0, 0, 0, 0, time.UT
// TestCreateClusterMinimal runs kops create cluster minimal.example.com --zones us-test-1a
func TestCreateClusterMinimal(t *testing.T) {
runCreateClusterIntegrationTest(t, "../../tests/integration/create_cluster/minimal-1.27", "v1alpha2")
runCreateClusterIntegrationTest(t, "../../tests/integration/create_cluster/minimal-1.28", "v1alpha2")
runCreateClusterIntegrationTest(t, "../../tests/integration/create_cluster/minimal-1.29", "v1alpha2")
runCreateClusterIntegrationTest(t, "../../tests/integration/create_cluster/minimal-1.30", "v1alpha2")
runCreateClusterIntegrationTest(t, "../../tests/integration/create_cluster/minimal-1.31", "v1alpha2")

View File

@ -98,7 +98,7 @@ func NewCmdExportKubeconfig(f *util.Factory, out io.Writer) *cobra.Command {
cmd.Flags().BoolVar(&options.Internal, "internal", options.Internal, "Use the cluster's internal DNS name")
cmd.Flags().BoolVar(&options.UseKopsAuthenticationPlugin, "auth-plugin", options.UseKopsAuthenticationPlugin, "Use the kOps authentication plugin")
options.CreateKubecfgOptions.AddCommonFlags(cmd.Flags())
options.CreateKubecfgOptions.AddFlagsForExport(cmd.Flags())
return cmd
}

View File

@ -246,28 +246,6 @@ func TestMinimalAWS(t *testing.T) {
runTestTerraformAWS(t)
}
// TestMinimal runs the test on a minimum configuration
func TestMinimal_v1_27(t *testing.T) {
newIntegrationTest("minimal.example.com", "minimal-1.27").
withAddons(
awsEBSCSIAddon,
dnsControllerAddon,
awsCCMAddon,
).
runTestTerraformAWS(t)
}
// TestMinimal runs the test on a minimum configuration
func TestMinimal_v1_28(t *testing.T) {
newIntegrationTest("minimal.example.com", "minimal-1.28").
withAddons(
awsEBSCSIAddon,
dnsControllerAddon,
awsCCMAddon,
).
runTestTerraformAWS(t)
}
// TestMinimal runs the test on a minimum configuration
func TestMinimal_v1_29(t *testing.T) {
newIntegrationTest("minimal.example.com", "minimal-1.29").
@ -722,15 +700,6 @@ func TestPrivateCiliumENI(t *testing.T) {
runTestTerraformAWS(t)
}
// TestPrivateCanal runs the test on a configuration with private topology, canal networking
func TestPrivateCanal(t *testing.T) {
newIntegrationTest("privatecanal.example.com", "privatecanal").
withPrivate().
withDefaultAddons30().
withAddons(canalAddon).
runTestTerraformAWS(t)
}
const kopeioNetworkingAddon = "networking.kope.io-k8s-1.12"
// TestPrivateKopeio runs the test on a configuration with private topology, kopeio networking
@ -1605,7 +1574,7 @@ func (i *integrationTest) runTestTerraformAWS(t *testing.T) {
"aws_cloudwatch_event_rule_" + awsup.GetClusterName40(i.clusterName) + "-SpotInterruption_event_pattern",
"aws_cloudwatch_event_rule_" + awsup.GetClusterName40(i.clusterName) + "-InstanceStateChange_event_pattern",
"aws_cloudwatch_event_rule_" + awsup.GetClusterName40(i.clusterName) + "-InstanceScheduledChange_event_pattern",
"aws_sqs_queue_" + strings.Replace(i.clusterName, ".", "-", -1) + "-nth_policy",
"aws_sqs_queue_" + strings.ReplaceAll(i.clusterName, ".", "-") + "-nth_policy",
}...)
}
if i.nthRebalance {
@ -1633,7 +1602,8 @@ func (i *integrationTest) runTestPhase(t *testing.T, phase cloudup.Phase) {
expectedFilenames := i.expectTerraformFilenames
if phase == cloudup.PhaseSecurity {
switch phase {
case cloudup.PhaseSecurity:
expectedFilenames = []string{
"aws_iam_role_masters." + i.clusterName + "_policy",
"aws_iam_role_nodes." + i.clusterName + "_policy",
@ -1648,7 +1618,7 @@ func (i *integrationTest) runTestPhase(t *testing.T, phase cloudup.Phase) {
"aws_launch_template_bastion." + i.clusterName + "_user_data",
}...)
}
} else if phase == cloudup.PhaseCluster {
case cloudup.PhaseCluster:
expectedFilenames = []string{
"aws_launch_template_nodes." + i.clusterName + "_user_data",
}

View File

@ -56,7 +56,7 @@ func (o *LifecycleTestOptions) AddDefaults() {
o.Version = "v1alpha2"
}
if o.ClusterName == "" {
o.ClusterName = strings.Replace(o.SrcDir, "_", "", -1) + ".example.com"
o.ClusterName = strings.ReplaceAll(o.SrcDir, "_", "") + ".example.com"
}
o.SrcDir = "../../tests/integration/update_cluster/" + o.SrcDir

View File

@ -45,11 +45,14 @@ func NewCmdToolboxEnroll(f commandutils.Factory, out io.Writer) *cobra.Command {
cmd.Flags().StringVar(&options.ClusterName, "cluster", options.ClusterName, "Name of cluster to join")
cmd.Flags().StringVar(&options.InstanceGroup, "instance-group", options.InstanceGroup, "Name of instance-group to join")
cmd.Flags().StringSliceVar(&options.PodCIDRs, "pod-cidr", options.PodCIDRs, "IP Address range to use for pods that run on this node")
cmd.Flags().StringVar(&options.Host, "host", options.Host, "IP/hostname for machine to add")
cmd.Flags().StringVar(&options.SSHUser, "ssh-user", options.SSHUser, "user for ssh")
cmd.Flags().IntVar(&options.SSHPort, "ssh-port", options.SSHPort, "port for ssh")
cmd.Flags().BoolVar(&options.BuildHost, "build-host", options.BuildHost, "only build the host resource, don't apply it or enroll the node")
options.CreateKubecfgOptions.AddCommonFlags(cmd.Flags())
return cmd

View File

@ -22,8 +22,8 @@ import (
"io"
"strings"
"github.com/aws/amazon-ec2-instance-selector/v2/pkg/cli"
"github.com/aws/amazon-ec2-instance-selector/v2/pkg/selector"
"github.com/aws/amazon-ec2-instance-selector/v3/pkg/cli"
"github.com/aws/amazon-ec2-instance-selector/v3/pkg/selector"
ec2types "github.com/aws/aws-sdk-go-v2/service/ec2/types"
"github.com/spf13/cobra"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@ -520,7 +520,8 @@ func decorateWithMixedInstancesPolicy(instanceGroup *kops.InstanceGroup, usageCl
ig := instanceGroup
ig.Spec.MachineType = instanceSelections[0]
if usageClass == ec2types.UsageClassTypeSpot {
switch usageClass {
case ec2types.UsageClassTypeSpot:
ondemandBase := int64(0)
ondemandAboveBase := int64(0)
spotAllocationStrategy := "capacity-optimized"
@ -530,11 +531,11 @@ func decorateWithMixedInstancesPolicy(instanceGroup *kops.InstanceGroup, usageCl
OnDemandAboveBase: &ondemandAboveBase,
SpotAllocationStrategy: &spotAllocationStrategy,
}
} else if usageClass == ec2types.UsageClassTypeOnDemand {
case ec2types.UsageClassTypeOnDemand:
ig.Spec.MixedInstancesPolicy = &kops.MixedInstancesPolicySpec{
Instances: instanceSelections,
}
} else {
default:
return nil, fmt.Errorf("error node usage class not supported")
}

View File

@ -21,7 +21,7 @@ import (
"regexp"
"testing"
"github.com/aws/amazon-ec2-instance-selector/v2/pkg/cli"
"github.com/aws/amazon-ec2-instance-selector/v3/pkg/cli"
ec2types "github.com/aws/aws-sdk-go-v2/service/ec2/types"
"k8s.io/kops/pkg/apis/kops"
)

View File

@ -359,9 +359,9 @@ func RunUpdateCluster(ctx context.Context, f *util.Factory, out io.Writer, c *Up
if !c.IgnoreKubeletVersionSkew {
minControlPlaneRunningVersion, err = checkControlPlaneRunningVersion(ctx, cluster.ObjectMeta.Name, minControlPlaneRunningVersion)
if err != nil {
klog.Warningf("error checking control plane running version, assuming no k8s upgrade in progress: %v", err)
klog.V(2).Infof("error checking control plane running version, assuming no k8s upgrade in progress: %v", err)
} else {
klog.V(2).Infof("successfully checked control plane running version: %v", minControlPlaneRunningVersion)
klog.V(2).Infof("found control plane running version: %v", minControlPlaneRunningVersion)
}
}
applyCmd := &cloudup.ApplyClusterCmd{
@ -412,6 +412,10 @@ func RunUpdateCluster(ctx context.Context, f *util.Factory, out io.Writer, c *Up
}
firstRun = !hasKubeconfig
if c.CreateKubecfgOptions.UseKubeconfig {
klog.Infof("hint: passing --create-kube-config=true causes the kubeconfig to be overwritten, you may not want to use this flag with --use-kubeconfig=false")
}
klog.Infof("Exporting kubeconfig for cluster")
conf, err := kubeconfig.BuildKubecfg(

View File

@ -25,6 +25,7 @@ import (
"sync"
"k8s.io/apimachinery/pkg/util/validation/field"
"k8s.io/cli-runtime/pkg/genericclioptions"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
@ -188,15 +189,19 @@ func (f *clusterInfo) RESTConfig(ctx context.Context) (*rest.Config, error) {
return nil, err
}
restConfig.UserAgent = "kops"
restConfig.Burst = 50
restConfig.QPS = 20
configureRESTConfig(restConfig)
f.cachedRESTConfig = restConfig
}
return f.cachedRESTConfig, nil
}
func configureRESTConfig(restConfig *rest.Config) {
restConfig.UserAgent = "kops"
restConfig.Burst = 50
restConfig.QPS = 20
}
func (f *Factory) HTTPClient(restConfig *rest.Config) (*http.Client, error) {
return rest.HTTPClientFor(restConfig)
}
@ -272,6 +277,31 @@ func (f *Factory) buildRESTConfig(ctx context.Context, cluster *kops.Cluster, op
options.Admin = kubeconfig.DefaultKubecfgAdminLifetime
}
if options.UseKubeconfig {
// Get the kubeconfig from the context
klog.Infof("--use-kubeconfig is set; loading connectivity information from kubeconfig (instead of generating it)")
clusterName := cluster.ObjectMeta.Name
clientGetter := genericclioptions.NewConfigFlags(true)
contextName := clusterName
clientGetter.Context = &contextName
restConfig, err := clientGetter.ToRESTConfig()
if err != nil {
return nil, fmt.Errorf("loading kubecfg settings for %q: %w", clusterName, err)
}
configureRESTConfig(restConfig)
if options.OverrideAPIServer != "" {
klog.Infof("overriding API server with %q", options.OverrideAPIServer)
restConfig.Host = options.OverrideAPIServer
}
return restConfig, nil
}
conf, err := kubeconfig.BuildKubecfg(
ctx,
cluster,

View File

@ -36,7 +36,6 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/klog/v2"
"k8s.io/kops/cmd/kops/util"
"k8s.io/kops/pkg/apis/kops"
kopsapi "k8s.io/kops/pkg/apis/kops"
"k8s.io/kops/pkg/validation"
"k8s.io/kops/util/pkg/tables"
@ -63,7 +62,7 @@ var (
type ValidateClusterOptions struct {
ClusterName string
InstanceGroupRoles []kops.InstanceGroupRole
InstanceGroupRoles []kopsapi.InstanceGroupRole
output string
wait time.Duration
count int
@ -71,7 +70,7 @@ type ValidateClusterOptions struct {
kubeconfig string
// filterInstanceGroups is a function that returns true if the instance group should be validated
filterInstanceGroups func(ig *kops.InstanceGroup) bool
filterInstanceGroups func(ig *kopsapi.InstanceGroup) bool
// filterPodsForValidation is a function that returns true if the pod should be validated
filterPodsForValidation func(pod *v1.Pod) bool

View File

@ -201,9 +201,10 @@ func (c *NodeController) updateNodeRecords(node *v1.Node) string {
for _, a := range node.Status.Addresses {
var roleType string
if a.Type == v1.NodeInternalIP {
switch a.Type {
case v1.NodeInternalIP:
roleType = dns.RoleTypeInternal
} else if a.Type == v1.NodeExternalIP {
case v1.NodeExternalIP:
roleType = dns.RoleTypeExternal
}
var recordType dns.RecordType = dns.RecordTypeA

View File

@ -152,7 +152,8 @@ func (c *ServiceController) updateServiceRecords(service *v1.Service) string {
if len(specExternal) != 0 || len(specInternal) != 0 {
var ingresses []dns.Record
if service.Spec.Type == v1.ServiceTypeLoadBalancer {
switch service.Spec.Type {
case v1.ServiceTypeLoadBalancer:
for i := range service.Status.LoadBalancer.Ingress {
ingress := &service.Status.LoadBalancer.Ingress[i]
if ingress.Hostname != "" {
@ -175,7 +176,7 @@ func (c *ServiceController) updateServiceRecords(service *v1.Service) string {
klog.V(4).Infof("Found A record for service %s/%s: %q", service.Namespace, service.Name, ingress.IP)
}
}
} else if service.Spec.Type == v1.ServiceTypeNodePort {
case v1.ServiceTypeNodePort:
var roleType string
if len(specExternal) != 0 && len(specInternal) != 0 {
klog.Warningln("DNS Records not possible for both Internal and Externals IPs.")
@ -190,7 +191,7 @@ func (c *ServiceController) updateServiceRecords(service *v1.Service) string {
Value: dns.AliasForNodesInRole("node", roleType),
})
klog.V(4).Infof("Setting internal alias for NodePort service %s/%s", service.Namespace, service.Name)
} else {
default:
// TODO: Emit event so that users are informed of this
klog.V(2).Infof("Cannot expose service %s/%s of type %q", service.Namespace, service.Name, service.Spec.Type)
}

View File

@ -46,6 +46,6 @@ func (m *ManagedZonesService) List(project string) interfaces.ManagedZonesListCa
}
func (m *ManagedZonesService) NewManagedZone(dnsName string) interfaces.ManagedZone {
name := "x" + strings.Replace(string(uuid.NewUUID()), "-", "", -1)[0:30] // Unique name, strip out the "-" chars to shorten it, start with a lower case alpha, and truncate to Cloud DNS 32 character limit
name := "x" + strings.ReplaceAll(string(uuid.NewUUID()), "-", "")[0:30] // Unique name, strip out the "-" chars to shorten it, start with a lower case alpha, and truncate to Cloud DNS 32 character limit
return &ManagedZone{impl: &dns.ManagedZone{Name: name, Description: "Kubernetes Federated Service", DnsName: dnsName}}
}

View File

@ -37,6 +37,7 @@ kops delete instance INSTANCE|NODE [flags]
-h, --help help for instance
--post-drain-delay duration Time to wait after draining each node (default 5s)
--surge Surge by detaching the node from the ASG before deletion (default true)
--use-kubeconfig Use the server endpoint from the local kubeconfig instead of inferring from cluster name
--validate-count int32 Number of times that a cluster needs to be validated after single node update (default 2)
--validation-timeout duration Maximum time to wait for a cluster to validate (default 15m0s)
-y, --yes Specify --yes to immediately delete the instance

View File

@ -21,6 +21,7 @@ kops get instances [CLUSTER] [flags]
```
--api-server string Override the API server used when communicating with the cluster kube-apiserver
-h, --help help for instances
--use-kubeconfig Use the server endpoint from the local kubeconfig instead of inferring from cluster name
```
### Options inherited from parent commands

View File

@ -74,6 +74,7 @@ kops rolling-update cluster [CLUSTER] [flags]
-i, --interactive Prompt to continue after each instance is updated
--node-interval duration Time to wait between restarting worker nodes (default 15s)
--post-drain-delay duration Time to wait after draining each node (default 5s)
--use-kubeconfig Use the server endpoint from the local kubeconfig instead of inferring from cluster name
--validate-count int32 Number of times that a cluster needs to be validated after single node update (default 2)
--validation-timeout duration Maximum time to wait for a cluster to validate (default 15m0s)
-y, --yes Perform rolling update immediately; without --yes rolling-update executes a dry-run

View File

@ -23,12 +23,15 @@ kops toolbox enroll [CLUSTER] [flags]
```
--api-server string Override the API server used when communicating with the cluster kube-apiserver
--build-host only build the host resource, don't apply it or enroll the node
--cluster string Name of cluster to join
-h, --help help for enroll
--host string IP/hostname for machine to add
--instance-group string Name of instance-group to join
--pod-cidr strings IP Address range to use for pods that run on this node
--ssh-port int port for ssh (default 22)
--ssh-user string user for ssh (default "root")
--use-kubeconfig Use the server endpoint from the local kubeconfig instead of inferring from cluster name
```
### Options inherited from parent commands

View File

@ -40,6 +40,7 @@ kops update cluster [CLUSTER] [flags]
--prune Delete old revisions of cloud resources that were needed during an upgrade
--ssh-public-key string SSH public key to use (deprecated: use kops create secret instead)
--target target Target - "direct", "terraform" (default direct)
--use-kubeconfig Use the server endpoint from the local kubeconfig instead of inferring from cluster name
--user string Existing user in kubeconfig file to use. Implies --create-kube-config
-y, --yes Create cloud resources, without --yes update is in dry run mode
```

View File

@ -35,6 +35,7 @@ kops validate cluster [CLUSTER] [flags]
--interval duration Time in duration to wait between validation attempts (default 10s)
--kubeconfig string Path to the kubeconfig file
-o, --output string Output format. One of json|yaml|table. (default "table")
--use-kubeconfig Use the server endpoint from the local kubeconfig instead of inferring from cluster name
--wait duration Amount of time to wait for the cluster to become ready
```

View File

@ -34,6 +34,10 @@ The additional permissions are:
"ecr:GetAuthorizationToken",
"ecr:GetDownloadUrlForLayer",
"ecr:GetRepositoryPolicy",
"ecr:ReplicateImage",
"ecr:BatchImportUpstreamImage",
"ecr:CreateRepository",
"ecr:TagResource",
"ecr:ListImages"
],
"Resource": [

View File

@ -80,7 +80,7 @@ bare-metal machine.
```
mkdir vm1
cd vm1
wget -O debian11.qcow2 https://cloud.debian.org/images/cloud/bullseye/20231013-1532/debian-11-nocloud-amd64-20231013-1532.qcow2
wget -O debian12.qcow2 https://cloud.debian.org/images/cloud/bookworm/20250703-2162/debian-12-generic-amd64-20250703-2162.qcow2
qemu-img create -o backing_file=debian11.qcow2,backing_fmt=qcow2 -f qcow2 vm1-root.qcow2 10G

View File

@ -29,6 +29,6 @@ None known.
# Deprecations
* Support for Kubernetes version 1.24 is deprecated and will be removed in kOps 1.30.
* Support for Kubernetes version 1.24 is removed in kOps 1.30.
* Support for Kubernetes version 1.25 is deprecated and will be removed in kOps 1.31.

View File

@ -22,6 +22,6 @@ This is a document to gather the release notes prior to the release.
# Deprecations
* Support for Kubernetes version 1.25 is deprecated and will be removed in kOps 1.31.
* Support for Kubernetes version 1.25 is removed in kOps 1.31.
* Support for Kubernetes version 1.26 is deprecated and will be removed in kOps 1.32.

View File

@ -15,6 +15,6 @@ The `kops reconcile` functionality was introduced in kOps 1.32.
# Deprecations
* Support for Kubernetes version 1.26 is deprecated and is removed in kOps 1.32.
* Support for Kubernetes version 1.26 is removed in kOps 1.32.
* Support for Kubernetes version 1.27 is deprecated and will be removed in kOps 1.33.

View File

@ -1,45 +1,120 @@
## Release notes for kOps 1.33 series
**&#9888; kOps 1.33 has not been released yet! &#9888;**
This is a document to gather the release notes prior to the release.
kOps 1.33.0 introduces significant improvements to cloud provider support, networking capabilities, and Kubernetes integration. This release adds new features for AWS ECR, Hetzner Cloud, and Cilium while removing deprecated legacy components.
# Significant changes
* TODO
## New Features
## Some Feature
### AWS ECR Pull-Through Cache Support
* Add support for using ECR as pull-through image cache ([#16593](https://github.com/kubernetes/kops/pull/16593))
- Enables faster container image pulls by caching images in ECR
- Reduces external registry dependencies and improves reliability
* TODO
### Hetzner Cloud Object Storage
* Add support for Object Storage ([#17453](https://github.com/kubernetes/kops/pull/17453))
- Enables state store configuration using Hetzner Cloud Object Storage
- Provides alternative to S3 for Hetzner Cloud users
## AWS
### Cilium Gateway API Support
* Add support for Gateway API within Cilium ([#17358](https://github.com/kubernetes/kops/pull/17358))
- Enables modern Kubernetes networking with Gateway API
- Provides advanced traffic management capabilities
* TODO
## Cloud Provider Improvements
## GCP
### Kubernetes 1.33 Cloud Provider Changes
* Remove cloud-config and cloud-provider flags from kubelet and kube-apiserver for Kubernetes 1.33+ ([#17412](https://github.com/kubernetes/kops/pull/17412), [#17270](https://github.com/kubernetes/kops/pull/17270))
- Aligns with Kubernetes deprecation of in-tree cloud providers
- Mandatory for Kubernetes 1.33+ compatibility
* TODO
### Azure Enhancements
* Deploy cloud-node-manager for Kubernetes 1.31+
- Ensures proper node management for newer Kubernetes versions
- Improves Azure cloud integration
## Openstack
### GCP Updates
* Do not reset MIG target size on cluster updates
- Prevents unwanted scaling during cluster operations
- Improves autoscaler compatibility
* TODO
## Container Runtime and Component Updates
# Other changes of note
### Major Version Updates
* Update Cilium to v1.16.7
* Update Calico to v3.29.4
* Update CoreDNS to v1.11.4
* Update containerd to v1.7.28
* Update etcd to v3.5.21
* Update etcd-manager to v3.0.20250803
* Update metrics-server to v0.7.2
* Update flannel to v0.26.4
* Update kube-router from v2.1.1 to v2.5.0
* Update Amazon VPC CNI to v1.19.3
* TODO
### Flannel Support Restored
* Re-enable Flannel and remove deprecation notice
- Flannel continues to be supported as a networking option
- Updates documentation to reflect continued support
# Breaking changes
## Other breaking changes
## Legacy Addon Removal
* Remove legacy addons from kOps repository ([#17332](https://github.com/kubernetes/kops/pull/17332))
- Only affects clusters using kOps versions prior to 1.22
- Modern clusters using managed addons are unaffected
* Legacy addons have been removed from the kOps repo. These were only referenced by kOps <1.22 ([17322](https://github.com/kubernetes/kops/pull/17332))
## Cloud Provider Flag Removal
* Remove cloud-config and cloud-provider flags for Kubernetes 1.33+
- **Breaking change** for clusters upgrading to Kubernetes 1.33
- External cloud providers must be configured separately
- Ensures compliance with Kubernetes 1.33 requirements
# Other notable changes
## Networking Enhancements
* Add CNI-exclusive setting for Cilium
* Allow setup of CoreDNS pod annotations ([#17315](https://github.com/kubernetes/kops/pull/17315))
* Prevent systemd-networkd from removing Cilium routes on restart
* Support systemd config on Ubuntu 22.04+ for Amazon VPC CNI
## Security and Configuration
* Use official etcd images from registry.k8s.io
* Increase key size for KubeConfig private key
* Enable more admission controllers by default
* Add goaway-chance parameter for kube-apiserver
## Testing and Infrastructure
* Use ephemeral S3 buckets for E2E tests ([#17157](https://github.com/kubernetes/kops/pull/17157))
- Improves test isolation and cleanup
- Reduces testing infrastructure costs
## OpenStack Support
* Fix: determine ports to delete based on tags
- Improves resource cleanup accuracy
- Prevents deletion of unmanaged ports
# Known Issues
* TODO
* None at this time
# Deprecations
* Support for Kubernetes version 1.27 is deprecated and is removed in kOps 1.33.
* Support for Kubernetes version 1.27 is removed in kOps 1.33
* Support for Kubernetes version 1.28 is deprecated and will be removed in kOps 1.34
* Support for Kubernetes version 1.28 is deprecated and will be removed in kOps 1.34.
# Installation and Upgrade Notes
## Kubernetes 1.33 Upgrade Requirements
* **Important**: Clusters upgrading to Kubernetes 1.33 must use external cloud providers
* The cloud-config and cloud-provider flags are no longer supported in Kubernetes 1.33
* Plan your upgrade carefully and test in non-production environments first
## Recommended Upgrade Process
* Use the `kops reconcile cluster` command for Kubernetes minor version upgrades
* Review breaking changes before upgrading production clusters
* Ensure proper testing of cloud provider configuration changes
---
This release includes contributions from the kOps community. Thank you to all contributors who made this release possible!

View File

@ -0,0 +1,47 @@
## Release notes for kOps 1.34 series
**&#9888; kOps 1.34 has not been released yet! &#9888;**
This is a document to gather the release notes prior to the release.
# Significant changes
* Default SSH key is now `~/.ssh/id_ed25519.pub`, instead of the less secure `~/.ssh/id_rsa.pub`.
* `crictl` and `nerdctl` are now only installed on demand, by setting `spec.containerd.installCriCtl=true` and `spec.containerd.installNerdCtl=true`.
* `ebtables`, `ethtool` and `socat` are no longer installed by default.
## Some Feature
* TODO
## AWS
* TODO
## GCP
* TODO
## Openstack
* TODO
# Other changes of note
* TODO
# Breaking changes
## Other breaking changes
* Legacy addons have been removed from the kOps repo. These were only referenced by kOps <1.22 ([17322](https://github.com/kubernetes/kops/pull/17332))
# Known Issues
* TODO
# Deprecations
* Support for Kubernetes version 1.28 is removed in kOps 1.34.
* Support for Kubernetes version 1.29 is deprecated and will be removed in kOps 1.35.

47
go.mod
View File

@ -1,9 +1,9 @@
module k8s.io/kops
// This should be kept in sync with cloudbuild.yaml and the other go.mod files
go 1.24.4
go 1.25.0
godebug default=go1.24
godebug default=go1.25
require (
cloud.google.com/go/compute/metadata v0.7.0
@ -18,7 +18,7 @@ require (
github.com/MakeNowJust/heredoc/v2 v2.0.1
github.com/Masterminds/sprig/v3 v3.3.0
github.com/apparentlymart/go-cidr v1.1.0
github.com/aws/amazon-ec2-instance-selector/v2 v2.4.2-0.20231216170552-14d4dfcbaadf
github.com/aws/amazon-ec2-instance-selector/v3 v3.1.1
github.com/aws/aws-sdk-go-v2 v1.36.5
github.com/aws/aws-sdk-go-v2/config v1.29.17
github.com/aws/aws-sdk-go-v2/credentials v1.17.70
@ -70,12 +70,12 @@ require (
go.opentelemetry.io/otel/trace v1.37.0
go.opentelemetry.io/proto/otlp v1.7.0
go.uber.org/multierr v1.11.0
golang.org/x/crypto v0.39.0
golang.org/x/crypto v0.41.0
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b
golang.org/x/net v0.41.0
golang.org/x/net v0.43.0
golang.org/x/oauth2 v0.30.0
golang.org/x/sync v0.15.0
golang.org/x/sys v0.33.0
golang.org/x/sync v0.16.0
golang.org/x/sys v0.35.0
google.golang.org/api v0.239.0
google.golang.org/grpc v1.73.0
google.golang.org/protobuf v1.36.6
@ -123,17 +123,18 @@ require (
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.4 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.17 // indirect
github.com/aws/aws-sdk-go-v2/service/pricing v1.21.6 // indirect
github.com/aws/aws-sdk-go-v2/service/pricing v1.32.17 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.25.5 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.3 // indirect
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/chai2010/gettext-go v1.0.2 // indirect
github.com/charmbracelet/bubbles v0.16.1 // indirect
github.com/charmbracelet/bubbletea v0.24.2 // indirect
github.com/charmbracelet/lipgloss v0.7.1 // indirect
github.com/containerd/console v1.0.4 // indirect
github.com/charmbracelet/bubbles v0.20.0 // indirect
github.com/charmbracelet/bubbletea v1.3.3 // indirect
github.com/charmbracelet/lipgloss v1.0.0 // indirect
github.com/charmbracelet/x/ansi v0.8.0 // indirect
github.com/charmbracelet/x/term v0.2.1 // indirect
github.com/containerd/containerd v1.7.27 // indirect
github.com/containerd/errdefs v1.0.0 // indirect
github.com/containerd/log v0.1.0 // indirect
@ -146,9 +147,10 @@ require (
github.com/docker/docker-credential-helpers v0.9.3 // indirect
github.com/docker/go-events v0.0.0-20250114142523-c867878c5e32 // indirect
github.com/emicklei/go-restful/v3 v3.12.1 // indirect
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
github.com/evanphx/json-patch v5.9.11+incompatible // indirect
github.com/evanphx/json-patch/v5 v5.9.11 // indirect
github.com/evertras/bubble-table v0.15.2 // indirect
github.com/evertras/bubble-table v0.17.1 // indirect
github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/fsnotify/fsnotify v1.8.0 // indirect
@ -183,7 +185,6 @@ require (
github.com/hashicorp/golang-lru v0.5.4 // indirect
github.com/hashicorp/memberlist v0.3.1 // indirect
github.com/huandu/xstrings v1.5.0 // indirect
github.com/imdario/mergo v0.3.16 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24 // indirect
github.com/josharian/intern v1.0.0 // indirect
@ -196,7 +197,7 @@ require (
github.com/mailru/easyjson v0.9.0 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-localereader v0.0.1 // indirect
github.com/mattn/go-runewidth v0.0.14 // indirect
github.com/mattn/go-runewidth v0.0.16 // indirect
github.com/miekg/dns v1.1.62 // indirect
github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
@ -209,10 +210,10 @@ require (
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect
github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b // indirect
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect
github.com/muesli/cancelreader v0.2.2 // indirect
github.com/muesli/reflow v0.3.0 // indirect
github.com/muesli/termenv v0.15.2 // indirect
github.com/muesli/termenv v0.16.0 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect
github.com/oklog/ulid v1.3.1 // indirect
@ -228,10 +229,10 @@ require (
github.com/prometheus/client_model v0.6.2 // indirect
github.com/prometheus/common v0.62.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/rivo/uniseg v0.2.0 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/sagikazarmark/locafero v0.7.0 // indirect
github.com/sahilm/fuzzy v0.1.0 // indirect
github.com/sahilm/fuzzy v0.1.1 // indirect
github.com/samber/lo v1.50.0 // indirect
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect
github.com/shopspring/decimal v1.4.0 // indirect
@ -248,11 +249,11 @@ require (
go.opentelemetry.io/otel/metric v1.37.0 // indirect
go.yaml.in/yaml/v2 v2.4.2 // indirect
go.yaml.in/yaml/v3 v3.0.3 // indirect
golang.org/x/mod v0.25.0 // indirect
golang.org/x/term v0.32.0 // indirect
golang.org/x/text v0.26.0 // indirect
golang.org/x/mod v0.27.0 // indirect
golang.org/x/term v0.34.0 // indirect
golang.org/x/text v0.28.0 // indirect
golang.org/x/time v0.12.0 // indirect
golang.org/x/tools v0.34.0 // indirect
golang.org/x/tools v0.36.0 // indirect
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect

92
go.sum
View File

@ -71,11 +71,10 @@ 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/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
github.com/aws/amazon-ec2-instance-selector/v2 v2.4.2-0.20231216170552-14d4dfcbaadf h1:1zems5/6/Fs+1dFsjTZ+oSogVHkfGl1VWuttRXYGx+0=
github.com/aws/amazon-ec2-instance-selector/v2 v2.4.2-0.20231216170552-14d4dfcbaadf/go.mod h1:zsxolOKwtNEvoOPScJy5+Bu8F72LZy7pqVJNhP8tqVE=
github.com/aws/amazon-ec2-instance-selector/v3 v3.1.1 h1:8pw8T4Ae8tiXbxTxXhVStJSUJpEv29+YOQaDxIv3EaI=
github.com/aws/amazon-ec2-instance-selector/v3 v3.1.1/go.mod h1:RU/lVVsYHNN7Bwr2UmCw5z2aWPcNIHADY49bj082oYM=
github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU=
github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
github.com/aws/aws-sdk-go-v2 v1.21.0/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M=
github.com/aws/aws-sdk-go-v2 v1.36.5 h1:0OF9RiEMEdDdZEMqF9MRjevyxAQcf6gY+E7vwBILFj0=
github.com/aws/aws-sdk-go-v2 v1.36.5/go.mod h1:EYrzvCCN9CMUTa5+6lf6MM4tq3Zjp8UhSGR/cBsjai0=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11 h1:12SpdwU8Djs+YGklkinSSlcrPyj3H4VifVsKf78KbwA=
@ -86,10 +85,8 @@ github.com/aws/aws-sdk-go-v2/credentials v1.17.70 h1:ONnH5CM16RTXRkS8Z1qg7/s2eDO
github.com/aws/aws-sdk-go-v2/credentials v1.17.70/go.mod h1:M+lWhhmomVGgtuPOhO85u4pEa3SmssPTdcYpP/5J/xc=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.32 h1:KAXP9JSHO1vKGCr5f4O6WmlVKLFFXgWYAGoJosorxzU=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.32/go.mod h1:h4Sg6FQdexC1yYG9RDnOvLbW1a/P986++/Y/a+GyEM8=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41/go.mod h1:CrObHAuPneJBlfEJ5T3szXOUkLEThaGfvnhTf33buas=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36 h1:SsytQyTMHMDPspp+spo7XwXTP44aJZZAC7fBV2C5+5s=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36/go.mod h1:Q1lnJArKRXkenyog6+Y+zr7WDpk4e6XlR6gs20bbeNo=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35/go.mod h1:SJC1nEVVva1g3pHAIdCp7QsRIkMmLAgoDquQ9Rr8kYw=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.36 h1:i2vNHQiXUvKhs3quBR6aqlgJaiaexz/aNvdCktW/kAM=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.36/go.mod h1:UdyGa7Q91id/sdyHPwth+043HhmP6yP9MBHgbZM0xo8=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo=
@ -118,8 +115,8 @@ github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.17 h1:qcLWgdhq45sDM
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.17/go.mod h1:M+jkjBFZ2J6DJrjMv2+vkBbuht6kxJYtJiwoVgX4p4U=
github.com/aws/aws-sdk-go-v2/service/kms v1.41.2 h1:zJeUxFP7+XP52u23vrp4zMcVhShTWbNO8dHV6xCSvFo=
github.com/aws/aws-sdk-go-v2/service/kms v1.41.2/go.mod h1:Pqd9k4TuespkireN206cK2QBsaBTL6X+VPAez5Qcijk=
github.com/aws/aws-sdk-go-v2/service/pricing v1.21.6 h1:k/f3T13s7wx/By6aKovlVsjdNkRVT0QRR2RlZEvaTGg=
github.com/aws/aws-sdk-go-v2/service/pricing v1.21.6/go.mod h1:9n3tkRCngy3+Iw/8vK3C69iXh22SCGsy3yn16nTxH+s=
github.com/aws/aws-sdk-go-v2/service/pricing v1.32.17 h1:EtZFyL/uhaXlHjIwHW0KSJvppg+Ie1fzQ3wEXLEUj0I=
github.com/aws/aws-sdk-go-v2/service/pricing v1.32.17/go.mod h1:l7bufyRvU+8mY0Z1BNWbWvjr59dlj9YrLKmeiz5CJ30=
github.com/aws/aws-sdk-go-v2/service/route53 v1.52.2 h1:dXHWVVPx2W2fq2PTugj8QXpJ0YTRAGx0KLPKhMBmcsY=
github.com/aws/aws-sdk-go-v2/service/route53 v1.52.2/go.mod h1:wi1naoiPnCQG3cyjsivwPON1ZmQt/EJGxFqXzubBTAw=
github.com/aws/aws-sdk-go-v2/service/s3 v1.82.0 h1:JubM8CGDDFaAOmBrd8CRYNr49ZNgEAiLwGwgNMdS0nw=
@ -134,7 +131,6 @@ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.3 h1:BpOxT3yhLwSJ77qIY3DoHAQj
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.3/go.mod h1:vq/GQR1gOFLquZMSrxUK/cpvKCNVYibNyJ1m7JrU88E=
github.com/aws/aws-sdk-go-v2/service/sts v1.34.0 h1:NFOJ/NXEGV4Rq//71Hs1jC/NvPs1ezajK+yQmkwnPV0=
github.com/aws/aws-sdk-go-v2/service/sts v1.34.0/go.mod h1:7ph2tGpfQvwzgistp2+zga9f+bCjlQJPkPUmMgDSD7w=
github.com/aws/smithy-go v1.14.2/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA=
github.com/aws/smithy-go v1.22.4 h1:uqXzVZNuNexwc/xrh6Tb56u89WDlJY6HS+KC0S4QSjw=
github.com/aws/smithy-go v1.22.4/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI=
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
@ -157,16 +153,18 @@ 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/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNSjIRk=
github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA=
github.com/charmbracelet/bubbles v0.16.1 h1:6uzpAAaT9ZqKssntbvZMlksWHruQLNxg49H5WdeuYSY=
github.com/charmbracelet/bubbles v0.16.1/go.mod h1:2QCp9LFlEsBQMvIYERr7Ww2H2bA7xen1idUDIzm/+Xc=
github.com/charmbracelet/bubbletea v0.24.2 h1:uaQIKx9Ai6Gdh5zpTbGiWpytMU+CfsPp06RaW2cx/SY=
github.com/charmbracelet/bubbletea v0.24.2/go.mod h1:XdrNrV4J8GiyshTtx3DNuYkR1FDaJmO3l2nejekbsgg=
github.com/charmbracelet/lipgloss v0.7.1 h1:17WMwi7N1b1rVWOjMT+rCh7sQkvDU75B2hbZpc5Kc1E=
github.com/charmbracelet/lipgloss v0.7.1/go.mod h1:yG0k3giv8Qj8edTCbbg6AlQ5e8KNWpFujkNawKNhE2c=
github.com/charmbracelet/bubbles v0.20.0 h1:jSZu6qD8cRQ6k9OMfR1WlM+ruM8fkPWkHvQWD9LIutE=
github.com/charmbracelet/bubbles v0.20.0/go.mod h1:39slydyswPy+uVOHZ5x/GjwVAFkCsV8IIVy+4MhzwwU=
github.com/charmbracelet/bubbletea v1.3.3 h1:WpU6fCY0J2vDWM3zfS3vIDi/ULq3SYphZhkAGGvmEUY=
github.com/charmbracelet/bubbletea v1.3.3/go.mod h1:dtcUCyCGEX3g9tosuYiut3MXgY/Jsv9nKVdibKKRRXo=
github.com/charmbracelet/lipgloss v1.0.0 h1:O7VkGDvqEdGi93X+DeqsQ7PKHDgtQfF8j8/O2qFMQNg=
github.com/charmbracelet/lipgloss v1.0.0/go.mod h1:U5fy9Z+C38obMs+T+tJqst9VGzlOYGj4ri9reL3qUlo=
github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE=
github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q=
github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ=
github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg=
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/containerd/console v1.0.4 h1:F2g4+oChYvBTsASRTz8NP6iIAi97J3TtSAsLbIFn4ro=
github.com/containerd/console v1.0.4/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk=
github.com/containerd/containerd v1.7.27 h1:yFyEyojddO3MIGVER2xJLWoCIn+Up4GaHFquP7hsFII=
github.com/containerd/containerd v1.7.27/go.mod h1:xZmPnl75Vc+BLGt4MIfu6bp+fy03gdHAn9bz+FreFR0=
github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI=
@ -210,12 +208,14 @@ github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQ
github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw=
github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU=
github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4=
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM=
github.com/evanphx/json-patch v5.9.11+incompatible h1:ixHHqfcGvxhWkniF1tWxBHA0yb4Z+d1UQi45df52xW8=
github.com/evanphx/json-patch v5.9.11+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU=
github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM=
github.com/evertras/bubble-table v0.15.2 h1:hVj27V9tk5TD5p6mVv0RK/KJu2sHq0U+mBMux/HptkU=
github.com/evertras/bubble-table v0.15.2/go.mod h1:SPOZKbIpyYWPHBNki3fyNpiPBQkvkULAtOT7NTD5fKY=
github.com/evertras/bubble-table v0.17.1 h1:HJwq3iQrZulXDE93ZcqJNiUVQCBbN4IJ2CkB/IxO3kk=
github.com/evertras/bubble-table v0.17.1/go.mod h1:ifHujS1YxwnYSOgcR2+m3GnJ84f7CVU/4kUOxUCjEbQ=
github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4=
github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
@ -287,7 +287,6 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
@ -379,13 +378,10 @@ github.com/hetznercloud/hcloud-go/v2 v2.21.1 h1:IH3liW8/cCRjfJ4cyqYvw3s1ek+KWP8d
github.com/hetznercloud/hcloud-go/v2 v2.21.1/go.mod h1:XOaYycZJ3XKMVWzmqQ24/+1V7ormJHmPdck/kxrNnQA=
github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI=
github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4=
github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jacksontj/memberlistmesh v0.0.0-20190905163944-93462b9d2bb7 h1:q9rwMYjPWIFOSijnxXre4+RGo8xS0NVbJzXg+F0NMHc=
github.com/jacksontj/memberlistmesh v0.0.0-20190905163944-93462b9d2bb7/go.mod h1:fFX3XoduobgoJsVtpzIFRTgKZAbNhsSJIDNOgeUU5g4=
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24 h1:liMMTbpW34dhU4az1GN0pTPADwNmvoRSeoZ6PItiqnY=
github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
@ -432,8 +428,8 @@ github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D
github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4=
github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88=
github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU=
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/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
@ -466,14 +462,14 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0=
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4=
github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b h1:1XF24mVaiu7u+CFywTdcDo2ie1pzzhwjt6RHqzpMU34=
github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b/go.mod h1:fQuZ0gauxyBcmsdE3ZT4NasjaRdxmbCS0jRHsrWu3Ho=
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI=
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo=
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.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo=
github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8=
github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc=
github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
@ -545,8 +541,9 @@ github.com/redis/go-redis/extra/redisotel/v9 v9.0.5/go.mod h1:WZjPDy7VNzn77AAfnA
github.com/redis/go-redis/v9 v9.8.0 h1:q3nRvjrlge/6UD7eTu/DSg2uYiU2mCL0G/uzBWqhicI=
github.com/redis/go-redis/v9 v9.8.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw=
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
@ -554,8 +551,8 @@ github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD
github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo=
github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k=
github.com/sahilm/fuzzy v0.1.0 h1:FzWGaw2Opqyu+794ZQ9SYifWv2EIXpwP4q8dY1kDAwI=
github.com/sahilm/fuzzy v0.1.0/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y=
github.com/sahilm/fuzzy v0.1.1 h1:ceu5RHF8DGgoi+/dR5PsECjCDH1BE3Fnmpo7aVXOdRA=
github.com/sahilm/fuzzy v0.1.1/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y=
github.com/samber/lo v1.50.0 h1:XrG0xOeHs+4FQ8gJR97zDz5uOFMW7OwFWiFVzqopKgY=
github.com/samber/lo v1.50.0/go.mod h1:RjZyNk6WSnUFRKK6EyOhsRJMqft3G+pg7dCWHQCWvsc=
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.33 h1:KhF0WejiUTDbL5X55nXowP7zNopwpowa6qaMAWyIE+0=
@ -683,8 +680,8 @@ golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliY
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o=
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
@ -694,8 +691,8 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=
golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=
golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/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-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@ -712,8 +709,8 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@ -727,8 +724,8 @@ golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@ -745,6 +742,7 @@ golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/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-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@ -756,8 +754,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
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=
@ -767,8 +765,8 @@ golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg=
golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ=
golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4=
golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw=
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=
@ -779,8 +777,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@ -794,8 +792,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=
golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
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=

View File

@ -159,19 +159,23 @@ generate_k8s_hashes 1.25 16
generate_k8s_hashes 1.26 15
generate_k8s_hashes 1.27 16
generate_k8s_hashes 1.28 15
generate_k8s_hashes 1.29 12
generate_k8s_hashes 1.30 8
generate_k8s_hashes 1.31 4
generate_k8s_hashes 1.32 0
generate_k8s_hashes 1.29 15
generate_k8s_hashes 1.30 14
generate_k8s_hashes 1.31 12
generate_k8s_hashes 1.32 8
generate_k8s_hashes 1.33 4
generate_k8s_hashes 1.34 0
# Generate runc hashes.
# The first argument is the major and minor version, the second is the maximum patch version.
generate_runc_hashes 1.1 15
generate_runc_hashes 1.2 4
generate_runc_hashes 1.2 6
generate_runc_hashes 1.3 0
# Generate containerd hashes.
generate_containerd_hashes 1.7 25
generate_containerd_hashes 2.0 1
generate_containerd_hashes 1.7 28
generate_containerd_hashes 2.0 6
generate_containerd_hashes 2.1 4
# Generate CNI network plugins hashes.
generate_cni_hashes 0.9 1

View File

@ -1,11 +1,11 @@
module k8s.io/kops/hack
go 1.24.4
go 1.25.0
require (
github.com/client9/misspell v0.3.4
github.com/golangci/golangci-lint v1.64.8
golang.org/x/tools v0.34.0
github.com/golangci/golangci-lint/v2 v2.4.0
golang.org/x/tools v0.36.0
honnef.co/go/tools v0.6.1
sigs.k8s.io/controller-tools v0.18.0
)
@ -13,52 +13,64 @@ require (
require (
4d63.com/gocheckcompilerdirectives v1.3.0 // indirect
4d63.com/gochecknoglobals v0.2.2 // indirect
github.com/4meepo/tagalign v1.4.2 // indirect
github.com/Abirdcfly/dupword v0.1.3 // indirect
github.com/Antonboom/errname v1.0.0 // indirect
github.com/Antonboom/nilnil v1.0.1 // indirect
github.com/Antonboom/testifylint v1.5.2 // indirect
github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c // indirect
github.com/Crocmagnon/fatcontext v0.7.1 // indirect
codeberg.org/chavacava/garif v0.2.0 // indirect
dev.gaijin.team/go/exhaustruct/v4 v4.0.0 // indirect
dev.gaijin.team/go/golib v0.6.0 // indirect
github.com/4meepo/tagalign v1.4.3 // indirect
github.com/Abirdcfly/dupword v0.1.6 // indirect
github.com/AlwxSin/noinlineerr v1.0.5 // indirect
github.com/Antonboom/errname v1.1.0 // indirect
github.com/Antonboom/nilnil v1.1.0 // indirect
github.com/Antonboom/testifylint v1.6.1 // indirect
github.com/BurntSushi/toml v1.5.0 // indirect
github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect
github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.1 // indirect
github.com/Masterminds/semver/v3 v3.3.0 // indirect
github.com/Masterminds/semver/v3 v3.3.1 // indirect
github.com/OpenPeeDeeP/depguard/v2 v2.2.1 // indirect
github.com/alecthomas/chroma/v2 v2.20.0 // indirect
github.com/alecthomas/go-check-sumtype v0.3.1 // indirect
github.com/alexkohler/nakedret/v2 v2.0.5 // indirect
github.com/alexkohler/nakedret/v2 v2.0.6 // indirect
github.com/alexkohler/prealloc v1.0.0 // indirect
github.com/alfatraining/structtag v1.0.0 // indirect
github.com/alingse/asasalint v0.0.11 // indirect
github.com/alingse/nilnesserr v0.1.2 // indirect
github.com/ashanbrown/forbidigo v1.6.0 // indirect
github.com/ashanbrown/makezero v1.2.0 // indirect
github.com/alingse/nilnesserr v0.2.0 // indirect
github.com/ashanbrown/forbidigo/v2 v2.1.0 // indirect
github.com/ashanbrown/makezero/v2 v2.0.1 // indirect
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/bkielbasa/cyclop v1.2.3 // indirect
github.com/blizzy78/varnamelen v0.8.0 // indirect
github.com/bombsimon/wsl/v4 v4.5.0 // indirect
github.com/breml/bidichk v0.3.2 // indirect
github.com/breml/errchkjson v0.4.0 // indirect
github.com/butuzov/ireturn v0.3.1 // indirect
github.com/bombsimon/wsl/v4 v4.7.0 // indirect
github.com/bombsimon/wsl/v5 v5.1.1 // 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/mirror v1.3.0 // indirect
github.com/catenacyber/perfsprint v0.8.2 // indirect
github.com/ccojocar/zxcvbn-go v1.0.2 // indirect
github.com/catenacyber/perfsprint v0.9.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.10 // indirect
github.com/chavacava/garif v0.1.0 // indirect
github.com/ckaznocha/intrange v0.3.0 // indirect
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect
github.com/charmbracelet/lipgloss v1.1.0 // indirect
github.com/charmbracelet/x/ansi v0.8.0 // indirect
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect
github.com/charmbracelet/x/term v0.2.1 // indirect
github.com/ckaznocha/intrange v0.3.1 // indirect
github.com/curioswitch/go-reassign v0.3.0 // indirect
github.com/daixiang0/gci v0.13.5 // indirect
github.com/daixiang0/gci v0.13.7 // indirect
github.com/dave/dst v0.27.3 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/denis-tingaikin/go-header v0.5.0 // indirect
github.com/dlclark/regexp2 v1.11.5 // indirect
github.com/ettle/strcase v0.2.0 // indirect
github.com/fatih/color v1.18.0 // indirect
github.com/fatih/structtag v1.2.0 // indirect
github.com/firefart/nonamedreturns v1.0.5 // indirect
github.com/firefart/nonamedreturns v1.0.6 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
github.com/fzipp/gocyclo v0.6.0 // indirect
github.com/ghostiam/protogetter v0.3.9 // indirect
github.com/go-critic/go-critic v0.12.0 // indirect
github.com/go-logr/logr v1.4.2 // indirect
github.com/ghostiam/protogetter v0.3.15 // indirect
github.com/go-critic/go-critic v0.13.0 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-openapi/jsonpointer v0.21.0 // indirect
github.com/go-openapi/jsonreference v0.20.2 // indirect
github.com/go-openapi/swag v0.23.0 // indirect
@ -69,7 +81,7 @@ require (
github.com/go-toolsmith/astp v1.1.0 // indirect
github.com/go-toolsmith/strparse v1.1.0 // indirect
github.com/go-toolsmith/typep v1.1.0 // indirect
github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
github.com/go-xmlfmt/xmlfmt v1.1.3 // indirect
github.com/gobuffalo/flect v1.0.3 // indirect
github.com/gobwas/glob v0.2.3 // indirect
@ -78,10 +90,12 @@ require (
github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 // indirect
github.com/golangci/go-printf-func-name v0.1.0 // indirect
github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d // indirect
github.com/golangci/misspell v0.6.0 // indirect
github.com/golangci/plugin-module-register v0.1.1 // indirect
github.com/golangci/golines v0.0.0-20250217134842-442fd0091d95 // indirect
github.com/golangci/misspell v0.7.0 // indirect
github.com/golangci/plugin-module-register v0.1.2 // indirect
github.com/golangci/revgrep v0.8.0 // indirect
github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed // 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.6.9 // indirect
github.com/google/go-cmp v0.7.0 // indirect
github.com/gordonklaus/ineffassign v0.1.0 // indirect
@ -95,9 +109,9 @@ require (
github.com/hashicorp/hcl v1.0.1-vault-5 // indirect
github.com/hexops/gotextdiff v1.0.3 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/jgautheron/goconst v1.7.1 // indirect
github.com/jgautheron/goconst v1.8.2 // indirect
github.com/jingyugao/rowserrcheck v1.1.1 // indirect
github.com/jjti/go-spancheck v0.6.4 // indirect
github.com/jjti/go-spancheck v0.6.5 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/julz/importas v0.2.0 // indirect
@ -105,43 +119,46 @@ require (
github.com/kisielk/errcheck v1.9.0 // indirect
github.com/kkHAIKE/contextcheck v1.1.6 // indirect
github.com/kulti/thelper v0.6.3 // indirect
github.com/kunwardeep/paralleltest v1.0.10 // indirect
github.com/kunwardeep/paralleltest v1.0.14 // indirect
github.com/lasiar/canonicalheader v1.1.2 // indirect
github.com/ldez/exptostd v0.4.2 // indirect
github.com/ldez/gomoddirectives v0.6.1 // indirect
github.com/ldez/grignotin v0.9.0 // indirect
github.com/ldez/exptostd v0.4.4 // indirect
github.com/ldez/gomoddirectives v0.7.0 // indirect
github.com/ldez/grignotin v0.10.0 // indirect
github.com/ldez/tagliatelle v0.7.1 // indirect
github.com/ldez/usetesting v0.4.2 // indirect
github.com/ldez/usetesting v0.5.0 // indirect
github.com/leonklingele/grouper v1.1.2 // indirect
github.com/macabu/inamedparam v0.1.3 // indirect
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
github.com/macabu/inamedparam v0.2.0 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/manuelarte/embeddedstructfieldcheck v0.3.0 // indirect
github.com/manuelarte/funcorder v0.5.0 // indirect
github.com/maratori/testableexamples v1.0.0 // indirect
github.com/maratori/testpackage v1.1.1 // 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/mgechev/revive v1.7.0 // indirect
github.com/mgechev/revive v1.11.0 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/moricho/tparallel v0.3.2 // indirect
github.com/muesli/termenv v0.16.0 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/nakabonne/nestif v0.3.1 // indirect
github.com/nishanths/exhaustive v0.12.0 // indirect
github.com/nishanths/predeclared v0.2.2 // indirect
github.com/nunnatsa/ginkgolinter v0.19.1 // indirect
github.com/olekukonko/tablewriter v0.0.5 // indirect
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
github.com/nunnatsa/ginkgolinter v0.20.0 // indirect
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/polyfloyd/go-errorlint v1.7.1 // indirect
github.com/polyfloyd/go-errorlint v1.8.0 // indirect
github.com/prometheus/client_golang v1.22.0 // indirect
github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.62.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/quasilyte/go-ruleguard v0.4.3-0.20240823090925-0fe6f58b47b1 // indirect
github.com/quasilyte/go-ruleguard v0.4.4 // indirect
github.com/quasilyte/go-ruleguard/dsl v0.3.22 // indirect
github.com/quasilyte/gogrep v0.5.0 // indirect
github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect
@ -149,25 +166,24 @@ require (
github.com/raeperd/recvcheck v0.2.0 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/rogpeppe/go-internal v1.14.1 // indirect
github.com/ryancurrah/gomodguard v1.3.5 // indirect
github.com/ryancurrah/gomodguard v1.4.1 // indirect
github.com/ryanrolds/sqlclosecheck v0.5.1 // indirect
github.com/sagikazarmark/locafero v0.4.0 // indirect
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
github.com/sanposhiho/wastedassign/v2 v2.1.0 // indirect
github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 // indirect
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect
github.com/sashamelentyev/interfacebloat v1.1.0 // indirect
github.com/sashamelentyev/usestdlibvars v1.28.0 // indirect
github.com/securego/gosec/v2 v2.22.2 // indirect
github.com/sashamelentyev/usestdlibvars v1.29.0 // indirect
github.com/securego/gosec/v2 v2.22.7 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/sivchari/containedctx v1.0.3 // indirect
github.com/sivchari/tenv v1.12.1 // indirect
github.com/sonatard/noctx v0.1.0 // indirect
github.com/sonatard/noctx v0.4.0 // indirect
github.com/sourcegraph/conc v0.3.0 // indirect
github.com/sourcegraph/go-diff v0.7.0 // indirect
github.com/spf13/afero v1.12.0 // indirect
github.com/spf13/afero v1.14.0 // indirect
github.com/spf13/cast v1.7.0 // indirect
github.com/spf13/cobra v1.9.1 // indirect
github.com/spf13/pflag v1.0.6 // indirect
github.com/spf13/pflag v1.0.7 // indirect
github.com/spf13/viper v1.19.0 // indirect
github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect
github.com/stbenjam/no-sprintf-host-port v0.2.0 // indirect
@ -175,34 +191,37 @@ require (
github.com/stretchr/testify v1.10.0 // indirect
github.com/subosito/gotenv v1.6.0 // indirect
github.com/tdakkota/asciicheck v0.4.1 // indirect
github.com/tetafro/godot v1.5.0 // indirect
github.com/timakin/bodyclose v0.0.0-20241017074812-ed6a65f985e3 // indirect
github.com/timonwong/loggercheck v0.10.1 // indirect
github.com/tomarrell/wrapcheck/v2 v2.10.0 // indirect
github.com/tetafro/godot v1.5.1 // indirect
github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67 // indirect
github.com/timonwong/loggercheck v0.11.0 // indirect
github.com/tomarrell/wrapcheck/v2 v2.11.0 // indirect
github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect
github.com/ultraware/funlen v0.2.0 // indirect
github.com/ultraware/whitespace v0.2.0 // indirect
github.com/uudashr/gocognit v1.2.0 // indirect
github.com/uudashr/iface v1.3.1 // indirect
github.com/uudashr/iface v1.4.1 // indirect
github.com/x448/float16 v0.8.4 // indirect
github.com/xen0n/gosmopolitan v1.2.2 // indirect
github.com/xen0n/gosmopolitan v1.3.0 // indirect
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
github.com/yagipy/maintidx v1.0.0 // indirect
github.com/yeya24/promlinter v0.3.0 // indirect
github.com/ykadowak/zerologlint v0.1.5 // indirect
gitlab.com/bosi/decorder v0.4.2 // indirect
go-simpler.org/musttag v0.13.0 // indirect
go-simpler.org/sloglint v0.9.0 // indirect
go-simpler.org/musttag v0.13.1 // indirect
go-simpler.org/sloglint v0.11.1 // indirect
go.augendre.info/arangolint v0.2.0 // indirect
go.augendre.info/fatcontext v0.8.0 // indirect
go.uber.org/automaxprocs v1.6.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect
golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac // indirect
golang.org/x/mod v0.25.0 // indirect
golang.org/x/net v0.41.0 // indirect
golang.org/x/sync v0.15.0 // indirect
golang.org/x/sys v0.33.0 // indirect
golang.org/x/text v0.26.0 // indirect
google.golang.org/protobuf v1.36.5 // indirect
golang.org/x/exp/typeparams v0.0.0-20250620022241-b7579e27df2b // indirect
golang.org/x/mod v0.27.0 // indirect
golang.org/x/net v0.43.0 // indirect
golang.org/x/sync v0.16.0 // indirect
golang.org/x/sys v0.35.0 // indirect
golang.org/x/text v0.28.0 // indirect
google.golang.org/protobuf v1.36.6 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
@ -215,8 +234,8 @@ require (
k8s.io/klog/v2 v2.130.1 // indirect
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect
mvdan.cc/gofumpt v0.7.0 // indirect
mvdan.cc/unparam v0.0.0-20240528143540-8a5130ca722f // indirect
mvdan.cc/gofumpt v0.8.0 // indirect
mvdan.cc/unparam v0.0.0-20250301125049-0df0534333a4 // indirect
sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect
sigs.k8s.io/randfill v1.0.0 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect

View File

@ -2,98 +2,122 @@
4d63.com/gocheckcompilerdirectives v1.3.0/go.mod h1:ofsJ4zx2QAuIP/NO/NAh1ig6R1Fb18/GI7RVMwz7kAY=
4d63.com/gochecknoglobals v0.2.2 h1:H1vdnwnMaZdQW/N+NrkT1SZMTBmcwHe9Vq8lJcYYTtU=
4d63.com/gochecknoglobals v0.2.2/go.mod h1:lLxwTQjL5eIesRbvnzIP3jZtG140FnTdz+AlMa+ogt0=
github.com/4meepo/tagalign v1.4.2 h1:0hcLHPGMjDyM1gHG58cS73aQF8J4TdVR96TZViorO9E=
github.com/4meepo/tagalign v1.4.2/go.mod h1:+p4aMyFM+ra7nb41CnFG6aSDXqRxU/w1VQqScKqDARI=
github.com/Abirdcfly/dupword v0.1.3 h1:9Pa1NuAsZvpFPi9Pqkd93I7LIYRURj+A//dFd5tgBeE=
github.com/Abirdcfly/dupword v0.1.3/go.mod h1:8VbB2t7e10KRNdwTVoxdBaxla6avbhGzb8sCTygUMhw=
github.com/Antonboom/errname v1.0.0 h1:oJOOWR07vS1kRusl6YRSlat7HFnb3mSfMl6sDMRoTBA=
github.com/Antonboom/errname v1.0.0/go.mod h1:gMOBFzK/vrTiXN9Oh+HFs+e6Ndl0eTFbtsRTSRdXyGI=
github.com/Antonboom/nilnil v1.0.1 h1:C3Tkm0KUxgfO4Duk3PM+ztPncTFlOf0b2qadmS0s4xs=
github.com/Antonboom/nilnil v1.0.1/go.mod h1:CH7pW2JsRNFgEh8B2UaPZTEPhCMuFowP/e8Udp9Nnb0=
github.com/Antonboom/testifylint v1.5.2 h1:4s3Xhuv5AvdIgbd8wOOEeo0uZG7PbDKQyKY5lGoQazk=
github.com/Antonboom/testifylint v1.5.2/go.mod h1:vxy8VJ0bc6NavlYqjZfmp6EfqXMtBgQ4+mhCojwC1P8=
github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c h1:pxW6RcqyfI9/kWtOwnv/G+AzdKuy2ZrqINhenH4HyNs=
github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/Crocmagnon/fatcontext v0.7.1 h1:SC/VIbRRZQeQWj/TcQBS6JmrXcfA+BU4OGSVUt54PjM=
github.com/Crocmagnon/fatcontext v0.7.1/go.mod h1:1wMvv3NXEBJucFGfwOJBxSVWcoIO6emV215SMkW9MFU=
codeberg.org/chavacava/garif v0.2.0 h1:F0tVjhYbuOCnvNcU3YSpO6b3Waw6Bimy4K0mM8y6MfY=
codeberg.org/chavacava/garif v0.2.0/go.mod h1:P2BPbVbT4QcvLZrORc2T29szK3xEOlnl0GiPTJmEqBQ=
dev.gaijin.team/go/exhaustruct/v4 v4.0.0 h1:873r7aNneqoBB3IaFIzhvt2RFYTuHgmMjoKfwODoI1Y=
dev.gaijin.team/go/exhaustruct/v4 v4.0.0/go.mod h1:aZ/k2o4Y05aMJtiux15x8iXaumE88YdiB0Ai4fXOzPI=
dev.gaijin.team/go/golib v0.6.0 h1:v6nnznFTs4bppib/NyU1PQxobwDHwCXXl15P7DV5Zgo=
dev.gaijin.team/go/golib v0.6.0/go.mod h1:uY1mShx8Z/aNHWDyAkZTkX+uCi5PdX7KsG1eDQa2AVE=
github.com/4meepo/tagalign v1.4.3 h1:Bnu7jGWwbfpAie2vyl63Zup5KuRv21olsPIha53BJr8=
github.com/4meepo/tagalign v1.4.3/go.mod h1:00WwRjiuSbrRJnSVeGWPLp2epS5Q/l4UEy0apLLS37c=
github.com/Abirdcfly/dupword v0.1.6 h1:qeL6u0442RPRe3mcaLcbaCi2/Y/hOcdtw6DE9odjz9c=
github.com/Abirdcfly/dupword v0.1.6/go.mod h1:s+BFMuL/I4YSiFv29snqyjwzDp4b65W2Kvy+PKzZ6cw=
github.com/AlwxSin/noinlineerr v1.0.5 h1:RUjt63wk1AYWTXtVXbSqemlbVTb23JOSRiNsshj7TbY=
github.com/AlwxSin/noinlineerr v1.0.5/go.mod h1:+QgkkoYrMH7RHvcdxdlI7vYYEdgeoFOVjU9sUhw/rQc=
github.com/Antonboom/errname v1.1.0 h1:A+ucvdpMwlo/myWrkHEUEBWc/xuXdud23S8tmTb/oAE=
github.com/Antonboom/errname v1.1.0/go.mod h1:O1NMrzgUcVBGIfi3xlVuvX8Q/VP/73sseCaAppfjqZw=
github.com/Antonboom/nilnil v1.1.0 h1:jGxJxjgYS3VUUtOTNk8Z1icwT5ESpLH/426fjmQG+ng=
github.com/Antonboom/nilnil v1.1.0/go.mod h1:b7sAlogQjFa1wV8jUW3o4PMzDVFLbTux+xnQdvzdcIE=
github.com/Antonboom/testifylint v1.6.1 h1:6ZSytkFWatT8mwZlmRCHkWz1gPi+q6UBSbieji2Gj/o=
github.com/Antonboom/testifylint v1.6.1/go.mod h1:k+nEkathI2NFjKO6HvwmSrbzUcQ6FAnbZV+ZRrnXPLI=
github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM=
github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs=
github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.1 h1:Sz1JIXEcSfhz7fUi7xHnhpIE0thVASYjvosApmHuD2k=
github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.1/go.mod h1:n/LSCXNuIYqVfBlVXyHfMQkZDdp1/mmxfSjADd3z1Zg=
github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0=
github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4=
github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
github.com/OpenPeeDeeP/depguard/v2 v2.2.1 h1:vckeWVESWp6Qog7UZSARNqfu/cZqvki8zsuj3piCMx4=
github.com/OpenPeeDeeP/depguard/v2 v2.2.1/go.mod h1:q4DKzC4UcVaAvcfd41CZh0PWpGgzrVxUYBlgKNGquUo=
github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
github.com/alecthomas/chroma/v2 v2.20.0 h1:sfIHpxPyR07/Oylvmcai3X/exDlE8+FA820NTz+9sGw=
github.com/alecthomas/chroma/v2 v2.20.0/go.mod h1:e7tViK0xh/Nf4BYHl00ycY6rV7b8iXBksI9E359yNmA=
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/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
github.com/alexkohler/nakedret/v2 v2.0.5 h1:fP5qLgtwbx9EJE8dGEERT02YwS8En4r9nnZ71RK+EVU=
github.com/alexkohler/nakedret/v2 v2.0.5/go.mod h1:bF5i0zF2Wo2o4X4USt9ntUWve6JbFv02Ff4vlkmS/VU=
github.com/alecthomas/repr v0.5.1 h1:E3G4t2QbHTSNpPKBgMTln5KLkZHLOcU7r37J4pXBuIg=
github.com/alecthomas/repr v0.5.1/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
github.com/alexkohler/nakedret/v2 v2.0.6 h1:ME3Qef1/KIKr3kWX3nti3hhgNxw6aqN5pZmQiFSsuzQ=
github.com/alexkohler/nakedret/v2 v2.0.6/go.mod h1:l3RKju/IzOMQHmsEvXwkqMDzHHvurNQfAgE1eVmT40Q=
github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw=
github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE=
github.com/alfatraining/structtag v1.0.0 h1:2qmcUqNcCoyVJ0up879K614L9PazjBSFruTB0GOFjCc=
github.com/alfatraining/structtag v1.0.0/go.mod h1:p3Xi5SwzTi+Ryj64DqjLWz7XurHxbGsq6y3ubePJPus=
github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw=
github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I=
github.com/alingse/nilnesserr v0.1.2 h1:Yf8Iwm3z2hUUrP4muWfW83DF4nE3r1xZ26fGWUKCZlo=
github.com/alingse/nilnesserr v0.1.2/go.mod h1:1xJPrXonEtX7wyTq8Dytns5P2hNzoWymVUIaKm4HNFg=
github.com/ashanbrown/forbidigo v1.6.0 h1:D3aewfM37Yb3pxHujIPSpTf6oQk9sc9WZi8gerOIVIY=
github.com/ashanbrown/forbidigo v1.6.0/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU=
github.com/ashanbrown/makezero v1.2.0 h1:/2Lp1bypdmK9wDIq7uWBlDF1iMUpIIS4A+pF6C9IEUU=
github.com/ashanbrown/makezero v1.2.0/go.mod h1:dxlPhHbDMC6N6xICzFBSK+4njQDdK8euNO0qjQMtGY4=
github.com/alingse/nilnesserr v0.2.0 h1:raLem5KG7EFVb4UIDAXgrv3N2JIaffeKNtcEXkEWd/w=
github.com/alingse/nilnesserr v0.2.0/go.mod h1:1xJPrXonEtX7wyTq8Dytns5P2hNzoWymVUIaKm4HNFg=
github.com/ashanbrown/forbidigo/v2 v2.1.0 h1:NAxZrWqNUQiDz19FKScQ/xvwzmij6BiOw3S0+QUQ+Hs=
github.com/ashanbrown/forbidigo/v2 v2.1.0/go.mod h1:0zZfdNAuZIL7rSComLGthgc/9/n2FqspBOH90xlCHdA=
github.com/ashanbrown/makezero/v2 v2.0.1 h1:r8GtKetWOgoJ4sLyUx97UTwyt2dO7WkGFHizn/Lo8TY=
github.com/ashanbrown/makezero/v2 v2.0.1/go.mod h1:kKU4IMxmYW1M4fiEHMb2vc5SFoPzXvgbMR9gIp5pjSw=
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
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/bkielbasa/cyclop v1.2.3 h1:faIVMIGDIANuGPWH031CZJTi2ymOQBULs9H21HSMa5w=
github.com/bkielbasa/cyclop v1.2.3/go.mod h1:kHTwA9Q0uZqOADdupvcFJQtp/ksSnytRMe8ztxG8Fuo=
github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M=
github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k=
github.com/bombsimon/wsl/v4 v4.5.0 h1:iZRsEvDdyhd2La0FVi5k6tYehpOR/R7qIUjmKk7N74A=
github.com/bombsimon/wsl/v4 v4.5.0/go.mod h1:NOQ3aLF4nD7N5YPXMruR6ZXDOAqLoM0GEpLwTdvmOSc=
github.com/breml/bidichk v0.3.2 h1:xV4flJ9V5xWTqxL+/PMFF6dtJPvZLPsyixAoPe8BGJs=
github.com/breml/bidichk v0.3.2/go.mod h1:VzFLBxuYtT23z5+iVkamXO386OB+/sVwZOpIj6zXGos=
github.com/breml/errchkjson v0.4.0 h1:gftf6uWZMtIa/Is3XJgibewBm2ksAQSY/kABDNFTAdk=
github.com/breml/errchkjson v0.4.0/go.mod h1:AuBOSTHyLSaaAFlWsRSuRBIroCh3eh7ZHh5YeelDIk8=
github.com/butuzov/ireturn v0.3.1 h1:mFgbEI6m+9W8oP/oDdfA34dLisRFCj2G6o/yiI1yZrY=
github.com/butuzov/ireturn v0.3.1/go.mod h1:ZfRp+E7eJLC0NQmk1Nrm1LOrn/gQlOykv+cVPdiXH5M=
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.1.1 h1:cQg5KJf9FlctAH4cpL9vLKnziYknoCMCdqXl0wjl72Q=
github.com/bombsimon/wsl/v5 v5.1.1/go.mod h1:Gp8lD04z27wm3FANIUPZycXp+8huVsn0oxc+n4qfV9I=
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/mirror v1.3.0 h1:HdWCXzmwlQHdVhwvsfBb2Au0r3HyINry3bDWLYXiKoc=
github.com/butuzov/mirror v1.3.0/go.mod h1:AEij0Z8YMALaq4yQj9CPPVYOyJQyiexpQEQgihajRfI=
github.com/catenacyber/perfsprint v0.8.2 h1:+o9zVmCSVa7M4MvabsWvESEhpsMkhfE7k0sHNGL95yw=
github.com/catenacyber/perfsprint v0.8.2/go.mod h1:q//VWC2fWbcdSLEY1R3l8n0zQCDPdE4IjZwyY1HMunM=
github.com/ccojocar/zxcvbn-go v1.0.2 h1:na/czXU8RrhXO4EZme6eQJLR4PzcGsahsBOAwU6I3Vg=
github.com/ccojocar/zxcvbn-go v1.0.2/go.mod h1:g1qkXtUSvHP8lhHp5GrSmTz6uWALGRMQdw6Qnz/hi60=
github.com/catenacyber/perfsprint v0.9.1 h1:5LlTp4RwTooQjJCvGEFV6XksZvWE7wCOUvjD2z0vls0=
github.com/catenacyber/perfsprint v0.9.1/go.mod h1:q//VWC2fWbcdSLEY1R3l8n0zQCDPdE4IjZwyY1HMunM=
github.com/ccojocar/zxcvbn-go v1.0.4 h1:FWnCIRMXPj43ukfX000kvBZvV6raSxakYr1nzyNrUcc=
github.com/ccojocar/zxcvbn-go v1.0.4/go.mod h1:3GxGX+rHmueTUMvm5ium7irpyjmm7ikxYFOSJB21Das=
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/charithe/durationcheck v0.0.10 h1:wgw73BiocdBDQPik+zcEoBG/ob8uyBHf2iyoHGPf5w4=
github.com/charithe/durationcheck v0.0.10/go.mod h1:bCWXb7gYRysD1CU3C+u4ceO49LoGOY1C1L6uouGNreQ=
github.com/chavacava/garif v0.1.0 h1:2JHa3hbYf5D9dsgseMKAmc/MZ109otzgNFk5s87H9Pc=
github.com/chavacava/garif v0.1.0/go.mod h1:XMyYCkEL58DF0oyW4qDjjnPWONs2HBqYKI+UIPD+Gww=
github.com/ckaznocha/intrange v0.3.0 h1:VqnxtK32pxgkhJgYQEeOArVidIPg+ahLP7WBOXZd5ZY=
github.com/ckaznocha/intrange v0.3.0/go.mod h1:+I/o2d2A1FBHgGELbGxzIcyd3/9l9DuwjM8FsbSS3Lo=
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/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.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE=
github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q=
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/ckaznocha/intrange v0.3.1 h1:j1onQyXvHUsPWujDH6WIjhyH26gkRt/txNlV7LspvJs=
github.com/ckaznocha/intrange v0.3.1/go.mod h1:QVepyz1AkUoFQkpEqksSYpNpUo3c5W7nWh/s6SHIJJk=
github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/curioswitch/go-reassign v0.3.0 h1:dh3kpQHuADL3cobV/sSGETA8DOv457dwl+fbBAhrQPs=
github.com/curioswitch/go-reassign v0.3.0/go.mod h1:nApPCCTtqLJN/s8HfItCcKV0jIPwluBOvZP+dsJGA88=
github.com/daixiang0/gci v0.13.5 h1:kThgmH1yBmZSBCh1EJVxQ7JsHpm5Oms0AMed/0LaH4c=
github.com/daixiang0/gci v0.13.5/go.mod h1:12etP2OniiIdP4q+kjUGrC/rUagga7ODbqsom5Eo5Yk=
github.com/daixiang0/gci v0.13.7 h1:+0bG5eK9vlI08J+J/NWGbWPTNiXPG4WhNLJOkSxWITQ=
github.com/daixiang0/gci v0.13.7/go.mod h1:812WVN6JLFY9S6Tv76twqmNqevN0pa3SX3nih0brVzQ=
github.com/dave/dst v0.27.3 h1:P1HPoMza3cMEquVf9kKy8yXsFirry4zEnWOdYPOoIzY=
github.com/dave/dst v0.27.3/go.mod h1:jHh6EOibnHgcUW3WjKHisiooEkYwqpHLBSX1iOBhEyc=
github.com/dave/jennifer v1.7.1 h1:B4jJJDHelWcDhlRQxWeo0Npa/pYKBLrirAQoTN45txo=
github.com/dave/jennifer v1.7.1/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/denis-tingaikin/go-header v0.5.0 h1:SRdnP5ZKvcO9KKRP1KJrhFR3RrlGuD+42t4429eC9k8=
github.com/denis-tingaikin/go-header v0.5.0/go.mod h1:mMenU5bWrok6Wl2UsZjy+1okegmwQ3UgWl4V1D8gjlY=
github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI=
github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ=
github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q=
github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A=
github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
github.com/firefart/nonamedreturns v1.0.5 h1:tM+Me2ZaXs8tfdDw3X6DOX++wMCOqzYUho6tUTYIdRA=
github.com/firefart/nonamedreturns v1.0.5/go.mod h1:gHJjDqhGM4WyPt639SOZs+G89Ko7QKH5R5BhnO6xJhw=
github.com/firefart/nonamedreturns v1.0.6 h1:vmiBcKV/3EqKY3ZiPxCINmpS431OcE1S47AQUwhrg8E=
github.com/firefart/nonamedreturns v1.0.6/go.mod h1:R8NisJnSIpvPWheCq0mNRXJok6D8h7fagJTF8EMEwCo=
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
@ -102,12 +126,12 @@ github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv
github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo=
github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA=
github.com/ghostiam/protogetter v0.3.9 h1:j+zlLLWzqLay22Cz/aYwTHKQ88GE2DQ6GkWSYFOI4lQ=
github.com/ghostiam/protogetter v0.3.9/go.mod h1:WZ0nw9pfzsgxuRsPOFQomgDVSWtDLJRfQJEhsGbmQMA=
github.com/go-critic/go-critic v0.12.0 h1:iLosHZuye812wnkEz1Xu3aBwn5ocCPfc9yqmFG9pa6w=
github.com/go-critic/go-critic v0.12.0/go.mod h1:DpE0P6OVc6JzVYzmM5gq5jMU31zLr4am5mB/VfFK64w=
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/ghostiam/protogetter v0.3.15 h1:1KF5sXel0HE48zh1/vn0Loiw25A9ApyseLzQuif1mLY=
github.com/ghostiam/protogetter v0.3.15/go.mod h1:WZ0nw9pfzsgxuRsPOFQomgDVSWtDLJRfQJEhsGbmQMA=
github.com/go-critic/go-critic v0.13.0 h1:kJzM7wzltQasSUXtYyTl6UaPVySO6GkaR1thFnJ6afY=
github.com/go-critic/go-critic v0.13.0/go.mod h1:M/YeuJ3vOCQDnP2SU+ZhjgRzwzcBW87JqLpMJLrZDLI=
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.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
@ -139,8 +163,8 @@ github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQi
github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ=
github.com/go-toolsmith/typep v1.1.0 h1:fIRYDyF+JywLfqzyhdiHzRop/GQDxxNhLGQ6gFUNHus=
github.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig=
github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss=
github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs=
github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
github.com/go-xmlfmt/xmlfmt v1.1.3 h1:t8Ey3Uy7jDSEisW2K3somuMKIpzktkWptA0iFCnRUWY=
github.com/go-xmlfmt/xmlfmt v1.1.3/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM=
github.com/gobuffalo/flect v1.0.3 h1:xeWBM2nui+qnVvNM4S3foBhCAL2XgPU+a7FdpelbTq4=
@ -157,29 +181,32 @@ github.com/golangci/go-printf-func-name v0.1.0 h1:dVokQP+NMTO7jwO4bwsRwLWeudOVUP
github.com/golangci/go-printf-func-name v0.1.0/go.mod h1:wqhWFH5mUdJQhweRnldEywnR5021wTdZSNgwYceV14s=
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 v1.64.8 h1:y5TdeVidMtBGG32zgSC7ZXTFNHrsJkDnpO4ItB3Am+I=
github.com/golangci/golangci-lint v1.64.8/go.mod h1:5cEsUQBSr6zi8XI8OjmcY2Xmliqc4iYL7YoPrL+zLJ4=
github.com/golangci/misspell v0.6.0 h1:JCle2HUTNWirNlDIAUO44hUsKhOFqGPoC4LZxlaSXDs=
github.com/golangci/misspell v0.6.0/go.mod h1:keMNyY6R9isGaSAu+4Q8NMBwMPkh15Gtc8UCVoDtAWo=
github.com/golangci/plugin-module-register v0.1.1 h1:TCmesur25LnyJkpsVrupv1Cdzo+2f7zX0H6Jkw1Ol6c=
github.com/golangci/plugin-module-register v0.1.1/go.mod h1:TTpqoB6KkwOJMV8u7+NyXMrkwwESJLOkfl9TxR1DGFc=
github.com/golangci/golangci-lint/v2 v2.4.0 h1:qz6O6vr7kVzXJqyvHjHSz5fA3D+PM8v96QU5gxZCNWM=
github.com/golangci/golangci-lint/v2 v2.4.0/go.mod h1:Oq7vuAf6L1iNL34uHDcsIF6Mnc0amOPdsT3/GlpHD+I=
github.com/golangci/golines v0.0.0-20250217134842-442fd0091d95 h1:AkK+w9FZBXlU/xUmBtSJN1+tAI4FIvy5WtnUnY8e4p8=
github.com/golangci/golines v0.0.0-20250217134842-442fd0091d95/go.mod h1:k9mmcyWKSTMcPPvQUCfRWWQ9VHJ1U9Dc0R7kaXAgtnQ=
github.com/golangci/misspell v0.7.0 h1:4GOHr/T1lTW0hhR4tgaaV1WS/lJ+ncvYCoFKmqJsj0c=
github.com/golangci/misspell v0.7.0/go.mod h1:WZyyI2P3hxPY2UVHs3cS8YcllAeyfquQcKfdeE9AFVg=
github.com/golangci/plugin-module-register v0.1.2 h1:e5WM6PO6NIAEcij3B053CohVp3HIYbzSuP53UAYgOpg=
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/unconvert v0.0.0-20240309020433-c5143eacb3ed h1:IURFTjxeTfNFP0hTEi1YKjB/ub8zkpaOqFFMApi2EAs=
github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed/go.mod h1:XLXN8bNw4CGRPaqgl3bv/lhz7bsGPh4/xSaMTbo2vkQ=
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=
github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e/go.mod h1:h+wZwLjUTJnm/P2rwlbJdRPZXOzaT36/FwnPnY2inzc=
github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw=
github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw=
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg=
github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a h1://KbezygeMJZCSHH+HgUZiTeSoiuFspbMg1ge+eFj18=
github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA=
github.com/gordonklaus/ineffassign v0.1.0 h1:y2Gd/9I7MdY1oEIt+n+rowjBNDcLQq3RsH5hwJd0f9s=
github.com/gordonklaus/ineffassign v0.1.0/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0=
github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk=
@ -210,12 +237,12 @@ github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUq
github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jgautheron/goconst v1.7.1 h1:VpdAG7Ca7yvvJk5n8dMwQhfEZJh95kl/Hl9S1OI5Jkk=
github.com/jgautheron/goconst v1.7.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4=
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/jjti/go-spancheck v0.6.4 h1:Tl7gQpYf4/TMU7AT84MN83/6PutY21Nb9fuQjFTpRRc=
github.com/jjti/go-spancheck v0.6.4/go.mod h1:yAEYdKJ2lRkDA8g7X+oKUHXOWVAXSBJRv04OhF+QUjk=
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 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
@ -239,28 +266,34 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kulti/thelper v0.6.3 h1:ElhKf+AlItIu+xGnI990no4cE2+XaSu1ULymV2Yulxs=
github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I=
github.com/kunwardeep/paralleltest v1.0.10 h1:wrodoaKYzS2mdNVnc4/w31YaXFtsc21PCTdvWJ/lDDs=
github.com/kunwardeep/paralleltest v1.0.10/go.mod h1:2C7s65hONVqY7Q5Efj5aLzRCNLjw2h4eMc9EcypGjcY=
github.com/kunwardeep/paralleltest v1.0.14 h1:wAkMoMeGX/kGfhQBPODT/BL8XhK23ol/nuQ3SwFaUw8=
github.com/kunwardeep/paralleltest v1.0.14/go.mod h1:di4moFqtfz3ToSKxhNjhOZL+696QtJGCFe132CbBLGk=
github.com/lasiar/canonicalheader v1.1.2 h1:vZ5uqwvDbyJCnMhmFYimgMZnJMjwljN5VGY0VKbMXb4=
github.com/lasiar/canonicalheader v1.1.2/go.mod h1:qJCeLFS0G/QlLQ506T+Fk/fWMa2VmBUiEI2cuMK4djI=
github.com/ldez/exptostd v0.4.2 h1:l5pOzHBz8mFOlbcifTxzfyYbgEmoUqjxLFHZkjlbHXs=
github.com/ldez/exptostd v0.4.2/go.mod h1:iZBRYaUmcW5jwCR3KROEZ1KivQQp6PHXbDPk9hqJKCQ=
github.com/ldez/gomoddirectives v0.6.1 h1:Z+PxGAY+217f/bSGjNZr/b2KTXcyYLgiWI6geMBN2Qc=
github.com/ldez/gomoddirectives v0.6.1/go.mod h1:cVBiu3AHR9V31em9u2kwfMKD43ayN5/XDgr+cdaFaKs=
github.com/ldez/grignotin v0.9.0 h1:MgOEmjZIVNn6p5wPaGp/0OKWyvq42KnzAt/DAb8O4Ow=
github.com/ldez/grignotin v0.9.0/go.mod h1:uaVTr0SoZ1KBii33c47O1M8Jp3OP3YDwhZCmzT9GHEk=
github.com/ldez/exptostd v0.4.4 h1:58AtQjnLcT/tI5W/1KU7xE/O7zW9RAWB6c/ScQAnfus=
github.com/ldez/exptostd v0.4.4/go.mod h1:QfdzPw6oHjFVdNV7ILoPu5sw3OZ3OG1JS0I5JN3J4Js=
github.com/ldez/gomoddirectives v0.7.0 h1:EOx8Dd56BZYSez11LVgdj025lKwlP0/E5OLSl9HDwsY=
github.com/ldez/gomoddirectives v0.7.0/go.mod h1:wR4v8MN9J8kcwvrkzrx6sC9xe9Cp68gWYCsda5xvyGc=
github.com/ldez/grignotin v0.10.0 h1:NQPeh1E/Eza4F0exCeC1WkpnLvgUcQDT8MQ1vOLML0E=
github.com/ldez/grignotin v0.10.0/go.mod h1:oR4iCKUP9fwoeO6vCQeD7M5SMxCT6xdVas4vg0h1LaI=
github.com/ldez/tagliatelle v0.7.1 h1:bTgKjjc2sQcsgPiT902+aadvMjCeMHrY7ly2XKFORIk=
github.com/ldez/tagliatelle v0.7.1/go.mod h1:3zjxUpsNB2aEZScWiZTHrAXOl1x25t3cRmzfK1mlo2I=
github.com/ldez/usetesting v0.4.2 h1:J2WwbrFGk3wx4cZwSMiCQQ00kjGR0+tuuyW0Lqm4lwA=
github.com/ldez/usetesting v0.4.2/go.mod h1:eEs46T3PpQ+9RgN9VjpY6qWdiw2/QmfiDeWmdZdrjIQ=
github.com/ldez/usetesting v0.5.0 h1:3/QtzZObBKLy1F4F8jLuKJiKBjjVFi1IavpoWbmqLwc=
github.com/ldez/usetesting v0.5.0/go.mod h1:Spnb4Qppf8JTuRgblLrEWb7IE6rDmUpGvxY3iRrzvDQ=
github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY=
github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA=
github.com/macabu/inamedparam v0.1.3 h1:2tk/phHkMlEL/1GNe/Yf6kkR/hkcUdAEY3L0hjYV1Mk=
github.com/macabu/inamedparam v0.1.3/go.mod h1:93FLICAIk/quk7eaPPQvbzihUdn/QkGDwIZEoLtpH6I=
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/macabu/inamedparam v0.2.0 h1:VyPYpOc10nkhI2qeNUdh3Zket4fcZjEWe35poddBCpE=
github.com/macabu/inamedparam v0.2.0/go.mod h1:+Pee9/YfGe5LJ62pYXqB89lJ+0k5bsR8Wgz/C0Zlq3U=
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/manuelarte/embeddedstructfieldcheck v0.3.0 h1:VhGqK8gANDvFYDxQkjPbv7/gDJtsGU9k6qj/hC2hgso=
github.com/manuelarte/embeddedstructfieldcheck v0.3.0/go.mod h1:LSo/IQpPfx1dXMcX4ibZCYA7Yy6ayZHIaOGM70+1Wy8=
github.com/manuelarte/funcorder v0.5.0 h1:llMuHXXbg7tD0i/LNw8vGnkDTHFpTnWqKPI85Rknc+8=
github.com/manuelarte/funcorder v0.5.0/go.mod h1:Yt3CiUQthSBMBxjShjdXMexmzpP8YGvGLjrxJNkO2hA=
github.com/maratori/testableexamples v1.0.0 h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s93SLMxb2vI=
github.com/maratori/testableexamples v1.0.0/go.mod h1:4rhjL1n20TUTT4vdh3RDqSizKLyXp7K2u6HgraZCGzE=
github.com/maratori/testpackage v1.1.1 h1:S58XVV5AD7HADMmD0fNnziNHqKvSdDuEKdPD1rNTU04=
@ -273,11 +306,10 @@ github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHP
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
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/mgechev/revive v1.7.0 h1:JyeQ4yO5K8aZhIKf5rec56u0376h8AlKNQEmjfkjKlY=
github.com/mgechev/revive v1.7.0/go.mod h1:qZnwcNhoguE58dfi96IJeSTPeZQejNeoMQLUZGi4SW4=
github.com/mgechev/revive v1.11.0 h1:b/gLLpBE427o+Xmd8G58gSA+KtBwxWinH/A565Awh0w=
github.com/mgechev/revive v1.11.0/go.mod h1:tI0oLF/2uj+InHCBLrrqfTKfjtFTBCFFfG05auyzgdw=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
@ -289,6 +321,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/moricho/tparallel v0.3.2 h1:odr8aZVFA3NZrNybggMkYO3rgPRcqjeQUlBBFVxKHTI=
github.com/moricho/tparallel v0.3.2/go.mod h1:OQ+K3b4Ln3l2TZveGCywybl68glfLEwFGqvnjok8b+U=
github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc=
github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk=
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/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U=
@ -297,16 +331,14 @@ github.com/nishanths/exhaustive v0.12.0 h1:vIY9sALmw6T/yxiASewa4TQcFsVYZQQRUQJhK
github.com/nishanths/exhaustive v0.12.0/go.mod h1:mEZ95wPIZW+x8kC4TgC+9YCUgiST7ecevsVDTgc2obs=
github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk=
github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c=
github.com/nunnatsa/ginkgolinter v0.19.1 h1:mjwbOlDQxZi9Cal+KfbEJTCz327OLNfwNvoZ70NJ+c4=
github.com/nunnatsa/ginkgolinter v0.19.1/go.mod h1:jkQ3naZDmxaZMXPWaS9rblH+i+GWXQCaS/JFIWcOH2s=
github.com/nunnatsa/ginkgolinter v0.20.0 h1:OmWLkAFO2HUTYcU6mprnKud1Ey5pVdiVNYGO5HVicx8=
github.com/nunnatsa/ginkgolinter v0.20.0/go.mod h1:dCIuFlTPfQerXgGUju3VygfAFPdC5aE1mdacCDKDJcQ=
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
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.22.2 h1:/3X8Panh8/WwhU/3Ssa6rCKqPLuAkVY2I0RoyDLySlU=
github.com/onsi/ginkgo/v2 v2.22.2/go.mod h1:oeMosUL+8LtarXBHu/c0bx2D/K9zyQ6uX3cTyztHwsk=
github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus=
github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8=
github.com/onsi/gomega v1.37.0 h1:CdEG8g0S133B4OswTDC/5XPSzE1OeP29QOioj2PID2Y=
github.com/onsi/gomega v1.37.0/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0=
github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw=
@ -316,13 +348,13 @@ github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJ
github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs=
github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo=
github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc=
github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
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/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/polyfloyd/go-errorlint v1.7.1 h1:RyLVXIbosq1gBdk/pChWA8zWYLsq9UEw7a1L5TVMCnA=
github.com/polyfloyd/go-errorlint v1.7.1/go.mod h1:aXjNb1x2TNhoLsk26iv1yl7a+zTnXPhwEMtEXukiLR8=
github.com/polyfloyd/go-errorlint v1.8.0 h1:DL4RestQqRLr8U4LygLw8g2DX6RN1eBJOpa2mzsrl1Q=
github.com/polyfloyd/go-errorlint v1.8.0/go.mod h1:G2W0Q5roxbLCt0ZQbdoxQxXktTjwNyDbEaj3n7jvl4s=
github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q=
@ -333,8 +365,8 @@ github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ
github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I=
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
github.com/quasilyte/go-ruleguard v0.4.3-0.20240823090925-0fe6f58b47b1 h1:+Wl/0aFp0hpuHM3H//KMft64WQ1yX9LdJY64Qm/gFCo=
github.com/quasilyte/go-ruleguard v0.4.3-0.20240823090925-0fe6f58b47b1/go.mod h1:GJLgqsLeo4qgavUoL8JeGFNS7qcisx3awV/w9eWTmNI=
github.com/quasilyte/go-ruleguard v0.4.4 h1:53DncefIeLX3qEpjzlS1lyUmQoUEeOWPFWqaTJq9eAQ=
github.com/quasilyte/go-ruleguard v0.4.4/go.mod h1:Vl05zJ538vcEEwu16V/Hdu7IYZWyKSwIy4c88Ro1kRE=
github.com/quasilyte/go-ruleguard/dsl v0.3.22 h1:wd8zkOhSNr+I+8Qeciml08ivDt1pSXe60+5DqOpCjPE=
github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU=
github.com/quasilyte/gogrep v0.5.0 h1:eTKODPXbI8ffJMN+W2aE0+oL0z/nh8/5eNdiO34SOAo=
@ -351,8 +383,8 @@ github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUc
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/ryancurrah/gomodguard v1.3.5 h1:cShyguSwUEeC0jS7ylOiG/idnd1TpJ1LfHGpV3oJmPU=
github.com/ryancurrah/gomodguard v1.3.5/go.mod h1:MXlEPQRxgfPQa62O8wzK3Ozbkv9Rkqr+wKjSxTdsNJE=
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/ryanrolds/sqlclosecheck v0.5.1 h1:dibWW826u0P8jNLsLN+En7+RqWWTYrjCB9fJfSfdyCU=
github.com/ryanrolds/sqlclosecheck v0.5.1/go.mod h1:2g3dUjoS6AL4huFdv6wn55WpLIDjY7ZgUR4J8HOO/XQ=
github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
@ -361,37 +393,38 @@ github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6g
github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
github.com/sanposhiho/wastedassign/v2 v2.1.0 h1:crurBF7fJKIORrV85u9UUpePDYGWnwvv3+A96WvwXT0=
github.com/sanposhiho/wastedassign/v2 v2.1.0/go.mod h1:+oSmSC+9bQ+VUAxA66nBb0Z7N8CK7mscKTDYC6aIek4=
github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 h1:PKK9DyHxif4LZo+uQSgXNqs0jj5+xZwwfKHgph2lxBw=
github.com/santhosh-tekuri/jsonschema/v6 v6.0.1/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU=
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ=
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU=
github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw=
github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ=
github.com/sashamelentyev/usestdlibvars v1.28.0 h1:jZnudE2zKCtYlGzLVreNp5pmCdOxXUzwsMDBkR21cyQ=
github.com/sashamelentyev/usestdlibvars v1.28.0/go.mod h1:9nl0jgOfHKWNFS43Ojw0i7aRoS4j6EBye3YBhmAIRF8=
github.com/securego/gosec/v2 v2.22.2 h1:IXbuI7cJninj0nRpZSLCUlotsj8jGusohfONMrHoF6g=
github.com/securego/gosec/v2 v2.22.2/go.mod h1:UEBGA+dSKb+VqM6TdehR7lnQtIIMorYJ4/9CW1KVQBE=
github.com/sashamelentyev/usestdlibvars v1.29.0 h1:8J0MoRrw4/NAXtjQqTHrbW9NN+3iMf7Knkq057v4XOQ=
github.com/sashamelentyev/usestdlibvars v1.29.0/go.mod h1:8PpnjHMk5VdeWlVb4wCdrB8PNbLqZ3wBZTZWkrpZZL8=
github.com/securego/gosec/v2 v2.22.7 h1:8/9P+oTYI4yIpAzccQKVsg1/90Po+JzGtAhqoHImDeM=
github.com/securego/gosec/v2 v2.22.7/go.mod h1:510TFNDMrIPytokyHQAVLvPeDr41Yihn2ak8P+XQfNE=
github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ=
github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
github.com/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.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+Wwfd0XE=
github.com/sivchari/containedctx v1.0.3/go.mod h1:c1RDvCbnJLtH4lLcYD/GqwiBSSf4F5Qk0xld2rBqzJ4=
github.com/sivchari/tenv v1.12.1 h1:+E0QzjktdnExv/wwsnnyk4oqZBUfuh89YMQT1cyuvSY=
github.com/sivchari/tenv v1.12.1/go.mod h1:1LjSOUCc25snIr5n3DtGGrENhX3LuWefcplwVGC24mw=
github.com/sonatard/noctx v0.1.0 h1:JjqOc2WN16ISWAjAk8M5ej0RfExEXtkEyExl2hLW+OM=
github.com/sonatard/noctx v0.1.0/go.mod h1:0RvBxqY8D4j9cTTTWE8ylt2vqj2EPI8fHmrxHdsaZ2c=
github.com/sonatard/noctx v0.4.0 h1:7MC/5Gg4SQ4lhLYR6mvOP6mQVSxCrdyiExo7atBs27o=
github.com/sonatard/noctx v0.4.0/go.mod h1:64XdbzFb18XL4LporKXp8poqZtPKbCrqQ402CV+kJas=
github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
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/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs=
github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4=
github.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA=
github.com/spf13/afero v1.14.0/go.mod h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo=
github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w=
github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/pflag v1.0.7 h1:vN6T9TfwStFPFM5XzjsvmzZkLuaLX+HS+0SeFLRgU6M=
github.com/spf13/pflag v1.0.7/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI=
github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg=
github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0=
@ -405,12 +438,10 @@ github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
@ -421,14 +452,14 @@ 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.0 h1:aNwfVI4I3+gdxjMgYPus9eHmoBeJIbnajOyqZYStzuw=
github.com/tetafro/godot v1.5.0/go.mod h1:2oVxTBSftRTh4+MVfUaUXR6bn2GDXCaMcOG4Dk3rfio=
github.com/timakin/bodyclose v0.0.0-20241017074812-ed6a65f985e3 h1:y4mJRFlM6fUyPhoXuFg/Yu02fg/nIPFMOY8tOqppoFg=
github.com/timakin/bodyclose v0.0.0-20241017074812-ed6a65f985e3/go.mod h1:mkjARE7Yr8qU23YcGMSALbIxTQ9r9QBVahQOBRfU460=
github.com/timonwong/loggercheck v0.10.1 h1:uVZYClxQFpw55eh+PIoqM7uAOHMrhVcDoWDery9R8Lg=
github.com/timonwong/loggercheck v0.10.1/go.mod h1:HEAWU8djynujaAVX7QI65Myb8qgfcZ1uKbdpg3ZzKl8=
github.com/tomarrell/wrapcheck/v2 v2.10.0 h1:SzRCryzy4IrAH7bVGG4cK40tNUhmVmMDuJujy4XwYDg=
github.com/tomarrell/wrapcheck/v2 v2.10.0/go.mod h1:g9vNIyhb5/9TQgumxQyOEqDHsmGYcGsVMOx/xGkqdMo=
github.com/tetafro/godot v1.5.1 h1:PZnjCol4+FqaEzvZg5+O8IY2P3hfY9JzRBNPv1pEDS4=
github.com/tetafro/godot v1.5.1/go.mod h1:cCdPtEndkmqqrhiCfkmxDodMQJ/f3L1BCNskCUZdTwk=
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/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.11.0 h1:BJSt36snX9+4WTIXeJ7nvHBQBcm1h2SjQMSlmQ6aFSU=
github.com/tomarrell/wrapcheck/v2 v2.11.0/go.mod h1:wFL9pDWDAbXhhPZZt+nG8Fu+h29TtnZ2MW6Lx4BRXIU=
github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw=
github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw=
github.com/ultraware/funlen v0.2.0 h1:gCHmCn+d2/1SemTdYMiKLAHFYxTYz7z9VIDRaTGyLkI=
@ -437,12 +468,14 @@ github.com/ultraware/whitespace v0.2.0 h1:TYowo2m9Nfj1baEQBjuHzvMRbp19i+RCcRYrSW
github.com/ultraware/whitespace v0.2.0/go.mod h1:XcP1RLD81eV4BW8UhQlpaR+SDc2givTvyI8a586WjW8=
github.com/uudashr/gocognit v1.2.0 h1:3BU9aMr1xbhPlvJLSydKwdLN3tEUUrzPSSM8S4hDYRA=
github.com/uudashr/gocognit v1.2.0/go.mod h1:k/DdKPI6XBZO1q7HgoV2juESI2/Ofj9AcHPZhBBdrTU=
github.com/uudashr/iface v1.3.1 h1:bA51vmVx1UIhiIsQFSNq6GZ6VPTk3WNMZgRiCe9R29U=
github.com/uudashr/iface v1.3.1/go.mod h1:4QvspiRd3JLPAEXBQ9AiZpLbJlrWWgRChOKDJEuQTdg=
github.com/uudashr/iface v1.4.1 h1:J16Xl1wyNX9ofhpHmQ9h9gk5rnv2A6lX/2+APLTo0zU=
github.com/uudashr/iface v1.4.1/go.mod h1:pbeBPlbuU2qkNDn0mmfrxP2X+wjPMIQAy+r1MBXSXtg=
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/xen0n/gosmopolitan v1.2.2 h1:/p2KTnMzwRexIW8GlKawsTWOxn7UHA+jCMF/V8HHtvU=
github.com/xen0n/gosmopolitan v1.2.2/go.mod h1:7XX7Mj61uLYrj0qmeN0zi7XDon9JRAEhYQqAPLVNTeg=
github.com/xen0n/gosmopolitan v1.3.0 h1:zAZI1zefvo7gcpbCOrPSHJZJYA9ZgLfJqtKzZ5pHqQM=
github.com/xen0n/gosmopolitan v1.3.0/go.mod h1:rckfr5T6o4lBtM1ga7mLGKZmLxswUoH1zxHgNXOsEt4=
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM=
github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk=
github.com/yeya24/promlinter v0.3.0 h1:JVDbMp08lVCP7Y6NP3qHroGAO6z2yGKQtS5JsjqtoFs=
@ -460,10 +493,14 @@ gitlab.com/bosi/decorder v0.4.2 h1:qbQaV3zgwnBZ4zPMhGLW4KZe7A7NwxEhJx39R3shffo=
gitlab.com/bosi/decorder v0.4.2/go.mod h1:muuhHoaJkA9QLcYHq4Mj8FJUwDZ+EirSHRiaTcTf6T8=
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.13.0 h1:Q/YAW0AHvaoaIbsPj3bvEI5/QFP7w696IMUpnKXQfCE=
go-simpler.org/musttag v0.13.0/go.mod h1:FTzIGeK6OkKlUDVpj0iQUXZLUO1Js9+mvykDQy9C5yM=
go-simpler.org/sloglint v0.9.0 h1:/40NQtjRx9txvsB/RN022KsUJU+zaaSb/9q9BSefSrE=
go-simpler.org/sloglint v0.9.0/go.mod h1:G/OrAF6uxj48sHahCzrbarVMptL2kjWTaUeC8+fOGww=
go-simpler.org/musttag v0.13.1 h1:lw2sJyu7S1X8lc8zWUAdH42y+afdcCnHhWpnkWvd6vU=
go-simpler.org/musttag v0.13.1/go.mod h1:8r450ehpMLQgvpb6sg+hV5Ur47eH6olp/3yEanfG97k=
go-simpler.org/sloglint v0.11.1 h1:xRbPepLT/MHPTCA6TS/wNfZrDzkGvCCqUv4Bdwc3H7s=
go-simpler.org/sloglint v0.11.1/go.mod h1:2PowwiCOK8mjiF+0KGifVOT8ZsCNiFzvfyJeJOIt8MQ=
go.augendre.info/arangolint v0.2.0 h1:2NP/XudpPmfBhQKX4rMk+zDYIj//qbt4hfZmSSTcpj8=
go.augendre.info/arangolint v0.2.0/go.mod h1:Vx4KSJwu48tkE+8uxuf0cbBnAPgnt8O1KWiT7bljq7w=
go.augendre.info/fatcontext v0.8.0 h1:2dfk6CQbDGeu1YocF59Za5Pia7ULeAM6friJ3LP7lmk=
go.augendre.info/fatcontext v0.8.0/go.mod h1:oVJfMgwngMsHO+KB2MdgzcO+RvtNdiCEOlWvSFtax/s=
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
@ -482,21 +519,19 @@ golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWB
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY=
golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac h1:TSSpLIG4v+p0rPv1pNOQtl1I8knsO4S9trOxNMOLVP4=
golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20250620022241-b7579e27df2b h1:KdrhdYPDUvJTvrDK9gdjfFd6JTk8vA1WJoldYSi0kHo=
golang.org/x/exp/typeparams v0.0.0-20250620022241-b7579e27df2b/go.mod h1:LKZHyeOpPuZcMgxeHjJp4p5yvxrCX1xDvH10zYHhjjQ=
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.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=
golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=
golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@ -506,14 +541,12 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
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-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@ -523,8 +556,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@ -540,19 +573,16 @@ golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
@ -561,13 +591,11 @@ 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.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
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-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
@ -583,19 +611,21 @@ golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg=
golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=
golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
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=
golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated/go.mod h1:RVAQXBGNv1ib0J382/DPCRS/BPnsGebyM1Gj5VSDpG8=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
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=
@ -629,10 +659,10 @@ k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUy
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8=
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro=
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
mvdan.cc/gofumpt v0.7.0 h1:bg91ttqXmi9y2xawvkuMXyvAA/1ZGJqYAEGjXuP0JXU=
mvdan.cc/gofumpt v0.7.0/go.mod h1:txVFJy/Sc/mvaycET54pV8SW8gWxTlUuGHVEcncmNUo=
mvdan.cc/unparam v0.0.0-20240528143540-8a5130ca722f h1:lMpcwN6GxNbWtbpI1+xzFLSW8XzX0u72NttUGVFjO3U=
mvdan.cc/unparam v0.0.0-20240528143540-8a5130ca722f/go.mod h1:RSLa7mKKCNeTTMHBw5Hsy2rfJmd6O2ivt9Dw9ZqCQpQ=
mvdan.cc/gofumpt v0.8.0 h1:nZUCeC2ViFaerTcYKstMmfysj6uhQrA2vJe+2vwGU6k=
mvdan.cc/gofumpt v0.8.0/go.mod h1:vEYnSzyGPmjvFkqJWtXkh79UwPWP9/HMxQdGEXZHjpg=
mvdan.cc/unparam v0.0.0-20250301125049-0df0534333a4 h1:WjUu4yQoT5BHT1w8Zu56SP8367OuBV5jvo+4Ulppyf8=
mvdan.cc/unparam v0.0.0-20250301125049-0df0534333a4/go.mod h1:rthT7OuvRbaGcd5ginj6dA2oLE7YNlta9qhBNNdCaLE=
sigs.k8s.io/controller-tools v0.18.0 h1:rGxGZCZTV2wJreeRgqVoWab/mfcumTMmSwKzoM9xrsE=
sigs.k8s.io/controller-tools v0.18.0/go.mod h1:gLKoiGBriyNh+x1rWtUQnakUYEujErjXs9pf+x/8n1U=
sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8=

View File

@ -25,5 +25,5 @@ import (
_ "sigs.k8s.io/controller-tools/cmd/controller-gen"
_ "github.com/golangci/golangci-lint/cmd/golangci-lint"
_ "github.com/golangci/golangci-lint/v2/cmd/golangci-lint"
)

View File

@ -28,9 +28,11 @@ export GOBIN="${TOOLS_BIN}"
PATH="${GOBIN}:${PATH}"
# Install golangci-lint
if ! command -v golangci-lint &> /dev/null; then
if ! command -v golangci-lint &>/dev/null; then
cd "${KOPS_ROOT}/hack" || exit 1
go install github.com/golangci/golangci-lint/cmd/golangci-lint
go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint
GOLANGCI_LINT_VERSION=$(go list -m -f '{{.Version}}' github.com/golangci/golangci-lint/v2)
echo "golangci-lint version: ${GOLANGCI_LINT_VERSION}"
fi
cd "${KOPS_ROOT}"
@ -39,9 +41,9 @@ cd "${KOPS_ROOT}"
echo 'running golangci-lint ' >&2
res=0
if [[ "$#" -gt 0 ]]; then
golangci-lint run "$@" >&2 || res=$?
golangci-lint run "$@" >&2 || res=$?
else
golangci-lint run ./... >&2 || res=$?
golangci-lint run ./... >&2 || res=$?
fi
# print a message based on the result

View File

@ -897,6 +897,12 @@ spec:
description: ConfigOverride is the complete containerd config
file provided by the user.
type: string
installCriCtl:
description: InstallCriCtl installs crictl (default "false").
type: boolean
installNerdCtl:
description: InstallNerdCtl installs nerdctl (default "false").
type: boolean
logLevel:
description: LogLevel controls the logging details [trace, debug,
info, warn, error, fatal, panic] (default "info").
@ -932,10 +938,14 @@ spec:
Enabled determines if kOps will install the Nvidia GPU runtime and drivers.
They will only be installed on intances that has an Nvidia GPU.
type: boolean
image:
description: Image defines the container image used to deploy
the Nvidia Kubernetes Device Plugin.
type: string
package:
description: |-
Package is the name of the nvidia driver package that will be installed.
Default is "nvidia-headless-460-server".
Default is "nvidia-driver-535-server".
type: string
type: object
packages:
@ -1002,6 +1012,10 @@ spec:
description: State directory for execution state files (default
"/run/containerd").
type: string
useECRCredentialsForMirrors:
description: Enables Kubelet ECR Credential helper to pass credentials
to containerd mirrors, to use ECR as a pull-through cache
type: boolean
version:
description: Version used to pick the containerd package.
type: string

View File

@ -42,6 +42,12 @@ spec:
properties:
instanceGroup:
type: string
podCIDRs:
description: PodCIDRs configures the IP ranges to be used for pods
on this node/host.
items:
type: string
type: array
publicKey:
type: string
type: object

View File

@ -133,6 +133,12 @@ spec:
description: ConfigOverride is the complete containerd config
file provided by the user.
type: string
installCriCtl:
description: InstallCriCtl installs crictl (default "false").
type: boolean
installNerdCtl:
description: InstallNerdCtl installs nerdctl (default "false").
type: boolean
logLevel:
description: LogLevel controls the logging details [trace, debug,
info, warn, error, fatal, panic] (default "info").
@ -168,10 +174,14 @@ spec:
Enabled determines if kOps will install the Nvidia GPU runtime and drivers.
They will only be installed on intances that has an Nvidia GPU.
type: boolean
image:
description: Image defines the container image used to deploy
the Nvidia Kubernetes Device Plugin.
type: string
package:
description: |-
Package is the name of the nvidia driver package that will be installed.
Default is "nvidia-headless-460-server".
Default is "nvidia-driver-535-server".
type: string
type: object
packages:
@ -238,6 +248,10 @@ spec:
description: State directory for execution state files (default
"/run/containerd").
type: string
useECRCredentialsForMirrors:
description: Enables Kubelet ECR Credential helper to pass credentials
to containerd mirrors, to use ECR as a pull-through cache
type: boolean
version:
description: Version used to pick the containerd package.
type: string

View File

@ -21,8 +21,8 @@ var Version = KOPS_RELEASE_VERSION
// These constants are parsed by build tooling - be careful about changing the formats
const (
KOPS_RELEASE_VERSION = "1.33.0-beta.1"
KOPS_CI_VERSION = "1.33.0-beta.2"
KOPS_RELEASE_VERSION = "1.34.0-alpha.1"
KOPS_CI_VERSION = "1.34.0-alpha.2"
)
// GitVersion should be replaced by the makefile

View File

@ -173,6 +173,9 @@ nav:
- Ports: "contributing/ports.md"
- Cluster Addons & Manager : "contributing/addons.md"
- Releases:
- "1.33": releases/1.33-NOTES.md
- "1.32": releases/1.32-NOTES.md
- "1.31": releases/1.31-NOTES.md
- "1.30": releases/1.30-NOTES.md
- "1.29": releases/1.29-NOTES.md
- "1.28": releases/1.28-NOTES.md

View File

@ -499,8 +499,8 @@ func (b *ContainerdBuilder) buildContainerdConfig() (string, error) {
for name, endpoints := range containerd.RegistryMirrors {
config.SetPath([]string{"plugins", "io.containerd.grpc.v1.cri", "registry", "mirrors", name, "endpoint"}, endpoints)
}
config.SetPath([]string{"plugins", "io.containerd.grpc.v1.cri", "containerd", "default_runtime_name"}, "runc")
config.SetPath([]string{"plugins", "io.containerd.grpc.v1.cri", "containerd", "runtimes", "runc", "runtime_type"}, "io.containerd.runc.v2")
// only enable systemd cgroups for kubernetes >= 1.20
config.SetPath([]string{"plugins", "io.containerd.grpc.v1.cri", "containerd", "runtimes", "runc", "options", "SystemdCgroup"}, true)
if b.NodeupConfig.UsesKubenet {
// Using containerd with Kubenet requires special configuration.
@ -545,7 +545,7 @@ func appendNvidiaGPURuntimeConfig(config *toml.Tree) error {
"privileged_without_host_devices": false,
"runtime_engine": "",
"runtime_root": "",
"runtime_type": "io.containerd.runc.v1",
"runtime_type": "io.containerd.runc.v2",
"options": map[string]interface{}{
"SystemdCgroup": true,
"BinaryName": "/usr/bin/nvidia-container-runtime",
@ -557,7 +557,6 @@ func appendNvidiaGPURuntimeConfig(config *toml.Tree) error {
}
config.SetPath([]string{"plugins", "io.containerd.grpc.v1.cri", "containerd", "runtimes", "nvidia"}, gpuConfig)
config.SetPath([]string{"plugins", "io.containerd.grpc.v1.cri", "containerd", "default_runtime_name"}, "runc")
return nil
}

View File

@ -200,12 +200,13 @@ func TestAppendGPURuntimeContainerdConfig(t *testing.T) {
originalConfig := `version = 2
[plugins]
[plugins."io.containerd.grpc.v1.cri"]
[plugins."io.containerd.grpc.v1.cri".containerd]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
[plugins."io.containerd.grpc.v1.cri".containerd]
default_runtime_name = "runc"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
`
expectedNewConfig := `version = 2
@ -223,7 +224,7 @@ func TestAppendGPURuntimeContainerdConfig(t *testing.T) {
privileged_without_host_devices = false
runtime_engine = ""
runtime_root = ""
runtime_type = "io.containerd.runc.v1"
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options]
BinaryName = "/usr/bin/nvidia-container-runtime"

View File

@ -33,6 +33,11 @@ type CrictlBuilder struct {
var _ fi.NodeupModelBuilder = &CrictlBuilder{}
func (b *CrictlBuilder) Build(c *fi.NodeupModelBuilderContext) error {
if b.skipInstall() {
klog.V(8).Info("won't install crictl")
return nil
}
assets := b.Assets.FindMatches(regexp.MustCompile(`^crictl$`))
if len(assets) == 0 {
klog.Warning("unable to find any crictl binaries in assets")
@ -65,3 +70,13 @@ func (b *CrictlBuilder) binaryPath() string {
}
return path
}
func (b *CrictlBuilder) skipInstall() bool {
containerd := b.NodeupConfig.ContainerdConfig
if containerd == nil {
return false
}
return containerd.SkipInstall && !containerd.InstallCriCtl
}

View File

@ -19,10 +19,12 @@ package model
import (
"context"
"fmt"
"net"
"path/filepath"
"sort"
"strings"
"k8s.io/klog/v2"
"k8s.io/kops/pkg/apis/kops"
"k8s.io/kops/pkg/flagbuilder"
"k8s.io/kops/pkg/k8scodecs"
@ -77,6 +79,55 @@ func (b *KubeAPIServerBuilder) Build(c *fi.NodeupModelBuilderContext) error {
}
}
if b.CloudProvider() == kops.CloudProviderMetal {
// Workaround for https://github.com/kubernetes/kubernetes/issues/111671
if b.IsIPv6Only() {
interfaces, err := net.Interfaces()
if err != nil {
return fmt.Errorf("getting local network interfaces: %w", err)
}
var ipv6s []net.IP
for _, intf := range interfaces {
addresses, err := intf.Addrs()
if err != nil {
return fmt.Errorf("getting addresses for network interface %q: %w", intf.Name, err)
}
for _, addr := range addresses {
ip, _, err := net.ParseCIDR(addr.String())
if ip == nil {
return fmt.Errorf("parsing ip address %q (bound to network %q): %w", addr.String(), intf.Name, err)
}
if ip.To4() != nil {
// We're only looking for ipv6
continue
}
if ip.IsLinkLocalUnicast() {
klog.V(4).Infof("ignoring link-local unicast addr %v", addr)
continue
}
if ip.IsLinkLocalMulticast() {
klog.V(4).Infof("ignoring link-local multicast addr %v", addr)
continue
}
if ip.IsLoopback() {
klog.V(4).Infof("ignoring loopback addr %v", addr)
continue
}
ipv6s = append(ipv6s, ip)
}
}
if len(ipv6s) > 1 {
klog.Warningf("found multiple ipv6s, choosing first: %v", ipv6s)
}
if len(ipv6s) == 0 {
klog.Warningf("did not find ipv6 address for kube-apiserver --advertise-address")
}
if len(ipv6s) > 0 {
kubeAPIServer.AdvertiseAddress = ipv6s[0].String()
}
}
}
b.configureOIDC(&kubeAPIServer)
if err := b.writeAuthenticationConfig(c, &kubeAPIServer); err != nil {
return err
@ -744,7 +795,7 @@ func (b *KubeAPIServerBuilder) buildPod(ctx context.Context, kubeAPIServer *kops
}
for _, path := range b.SSLHostPaths() {
name := strings.Replace(path, "/", "", -1)
name := strings.ReplaceAll(path, "/", "")
kubemanifest.AddHostPathMapping(pod, container, name, path)
}

View File

@ -261,7 +261,7 @@ func (b *KubeControllerManagerBuilder) buildPod(kcm *kops.KubeControllerManagerC
container.Args = append(container.Args, sortedStrings(flags)...)
}
for _, path := range b.SSLHostPaths() {
name := strings.Replace(path, "/", "", -1)
name := strings.ReplaceAll(path, "/", "")
kubemanifest.AddHostPathMapping(pod, container, name, path)
}

View File

@ -103,10 +103,16 @@ func (b *KubectlBuilder) Build(c *fi.NodeupModelBuilderContext) error {
// findKubeconfigUser finds the default user for whom we should create a kubeconfig
func (b *KubectlBuilder) findKubeconfigUser() (*fi.User, *fi.Group, error) {
users, err := b.Distribution.DefaultUsers()
if err != nil {
klog.Warningf("won't write kubeconfig to homedir for distribution %v: %v", b.Distribution, err)
return nil, nil, nil
var users []string
if b.RunningOnAzure() {
users = append(users, b.NodeupConfig.AzureAdminUser)
} else {
defaultUsers, err := b.Distribution.DefaultUsers()
if err != nil {
klog.Warningf("won't write kubeconfig to homedir for distribution %v: %v", b.Distribution, err)
return nil, nil, nil
}
users = append(users, defaultUsers...)
}
for _, s := range users {

View File

@ -26,12 +26,15 @@ import (
"path"
"path/filepath"
"strings"
"time"
awsconfig "github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/feature/ec2/imds"
ec2types "github.com/aws/aws-sdk-go-v2/service/ec2/types"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/serializer"
"k8s.io/klog/v2"
"k8s.io/kops/pkg/apis/kops"
"k8s.io/kops/pkg/flagbuilder"
@ -41,6 +44,7 @@ import (
"k8s.io/kops/upup/pkg/fi/cloudup/awsup"
"k8s.io/kops/upup/pkg/fi/nodeup/nodetasks"
"k8s.io/kops/util/pkg/distributions"
kubeletv1 "k8s.io/kubelet/config/v1"
kubelet "k8s.io/kubelet/config/v1beta1"
)
@ -467,25 +471,65 @@ func (b *KubeletBuilder) addECRCredentialProvider(c *fi.NodeupModelBuilderContex
}
{
configContent := `apiVersion: kubelet.config.k8s.io/v1
kind: CredentialProviderConfig
providers:
- name: ecr-credential-provider
matchImages:
- "*.dkr.ecr.*.amazonaws.com"
- "*.dkr.ecr.*.amazonaws.com.cn"
- "*.dkr.ecr-fips.*.amazonaws.com"
- "*.dkr.ecr.us-iso-east-1.c2s.ic.gov"
- "*.dkr.ecr.us-isob-east-1.sc2s.sgov.gov"
defaultCacheDuration: "12h"
apiVersion: credentialprovider.kubelet.k8s.io/v1
args:
- get-credentials
`
providerConfig := &kubeletv1.CredentialProviderConfig{}
// Build the list of container registry globs to match
registryList := []string{
"*.dkr.ecr.*.amazonaws.com",
"*.dkr.ecr.*.amazonaws.com.cn",
"*.dkr.ecr-fips.*.amazonaws.com",
"*.dkr.ecr.us-iso-east-1.c2s.ic.gov",
}
containerd := b.NodeupConfig.ContainerdConfig
if containerd.UseECRCredentialsForMirrors {
for name := range containerd.RegistryMirrors {
registryList = append(registryList, name)
}
}
cacheDuration, err := time.ParseDuration("12h")
if err != nil {
return err
}
providerConfig.Providers = []kubeletv1.CredentialProvider{
{
APIVersion: "credentialprovider.kubelet.k8s.io/v1",
Name: "ecr-credential-provider",
MatchImages: registryList,
DefaultCacheDuration: &v1.Duration{Duration: cacheDuration},
Args: []string{"get-credentials"},
Env: []kubeletv1.ExecEnvVar{
{
Name: "AWS_REGION",
Value: b.Cloud.Region(),
},
},
},
}
sch := runtime.NewScheme()
if err := kubeletv1.AddToScheme(sch); err != nil {
return err
}
gv := kubeletv1.SchemeGroupVersion
codecFactory := serializer.NewCodecFactory(sch)
info, ok := runtime.SerializerInfoForMediaType(codecFactory.SupportedMediaTypes(), "application/yaml")
if !ok {
return fmt.Errorf("failed to find serializer")
}
encoder := codecFactory.EncoderForVersion(info.Serializer, gv)
var w bytes.Buffer
if err := encoder.Encode(providerConfig, &w); err != nil {
return err
}
t := &nodetasks.File{
Path: credentialProviderConfigFilePath,
Contents: fi.NewStringResource(configContent),
Contents: fi.NewBytesResource(w.Bytes()),
Type: nodetasks.FileType_File,
Mode: s("0644"),
}

View File

@ -48,7 +48,7 @@ func TestTaintsApplied(t *testing.T) {
expectTaints []string
}{
{
version: "1.28.0",
version: "1.29.0",
taints: []string{"foo", "bar", "baz"},
expectTaints: []string{"foo", "bar", "baz", "node-role.kubernetes.io/control-plane=:NoSchedule"},
},
@ -101,8 +101,8 @@ func TestTaintsApplied(t *testing.T) {
}
func stringSlicesEqual(exp, other []string) bool {
sort.Sort(sort.StringSlice(exp))
sort.Sort(sort.StringSlice(other))
sort.Strings(exp)
sort.Strings(other)
if exp == nil && other != nil {
return false
}

View File

@ -18,6 +18,7 @@ package model
import (
"path/filepath"
"regexp"
"k8s.io/klog/v2"
"k8s.io/kops/upup/pkg/fi"
@ -33,24 +34,28 @@ var _ fi.NodeupModelBuilder = &NerdctlBuilder{}
func (b *NerdctlBuilder) Build(c *fi.NodeupModelBuilderContext) error {
if b.skipInstall() {
klog.Info("containerd.skipInstall is set to true; won't install nerdctl")
klog.V(8).Info("won't install nerdctl")
return nil
}
assetName := "nerdctl"
assetPath := ""
asset, err := b.Assets.Find(assetName, assetPath)
if err != nil {
klog.Warningf("unable to locate asset %q: %v", assetName, err)
assets := b.Assets.FindMatches(regexp.MustCompile(`^nerdctl$`))
if len(assets) == 0 {
klog.Warning("unable to find any nerdctl binaries in assets")
return nil
}
if len(assets) > 1 {
klog.Warning("multiple nerdctl binaries are found")
return nil
}
c.AddTask(&nodetasks.File{
Path: b.nerdctlPath(),
Contents: asset,
Type: nodetasks.FileType_File,
Mode: s("0755"),
})
for k, v := range assets {
c.AddTask(&nodetasks.File{
Path: filepath.Join(b.binaryPath(), k),
Contents: v,
Type: nodetasks.FileType_File,
Mode: s("0755"),
})
}
return nil
}
@ -64,19 +69,14 @@ func (b *NerdctlBuilder) binaryPath() string {
path = "/home/kubernetes/bin"
}
return path
}
func (b *NerdctlBuilder) nerdctlPath() string {
return filepath.Join(b.binaryPath(), "nerdctl")
}
func (b *NerdctlBuilder) skipInstall() bool {
d := b.NodeupConfig.ContainerdConfig
containerd := b.NodeupConfig.ContainerdConfig
if d == nil {
if containerd == nil {
return false
}
return d.SkipInstall
return containerd.SkipInstall && !containerd.InstallNerdCtl
}

View File

@ -35,21 +35,21 @@ var _ fi.NodeupModelBuilder = &PackagesBuilder{}
func (b *PackagesBuilder) Build(c *fi.NodeupModelBuilderContext) error {
// kubelet needs:
// conntrack - kops #5671
// ebtables - kops #1711
// ethtool - kops #1830
if b.Distribution.IsDebianFamily() {
// From containerd: https://github.com/containerd/cri/blob/master/contrib/ansible/tasks/bootstrap_ubuntu.yaml
c.AddTask(&nodetasks.Package{Name: "bridge-utils"})
c.AddTask(&nodetasks.Package{Name: "cgroupfs-mount"})
if (b.Distribution.IsDebian() && b.Distribution.Version() < 13) || (b.Distribution.IsUbuntu() && b.Distribution.Version() < 25.10) {
c.AddTask(&nodetasks.Package{Name: "cgroupfs-mount"})
}
c.AddTask(&nodetasks.Package{Name: "conntrack"})
c.AddTask(&nodetasks.Package{Name: "ebtables"})
c.AddTask(&nodetasks.Package{Name: "ethtool"})
c.AddTask(&nodetasks.Package{Name: "iptables"})
c.AddTask(&nodetasks.Package{Name: "libapparmor1"})
c.AddTask(&nodetasks.Package{Name: "libseccomp2"})
c.AddTask(&nodetasks.Package{Name: "libltdl7"})
if b.NodeupConfig.KubeProxy != nil && fi.ValueOf(b.NodeupConfig.KubeProxy.Enabled) && b.NodeupConfig.KubeProxy.ProxyMode == "nftables" {
c.AddTask(&nodetasks.Package{Name: "nftables"})
}
c.AddTask(&nodetasks.Package{Name: "pigz"})
c.AddTask(&nodetasks.Package{Name: "socat"})
c.AddTask(&nodetasks.Package{Name: "util-linux"})
// Additional packages
for _, additionalPackage := range b.NodeupConfig.Packages {
@ -58,8 +58,6 @@ func (b *PackagesBuilder) Build(c *fi.NodeupModelBuilderContext) error {
} else if b.Distribution.IsRHELFamily() {
// From containerd: https://github.com/containerd/cri/blob/master/contrib/ansible/tasks/bootstrap_centos.yaml
c.AddTask(&nodetasks.Package{Name: "conntrack-tools"})
c.AddTask(&nodetasks.Package{Name: "ebtables"})
c.AddTask(&nodetasks.Package{Name: "ethtool"})
if b.Distribution == distributions.DistributionAmazonLinux2023 {
// install iptables-nft in al2023 (NOT the iptables-legacy!)
c.AddTask(&nodetasks.Package{Name: "iptables-nft"})
@ -68,7 +66,9 @@ func (b *PackagesBuilder) Build(c *fi.NodeupModelBuilderContext) error {
}
c.AddTask(&nodetasks.Package{Name: "libseccomp"})
c.AddTask(&nodetasks.Package{Name: "libtool-ltdl"})
c.AddTask(&nodetasks.Package{Name: "socat"})
if b.NodeupConfig.KubeProxy != nil && fi.ValueOf(b.NodeupConfig.KubeProxy.Enabled) && b.NodeupConfig.KubeProxy.ProxyMode == "nftables" {
c.AddTask(&nodetasks.Package{Name: "nftables"})
}
c.AddTask(&nodetasks.Package{Name: "util-linux"})
// Handle some packages differently for each distro
// Amazon Linux 2 doesn't have SELinux enabled by default

View File

@ -41,6 +41,8 @@ func (b *PrefixBuilder) Build(c *fi.NodeupModelBuilderContext) error {
})
case kops.CloudProviderGCE:
// Prefix is assigned by GCE
case kops.CloudProviderMetal:
// IPv6 must be configured externally (not by nodeup)
default:
return fmt.Errorf("kOps IPAM controller not supported on cloud %q", b.CloudProvider())
}

View File

@ -32,6 +32,7 @@ contents: |
conf_template = "/etc/containerd/config-cni.template"
[plugins."io.containerd.grpc.v1.cri".containerd]
default_runtime_name = "runc"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]

View File

@ -32,6 +32,7 @@ contents: |
conf_template = "/etc/containerd/config-cni.template"
[plugins."io.containerd.grpc.v1.cri".containerd]
default_runtime_name = "runc"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]

View File

@ -32,6 +32,7 @@ contents: |
conf_template = "/etc/containerd/config-cni.template"
[plugins."io.containerd.grpc.v1.cri".containerd]
default_runtime_name = "runc"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]

View File

@ -54,7 +54,7 @@ contents: |
- --etcd-keyfile=/srv/kubernetes/kube-apiserver/etcd-client.key
- --etcd-servers-overrides=/events#https://127.0.0.1:4002
- --etcd-servers=https://127.0.0.1:4001
- --feature-gates=CSIMigrationAWS=true,InTreePluginAWSUnregister=true
- --feature-gates=InTreePluginAWSUnregister=true
- --kubelet-client-certificate=/srv/kubernetes/kube-apiserver/kubelet-api.crt
- --kubelet-client-key=/srv/kubernetes/kube-apiserver/kubelet-api.key
- --kubelet-preferred-address-types=InternalIP,Hostname,ExternalIP

View File

@ -32,7 +32,7 @@ contents: |
- --etcd-keyfile=/srv/kubernetes/kube-apiserver/etcd-client.key
- --etcd-servers-overrides=/events#https://events.etcd.internal.minimal.example.com:4002
- --etcd-servers=https://main.etcd.internal.minimal.example.com:4001
- --feature-gates=CSIMigrationAWS=true,InTreePluginAWSUnregister=true
- --feature-gates=InTreePluginAWSUnregister=true
- --kubelet-client-certificate=/srv/kubernetes/kube-apiserver/kubelet-api.crt
- --kubelet-client-key=/srv/kubernetes/kube-apiserver/kubelet-api.key
- --kubelet-preferred-address-types=InternalIP,Hostname,ExternalIP

View File

@ -31,7 +31,7 @@ contents: |
- --etcd-certfile=/srv/kubernetes/kube-apiserver/etcd-client.crt
- --etcd-keyfile=/srv/kubernetes/kube-apiserver/etcd-client.key
- --etcd-servers=https://127.0.0.1:4001
- --feature-gates=CSIMigrationAWS=true,InTreePluginAWSUnregister=true
- --feature-gates=InTreePluginAWSUnregister=true
- --kubelet-client-certificate=/srv/kubernetes/kube-apiserver/kubelet-api.crt
- --kubelet-client-key=/srv/kubernetes/kube-apiserver/kubelet-api.key
- --kubelet-preferred-address-types=InternalIP,Hostname,ExternalIP

View File

@ -3,7 +3,7 @@ path: /etc/kubernetes/manifests
type: directory
---
contents: |
DAEMON_ARGS="--authentication-token-webhook=true --authorization-mode=Webhook --cgroup-driver=systemd --cgroup-root=/ --client-ca-file=/srv/kubernetes/ca.crt --cloud-provider=external --cluster-dns=100.64.0.10 --cluster-domain=cluster.local --enable-debugging-handlers=true --eviction-hard=memory.available<100Mi,nodefs.available<10%,nodefs.inodesFree<5%,imagefs.available<10%,imagefs.inodesFree<5% --feature-gates=AllowExtTrafficLocalEndpoints=false,CSIMigrationAWS=true,ExperimentalCriticalPodAnnotation=true,InTreePluginAWSUnregister=true --kubeconfig=/var/lib/kubelet/kubeconfig --pod-infra-container-image=registry.k8s.io/pause:3.9 --pod-manifest-path=/etc/kubernetes/manifests --protect-kernel-defaults=true --register-schedulable=true --resolv-conf=/run/systemd/resolve/resolv.conf --v=2 --volume-plugin-dir=/usr/libexec/kubernetes/kubelet-plugins/volume/exec/ --cloud-config=/etc/kubernetes/in-tree-cloud.config --runtime-request-timeout=15m --container-runtime-endpoint=unix:///run/containerd/containerd.sock --tls-cert-file=/srv/kubernetes/kubelet-server.crt --tls-private-key-file=/srv/kubernetes/kubelet-server.key --config=/var/lib/kubelet/kubelet.conf"
DAEMON_ARGS="--authentication-token-webhook=true --authorization-mode=Webhook --cgroup-driver=systemd --cgroup-root=/ --client-ca-file=/srv/kubernetes/ca.crt --cloud-provider=external --cluster-dns=100.64.0.10 --cluster-domain=cluster.local --enable-debugging-handlers=true --eviction-hard=memory.available<100Mi,nodefs.available<10%,nodefs.inodesFree<5%,imagefs.available<10%,imagefs.inodesFree<5% --feature-gates=AllowExtTrafficLocalEndpoints=false,ExperimentalCriticalPodAnnotation=true,InTreePluginAWSUnregister=true --kubeconfig=/var/lib/kubelet/kubeconfig --pod-infra-container-image=registry.k8s.io/pause:3.9 --pod-manifest-path=/etc/kubernetes/manifests --protect-kernel-defaults=true --register-schedulable=true --resolv-conf=/run/systemd/resolve/resolv.conf --v=2 --volume-plugin-dir=/usr/libexec/kubernetes/kubelet-plugins/volume/exec/ --cloud-config=/etc/kubernetes/in-tree-cloud.config --runtime-request-timeout=15m --container-runtime-endpoint=unix:///run/containerd/containerd.sock --tls-cert-file=/srv/kubernetes/kubelet-server.crt --tls-private-key-file=/srv/kubernetes/kubelet-server.key --config=/var/lib/kubelet/kubelet.conf --image-credential-provider-config=/var/lib/kubelet/credential-provider.conf --image-credential-provider-bin-dir=/usr/local/bin"
HOME="/root"
path: /etc/sysconfig/kubelet
type: file

View File

@ -3,7 +3,7 @@ path: /etc/kubernetes/manifests
type: directory
---
contents: |
DAEMON_ARGS="--authentication-token-webhook=true --authorization-mode=Webhook --cgroup-driver=systemd --cgroup-root=/ --client-ca-file=/srv/kubernetes/ca.crt --cloud-provider=external --cluster-dns=100.64.0.10 --cluster-domain=cluster.local --enable-debugging-handlers=true --eviction-hard=memory.available<100Mi,nodefs.available<10%,nodefs.inodesFree<5%,imagefs.available<10%,imagefs.inodesFree<5% --feature-gates=CSIMigrationAWS=true,InTreePluginAWSUnregister=true --kubeconfig=/var/lib/kubelet/kubeconfig --pod-infra-container-image=registry.k8s.io/pause:3.9 --pod-manifest-path=/etc/kubernetes/manifests --protect-kernel-defaults=true --register-schedulable=true --resolv-conf=/run/systemd/resolve/resolv.conf --v=2 --volume-plugin-dir=/usr/libexec/kubernetes/kubelet-plugins/volume/exec/ --cloud-config=/etc/kubernetes/in-tree-cloud.config --runtime-request-timeout=15m --container-runtime-endpoint=unix:///run/containerd/containerd.sock --tls-cert-file=/srv/kubernetes/kubelet-server.crt --tls-private-key-file=/srv/kubernetes/kubelet-server.key --config=/var/lib/kubelet/kubelet.conf"
DAEMON_ARGS="--authentication-token-webhook=true --authorization-mode=Webhook --cgroup-driver=systemd --cgroup-root=/ --client-ca-file=/srv/kubernetes/ca.crt --cloud-provider=external --cluster-dns=100.64.0.10 --cluster-domain=cluster.local --enable-debugging-handlers=true --eviction-hard=memory.available<100Mi,nodefs.available<10%,nodefs.inodesFree<5%,imagefs.available<10%,imagefs.inodesFree<5% --feature-gates=InTreePluginAWSUnregister=true --kubeconfig=/var/lib/kubelet/kubeconfig --pod-infra-container-image=registry.k8s.io/pause:3.9 --pod-manifest-path=/etc/kubernetes/manifests --protect-kernel-defaults=true --register-schedulable=true --resolv-conf=/run/systemd/resolve/resolv.conf --v=2 --volume-plugin-dir=/usr/libexec/kubernetes/kubelet-plugins/volume/exec/ --cloud-config=/etc/kubernetes/in-tree-cloud.config --runtime-request-timeout=15m --container-runtime-endpoint=unix:///run/containerd/containerd.sock --tls-cert-file=/srv/kubernetes/kubelet-server.crt --tls-private-key-file=/srv/kubernetes/kubelet-server.key --config=/var/lib/kubelet/kubelet.conf --image-credential-provider-config=/var/lib/kubelet/credential-provider.conf --image-credential-provider-bin-dir=/usr/local/bin"
HOME="/root"
path: /etc/sysconfig/kubelet
type: file

View File

@ -19,6 +19,7 @@ package kops
import (
"fmt"
"github.com/blang/semver/v4"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@ -947,6 +948,29 @@ func (c *Cluster) InstallCNIAssets() bool {
c.Spec.Networking.Cilium == nil
}
func (c *Cluster) HasImageVolumesSupport() bool {
// Image Volumes was added to Kubernetes v1.31
// https://kubernetes.io/blog/2024/08/16/kubernetes-1-31-image-volume-source/
// Image Volumes graduated to beta in Kubernetes v1.33
// https://kubernetes.io/blog/2025/04/29/kubernetes-v1-33-image-volume-beta/
if c.IsKubernetesLT("1.33.0") {
return false
}
if c.Spec.Containerd == nil || c.Spec.Containerd.Version == nil {
return false
}
sv, err := semver.ParseTolerant(*c.Spec.Containerd.Version)
if err != nil {
return false
}
// Image Volumes was released in Containerd v2.1.0
// https://github.com/containerd/containerd/releases/tag/v2.1.0
if sv.LT(semver.MustParse("2.1.0")) {
return false
}
return true
}
func (c *Cluster) APIInternalName() string {
return "api.internal." + c.ObjectMeta.Name
}

View File

@ -21,8 +21,12 @@ import (
"k8s.io/apimachinery/pkg/util/intstr"
)
// NvidiaDefaultDriverPackage is the nvidia driver default version
const NvidiaDefaultDriverPackage = "nvidia-driver-535-server"
const (
// NvidiaDefaultDriverPackage is the nvidia driver default version
NvidiaDefaultDriverPackage = "nvidia-driver-535-server"
// NvidiaDevicePluginImage is the Nvidia K8s device plugin container image
NvidiaDevicePluginImage = "nvcr.io/nvidia/k8s-device-plugin:v0.17.3"
)
// ContainerdConfig is the configuration for containerd
type ContainerdConfig struct {
@ -54,6 +58,12 @@ type ContainerdConfig struct {
SeLinuxEnabled bool `json:"selinuxEnabled,omitempty"`
// NRI configures the Node Resource Interface.
NRI *NRIConfig `json:"nri,omitempty"`
// Enables Kubelet ECR Credential helper to pass credentials to containerd mirrors, to use ECR as a pull-through cache
UseECRCredentialsForMirrors bool `json:"useECRCredentialsForMirrors,omitempty"`
// InstallCriCtl installs crictl (default "false").
InstallCriCtl bool `json:"installCriCtl,omitempty"`
// InstallNerdCtl installs nerdctl (default "false").
InstallNerdCtl bool `json:"installNerdCtl,omitempty"`
}
type NRIConfig struct {
@ -67,11 +77,13 @@ type NRIConfig struct {
type NvidiaGPUConfig struct {
// Package is the name of the nvidia driver package that will be installed.
// Default is "nvidia-headless-510-server".
// Default is "nvidia-driver-535-server".
DriverPackage string `json:"package,omitempty"`
// Enabled determines if kOps will install the Nvidia GPU runtime and drivers.
// They will only be installed on intances that has an Nvidia GPU.
// They will only be installed on instances that has an Nvidia GPU.
Enabled *bool `json:"enabled,omitempty"`
// Image defines the container image used to deploy the Nvidia Kubernetes Device Plugin.
DevicePluginImage string `json:"image,omitempty"`
// DCGMExporterConfig configures the DCGM exporter
DCGMExporter *DCGMExporterConfig `json:"dcgmExporter,omitempty"`
}

49
pkg/apis/kops/host.go Normal file
View File

@ -0,0 +1,49 @@
/*
Copyright 2023 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package kops
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// +genclient
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// Host represents a bare-metal machine that could be registered as a Node.
type Host struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec HostSpec `json:"spec,omitempty"`
}
type HostSpec struct {
PublicKey string `json:"publicKey,omitempty"`
InstanceGroup string `json:"instanceGroup,omitempty"`
// PodCIDRs configures the IP ranges to be used for pods on this node/host.
PodCIDRs []string `json:"podCIDRs,omitempty"`
}
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type HostList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []Host `json:"items"`
}

View File

@ -0,0 +1,52 @@
/*
Copyright 2025 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package install
import (
"strings"
"testing"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
)
func TestTypesExistInAllVersions(t *testing.T) {
scheme := runtime.NewScheme()
Install(scheme)
group := "kops.k8s.io"
internalVersion := schema.GroupVersion{Group: group, Version: runtime.APIVersionInternal}
internalKindToGoType := scheme.KnownTypes(internalVersion)
internalKinds := make(map[string]bool)
for kind := range internalKindToGoType {
internalKinds[kind] = true
}
for _, version := range []string{"v1alpha2", "v1alpha3"} {
versionKinds := scheme.KnownTypes(schema.GroupVersion{Group: group, Version: version})
for kind := range versionKinds {
// Ignore ListOptions, DeleteOptions, etc.
if strings.HasSuffix(kind, "Options") {
continue
}
if !internalKinds[kind] {
t.Errorf("version %s has kind %s, not found in internal API", version, kind)
}
}
}
}

View File

@ -17,11 +17,42 @@ limitations under the License.
package install
import (
"math/rand"
"testing"
"k8s.io/apimachinery/pkg/api/apitesting/fuzzer"
"k8s.io/apimachinery/pkg/api/apitesting/roundtrip"
metafuzzer "k8s.io/apimachinery/pkg/apis/meta/fuzzer"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer"
)
func TestRoundTripTypes(t *testing.T) {
t.Skipped()
// TODO: Reenable
// roundtrip.RoundTripTestForAPIGroup(t, Install, nil)
var fuzzingFuncs fuzzer.FuzzerFuncs
nonRoundTrippableTypes := make(map[schema.GroupVersionKind]bool)
// TODO: Eliminate this once all types round-trip
for _, version := range []string{"v1alpha2", "v1alpha3"} {
nonRoundTrippableTypes[schema.GroupVersionKind{Group: "kops.k8s.io", Version: version, Kind: "Cluster"}] = true
nonRoundTrippableTypes[schema.GroupVersionKind{Group: "kops.k8s.io", Version: version, Kind: "ClusterList"}] = true
nonRoundTrippableTypes[schema.GroupVersionKind{Group: "kops.k8s.io", Version: version, Kind: "InstanceGroup"}] = true
nonRoundTrippableTypes[schema.GroupVersionKind{Group: "kops.k8s.io", Version: version, Kind: "InstanceGroupList"}] = true
}
if len(nonRoundTrippableTypes) == 0 {
roundtrip.RoundTripTestForAPIGroup(t, Install, fuzzingFuncs)
} else {
scheme := runtime.NewScheme()
Install(scheme)
codecFactory := runtimeserializer.NewCodecFactory(scheme)
f := fuzzer.FuzzerFor(
fuzzer.MergeFuzzerFuncs(metafuzzer.Funcs, fuzzingFuncs),
rand.NewSource(rand.Int63()),
codecFactory,
)
roundtrip.RoundTripTypesWithoutProtobuf(t, scheme, codecFactory, f, nonRoundTrippableTypes)
}
}

View File

@ -73,7 +73,7 @@ func UseExternalKubeletCredentialProvider(k8sVersion *KubernetesVersion, cloudPr
case kops.CloudProviderGCE:
return k8sVersion.IsGTE("1.29")
case kops.CloudProviderAWS:
return k8sVersion.IsGTE("1.27")
return true
default:
return false
}

View File

@ -63,6 +63,8 @@ func addKnownTypes(scheme *runtime.Scheme) error {
&KeysetList{},
&SSHCredential{},
&SSHCredentialList{},
&Host{},
&HostList{},
)
// metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
return nil

View File

@ -51,6 +51,12 @@ type ContainerdConfig struct {
SeLinuxEnabled bool `json:"selinuxEnabled,omitempty"`
// NRI configures the Node Resource Interface.
NRI *NRIConfig `json:"nri,omitempty"`
// Enables Kubelet ECR Credential helper to pass credentials to containerd mirrors, to use ECR as a pull-through cache
UseECRCredentialsForMirrors bool `json:"useECRCredentialsForMirrors,omitempty"`
// InstallCriCtl installs crictl (default "false").
InstallCriCtl bool `json:"installCriCtl,omitempty"`
// InstallNerdCtl installs nerdctl (default "false").
InstallNerdCtl bool `json:"installNerdCtl,omitempty"`
}
type NRIConfig struct {
@ -64,11 +70,13 @@ type NRIConfig struct {
type NvidiaGPUConfig struct {
// Package is the name of the nvidia driver package that will be installed.
// Default is "nvidia-headless-460-server".
// Default is "nvidia-driver-535-server".
DriverPackage string `json:"package,omitempty"`
// Enabled determines if kOps will install the Nvidia GPU runtime and drivers.
// They will only be installed on intances that has an Nvidia GPU.
Enabled *bool `json:"enabled,omitempty"`
// Image defines the container image used to deploy the Nvidia Kubernetes Device Plugin.
DevicePluginImage string `json:"image,omitempty"`
// DCGMExporterConfig configures the DCGM exporter
DCGMExporter *DCGMExporterConfig `json:"dcgmExporter,omitempty"`
}

View File

@ -36,6 +36,9 @@ type Host struct {
type HostSpec struct {
PublicKey string `json:"publicKey,omitempty"`
InstanceGroup string `json:"instanceGroup,omitempty"`
// PodCIDRs configures the IP ranges to be used for pods on this node/host.
PodCIDRs []string `json:"podCIDRs,omitempty"`
}
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

View File

@ -514,6 +514,36 @@ func RegisterConversions(s *runtime.Scheme) error {
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*Host)(nil), (*kops.Host)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1alpha2_Host_To_kops_Host(a.(*Host), b.(*kops.Host), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*kops.Host)(nil), (*Host)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_kops_Host_To_v1alpha2_Host(a.(*kops.Host), b.(*Host), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*HostList)(nil), (*kops.HostList)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1alpha2_HostList_To_kops_HostList(a.(*HostList), b.(*kops.HostList), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*kops.HostList)(nil), (*HostList)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_kops_HostList_To_v1alpha2_HostList(a.(*kops.HostList), b.(*HostList), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*HostSpec)(nil), (*kops.HostSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1alpha2_HostSpec_To_kops_HostSpec(a.(*HostSpec), b.(*kops.HostSpec), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*kops.HostSpec)(nil), (*HostSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_kops_HostSpec_To_v1alpha2_HostSpec(a.(*kops.HostSpec), b.(*HostSpec), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*HubbleSpec)(nil), (*kops.HubbleSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1alpha2_HubbleSpec_To_kops_HubbleSpec(a.(*HubbleSpec), b.(*kops.HubbleSpec), scope)
}); err != nil {
@ -3287,6 +3317,9 @@ func autoConvert_v1alpha2_ContainerdConfig_To_kops_ContainerdConfig(in *Containe
} else {
out.NRI = nil
}
out.UseECRCredentialsForMirrors = in.UseECRCredentialsForMirrors
out.InstallCriCtl = in.InstallCriCtl
out.InstallNerdCtl = in.InstallNerdCtl
return nil
}
@ -3342,6 +3375,9 @@ func autoConvert_kops_ContainerdConfig_To_v1alpha2_ContainerdConfig(in *kops.Con
} else {
out.NRI = nil
}
out.UseECRCredentialsForMirrors = in.UseECRCredentialsForMirrors
out.InstallCriCtl = in.InstallCriCtl
out.InstallNerdCtl = in.InstallNerdCtl
return nil
}
@ -4132,6 +4168,98 @@ func autoConvert_kops_HookSpec_To_v1alpha2_HookSpec(in *kops.HookSpec, out *Hook
return nil
}
func autoConvert_v1alpha2_Host_To_kops_Host(in *Host, out *kops.Host, s conversion.Scope) error {
out.ObjectMeta = in.ObjectMeta
if err := Convert_v1alpha2_HostSpec_To_kops_HostSpec(&in.Spec, &out.Spec, s); err != nil {
return err
}
return nil
}
// Convert_v1alpha2_Host_To_kops_Host is an autogenerated conversion function.
func Convert_v1alpha2_Host_To_kops_Host(in *Host, out *kops.Host, s conversion.Scope) error {
return autoConvert_v1alpha2_Host_To_kops_Host(in, out, s)
}
func autoConvert_kops_Host_To_v1alpha2_Host(in *kops.Host, out *Host, s conversion.Scope) error {
out.ObjectMeta = in.ObjectMeta
if err := Convert_kops_HostSpec_To_v1alpha2_HostSpec(&in.Spec, &out.Spec, s); err != nil {
return err
}
return nil
}
// Convert_kops_Host_To_v1alpha2_Host is an autogenerated conversion function.
func Convert_kops_Host_To_v1alpha2_Host(in *kops.Host, out *Host, s conversion.Scope) error {
return autoConvert_kops_Host_To_v1alpha2_Host(in, out, s)
}
func autoConvert_v1alpha2_HostList_To_kops_HostList(in *HostList, out *kops.HostList, s conversion.Scope) error {
out.ListMeta = in.ListMeta
if in.Items != nil {
in, out := &in.Items, &out.Items
*out = make([]kops.Host, len(*in))
for i := range *in {
if err := Convert_v1alpha2_Host_To_kops_Host(&(*in)[i], &(*out)[i], s); err != nil {
return err
}
}
} else {
out.Items = nil
}
return nil
}
// Convert_v1alpha2_HostList_To_kops_HostList is an autogenerated conversion function.
func Convert_v1alpha2_HostList_To_kops_HostList(in *HostList, out *kops.HostList, s conversion.Scope) error {
return autoConvert_v1alpha2_HostList_To_kops_HostList(in, out, s)
}
func autoConvert_kops_HostList_To_v1alpha2_HostList(in *kops.HostList, out *HostList, s conversion.Scope) error {
out.ListMeta = in.ListMeta
if in.Items != nil {
in, out := &in.Items, &out.Items
*out = make([]Host, len(*in))
for i := range *in {
if err := Convert_kops_Host_To_v1alpha2_Host(&(*in)[i], &(*out)[i], s); err != nil {
return err
}
}
} else {
out.Items = nil
}
return nil
}
// Convert_kops_HostList_To_v1alpha2_HostList is an autogenerated conversion function.
func Convert_kops_HostList_To_v1alpha2_HostList(in *kops.HostList, out *HostList, s conversion.Scope) error {
return autoConvert_kops_HostList_To_v1alpha2_HostList(in, out, s)
}
func autoConvert_v1alpha2_HostSpec_To_kops_HostSpec(in *HostSpec, out *kops.HostSpec, s conversion.Scope) error {
out.PublicKey = in.PublicKey
out.InstanceGroup = in.InstanceGroup
out.PodCIDRs = in.PodCIDRs
return nil
}
// Convert_v1alpha2_HostSpec_To_kops_HostSpec is an autogenerated conversion function.
func Convert_v1alpha2_HostSpec_To_kops_HostSpec(in *HostSpec, out *kops.HostSpec, s conversion.Scope) error {
return autoConvert_v1alpha2_HostSpec_To_kops_HostSpec(in, out, s)
}
func autoConvert_kops_HostSpec_To_v1alpha2_HostSpec(in *kops.HostSpec, out *HostSpec, s conversion.Scope) error {
out.PublicKey = in.PublicKey
out.InstanceGroup = in.InstanceGroup
out.PodCIDRs = in.PodCIDRs
return nil
}
// Convert_kops_HostSpec_To_v1alpha2_HostSpec is an autogenerated conversion function.
func Convert_kops_HostSpec_To_v1alpha2_HostSpec(in *kops.HostSpec, out *HostSpec, s conversion.Scope) error {
return autoConvert_kops_HostSpec_To_v1alpha2_HostSpec(in, out, s)
}
func autoConvert_v1alpha2_HubbleSpec_To_kops_HubbleSpec(in *HubbleSpec, out *kops.HubbleSpec, s conversion.Scope) error {
out.Enabled = in.Enabled
out.Metrics = in.Metrics
@ -6775,6 +6903,7 @@ func Convert_kops_NodeTerminationHandlerSpec_To_v1alpha2_NodeTerminationHandlerS
func autoConvert_v1alpha2_NvidiaGPUConfig_To_kops_NvidiaGPUConfig(in *NvidiaGPUConfig, out *kops.NvidiaGPUConfig, s conversion.Scope) error {
out.DriverPackage = in.DriverPackage
out.Enabled = in.Enabled
out.DevicePluginImage = in.DevicePluginImage
if in.DCGMExporter != nil {
in, out := &in.DCGMExporter, &out.DCGMExporter
*out = new(kops.DCGMExporterConfig)
@ -6795,6 +6924,7 @@ func Convert_v1alpha2_NvidiaGPUConfig_To_kops_NvidiaGPUConfig(in *NvidiaGPUConfi
func autoConvert_kops_NvidiaGPUConfig_To_v1alpha2_NvidiaGPUConfig(in *kops.NvidiaGPUConfig, out *NvidiaGPUConfig, s conversion.Scope) error {
out.DriverPackage = in.DriverPackage
out.Enabled = in.Enabled
out.DevicePluginImage = in.DevicePluginImage
if in.DCGMExporter != nil {
in, out := &in.DCGMExporter, &out.DCGMExporter
*out = new(DCGMExporterConfig)

View File

@ -2370,7 +2370,7 @@ func (in *Host) DeepCopyInto(out *Host) {
*out = *in
out.TypeMeta = in.TypeMeta
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
out.Spec = in.Spec
in.Spec.DeepCopyInto(&out.Spec)
return
}
@ -2428,6 +2428,11 @@ func (in *HostList) DeepCopyObject() runtime.Object {
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *HostSpec) DeepCopyInto(out *HostSpec) {
*out = *in
if in.PodCIDRs != nil {
in, out := &in.PodCIDRs, &out.PodCIDRs
*out = make([]string, len(*in))
copy(*out, *in)
}
return
}

View File

@ -51,6 +51,12 @@ type ContainerdConfig struct {
SeLinuxEnabled bool `json:"selinuxEnabled,omitempty"`
// NRI configures the Node Resource Interface.
NRI *NRIConfig `json:"nri,omitempty"`
// Enables Kubelet ECR Credential helper to pass credentials to containerd mirrors, to use ECR as a pull-through cache
UseECRCredentialsForMirrors bool `json:"useECRCredentialsForMirrors,omitempty"`
// InstallCriCtl installs crictl (default "false").
InstallCriCtl bool `json:"installCriCtl,omitempty"`
// InstallNerdCtl installs nerdctl (default "false").
InstallNerdCtl bool `json:"installNerdCtl,omitempty"`
}
type NRIConfig struct {
@ -64,11 +70,13 @@ type NRIConfig struct {
type NvidiaGPUConfig struct {
// Package is the name of the nvidia driver package that will be installed.
// Default is "nvidia-headless-460-server".
// Default is "nvidia-driver-535-server".
DriverPackage string `json:"package,omitempty"`
// Enabled determines if kOps will install the Nvidia GPU runtime and drivers.
// They will only be installed on intances that has an Nvidia GPU.
Enabled *bool `json:"enabled,omitempty"`
// Image defines the container image used to deploy the Nvidia Kubernetes Device Plugin.
DevicePluginImage string `json:"image,omitempty"`
// DCGMExporterConfig configures the DCGM exporter
DCGMExporter *DCGMExporterConfig `json:"dcgmExporter,omitempty"`
}

View File

@ -36,6 +36,9 @@ type Host struct {
type HostSpec struct {
PublicKey string `json:"publicKey,omitempty"`
InstanceGroup string `json:"instanceGroup,omitempty"`
// PodCIDRs configures the IP ranges to be used for pods on this node/host.
PodCIDRs []string `json:"podCIDRs,omitempty"`
}
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

View File

@ -614,6 +614,36 @@ func RegisterConversions(s *runtime.Scheme) error {
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*Host)(nil), (*kops.Host)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1alpha3_Host_To_kops_Host(a.(*Host), b.(*kops.Host), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*kops.Host)(nil), (*Host)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_kops_Host_To_v1alpha3_Host(a.(*kops.Host), b.(*Host), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*HostList)(nil), (*kops.HostList)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1alpha3_HostList_To_kops_HostList(a.(*HostList), b.(*kops.HostList), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*kops.HostList)(nil), (*HostList)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_kops_HostList_To_v1alpha3_HostList(a.(*kops.HostList), b.(*HostList), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*HostSpec)(nil), (*kops.HostSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1alpha3_HostSpec_To_kops_HostSpec(a.(*HostSpec), b.(*kops.HostSpec), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*kops.HostSpec)(nil), (*HostSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_kops_HostSpec_To_v1alpha3_HostSpec(a.(*kops.HostSpec), b.(*HostSpec), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*HubbleSpec)(nil), (*kops.HubbleSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1alpha3_HubbleSpec_To_kops_HubbleSpec(a.(*HubbleSpec), b.(*kops.HubbleSpec), scope)
}); err != nil {
@ -3532,6 +3562,9 @@ func autoConvert_v1alpha3_ContainerdConfig_To_kops_ContainerdConfig(in *Containe
} else {
out.NRI = nil
}
out.UseECRCredentialsForMirrors = in.UseECRCredentialsForMirrors
out.InstallCriCtl = in.InstallCriCtl
out.InstallNerdCtl = in.InstallNerdCtl
return nil
}
@ -3587,6 +3620,9 @@ func autoConvert_kops_ContainerdConfig_To_v1alpha3_ContainerdConfig(in *kops.Con
} else {
out.NRI = nil
}
out.UseECRCredentialsForMirrors = in.UseECRCredentialsForMirrors
out.InstallCriCtl = in.InstallCriCtl
out.InstallNerdCtl = in.InstallNerdCtl
return nil
}
@ -4479,6 +4515,98 @@ func Convert_kops_HookSpec_To_v1alpha3_HookSpec(in *kops.HookSpec, out *HookSpec
return autoConvert_kops_HookSpec_To_v1alpha3_HookSpec(in, out, s)
}
func autoConvert_v1alpha3_Host_To_kops_Host(in *Host, out *kops.Host, s conversion.Scope) error {
out.ObjectMeta = in.ObjectMeta
if err := Convert_v1alpha3_HostSpec_To_kops_HostSpec(&in.Spec, &out.Spec, s); err != nil {
return err
}
return nil
}
// Convert_v1alpha3_Host_To_kops_Host is an autogenerated conversion function.
func Convert_v1alpha3_Host_To_kops_Host(in *Host, out *kops.Host, s conversion.Scope) error {
return autoConvert_v1alpha3_Host_To_kops_Host(in, out, s)
}
func autoConvert_kops_Host_To_v1alpha3_Host(in *kops.Host, out *Host, s conversion.Scope) error {
out.ObjectMeta = in.ObjectMeta
if err := Convert_kops_HostSpec_To_v1alpha3_HostSpec(&in.Spec, &out.Spec, s); err != nil {
return err
}
return nil
}
// Convert_kops_Host_To_v1alpha3_Host is an autogenerated conversion function.
func Convert_kops_Host_To_v1alpha3_Host(in *kops.Host, out *Host, s conversion.Scope) error {
return autoConvert_kops_Host_To_v1alpha3_Host(in, out, s)
}
func autoConvert_v1alpha3_HostList_To_kops_HostList(in *HostList, out *kops.HostList, s conversion.Scope) error {
out.ListMeta = in.ListMeta
if in.Items != nil {
in, out := &in.Items, &out.Items
*out = make([]kops.Host, len(*in))
for i := range *in {
if err := Convert_v1alpha3_Host_To_kops_Host(&(*in)[i], &(*out)[i], s); err != nil {
return err
}
}
} else {
out.Items = nil
}
return nil
}
// Convert_v1alpha3_HostList_To_kops_HostList is an autogenerated conversion function.
func Convert_v1alpha3_HostList_To_kops_HostList(in *HostList, out *kops.HostList, s conversion.Scope) error {
return autoConvert_v1alpha3_HostList_To_kops_HostList(in, out, s)
}
func autoConvert_kops_HostList_To_v1alpha3_HostList(in *kops.HostList, out *HostList, s conversion.Scope) error {
out.ListMeta = in.ListMeta
if in.Items != nil {
in, out := &in.Items, &out.Items
*out = make([]Host, len(*in))
for i := range *in {
if err := Convert_kops_Host_To_v1alpha3_Host(&(*in)[i], &(*out)[i], s); err != nil {
return err
}
}
} else {
out.Items = nil
}
return nil
}
// Convert_kops_HostList_To_v1alpha3_HostList is an autogenerated conversion function.
func Convert_kops_HostList_To_v1alpha3_HostList(in *kops.HostList, out *HostList, s conversion.Scope) error {
return autoConvert_kops_HostList_To_v1alpha3_HostList(in, out, s)
}
func autoConvert_v1alpha3_HostSpec_To_kops_HostSpec(in *HostSpec, out *kops.HostSpec, s conversion.Scope) error {
out.PublicKey = in.PublicKey
out.InstanceGroup = in.InstanceGroup
out.PodCIDRs = in.PodCIDRs
return nil
}
// Convert_v1alpha3_HostSpec_To_kops_HostSpec is an autogenerated conversion function.
func Convert_v1alpha3_HostSpec_To_kops_HostSpec(in *HostSpec, out *kops.HostSpec, s conversion.Scope) error {
return autoConvert_v1alpha3_HostSpec_To_kops_HostSpec(in, out, s)
}
func autoConvert_kops_HostSpec_To_v1alpha3_HostSpec(in *kops.HostSpec, out *HostSpec, s conversion.Scope) error {
out.PublicKey = in.PublicKey
out.InstanceGroup = in.InstanceGroup
out.PodCIDRs = in.PodCIDRs
return nil
}
// Convert_kops_HostSpec_To_v1alpha3_HostSpec is an autogenerated conversion function.
func Convert_kops_HostSpec_To_v1alpha3_HostSpec(in *kops.HostSpec, out *HostSpec, s conversion.Scope) error {
return autoConvert_kops_HostSpec_To_v1alpha3_HostSpec(in, out, s)
}
func autoConvert_v1alpha3_HubbleSpec_To_kops_HubbleSpec(in *HubbleSpec, out *kops.HubbleSpec, s conversion.Scope) error {
out.Enabled = in.Enabled
out.Metrics = in.Metrics
@ -7032,6 +7160,7 @@ func Convert_kops_NodeTerminationHandlerSpec_To_v1alpha3_NodeTerminationHandlerS
func autoConvert_v1alpha3_NvidiaGPUConfig_To_kops_NvidiaGPUConfig(in *NvidiaGPUConfig, out *kops.NvidiaGPUConfig, s conversion.Scope) error {
out.DriverPackage = in.DriverPackage
out.Enabled = in.Enabled
out.DevicePluginImage = in.DevicePluginImage
if in.DCGMExporter != nil {
in, out := &in.DCGMExporter, &out.DCGMExporter
*out = new(kops.DCGMExporterConfig)
@ -7052,6 +7181,7 @@ func Convert_v1alpha3_NvidiaGPUConfig_To_kops_NvidiaGPUConfig(in *NvidiaGPUConfi
func autoConvert_kops_NvidiaGPUConfig_To_v1alpha3_NvidiaGPUConfig(in *kops.NvidiaGPUConfig, out *NvidiaGPUConfig, s conversion.Scope) error {
out.DriverPackage = in.DriverPackage
out.Enabled = in.Enabled
out.DevicePluginImage = in.DevicePluginImage
if in.DCGMExporter != nil {
in, out := &in.DCGMExporter, &out.DCGMExporter
*out = new(DCGMExporterConfig)

View File

@ -2338,7 +2338,7 @@ func (in *Host) DeepCopyInto(out *Host) {
*out = *in
out.TypeMeta = in.TypeMeta
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
out.Spec = in.Spec
in.Spec.DeepCopyInto(&out.Spec)
return
}
@ -2396,6 +2396,11 @@ func (in *HostList) DeepCopyObject() runtime.Object {
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *HostSpec) DeepCopyInto(out *HostSpec) {
*out = *in
if in.PodCIDRs != nil {
in, out := &in.PodCIDRs, &out.PodCIDRs
*out = make([]string, len(*in))
copy(*out, *in)
}
return
}

View File

@ -57,7 +57,7 @@ func newValidateCluster(cluster *kops.Cluster, strict bool) field.ErrorList {
errs := utilvalidation.IsDNS1123Subdomain(clusterName)
if len(errs) != 0 {
allErrs = append(allErrs, field.Invalid(field.NewPath("objectMeta", "name"), clusterName, fmt.Sprintf("Cluster Name must be a valid DNS name (e.g. --name=mycluster.myzone.com) errors: %s", strings.Join(errs, ", "))))
} else if !strings.Contains(clusterName, ".") {
} else if !strings.Contains(clusterName, ".") && !cluster.UsesNoneDNS() {
// Tolerate if this is a cluster we are importing for upgrade
if cluster.ObjectMeta.Annotations[kops.AnnotationNameManagement] != kops.AnnotationValueManagementImported {
allErrs = append(allErrs, field.Invalid(field.NewPath("objectMeta", "name"), clusterName, "Cluster Name must be a fully-qualified DNS name (e.g. --name=mycluster.myzone.com)"))
@ -1127,11 +1127,7 @@ func validateNetworking(cluster *kops.Cluster, v *kops.NetworkingSpec, fldPath *
}
if v.Canal != nil {
if cluster.IsKubernetesGTE("1.28") {
allErrs = append(allErrs, field.Forbidden(fldPath.Child("canal"), "Canal is not supported for Kubernetes >= 1.28"))
} else {
allErrs = append(allErrs, validateNetworkingCanal(cluster, v.Canal, fldPath.Child("canal"))...)
}
allErrs = append(allErrs, field.Forbidden(fldPath.Child("canal"), "Canal is not supported for Kubernetes >= 1.28"))
}
if v.KubeRouter != nil {
@ -1629,13 +1625,14 @@ func validateCalicoAutoDetectionMethod(fldPath *field.Path, runtime string, vers
case "can-reach":
destStr := method[1]
ip := netutils.ParseIPSloppy(destStr)
if version == ipv4.Version {
switch version {
case ipv4.Version:
if ip == nil || ip.To4() == nil {
return field.ErrorList{field.Invalid(fldPath, runtime, "must be a valid IPv4 address")}
} else {
return nil
}
} else if version == ipv6.Version {
case ipv6.Version:
if ip == nil || ip.To4() != nil {
return field.ErrorList{field.Invalid(fldPath, runtime, "must be a valid IPv6 address")}
} else {

View File

@ -379,7 +379,7 @@ func TestValidateKubeControllermanager(t *testing.T) {
if g.Cluster == nil {
g.Cluster = &kops.Cluster{
Spec: kops.ClusterSpec{
KubernetesVersion: "1.28.0",
KubernetesVersion: "1.29.0",
},
}
}
@ -436,7 +436,7 @@ func Test_Validate_Networking_Flannel(t *testing.T) {
for _, g := range grid {
cluster := &kops.Cluster{
Spec: kops.ClusterSpec{
KubernetesVersion: "1.27.0",
KubernetesVersion: "1.29.0",
Networking: kops.NetworkingSpec{
NetworkCIDR: "10.0.0.0/8",
NonMasqueradeCIDR: "100.64.0.0/10",
@ -502,7 +502,7 @@ func Test_Validate_Networking_Kindnet(t *testing.T) {
for _, g := range grid {
cluster := &kops.Cluster{
Spec: kops.ClusterSpec{
KubernetesVersion: "1.27.0",
KubernetesVersion: "1.29.0",
Networking: kops.NetworkingSpec{
NetworkCIDR: "10.0.0.0/8",
NonMasqueradeCIDR: "100.64.0.0/10",
@ -596,7 +596,7 @@ func Test_Validate_Networking_OverlappingCIDR(t *testing.T) {
t.Run(g.Name, func(t *testing.T) {
cluster := &kops.Cluster{
Spec: kops.ClusterSpec{
KubernetesVersion: "1.27.0",
KubernetesVersion: "1.29.0",
},
}
cluster.Spec.Networking = g.Networking

View File

@ -2496,6 +2496,87 @@ func (in *HookSpec) DeepCopy() *HookSpec {
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Host) DeepCopyInto(out *Host) {
*out = *in
out.TypeMeta = in.TypeMeta
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
in.Spec.DeepCopyInto(&out.Spec)
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Host.
func (in *Host) DeepCopy() *Host {
if in == nil {
return nil
}
out := new(Host)
in.DeepCopyInto(out)
return out
}
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *Host) DeepCopyObject() runtime.Object {
if c := in.DeepCopy(); c != nil {
return c
}
return nil
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *HostList) DeepCopyInto(out *HostList) {
*out = *in
out.TypeMeta = in.TypeMeta
in.ListMeta.DeepCopyInto(&out.ListMeta)
if in.Items != nil {
in, out := &in.Items, &out.Items
*out = make([]Host, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HostList.
func (in *HostList) DeepCopy() *HostList {
if in == nil {
return nil
}
out := new(HostList)
in.DeepCopyInto(out)
return out
}
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *HostList) DeepCopyObject() runtime.Object {
if c := in.DeepCopy(); c != nil {
return c
}
return nil
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *HostSpec) DeepCopyInto(out *HostSpec) {
*out = *in
if in.PodCIDRs != nil {
in, out := &in.PodCIDRs, &out.PodCIDRs
*out = make([]string, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HostSpec.
func (in *HostSpec) DeepCopy() *HostSpec {
if in == nil {
return nil
}
out := new(HostSpec)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *HubbleSpec) DeepCopyInto(out *HubbleSpec) {
*out = *in

View File

@ -118,6 +118,8 @@ type Config struct {
WarmPoolImages []string `json:"warmPoolImages,omitempty"`
// Azure-specific
// AzureAdminUser is the admin user of VMs.
AzureAdminUser string `json:",omitempty"`
// AzureLocation is the location of the resource group that the cluster is deployed in.
AzureLocation string `json:",omitempty"`
// AzureSubscriptionID is the ID of the Azure Subscription that the cluster is deployed in.
@ -280,6 +282,7 @@ func NewConfig(cluster *kops.Cluster, instanceGroup *kops.InstanceGroup) (*Confi
config.AzureResourceGroup = cluster.AzureResourceGroupName()
config.AzureRouteTableName = cluster.AzureRouteTableName()
config.Networking.NetworkID = cluster.Spec.Networking.NetworkID
config.AzureAdminUser = cluster.Spec.CloudProvider.Azure.AdminUser
}
if cluster.Spec.CloudProvider.GCE != nil {

View File

@ -62,9 +62,10 @@ func (req *putResource) Run(s *MockKubeAPIServer) error {
var updated *unstructured.Unstructured
if req.SubResource == "" {
switch req.SubResource {
case "":
updated = body
} else if req.SubResource == "status" {
case "status":
updated = existing.DeepCopyObject().(*unstructured.Unstructured)
newStatus := body.Object["status"]
if newStatus == nil {
@ -72,7 +73,7 @@ func (req *putResource) Run(s *MockKubeAPIServer) error {
return fmt.Errorf("status not specified on status subresource update")
}
updated.Object["status"] = newStatus
} else {
default:
// TODO: We need to implement put properly
return fmt.Errorf("unknown subresource %q", req.SubResource)
}

View File

@ -134,3 +134,18 @@ files:
sha256: 02990fa281c0a2c4b073c6d2415d264b682bd693aa7d86c5d8eb4b86d684a18c
- name: v1.7.25/containerd-1.7.25-linux-arm64.tar.gz
sha256: e9201d478e4c931496344b779eb6cb40ce5084ec08c8fff159a02cabb0c6b9bf
# containerd 1.7.26
- name: v1.7.26/containerd-1.7.26-linux-amd64.tar.gz
sha256: fdf1fb17086b62fc861103da4e3fda3d79bc543b42d2acef5d07e76b13d35d19
- name: v1.7.26/containerd-1.7.26-linux-arm64.tar.gz
sha256: adea067914e678ac37d5091ead66f1e36e5cced4d395bbd2be60772495e09eff
# containerd 1.7.27
- name: v1.7.27/containerd-1.7.27-linux-amd64.tar.gz
sha256: 5b038fb22ab5dbb1ce57dd3d8f102460cd8619ff2afc78870837b06e8c4e840a
- name: v1.7.27/containerd-1.7.27-linux-arm64.tar.gz
sha256: 3f03ea60c7dacddf890be3ab18f7ef859d9d104b19627f52038d7984361912bc
# containerd 1.7.28
- name: v1.7.28/containerd-1.7.28-linux-amd64.tar.gz
sha256: 7a8c262deb63becc877e82d23749e4f99f4a17e8e660f9b8c257ca87a5c056b6
- name: v1.7.28/containerd-1.7.28-linux-arm64.tar.gz
sha256: 97457594ff8549cb82d664306593cafd3d2c781c706f9fffed885a46d8919bec

Some files were not shown because too many files have changed in this diff Show More