From 3378e71750c8172505d5d40cf07cf3037660674f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Mar 2026 10:06:16 +0000 Subject: [PATCH 1/2] Bump the go-dependencies group across 1 directory with 7 updates Bumps the go-dependencies group with 5 updates in the / directory: | Package | From | To | | --- | --- | --- | | [github.com/onsi/ginkgo/v2](https://github.com/onsi/ginkgo) | `2.27.4` | `2.28.1` | | [github.com/onsi/gomega](https://github.com/onsi/gomega) | `1.39.0` | `1.39.1` | | [k8s.io/api](https://github.com/kubernetes/api) | `0.35.0` | `0.35.1` | | [k8s.io/apiextensions-apiserver](https://github.com/kubernetes/apiextensions-apiserver) | `0.35.0` | `0.35.1` | | [sigs.k8s.io/controller-runtime](https://github.com/kubernetes-sigs/controller-runtime) | `0.22.4` | `0.23.1` | Updates `github.com/onsi/ginkgo/v2` from 2.27.4 to 2.28.1 - [Release notes](https://github.com/onsi/ginkgo/releases) - [Changelog](https://github.com/onsi/ginkgo/blob/master/CHANGELOG.md) - [Commits](https://github.com/onsi/ginkgo/compare/v2.27.4...v2.28.1) Updates `github.com/onsi/gomega` from 1.39.0 to 1.39.1 - [Release notes](https://github.com/onsi/gomega/releases) - [Changelog](https://github.com/onsi/gomega/blob/master/CHANGELOG.md) - [Commits](https://github.com/onsi/gomega/compare/v1.39.0...v1.39.1) Updates `k8s.io/api` from 0.35.0 to 0.35.1 - [Commits](https://github.com/kubernetes/api/compare/v0.35.0...v0.35.1) Updates `k8s.io/apiextensions-apiserver` from 0.35.0 to 0.35.1 - [Release notes](https://github.com/kubernetes/apiextensions-apiserver/releases) - [Commits](https://github.com/kubernetes/apiextensions-apiserver/compare/v0.35.0...v0.35.1) Updates `k8s.io/apimachinery` from 0.35.0 to 0.35.1 - [Commits](https://github.com/kubernetes/apimachinery/compare/v0.35.0...v0.35.1) Updates `k8s.io/client-go` from 0.35.0 to 0.35.1 - [Changelog](https://github.com/kubernetes/client-go/blob/master/CHANGELOG.md) - [Commits](https://github.com/kubernetes/client-go/compare/v0.35.0...v0.35.1) Updates `sigs.k8s.io/controller-runtime` from 0.22.4 to 0.23.1 - [Release notes](https://github.com/kubernetes-sigs/controller-runtime/releases) - [Changelog](https://github.com/kubernetes-sigs/controller-runtime/blob/main/RELEASE.md) - [Commits](https://github.com/kubernetes-sigs/controller-runtime/compare/v0.22.4...v0.23.1) --- updated-dependencies: - dependency-name: github.com/onsi/ginkgo/v2 dependency-version: 2.28.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-dependencies - dependency-name: github.com/onsi/gomega dependency-version: 1.39.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-dependencies - dependency-name: k8s.io/api dependency-version: 0.35.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-dependencies - dependency-name: k8s.io/apiextensions-apiserver dependency-version: 0.35.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-dependencies - dependency-name: k8s.io/apimachinery dependency-version: 0.35.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-dependencies - dependency-name: k8s.io/client-go dependency-version: 0.35.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-dependencies - dependency-name: sigs.k8s.io/controller-runtime dependency-version: 0.23.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-dependencies ... Signed-off-by: dependabot[bot] --- go.mod | 34 ++++++++++++++--------------- go.sum | 68 +++++++++++++++++++++++++++++----------------------------- 2 files changed, 51 insertions(+), 51 deletions(-) diff --git a/go.mod b/go.mod index 9e55e6c..3210703 100644 --- a/go.mod +++ b/go.mod @@ -6,18 +6,18 @@ require ( github.com/go-logr/logr v1.4.3 github.com/google/addlicense v1.2.0 github.com/ironcore-dev/controller-utils v0.11.0 - github.com/onsi/ginkgo/v2 v2.27.4 - github.com/onsi/gomega v1.39.0 + github.com/onsi/ginkgo/v2 v2.28.1 + github.com/onsi/gomega v1.39.1 github.com/pkg/errors v0.9.1 github.com/spf13/cobra v1.10.2 go4.org/netipx v0.0.0-20231129151722-fdeea329fbba gopkg.in/inf.v0 v0.9.1 - k8s.io/api v0.35.0 - k8s.io/apiextensions-apiserver v0.35.0 - k8s.io/apimachinery v0.35.0 - k8s.io/client-go v0.35.0 + k8s.io/api v0.35.2 + k8s.io/apiextensions-apiserver v0.35.2 + k8s.io/apimachinery v0.35.2 + k8s.io/client-go v0.35.2 k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 - sigs.k8s.io/controller-runtime v0.22.4 + sigs.k8s.io/controller-runtime v0.23.1 ) require ( @@ -57,7 +57,7 @@ require ( github.com/google/cel-go v0.26.0 // indirect github.com/google/gnostic-models v0.7.0 // indirect github.com/google/go-cmp v0.7.0 // indirect - github.com/google/pprof v0.0.0-20251007162407-5df77e3f7d1d // indirect + github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83 // indirect github.com/google/uuid v1.6.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -87,28 +87,28 @@ require ( go.yaml.in/yaml/v2 v2.4.3 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect - golang.org/x/mod v0.29.0 // indirect - golang.org/x/net v0.47.0 // indirect + golang.org/x/mod v0.32.0 // indirect + golang.org/x/net v0.49.0 // indirect golang.org/x/oauth2 v0.32.0 // indirect - golang.org/x/sync v0.18.0 // indirect + golang.org/x/sync v0.19.0 // indirect golang.org/x/sys v0.40.0 // indirect - golang.org/x/term v0.37.0 // indirect - golang.org/x/text v0.31.0 // indirect + golang.org/x/term v0.39.0 // indirect + golang.org/x/text v0.33.0 // indirect golang.org/x/time v0.14.0 // indirect - golang.org/x/tools v0.38.0 // indirect + golang.org/x/tools v0.41.0 // indirect gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20251022142026-3a174f9686a8 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20251022142026-3a174f9686a8 // indirect google.golang.org/grpc v1.76.0 // indirect google.golang.org/protobuf v1.36.10 // indirect gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect - k8s.io/apiserver v0.35.0 // indirect - k8s.io/component-base v0.35.0 // indirect + k8s.io/apiserver v0.35.2 // indirect + k8s.io/component-base v0.35.2 // indirect k8s.io/klog/v2 v2.130.1 // indirect k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 // indirect sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0 // indirect sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect sigs.k8s.io/randfill v1.0.0 // indirect - sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.3.2-0.20260122202528-d9cc6641c482 // indirect sigs.k8s.io/yaml v1.6.0 // indirect ) diff --git a/go.sum b/go.sum index 6c77097..0adbdae 100644 --- a/go.sum +++ b/go.sum @@ -93,8 +93,8 @@ github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20251007162407-5df77e3f7d1d h1:KJIErDwbSHjnp/SGzE5ed8Aol7JsKiI5X7yWKAtzhM0= -github.com/google/pprof v0.0.0-20251007162407-5df77e3f7d1d/go.mod h1:I6V7YzU0XDpsHqbsyrghnFZLO1gwK6NPTNvmetQIk9U= +github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83 h1:z2ogiKUYzX5Is6zr/vP9vJGqPwcdqsWjOt+V8J7+bTc= +github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 h1:NmZ1PKzSTQbuGHw9DGPFomqkkLWMC+vZCkfs+FHv1Vg= @@ -127,10 +127,10 @@ github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFd github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/onsi/ginkgo/v2 v2.27.4 h1:fcEcQW/A++6aZAZQNUmNjvA9PSOzefMJBerHJ4t8v8Y= -github.com/onsi/ginkgo/v2 v2.27.4/go.mod h1:ArE1D/XhNXBXCBkKOLkbsb2c81dQHCRcF5zwn/ykDRo= -github.com/onsi/gomega v1.39.0 h1:y2ROC3hKFmQZJNFeGAMeHZKkjBL65mIZcvrLQBF9k6Q= -github.com/onsi/gomega v1.39.0/go.mod h1:ZCU1pkQcXDO5Sl9/VVEGlDyp+zm0m1cmeG5TOzLgdh4= +github.com/onsi/ginkgo/v2 v2.28.1 h1:S4hj+HbZp40fNKuLUQOYLDgZLwNUVn19N3Atb98NCyI= +github.com/onsi/ginkgo/v2 v2.28.1/go.mod h1:CLtbVInNckU3/+gC8LzkGUb9oF+e8W8TdUsxPwvdOgE= +github.com/onsi/gomega v1.39.1 h1:1IJLAad4zjPn2PsnhH70V4DKRFlrCzGBNrNaru+Vf28= +github.com/onsi/gomega v1.39.1/go.mod h1:hL6yVALoTOxeWudERyfppUcZXjMwIMLnuSfruD2lcfg= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -209,25 +209,25 @@ go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBs go4.org/netipx v0.0.0-20231129151722-fdeea329fbba/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= -golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= -golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= -golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= -golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c= +golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU= +golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= +golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= golang.org/x/oauth2 v0.32.0 h1:jsCblLleRMDrxMN29H3z/k1KliIvpLgCkE6R8FXXNgY= golang.org/x/oauth2 v0.32.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= -golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= -golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= -golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= -golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= +golang.org/x/term v0.39.0 h1:RclSuaJf32jOqZz74CkPA9qFuVTX7vhLlpfj/IGWlqY= +golang.org/x/term v0.39.0/go.mod h1:yxzUCTP/U+FzoxfdKmLaA0RV1WgE0VY7hXBwKtY/4ww= +golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE= +golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= -golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= -golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= +golang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc= +golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg= gomodules.xyz/jsonpatch/v2 v2.5.0 h1:JELs8RLM12qJGXU4u/TO3V25KW8GreMKl9pdkk14RM0= gomodules.xyz/jsonpatch/v2 v2.5.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= @@ -250,18 +250,18 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/api v0.35.0 h1:iBAU5LTyBI9vw3L5glmat1njFK34srdLmktWwLTprlY= -k8s.io/api v0.35.0/go.mod h1:AQ0SNTzm4ZAczM03QH42c7l3bih1TbAXYo0DkF8ktnA= -k8s.io/apiextensions-apiserver v0.35.0 h1:3xHk2rTOdWXXJM+RDQZJvdx0yEOgC0FgQ1PlJatA5T4= -k8s.io/apiextensions-apiserver v0.35.0/go.mod h1:E1Ahk9SADaLQ4qtzYFkwUqusXTcaV2uw3l14aqpL2LU= -k8s.io/apimachinery v0.35.0 h1:Z2L3IHvPVv/MJ7xRxHEtk6GoJElaAqDCCU0S6ncYok8= -k8s.io/apimachinery v0.35.0/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns= -k8s.io/apiserver v0.35.0 h1:CUGo5o+7hW9GcAEF3x3usT3fX4f9r8xmgQeCBDaOgX4= -k8s.io/apiserver v0.35.0/go.mod h1:QUy1U4+PrzbJaM3XGu2tQ7U9A4udRRo5cyxkFX0GEds= -k8s.io/client-go v0.35.0 h1:IAW0ifFbfQQwQmga0UdoH0yvdqrbwMdq9vIFEhRpxBE= -k8s.io/client-go v0.35.0/go.mod h1:q2E5AAyqcbeLGPdoRB+Nxe3KYTfPce1Dnu1myQdqz9o= -k8s.io/component-base v0.35.0 h1:+yBrOhzri2S1BVqyVSvcM3PtPyx5GUxCK2tinZz1G94= -k8s.io/component-base v0.35.0/go.mod h1:85SCX4UCa6SCFt6p3IKAPej7jSnF3L8EbfSyMZayJR0= +k8s.io/api v0.35.2 h1:tW7mWc2RpxW7HS4CoRXhtYHSzme1PN1UjGHJ1bdrtdw= +k8s.io/api v0.35.2/go.mod h1:7AJfqGoAZcwSFhOjcGM7WV05QxMMgUaChNfLTXDRE60= +k8s.io/apiextensions-apiserver v0.35.2 h1:iyStXHoJZsUXPh/nFAsjC29rjJWdSgUmG1XpApE29c0= +k8s.io/apiextensions-apiserver v0.35.2/go.mod h1:OdyGvcO1FtMDWQ+rRh/Ei3b6X3g2+ZDHd0MSRGeS8rU= +k8s.io/apimachinery v0.35.2 h1:NqsM/mmZA7sHW02JZ9RTtk3wInRgbVxL8MPfzSANAK8= +k8s.io/apimachinery v0.35.2/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns= +k8s.io/apiserver v0.35.2 h1:rb52v0CZGEL0FkhjS+I6jHflAp7fZ4MIaKcEHX7wmDk= +k8s.io/apiserver v0.35.2/go.mod h1:CROJUAu0tfjZLyYgSeBsBan2T7LUJGh0ucWwTCSSk7g= +k8s.io/client-go v0.35.2 h1:YUfPefdGJA4aljDdayAXkc98DnPkIetMl4PrKX97W9o= +k8s.io/client-go v0.35.2/go.mod h1:4QqEwh4oQpeK8AaefZ0jwTFJw/9kIjdQi0jpKeYvz7g= +k8s.io/component-base v0.35.2 h1:btgR+qNrpWuRSuvWSnQYsZy88yf5gVwemvz0yw79pGc= +k8s.io/component-base v0.35.2/go.mod h1:B1iBJjooe6xIJYUucAxb26RwhAjzx0gHnqO9htWIX+0= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 h1:Y3gxNAuB0OBLImH611+UDZcmKS3g6CthxToOb37KgwE= @@ -270,13 +270,13 @@ k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 h1:SjGebBtkBqHFOli+05xYbK8YF1Dzk k8s.io/utils v0.0.0-20251002143259-bc988d571ff4/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0 h1:qPrZsv1cwQiFeieFlRqT627fVZ+tyfou/+S5S0H5ua0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= -sigs.k8s.io/controller-runtime v0.22.4 h1:GEjV7KV3TY8e+tJ2LCTxUTanW4z/FmNB7l327UfMq9A= -sigs.k8s.io/controller-runtime v0.22.4/go.mod h1:+QX1XUpTXN4mLoblf4tqr5CQcyHPAki2HLXqQMY6vh8= +sigs.k8s.io/controller-runtime v0.23.1 h1:TjJSM80Nf43Mg21+RCy3J70aj/W6KyvDtOlpKf+PupE= +sigs.k8s.io/controller-runtime v0.23.1/go.mod h1:B6COOxKptp+YaUT5q4l6LqUJTRpizbgf9KSRNdQGns0= sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco= -sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= +sigs.k8s.io/structured-merge-diff/v6 v6.3.2-0.20260122202528-d9cc6641c482 h1:2WOzJpHUBVrrkDjU4KBT8n5LDcj824eX0I5UKcgeRUs= +sigs.k8s.io/structured-merge-diff/v6 v6.3.2-0.20260122202528-d9cc6641c482/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= From 5f7f70d81d72e5b1a2ce3d33f220f5e5713ab8ef Mon Sep 17 00:00:00 2001 From: Damyan Yordanov Date: Mon, 2 Mar 2026 13:07:19 +0100 Subject: [PATCH 2/2] Bump some component versions Bump `controller-gen`, `golang` and `linter` versions. Fix all linter findings --- Makefile | 8 +- cmdutils/move_test.go | 2 +- .../bases/ipam.metal.ironcore.dev_ips.yaml | 2 +- ...am.metal.ironcore.dev_networkcounters.yaml | 2 +- .../ipam.metal.ironcore.dev_networks.yaml | 2 +- .../ipam.metal.ironcore.dev_subnets.yaml | 2 +- go.mod | 2 +- internal/controller/ip_controller.go | 14 +- internal/controller/network_controller.go | 14 +- .../controller/networkcounter_controller.go | 6 +- internal/controller/subnet_controller.go | 26 +-- internal/webhook/v1alpha1/ip_webhook.go | 113 ++++-------- internal/webhook/v1alpha1/network_webhook.go | 95 +++------- .../v1alpha1/networkcounter_webhook.go | 72 ++------ internal/webhook/v1alpha1/subnet_webhook.go | 166 ++++++------------ 15 files changed, 164 insertions(+), 362 deletions(-) diff --git a/Makefile b/Makefile index b5e690e..5fda9a3 100644 --- a/Makefile +++ b/Makefile @@ -191,15 +191,15 @@ GOIMPORTS ?= $(LOCALBIN)/goimports GEN_CRD_API_REFERENCE_DOCS ?= $(LOCALBIN)/gen-crd-api-reference-docs ## Tool Versions -KUSTOMIZE_VERSION ?= v5.5.0 -CONTROLLER_TOOLS_VERSION ?= v0.17.1 +KUSTOMIZE_VERSION ?= v5.8.1 +CONTROLLER_TOOLS_VERSION ?= v0.20.1 #ENVTEST_VERSION is the version of controller-runtime release branch to fetch the envtest setup script (i.e. release-0.20) ENVTEST_VERSION ?= $(shell go list -m -f "{{ .Version }}" sigs.k8s.io/controller-runtime | awk -F'[v.]' '{printf "release-%d.%d", $$2, $$3}') #ENVTEST_K8S_VERSION is the version of Kubernetes to use for setting up ENVTEST binaries (i.e. 1.31) ENVTEST_K8S_VERSION ?= $(shell go list -m -f "{{ .Version }}" k8s.io/api | awk -F'[v.]' '{printf "1.%d", $$3}') -GOLANGCI_LINT_VERSION ?= v2.4.0 +GOLANGCI_LINT_VERSION ?= v2.8.0 ADDLICENSE_VERSION ?= v1.1.1 -GOIMPORTS_VERSION ?= v0.31.0 +GOIMPORTS_VERSION ?= v0.38.0 GEN_CRD_API_REFERENCE_DOCS_VERSION ?= v0.3.0 # curl retries diff --git a/cmdutils/move_test.go b/cmdutils/move_test.go index 7a43f80..7e12bbe 100644 --- a/cmdutils/move_test.go +++ b/cmdutils/move_test.go @@ -64,7 +64,7 @@ var _ = Describe("ipamctl move", func() { targetIP := namedObj(&ipamv1alphav1.IP{}, sourceIP.Name) // TEST - crsSchema := []schema.GroupVersionKind{} + crsSchema := make([]schema.GroupVersionKind, 0, 3) for _, crdKind := range []string{"Network", "Subnet", "IP"} { crsSchema = append(crsSchema, schema.GroupVersionKind{Group: "ipam.metal.ironcore.dev", Version: "v1alpha1", Kind: crdKind}) diff --git a/config/crd/bases/ipam.metal.ironcore.dev_ips.yaml b/config/crd/bases/ipam.metal.ironcore.dev_ips.yaml index 8c067e5..a598e1e 100644 --- a/config/crd/bases/ipam.metal.ironcore.dev_ips.yaml +++ b/config/crd/bases/ipam.metal.ironcore.dev_ips.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.17.1 + controller-gen.kubebuilder.io/version: v0.20.1 name: ips.ipam.metal.ironcore.dev spec: group: ipam.metal.ironcore.dev diff --git a/config/crd/bases/ipam.metal.ironcore.dev_networkcounters.yaml b/config/crd/bases/ipam.metal.ironcore.dev_networkcounters.yaml index 79d6d3a..b424427 100644 --- a/config/crd/bases/ipam.metal.ironcore.dev_networkcounters.yaml +++ b/config/crd/bases/ipam.metal.ironcore.dev_networkcounters.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.17.1 + controller-gen.kubebuilder.io/version: v0.20.1 name: networkcounters.ipam.metal.ironcore.dev spec: group: ipam.metal.ironcore.dev diff --git a/config/crd/bases/ipam.metal.ironcore.dev_networks.yaml b/config/crd/bases/ipam.metal.ironcore.dev_networks.yaml index 73e9afa..30fa029 100644 --- a/config/crd/bases/ipam.metal.ironcore.dev_networks.yaml +++ b/config/crd/bases/ipam.metal.ironcore.dev_networks.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.17.1 + controller-gen.kubebuilder.io/version: v0.20.1 name: networks.ipam.metal.ironcore.dev spec: group: ipam.metal.ironcore.dev diff --git a/config/crd/bases/ipam.metal.ironcore.dev_subnets.yaml b/config/crd/bases/ipam.metal.ironcore.dev_subnets.yaml index 90d95e6..0578b29 100644 --- a/config/crd/bases/ipam.metal.ironcore.dev_subnets.yaml +++ b/config/crd/bases/ipam.metal.ironcore.dev_subnets.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.17.1 + controller-gen.kubebuilder.io/version: v0.20.1 name: subnets.ipam.metal.ironcore.dev spec: group: ipam.metal.ironcore.dev diff --git a/go.mod b/go.mod index 3210703..6acbc94 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/ironcore-dev/ipam -go 1.25.0 +go 1.25.6 require ( github.com/go-logr/logr v1.4.3 diff --git a/internal/controller/ip_controller.go b/internal/controller/ip_controller.go index b415276..1b44e47 100644 --- a/internal/controller/ip_controller.go +++ b/internal/controller/ip_controller.go @@ -10,7 +10,7 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/types" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "github.com/ironcore-dev/ipam/api/ipam/v1alpha1" @@ -37,7 +37,7 @@ type IPReconciler struct { client.Client Log logr.Logger Scheme *runtime.Scheme - EventRecorder record.EventRecorder + EventRecorder events.EventRecorder } // +kubebuilder:rbac:groups=*,resources=*,verbs=get;list;watch @@ -146,7 +146,7 @@ func (r *IPReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Re log.Error(err, "unable to update ip status", "name", req.NamespacedName) return ctrl.Result{}, err } - r.EventRecorder.Eventf(ip, v1.EventTypeWarning, CIPProposalFailureReason, ip.Status.Message) + r.EventRecorder.Eventf(ip, nil, v1.EventTypeWarning, CIPProposalFailureReason, "IPProposal", ip.Status.Message) } ipCidrToReserve = cidr } @@ -158,7 +158,7 @@ func (r *IPReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Re log.Error(err, "unable to update ip status", "name", req.NamespacedName) return ctrl.Result{}, err } - r.EventRecorder.Eventf(ip, v1.EventTypeWarning, CIPReservationFailureReason, ip.Status.Message) + r.EventRecorder.Eventf(ip, nil, v1.EventTypeWarning, CIPReservationFailureReason, "IPReservation", ip.Status.Message) return ctrl.Result{}, err } @@ -174,7 +174,7 @@ func (r *IPReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Re log.Error(err, "unable to update ip status after ip reservation", "name", req.NamespacedName, "subnet name", subnetNamespacedName) return ctrl.Result{}, err } - r.EventRecorder.Eventf(ip, v1.EventTypeNormal, CIPReservationSuccessReason, "IP %s reserved", ipCidrToReserve.String()) + r.EventRecorder.Eventf(ip, nil, v1.EventTypeNormal, CIPReservationSuccessReason, "IPReservation", "IP %s reserved", ipCidrToReserve.String()) return ctrl.Result{}, nil } @@ -217,14 +217,14 @@ func (r *IPReconciler) finalizeIP(ctx context.Context, log logr.Logger, ip *v1al return err } - r.EventRecorder.Eventf(ip, v1.EventTypeNormal, CIPReleaseSuccessReason, "IP %s released", ipCidr.String()) + r.EventRecorder.Eventf(ip, nil, v1.EventTypeNormal, CIPReleaseSuccessReason, "IPRelease", "IP %s released", ipCidr.String()) return nil } // SetupWithManager sets up the controller with the Manager. func (r *IPReconciler) SetupWithManager(mgr ctrl.Manager) error { - r.EventRecorder = mgr.GetEventRecorderFor("ip-controller") + r.EventRecorder = mgr.GetEventRecorder("ip-controller") return ctrl.NewControllerManagedBy(mgr). For(&v1alpha1.IP{}). Complete(r) diff --git a/internal/controller/network_controller.go b/internal/controller/network_controller.go index 19d905b..1e49198 100644 --- a/internal/controller/network_controller.go +++ b/internal/controller/network_controller.go @@ -12,7 +12,7 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" @@ -36,7 +36,7 @@ type NetworkReconciler struct { client.Client Log logr.Logger Scheme *runtime.Scheme - EventRecorder record.EventRecorder + EventRecorder events.EventRecorder } // +kubebuilder:rbac:groups=ipam.metal.ironcore.dev,resources=networkcounters,verbs=get;list;watch;create;update;patch;delete @@ -167,7 +167,7 @@ func (r *NetworkReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct log.Error(err, "unable to update network status", "name", req.NamespacedName) return ctrl.Result{}, err } - r.EventRecorder.Event(network, v1.EventTypeWarning, CNetworkIDProposalFailureReason, network.Status.Message) + r.EventRecorder.Eventf(network, nil, v1.EventTypeWarning, CNetworkIDProposalFailureReason, "NetworkIDProposal", network.Status.Message) log.Error(err, "unable to get network id", "name", req.NamespacedName) return ctrl.Result{}, err } @@ -181,7 +181,7 @@ func (r *NetworkReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct log.Error(err, "unable to update network status", "name", req.NamespacedName) return ctrl.Result{}, err } - r.EventRecorder.Event(network, v1.EventTypeWarning, CNetworkIDReservationFailureReason, network.Status.Message) + r.EventRecorder.Eventf(network, nil, v1.EventTypeWarning, CNetworkIDReservationFailureReason, "NetworkIDReservation", network.Status.Message) log.Error(err, "unable to reserve network id", "name", req.NamespacedName, "network id", network.Spec.ID) return ctrl.Result{}, err } @@ -190,7 +190,7 @@ func (r *NetworkReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct log.Error(err, "unable to update counter state", "name", req.NamespacedName, "counter name", counterNamespacedName) return ctrl.Result{}, err } - r.EventRecorder.Eventf(network, v1.EventTypeNormal, CNetworkIDReservationSuccessReason, "ID %s for type %s reserved successfully", networkIdToReserve, network.Spec.Type) + r.EventRecorder.Eventf(network, nil, v1.EventTypeNormal, CNetworkIDReservationSuccessReason, "NetworkIDReservation", "ID %s for type %s reserved successfully", networkIdToReserve, network.Spec.Type) network.Status.State = machinev1alpha1.CFinishedNetworkState network.Status.Message = "" @@ -272,7 +272,7 @@ func (r *NetworkReconciler) finalizeNetwork(ctx context.Context, log logr.Logger log.Error(err, "unexpected error while updating counter", "counter name", counterNamespacedName) return err } - r.EventRecorder.Eventf(network, v1.EventTypeNormal, CNetworkIDReleaseSuccessReason, "ID %s for type %s released successfully", network.Status.Reserved, network.Spec.Type) + r.EventRecorder.Eventf(network, nil, v1.EventTypeNormal, CNetworkIDReleaseSuccessReason, "NetworkIDRelease", "ID %s for type %s released successfully", network.Status.Reserved, network.Spec.Type) return nil } @@ -317,7 +317,7 @@ func (r *NetworkReconciler) SetupWithManager(mgr ctrl.Manager) error { return err } - r.EventRecorder = mgr.GetEventRecorderFor("network-controller") + r.EventRecorder = mgr.GetEventRecorder("network-controller") return ctrl.NewControllerManagedBy(mgr). For(&machinev1alpha1.Network{}). Complete(r) diff --git a/internal/controller/networkcounter_controller.go b/internal/controller/networkcounter_controller.go index 2257682..0758392 100644 --- a/internal/controller/networkcounter_controller.go +++ b/internal/controller/networkcounter_controller.go @@ -10,7 +10,7 @@ import ( "github.com/pkg/errors" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -30,7 +30,7 @@ type NetworkCounterReconciler struct { client.Client Log logr.Logger Scheme *runtime.Scheme - EventRecorder record.EventRecorder + EventRecorder events.EventRecorder } func (r *NetworkCounterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { @@ -102,7 +102,7 @@ func (r *NetworkCounterReconciler) SetupWithManager(mgr ctrl.Manager) error { return err } - r.EventRecorder = mgr.GetEventRecorderFor("networkcounter-controller") + r.EventRecorder = mgr.GetEventRecorder("networkcounter-controller") return ctrl.NewControllerManagedBy(mgr). For(&v1alpha1.NetworkCounter{}). Complete(r) diff --git a/internal/controller/subnet_controller.go b/internal/controller/subnet_controller.go index dd80690..362f49e 100644 --- a/internal/controller/subnet_controller.go +++ b/internal/controller/subnet_controller.go @@ -12,7 +12,7 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" @@ -45,7 +45,7 @@ type SubnetReconciler struct { client.Client Log logr.Logger Scheme *runtime.Scheme - EventRecorder record.EventRecorder + EventRecorder events.EventRecorder } // +kubebuilder:rbac:groups=ipam.metal.ironcore.dev,resources=subnets,verbs=get;list;watch;create;update;patch;delete @@ -89,7 +89,7 @@ func (r *SubnetReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr log.Error(err, "unable to update subnet resource on finalizer removal", "name", req.NamespacedName) return ctrl.Result{}, err } - r.EventRecorder.Event(subnet, v1.EventTypeNormal, CSubnetFinalizationSuccessReason, "Subnet deleted") + r.EventRecorder.Eventf(subnet, nil, v1.EventTypeNormal, CSubnetFinalizationSuccessReason, "SubnetFinalization", "Subnet deleted") } return ctrl.Result{}, nil } @@ -157,7 +157,7 @@ func (r *SubnetReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr log.Error(err, "unable to update subnet status", "name", req.NamespacedName) return ctrl.Result{}, err } - r.EventRecorder.Event(subnet, v1.EventTypeWarning, CTopSubnetReservationFailureReason, subnet.Status.Message) + r.EventRecorder.Eventf(subnet, nil, v1.EventTypeWarning, CTopSubnetReservationFailureReason, "TopSubnetReservation", subnet.Status.Message) return ctrl.Result{}, err } @@ -171,7 +171,7 @@ func (r *SubnetReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr log.Error(err, "unable to update subnet status", "name", req.NamespacedName) return ctrl.Result{}, err } - r.EventRecorder.Eventf(subnet, v1.EventTypeNormal, CTopSubnetReservationSuccessReason, "CIDR %s in network %s reserved successfully", subnet.Status.Reserved.String(), network.Name) + r.EventRecorder.Eventf(subnet, nil, v1.EventTypeNormal, CTopSubnetReservationSuccessReason, "TopSubnetReservation", "CIDR %s in network %s reserved successfully", subnet.Status.Reserved.String(), network.Name) return ctrl.Result{}, nil } @@ -199,7 +199,7 @@ func (r *SubnetReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr log.Error(err, "unable to update subnet status", "name", req.NamespacedName) return ctrl.Result{}, err } - r.EventRecorder.Event(subnet, v1.EventTypeWarning, CChildSubnetRegionScopeFailureReason, subnet.Status.Message) + r.EventRecorder.Eventf(subnet, nil, v1.EventTypeWarning, CChildSubnetRegionScopeFailureReason, "ChildSubnetRegionScope", subnet.Status.Message) return ctrl.Result{}, err } @@ -212,7 +212,7 @@ func (r *SubnetReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr log.Error(err, "unable to update subnet status", "name", req.NamespacedName) return ctrl.Result{}, err } - r.EventRecorder.Event(subnet, v1.EventTypeWarning, CChildSubnetAZScopeFailureReason, subnet.Status.Message) + r.EventRecorder.Eventf(subnet, nil, v1.EventTypeWarning, CChildSubnetAZScopeFailureReason, "ChildSubnetAZScope", subnet.Status.Message) return ctrl.Result{}, err } @@ -233,7 +233,7 @@ func (r *SubnetReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr log.Error(err, "unable to update subnet status", "name", req.NamespacedName) return ctrl.Result{}, err } - r.EventRecorder.Event(subnet, v1.EventTypeWarning, CChildSubnetCIDRProposalFailureReason, subnet.Status.Message) + r.EventRecorder.Eventf(subnet, nil, v1.EventTypeWarning, CChildSubnetCIDRProposalFailureReason, "ChildSubnetCIDRProposal", subnet.Status.Message) return ctrl.Result{}, err } @@ -247,7 +247,7 @@ func (r *SubnetReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr log.Error(err, "unable to update subnet status", "name", req.NamespacedName) return ctrl.Result{}, err } - r.EventRecorder.Event(subnet, v1.EventTypeWarning, CChildSubnetReservationFailureReason, subnet.Status.Message) + r.EventRecorder.Eventf(subnet, nil, v1.EventTypeWarning, CChildSubnetReservationFailureReason, "ChildSubnetReservation", subnet.Status.Message) return ctrl.Result{}, err } @@ -261,7 +261,7 @@ func (r *SubnetReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr log.Error(err, "unable to update parent subnet status after cidr reservation", "name", req.NamespacedName, "parent name", parentSubnetNamespacedName) return ctrl.Result{}, err } - r.EventRecorder.Eventf(subnet, v1.EventTypeNormal, CChildSubnetReservationSuccessReason, "CIDR %s in subnet %s reserved successfully", subnet.Status.Reserved.String(), parentSubnet.Name) + r.EventRecorder.Eventf(subnet, nil, v1.EventTypeNormal, CChildSubnetReservationSuccessReason, "ChildSubnetReservation", "CIDR %s in subnet %s reserved successfully", subnet.Status.Reserved.String(), parentSubnet.Name) return ctrl.Result{}, nil } @@ -310,7 +310,7 @@ func (r *SubnetReconciler) SetupWithManager(mgr ctrl.Manager) error { return err } - r.EventRecorder = mgr.GetEventRecorderFor("subnet-controller") + r.EventRecorder = mgr.GetEventRecorder("subnet-controller") return ctrl.NewControllerManagedBy(mgr). For(&v1alpha1.Subnet{}). Complete(r) @@ -360,7 +360,7 @@ func (r *SubnetReconciler) finalizeSubnet(ctx context.Context, log logr.Logger, log.Error(err, "unable to update network", "name", namespacedName, "network name", networkNamespacedName) return err } - r.EventRecorder.Eventf(subnet, v1.EventTypeNormal, CTopSubnetReleaseSuccessReason, "CIDR %s in network %s released successfully", subnet.Status.Reserved.String(), network.Name) + r.EventRecorder.Eventf(subnet, nil, v1.EventTypeNormal, CTopSubnetReleaseSuccessReason, "TopSubnetRelease", "CIDR %s in network %s released successfully", subnet.Status.Reserved.String(), network.Name) } else { parentSubnetNamespacedName := types.NamespacedName{ Namespace: subnet.Namespace, @@ -391,7 +391,7 @@ func (r *SubnetReconciler) finalizeSubnet(ctx context.Context, log logr.Logger, log.Error(err, "unable to update parent subnet status after cidr reservation", "name", namespacedName, "parent name", parentSubnetNamespacedName) return err } - r.EventRecorder.Eventf(subnet, v1.EventTypeNormal, CChildSubnetReleaseSuccessReason, "CIDR %s in subnet %s released successfully", subnet.Status.Reserved.String(), parentSubnet.Name) + r.EventRecorder.Eventf(subnet, nil, v1.EventTypeNormal, CChildSubnetReleaseSuccessReason, "ChildSubnetRelease", "CIDR %s in subnet %s released successfully", subnet.Status.Reserved.String(), parentSubnet.Name) } return nil diff --git a/internal/webhook/v1alpha1/ip_webhook.go b/internal/webhook/v1alpha1/ip_webhook.go index d24c035..0e1a1c7 100644 --- a/internal/webhook/v1alpha1/ip_webhook.go +++ b/internal/webhook/v1alpha1/ip_webhook.go @@ -11,17 +11,14 @@ import ( "sigs.k8s.io/controller-runtime/pkg/webhook/admission" - "github.com/pkg/errors" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/validation/field" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" ) // log is for logging in this package. @@ -29,39 +26,13 @@ var iplog = logf.Log.WithName("ip-resource") // SetupIPWebhookWithManager sets up and registers the webhook with the manager. func SetupIPWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr).For(&v1alpha1.IP{}). - WithValidator(&IPCustomValidator{mgr.GetClient()}). - WithDefaulter(&IPCustomDefaulter{}). + return ctrl.NewWebhookManagedBy(mgr, &v1alpha1.IP{}). + WithValidator(&IPCustomValidator{Client: mgr.GetClient()}). Complete() } // +kubebuilder:webhook:path=/mutate-ipam-metal-ironcore-dev-v1alpha1-ip,mutating=true,failurePolicy=fail,sideEffects=None,groups=ipam.metal.ironcore.dev,resources=ips,verbs=create;update,versions=v1,name=mip-v1alpha1.kb.io,admissionReviewVersions=v1 -// IPCustomDefaulter struct is responsible for setting default values on the custom resource of the -// Kind CronJob when those are created or updated. -// -// NOTE: The +kubebuilder:object:generate=false marker prevents controller-gen from generating DeepCopy methods, -// as it is used only for temporary operations and does not need to be deeply copied. -type IPCustomDefaulter struct { - // TODO(user): Add more fields as needed for defaulting -} - -var _ webhook.CustomDefaulter = &IPCustomDefaulter{} - -// Default implements webhook.CustomDefaulter so a webhook will be registered for the Kind IP -func (d *IPCustomDefaulter) Default(ctx context.Context, obj runtime.Object) error { - ip, ok := obj.(*v1alpha1.IP) - - if !ok { - return fmt.Errorf("expected an IP object but got %T", obj) - } - iplog.Info("Defaulting for IP", "name", ip.GetName()) - - // TODO(user): fill in your defaulting logic. - - return nil -} - // +kubebuilder:webhook:path=/validate-ipam-metal-ironcore-dev-v1alpha1-ip,mutating=false,failurePolicy=fail,sideEffects=None,groups=ipam.metal.ironcore.dev,resources=ips,verbs=create;update;delete,versions=v1alpha1,name=vip.kb.io,admissionReviewVersions={v1,v1beta1} // IPCustomValidator struct is responsible for validating the IP resource @@ -73,108 +44,86 @@ type IPCustomValidator struct { client.Client } -var _ webhook.CustomValidator = &IPCustomValidator{} - // ValidateCreate implements webhook.Validator so a webhook will be registered for the type -func (v *IPCustomValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (v *IPCustomValidator) ValidateCreate(ctx context.Context, obj *v1alpha1.IP) (admission.Warnings, error) { var allErrs field.ErrorList var warnings admission.Warnings - ip, ok := obj.(*v1alpha1.IP) - if !ok { - return warnings, apierrors.NewInternalError( - errors.New("cannot cast previous object version to IP CR type")) - } - iplog.Info("validate create", "name", ip.GetName()) + iplog.Info("validate create", "name", obj.GetName()) - if ip.Spec.Consumer != nil { - if _, err := schema.ParseGroupVersion(ip.Spec.Consumer.APIVersion); err != nil { + if obj.Spec.Consumer != nil { + if _, err := schema.ParseGroupVersion(obj.Spec.Consumer.APIVersion); err != nil { allErrs = append(allErrs, field.Invalid( - field.NewPath("spec.consumer.apiVersion"), ip.Spec.Consumer.APIVersion, err.Error())) + field.NewPath("spec.consumer.apiVersion"), obj.Spec.Consumer.APIVersion, err.Error())) } } - if ip.Spec.Subnet.Name == "" { + if obj.Spec.Subnet.Name == "" { allErrs = append(allErrs, field.Invalid( - field.NewPath("spec.subnet.name"), ip.Spec.IP, "Parent subnet should be defined")) + field.NewPath("spec.subnet.name"), obj.Spec.IP, "Parent subnet should be defined")) } if len(allErrs) > 0 { - return warnings, apierrors.NewInvalid(ip.GroupVersionKind().GroupKind(), ip.Name, allErrs) + return warnings, apierrors.NewInvalid(obj.GroupVersionKind().GroupKind(), obj.Name, allErrs) } return warnings, nil } // ValidateUpdate implements webhook.Validator so a webhook will be registered for the type -func (v *IPCustomValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { +func (v *IPCustomValidator) ValidateUpdate(ctx context.Context, oldObj, newObj *v1alpha1.IP) (admission.Warnings, error) { var warnings admission.Warnings - oldIP, ok := oldObj.(*v1alpha1.IP) - if !ok { - return warnings, apierrors.NewInternalError( - errors.New("cannot cast previous object version to IP CR type")) - } - newIP, ok := newObj.(*v1alpha1.IP) - if !ok { - return warnings, apierrors.NewInternalError( - errors.New("cannot cast previous object version to IP CR type")) - } - iplog.Info("validate update", "name", oldIP.GetName()) + iplog.Info("validate update", "name", oldObj.GetName()) var allErrs field.ErrorList - if oldIP.Spec.IP != nil || newIP.Spec.IP != nil { - if oldIP.Spec.IP == nil || newIP.Spec.IP == nil || - !oldIP.Spec.IP.Equal(newIP.Spec.IP) { + if oldObj.Spec.IP != nil || newObj.Spec.IP != nil { + if oldObj.Spec.IP == nil || newObj.Spec.IP == nil || + !oldObj.Spec.IP.Equal(newObj.Spec.IP) { allErrs = append(allErrs, field.Invalid( - field.NewPath("spec.ip"), newIP.Spec.IP, "IP change is disallowed")) + field.NewPath("spec.ip"), newObj.Spec.IP, "IP change is disallowed")) } } - if oldIP.Spec.Subnet.Name != newIP.Spec.Subnet.Name { + if oldObj.Spec.Subnet.Name != newObj.Spec.Subnet.Name { allErrs = append(allErrs, field.Invalid( - field.NewPath("spec.subnet.name"), newIP.Spec.Subnet.Name, "Subnet change is disallowed")) + field.NewPath("spec.subnet.name"), newObj.Spec.Subnet.Name, "Subnet change is disallowed")) } if len(allErrs) > 0 { - return warnings, apierrors.NewInvalid(newIP.GroupVersionKind().GroupKind(), newIP.Name, allErrs) + return warnings, apierrors.NewInvalid(newObj.GroupVersionKind().GroupKind(), newObj.Name, allErrs) } return warnings, nil } // ValidateDelete implements webhook.Validator so a webhook will be registered for the type -func (v *IPCustomValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (v *IPCustomValidator) ValidateDelete(ctx context.Context, obj *v1alpha1.IP) (admission.Warnings, error) { var warnings admission.Warnings - ip, ok := obj.(*v1alpha1.IP) - if !ok { - return warnings, apierrors.NewInternalError( - errors.New("cannot cast previous object version to IP CR type")) - } - iplog.Info("validate delete", "name", ip.GetName()) + iplog.Info("validate delete", "name", obj.GetName()) - if ip.Spec.Consumer == nil { + if obj.Spec.Consumer == nil { return warnings, nil } unstruct := &unstructured.Unstructured{} - gv, err := schema.ParseGroupVersion(ip.Spec.Consumer.APIVersion) + gv, err := schema.ParseGroupVersion(obj.Spec.Consumer.APIVersion) if err != nil { message := fmt.Sprintf("unable to parse APIVerson of consumer resource, therefore allowing to delete IP."+ "name: %s, api version: %s", - ip.Name, ip.Spec.Consumer.APIVersion) + obj.Name, obj.Spec.Consumer.APIVersion) iplog.Error(err, message) return append(warnings, message), nil } - gvk := gv.WithKind(ip.Spec.Consumer.Kind) + gvk := gv.WithKind(obj.Spec.Consumer.Kind) unstruct.SetGroupVersionKind(gvk) namespacedName := types.NamespacedName{ - Namespace: ip.Namespace, - Name: ip.Spec.Consumer.Name, + Namespace: obj.Namespace, + Name: obj.Spec.Consumer.Name, } err = v.Get(ctx, namespacedName, unstruct) @@ -184,11 +133,11 @@ func (v *IPCustomValidator) ValidateDelete(ctx context.Context, obj runtime.Obje deletionTimestamp, _, err := unstructured.NestedString(consumerUnstruct, "metadata", "deletionTimestamp") switch { case err != nil: - allErrs = append(allErrs, field.Invalid(field.NewPath("spec.consumer"), ip.Spec.Consumer, err.Error())) - return warnings, apierrors.NewInvalid(gvk.GroupKind(), ip.Name, allErrs) + allErrs = append(allErrs, field.Invalid(field.NewPath("spec.consumer"), obj.Spec.Consumer, err.Error())) + return warnings, apierrors.NewInvalid(gvk.GroupKind(), obj.Name, allErrs) case deletionTimestamp == "": - allErrs = append(allErrs, field.Invalid(field.NewPath("spec.consumer"), ip.Spec.Consumer, "Consumer is not deleted")) - return warnings, apierrors.NewInvalid(gvk.GroupKind(), ip.Name, allErrs) + allErrs = append(allErrs, field.Invalid(field.NewPath("spec.consumer"), obj.Spec.Consumer, "Consumer is not deleted")) + return warnings, apierrors.NewInvalid(gvk.GroupKind(), obj.Name, allErrs) } } diff --git a/internal/webhook/v1alpha1/network_webhook.go b/internal/webhook/v1alpha1/network_webhook.go index 4694818..7b79464 100644 --- a/internal/webhook/v1alpha1/network_webhook.go +++ b/internal/webhook/v1alpha1/network_webhook.go @@ -14,48 +14,23 @@ import ( "github.com/pkg/errors" apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/validation/field" ctrl "sigs.k8s.io/controller-runtime" logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" ) // log is for logging in this package. var networklog = logf.Log.WithName("network-resource") func SetupNetworkWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr).For(&v1alpha1.Network{}). + return ctrl.NewWebhookManagedBy(mgr, &v1alpha1.Network{}). WithValidator(&NetworkCustomValidator{}). - WithDefaulter(&NetworkCustomDefaulter{}). Complete() } // +kubebuilder:webhook:path=/mutate-ipam-metal-ironcore-dev-v1alpha1-network,mutating=true,failurePolicy=fail,sideEffects=None,groups=ipam.metal.ironcore.dev,resources=networks,verbs=create;update,versions=v1,name=mnetwork-v1alpha1.kb.io,admissionReviewVersions=v1 -// NetworkCustomDefaulter struct is responsible for setting default values on the custom resource of the -// Kind Network when those are created or updated. -// -// NOTE: The +kubebuilder:object:generate=false marker prevents controller-gen from generating DeepCopy methods, -// as it is used only for temporary operations and does not need to be deeply copied. -type NetworkCustomDefaulter struct { -} - -var _ webhook.CustomDefaulter = &NetworkCustomDefaulter{} - -// Default implements webhook.CustomDefaulter so a webhook will be registered for the Kind Network -func (d *NetworkCustomDefaulter) Default(ctx context.Context, obj runtime.Object) error { - net, ok := obj.(*v1alpha1.Network) - - if !ok { - return fmt.Errorf("expected an Network object but got %T", obj) - } - networklog.Info("Defaulting for Network", "name", net.GetName()) - - return nil -} - // +kubebuilder:webhook:path=/validate-ipam-metal-ironcore-dev-v1alpha1-network,mutating=false,failurePolicy=fail,sideEffects=None,groups=ipam.metal.ironcore.dev,resources=networks,verbs=create;update;delete,versions=v1alpha1,name=vnetwork.kb.io,admissionReviewVersions={v1,v1beta1} // NetworkCustomValidator struct is responsible for validating the IP resource @@ -66,105 +41,83 @@ func (d *NetworkCustomDefaulter) Default(ctx context.Context, obj runtime.Object type NetworkCustomValidator struct { } -var _ webhook.CustomValidator = &IPCustomValidator{} - // ValidateCreate implements webhook.Validator so a webhook will be registered for the type -func (v *NetworkCustomValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (v *NetworkCustomValidator) ValidateCreate(ctx context.Context, obj *v1alpha1.Network) (admission.Warnings, error) { var allErrs field.ErrorList var warnings admission.Warnings - net, ok := obj.(*v1alpha1.Network) - if !ok { - return warnings, apierrors.NewInternalError( - errors.New("cannot cast previous object version to Network CR type")) - } - networklog.Info("validate create", "name", net.GetName()) + networklog.Info("validate create", "name", obj.GetName()) - if net.Spec.Type == "" && net.Spec.ID != nil { + if obj.Spec.Type == "" && obj.Spec.ID != nil { allErrs = append(allErrs, field.Invalid( - field.NewPath("spec.id"), net.Spec.ID, "setting network ID without type is disallowed")) + field.NewPath("spec.id"), obj.Spec.ID, "setting network ID without type is disallowed")) } - if err := validateID(net); err != nil { + if err := validateID(obj); err != nil { allErrs = append(allErrs, err) } if len(allErrs) > 0 { - gvk := net.GroupVersionKind() + gvk := obj.GroupVersionKind() gk := schema.GroupKind{ Group: gvk.Group, Kind: gvk.Kind, } - return warnings, apierrors.NewInvalid(gk, net.Name, allErrs) + return warnings, apierrors.NewInvalid(gk, obj.Name, allErrs) } return warnings, nil } // ValidateUpdate implements webhook.Validator so a webhook will be registered for the type -func (v *NetworkCustomValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { +func (v *NetworkCustomValidator) ValidateUpdate(ctx context.Context, oldObj, newObj *v1alpha1.Network) (admission.Warnings, error) { var warnings admission.Warnings var allErrs field.ErrorList - oldNetwork, ok := oldObj.(*v1alpha1.Network) - if !ok { - return warnings, apierrors.NewInternalError( - errors.New("cannot cast previous object version to Network CR type")) - } - newNetwork, ok := newObj.(*v1alpha1.Network) - if !ok { - return warnings, apierrors.NewInternalError( - errors.New("cannot cast previous object version to Network CR type")) - } - networklog.Info("validate update", "name", oldNetwork.GetName()) + networklog.Info("validate update", "name", oldObj.GetName()) - if oldNetwork.Spec.Type != "" && - oldNetwork.Spec.Type != newNetwork.Spec.Type { + if oldObj.Spec.Type != "" && + oldObj.Spec.Type != newObj.Spec.Type { allErrs = append(allErrs, field.Invalid( - field.NewPath("spec.type"), newNetwork.Spec.Type, "network type change is disallowed; resource should be released (deleted) first")) + field.NewPath("spec.type"), newObj.Spec.Type, "network type change is disallowed; resource should be released (deleted) first")) } - if (oldNetwork.Spec.ID != nil && oldNetwork.Spec.ID.Cmp(&newNetwork.Spec.ID.Int) != 0) || - (oldNetwork.Spec.ID == nil && oldNetwork.Spec.Type != "" && newNetwork.Spec.ID != nil) { + if (oldObj.Spec.ID != nil && oldObj.Spec.ID.Cmp(&newObj.Spec.ID.Int) != 0) || + (oldObj.Spec.ID == nil && oldObj.Spec.Type != "" && newObj.Spec.ID != nil) { allErrs = append(allErrs, field.Invalid( - field.NewPath("spec.id"), newNetwork.Spec.ID, + field.NewPath("spec.id"), newObj.Spec.ID, "network ID change after assignment is disallowed; resource should be released (deleted) first")) } - if err := validateID(newNetwork); err != nil { + if err := validateID(newObj); err != nil { allErrs = append(allErrs, err) } if len(allErrs) > 0 { - gvk := newNetwork.GroupVersionKind() + gvk := newObj.GroupVersionKind() gk := schema.GroupKind{ Group: gvk.Group, Kind: gvk.Kind, } - return warnings, apierrors.NewInvalid(gk, newNetwork.Name, allErrs) + return warnings, apierrors.NewInvalid(gk, newObj.Name, allErrs) } return warnings, nil } // ValidateDelete implements webhook.Validator so a webhook will be registered for the type -func (v *NetworkCustomValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (v *NetworkCustomValidator) ValidateDelete(ctx context.Context, obj *v1alpha1.Network) (admission.Warnings, error) { var allErrs field.ErrorList var warnings admission.Warnings - network, ok := obj.(*v1alpha1.Network) - if !ok { - return warnings, apierrors.NewInternalError( - errors.New("cannot cast previous object version to Network CR type")) - } - networklog.Info("validate delete", "name", network.Name) + networklog.Info("validate delete", "name", obj.Name) - if len(network.Status.IPv4Ranges) > 0 { + if len(obj.Status.IPv4Ranges) > 0 { allErrs = append(allErrs, field.InternalError( field.NewPath("metadata.name"), errors.New("Network has active IPv4 subnets"))) } - if len(network.Status.IPv6Ranges) > 0 { + if len(obj.Status.IPv6Ranges) > 0 { allErrs = append(allErrs, field.InternalError( field.NewPath("metadata.name"), errors.New("Network has active IPv6 subnets"))) } @@ -174,7 +127,7 @@ func (v *NetworkCustomValidator) ValidateDelete(ctx context.Context, obj runtime schema.GroupKind{ Group: v1alpha1.SchemeGroupVersion.Group, Kind: "Network", - }, network.Name, allErrs) + }, obj.Name, allErrs) } return warnings, nil diff --git a/internal/webhook/v1alpha1/networkcounter_webhook.go b/internal/webhook/v1alpha1/networkcounter_webhook.go index d1f1eb3..14216cf 100644 --- a/internal/webhook/v1alpha1/networkcounter_webhook.go +++ b/internal/webhook/v1alpha1/networkcounter_webhook.go @@ -5,17 +5,14 @@ package v1alpha1 import ( "context" - "fmt" "github.com/ironcore-dev/ipam/api/ipam/v1alpha1" "github.com/pkg/errors" apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/validation/field" ctrl "sigs.k8s.io/controller-runtime" logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" ) @@ -23,37 +20,13 @@ import ( var networkcounterlog = logf.Log.WithName("networkcounter-resource") func SetupNetworkCounterWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr).For(&v1alpha1.NetworkCounter{}). + return ctrl.NewWebhookManagedBy(mgr, &v1alpha1.NetworkCounter{}). WithValidator(&NetworkCounterCustomValidator{}). - WithDefaulter(&NetworkCounterCustomDefaulter{}). Complete() } // +kubebuilder:webhook:path=/mutate-ipam-metal-ironcore-dev-v1alpha1-networkcounter,mutating=true,failurePolicy=fail,sideEffects=None,groups=ipam.metal.ironcore.dev,resources=networkcounters,verbs=create;update,versions=v1,name=mnetworkcounter-v1alpha1.kb.io,admissionReviewVersions=v1 -// NetworkCounterCustomDefaulter struct is responsible for setting default values on the custom resource of the -// Kind NetworkCounter when those are created or updated. -// -// NOTE: The +kubebuilder:object:generate=false marker prevents controller-gen from generating DeepCopy methods, -// as it is used only for temporary operations and does not need to be deeply copied. -type NetworkCounterCustomDefaulter struct { - // TODO(user): Add more fields as needed for defaulting -} - -var _ webhook.CustomDefaulter = &NetworkCounterCustomDefaulter{} - -// Default implements webhook.CustomDefaulter so a webhook will be registered for the Kind NetworkCounter -func (d *NetworkCounterCustomDefaulter) Default(ctx context.Context, obj runtime.Object) error { - networkCounter, ok := obj.(*v1alpha1.NetworkCounter) - - if !ok { - return fmt.Errorf("expected an NetworkCounter object but got %T", obj) - } - networklog.Info("Defaulting for NetworkCounter", "name", networkCounter.GetName()) - - return nil -} - // +kubebuilder:webhook:path=/validate-ipam-metal-ironcore-dev-v1alpha1-networkcounter,mutating=false,failurePolicy=fail,sideEffects=None,groups=ipam.metal.ironcore.dev,resources=networkcounters,verbs=create;update;delete,versions=v1alpha1,name=vnetworkcounter.kb.io,admissionReviewVersions={v1,v1beta1} // NetworkCounterCustomValidator struct is responsible for validating the NetworkCounter resource @@ -64,48 +37,27 @@ func (d *NetworkCounterCustomDefaulter) Default(ctx context.Context, obj runtime type NetworkCounterCustomValidator struct { } -var _ webhook.CustomValidator = &NetworkCounterCustomValidator{} - // ValidateCreate implements webhook.Validator so a webhook will be registered for the type -func (v *NetworkCounterCustomValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { - var warnings admission.Warnings - - nc, ok := obj.(*v1alpha1.NetworkCounter) - if !ok { - return warnings, apierrors.NewInternalError( - errors.New("cannot cast previous object version to NetworkCounter CR type")) - } - networkcounterlog.Info("validate create", "name", nc.GetName()) +func (v *NetworkCounterCustomValidator) ValidateCreate(ctx context.Context, obj *v1alpha1.NetworkCounter) (admission.Warnings, error) { + networkcounterlog.Info("validate create", "name", obj.GetName()) return nil, nil } // ValidateUpdate implements webhook.Validator so a webhook will be registered for the type -func (v *NetworkCounterCustomValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { - var warnings admission.Warnings - - nc, ok := oldObj.(*v1alpha1.NetworkCounter) - if !ok { - return warnings, apierrors.NewInternalError( - errors.New("cannot cast previous object version to NetworkCounter CR type")) - } - networkcounterlog.Info("validate update", "name", nc.GetName()) +func (v *NetworkCounterCustomValidator) ValidateUpdate(ctx context.Context, oldObj, newObj *v1alpha1.NetworkCounter) (admission.Warnings, error) { + networkcounterlog.Info("validate update", "name", oldObj.GetName()) return nil, nil } // ValidateDelete implements webhook.Validator so a webhook will be registered for the type -func (v *NetworkCounterCustomValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (v *NetworkCounterCustomValidator) ValidateDelete(ctx context.Context, obj *v1alpha1.NetworkCounter) (admission.Warnings, error) { var allErrs field.ErrorList var warnings admission.Warnings - nc, ok := obj.(*v1alpha1.NetworkCounter) - if !ok { - return warnings, apierrors.NewInternalError( - errors.New("cannot cast previous object version to NetworkCounter CR type")) - } - networkcounterlog.Info("validate delete", "name", nc.GetName()) + networkcounterlog.Info("validate delete", "name", obj.GetName()) - if len(nc.Spec.Vacant) == 0 { + if len(obj.Spec.Vacant) == 0 { allErrs = append(allErrs, field.InternalError( field.NewPath("metadata.name"), errors.New("Network Counter is still in use by networks"))) @@ -113,11 +65,11 @@ func (v *NetworkCounterCustomValidator) ValidateDelete(ctx context.Context, obj schema.GroupKind{ Group: v1alpha1.SchemeGroupVersion.Group, Kind: "NetworkCounter", - }, nc.Name, allErrs) + }, obj.Name, allErrs) } - begin := nc.Spec.Vacant[0].Begin - end := nc.Spec.Vacant[0].End + begin := obj.Spec.Vacant[0].Begin + end := obj.Spec.Vacant[0].End if end == nil && begin.Eq(v1alpha1.MPLSFirstAvailableID) { return warnings, nil @@ -132,5 +84,5 @@ func (v *NetworkCounterCustomValidator) ValidateDelete(ctx context.Context, obj schema.GroupKind{ Group: v1alpha1.SchemeGroupVersion.Group, Kind: "NetworkCounter", - }, nc.Name, allErrs) + }, obj.Name, allErrs) } diff --git a/internal/webhook/v1alpha1/subnet_webhook.go b/internal/webhook/v1alpha1/subnet_webhook.go index fe10c18..0b1ede7 100644 --- a/internal/webhook/v1alpha1/subnet_webhook.go +++ b/internal/webhook/v1alpha1/subnet_webhook.go @@ -17,14 +17,12 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/validation/field" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" ) const ( @@ -75,39 +73,13 @@ func SetupSubnetWebhookWithManager(mgr ctrl.Manager) error { return err } - return ctrl.NewWebhookManagedBy(mgr).For(&v1alpha1.Subnet{}). + return ctrl.NewWebhookManagedBy(mgr, &v1alpha1.Subnet{}). WithValidator(&SubnetCustomValidator{mgr.GetClient()}). - WithDefaulter(&SubnetCustomDefaulter{}). Complete() } // +kubebuilder:webhook:path=/mutate-ipam-metal-ironcore-dev-v1alpha1-subnet,mutating=true,failurePolicy=fail,sideEffects=None,groups=ipam.metal.ironcore.dev,resources=subnets,verbs=create;update,versions=v1,name=msubnet-v1alpha1.kb.io,admissionReviewVersions=v1 -// SubnetCustomDefaulter struct is responsible for setting default values on the custom resource of the -// Kind Subnet when those are created or updated. -// -// NOTE: The +kubebuilder:object:generate=false marker prevents controller-gen from generating DeepCopy methods, -// as it is used only for temporary operations and does not need to be deeply copied. -type SubnetCustomDefaulter struct { - // TODO(user): Add more fields as needed for defaulting -} - -var _ webhook.CustomDefaulter = &SubnetCustomDefaulter{} - -// Default implements webhook.CustomDefaulter so a webhook will be registered for the Kind Subnet -func (d *SubnetCustomDefaulter) Default(ctx context.Context, obj runtime.Object) error { - subnet, ok := obj.(*v1alpha1.Subnet) - - if !ok { - return fmt.Errorf("expected an Subnet object but got %T", obj) - } - iplog.Info("Defaulting for Subnet", "name", subnet.GetName()) - - // TODO(user): fill in your defaulting logic. - - return nil -} - // +kubebuilder:webhook:path=/validate-ipam-metal-ironcore-dev-v1alpha1-subnet,mutating=false,failurePolicy=fail,sideEffects=None,groups=ipam.metal.ironcore.dev,resources=subnets,verbs=create;update;delete,versions=v1alpha1,name=vsubnet.kb.io,admissionReviewVersions={v1,v1beta1} // SubnetCustomValidator struct is responsible for validating the Subnet resource @@ -119,21 +91,14 @@ type SubnetCustomValidator struct { client.Client } -var _ webhook.CustomValidator = &SubnetCustomValidator{} - // ValidateCreate implements webhook.Validator so a webhook will be registered for the type -func (v *SubnetCustomValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (v *SubnetCustomValidator) ValidateCreate(ctx context.Context, obj *v1alpha1.Subnet) (admission.Warnings, error) { var allErrs field.ErrorList var warnings admission.Warnings - subnet, ok := obj.(*v1alpha1.Subnet) - if !ok { - return warnings, apierrors.NewInternalError( - errors.New("cannot cast previous object version to Subnet CR type")) - } - subnetlog.Info("validate create", "name", subnet.GetName()) + subnetlog.Info("validate create", "name", obj.GetName()) - rulesCount := countCIDRReservationRules(subnet) + rulesCount := countCIDRReservationRules(obj) rulesPaths := []string{"spec.cidr", "spec.capacity", "spec.hostIdentifierBits"} minQuantity := resource.NewQuantity(1, resource.DecimalSI) maxQuantity, err := resource.ParseQuantity("340282366920938463463374607431768211456") @@ -144,99 +109,88 @@ func (v *SubnetCustomValidator) ValidateCreate(ctx context.Context, obj runtime. if rulesCount == 0 || rulesCount > 1 { errMsg := fmt.Sprintf("value should be set for the one of the following fields: %s", strings.Join(rulesPaths, ", ")) for _, path := range rulesPaths { - allErrs = append(allErrs, field.Invalid(field.NewPath(path), subnet.Spec.CIDR, errMsg)) + allErrs = append(allErrs, field.Invalid(field.NewPath(path), obj.Spec.CIDR, errMsg)) } } - if subnet.Spec.Consumer != nil { - if _, err := schema.ParseGroupVersion(subnet.Spec.Consumer.APIVersion); err != nil { - allErrs = append(allErrs, field.Invalid(field.NewPath("spec.consumer.apiVersion"), subnet.Spec.Consumer, err.Error())) + if obj.Spec.Consumer != nil { + if _, err := schema.ParseGroupVersion(obj.Spec.Consumer.APIVersion); err != nil { + allErrs = append(allErrs, field.Invalid(field.NewPath("spec.consumer.apiVersion"), obj.Spec.Consumer, err.Error())) } } - if subnet.Spec.ParentSubnet.Name == "" && - subnet.Spec.CIDR == nil { - allErrs = append(allErrs, field.Invalid(field.NewPath("spec.cidr"), subnet.Spec.CIDR, "cidr should be set explicitly if a top level subnet (without parent subnet) is created")) + if obj.Spec.ParentSubnet.Name == "" && + obj.Spec.CIDR == nil { + allErrs = append(allErrs, field.Invalid(field.NewPath("spec.cidr"), obj.Spec.CIDR, "cidr should be set explicitly if a top level subnet (without parent subnet) is created")) } - if subnet.Spec.Capacity != nil && maxQuantity.Cmp(*subnet.Spec.Capacity) < 0 && - minQuantity.Cmp(*subnet.Spec.Capacity) > 0 { - allErrs = append(allErrs, field.Invalid(field.NewPath("spec.capacity"), subnet.Spec.CIDR, "if set, capacity value should be between 1 and 2^128")) + if obj.Spec.Capacity != nil && maxQuantity.Cmp(*obj.Spec.Capacity) < 0 && + minQuantity.Cmp(*obj.Spec.Capacity) > 0 { + allErrs = append(allErrs, field.Invalid(field.NewPath("spec.capacity"), obj.Spec.CIDR, "if set, capacity value should be between 1 and 2^128")) } - if !uniqueRegionSet(subnet) { - allErrs = append(allErrs, field.Invalid(field.NewPath("spec.regions"), subnet.Spec.Regions, "region values should be unique")) + if !uniqueRegionSet(obj) { + allErrs = append(allErrs, field.Invalid(field.NewPath("spec.regions"), obj.Spec.Regions, "region values should be unique")) } - for i, region := range subnet.Spec.Regions { + for i, region := range obj.Spec.Regions { if !uniqueAZSet(region.AvailabilityZones) { allErrs = append(allErrs, field.Invalid(field.NewPath(fmt.Sprintf("spec.regions[%d].availabilityZones", i)), region.AvailabilityZones, "availability zone values should be unique")) } } if len(allErrs) > 0 { - gvk := subnet.GroupVersionKind() + gvk := obj.GroupVersionKind() gk := schema.GroupKind{ Group: gvk.Group, Kind: gvk.Kind, } - return warnings, apierrors.NewInvalid(gk, subnet.Name, allErrs) + return warnings, apierrors.NewInvalid(gk, obj.Name, allErrs) } return warnings, nil } // ValidateUpdate implements webhook.Validator so a webhook will be registered for the type -func (v *SubnetCustomValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { +func (v *SubnetCustomValidator) ValidateUpdate(ctx context.Context, oldObj, newObj *v1alpha1.Subnet) (admission.Warnings, error) { var warnings admission.Warnings var allErrs field.ErrorList - oldSubnet, ok := oldObj.(*v1alpha1.Subnet) - if !ok { - return warnings, apierrors.NewInternalError( - errors.New("cannot cast previous object version to Subnet CR type")) - } - newSubnet, ok := newObj.(*v1alpha1.Subnet) - if !ok { - return warnings, apierrors.NewInternalError( - errors.New("cannot cast previous object version to Subnet CR type")) - } - - subnetlog.Info("validate update", "name", oldSubnet.Name) + subnetlog.Info("validate update", "name", oldObj.Name) - if oldSubnet.Spec.CIDR != nil || newSubnet.Spec.CIDR != nil { - if oldSubnet.Spec.CIDR == nil || newSubnet.Spec.CIDR == nil || - !oldSubnet.Spec.CIDR.Equal(newSubnet.Spec.CIDR) { + if oldObj.Spec.CIDR != nil || newObj.Spec.CIDR != nil { + if oldObj.Spec.CIDR == nil || newObj.Spec.CIDR == nil || + !oldObj.Spec.CIDR.Equal(newObj.Spec.CIDR) { allErrs = append(allErrs, field.Invalid( - field.NewPath("spec.cidr"), newSubnet.Spec.CIDR, "CIDR change is disallowed")) + field.NewPath("spec.cidr"), newObj.Spec.CIDR, "CIDR change is disallowed")) } } - if oldSubnet.Spec.PrefixBits != nil || newSubnet.Spec.PrefixBits != nil { - if oldSubnet.Spec.PrefixBits == nil || newSubnet.Spec.PrefixBits == nil || - *oldSubnet.Spec.PrefixBits != *newSubnet.Spec.PrefixBits { - allErrs = append(allErrs, field.Invalid(field.NewPath("spec.hostIdentifierBits"), newSubnet.Spec.PrefixBits, "Host identifier bits change is disallowed")) + if oldObj.Spec.PrefixBits != nil || newObj.Spec.PrefixBits != nil { + if oldObj.Spec.PrefixBits == nil || newObj.Spec.PrefixBits == nil || + *oldObj.Spec.PrefixBits != *newObj.Spec.PrefixBits { + allErrs = append(allErrs, field.Invalid(field.NewPath("spec.hostIdentifierBits"), newObj.Spec.PrefixBits, "Host identifier bits change is disallowed")) } } - if oldSubnet.Spec.Capacity != nil || newSubnet.Spec.Capacity != nil { - if oldSubnet.Spec.Capacity == nil || newSubnet.Spec.Capacity == nil || - !oldSubnet.Spec.Capacity.Equal(*newSubnet.Spec.Capacity) { - allErrs = append(allErrs, field.Invalid(field.NewPath("spec.capacity"), newSubnet.Spec.Capacity, "Capacity change is disallowed")) + if oldObj.Spec.Capacity != nil || newObj.Spec.Capacity != nil { + if oldObj.Spec.Capacity == nil || newObj.Spec.Capacity == nil || + !oldObj.Spec.Capacity.Equal(*newObj.Spec.Capacity) { + allErrs = append(allErrs, field.Invalid(field.NewPath("spec.capacity"), newObj.Spec.Capacity, "Capacity change is disallowed")) } } - if oldSubnet.Spec.ParentSubnet.Name != newSubnet.Spec.ParentSubnet.Name { - allErrs = append(allErrs, field.Invalid(field.NewPath("spec.parentSubnet.name"), newSubnet.Spec.CIDR, "Parent Subnet change is disallowed")) + if oldObj.Spec.ParentSubnet.Name != newObj.Spec.ParentSubnet.Name { + allErrs = append(allErrs, field.Invalid(field.NewPath("spec.parentSubnet.name"), newObj.Spec.CIDR, "Parent Subnet change is disallowed")) } - if oldSubnet.Spec.Network.Name != newSubnet.Spec.Network.Name { - allErrs = append(allErrs, field.Invalid(field.NewPath("spec.network.name"), newSubnet.Spec.CIDR, "Network change is disallowed")) + if oldObj.Spec.Network.Name != newObj.Spec.Network.Name { + allErrs = append(allErrs, field.Invalid(field.NewPath("spec.network.name"), newObj.Spec.CIDR, "Network change is disallowed")) } - if !reflect.DeepEqual(oldSubnet.Spec.Regions, newSubnet.Spec.Regions) { - allErrs = append(allErrs, field.Invalid(field.NewPath("spec.regions"), newSubnet.Spec.CIDR, "Regions change is disallowed")) + if !reflect.DeepEqual(oldObj.Spec.Regions, newObj.Spec.Regions) { + allErrs = append(allErrs, field.Invalid(field.NewPath("spec.regions"), newObj.Spec.CIDR, "Regions change is disallowed")) } if len(allErrs) > 0 { @@ -244,42 +198,36 @@ func (v *SubnetCustomValidator) ValidateUpdate(ctx context.Context, oldObj, newO schema.GroupKind{ Group: v1alpha1.SchemeGroupVersion.Group, Kind: "Subnet", - }, newSubnet.Name, allErrs) + }, newObj.Name, allErrs) } return warnings, nil } // ValidateDelete implements webhook.Validator so a webhook will be registered for the type -func (v *SubnetCustomValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (v *SubnetCustomValidator) ValidateDelete(ctx context.Context, obj *v1alpha1.Subnet) (admission.Warnings, error) { var allErrs field.ErrorList var warnings admission.Warnings - subnet, ok := obj.(*v1alpha1.Subnet) - if !ok { - return warnings, apierrors.NewInternalError( - errors.New("cannot cast previous object version to Subnet CR type")) - } - - subnetlog.Info("validate delete", "name", subnet.Name) + subnetlog.Info("validate delete", "name", obj.Name) - if subnet.Spec.Consumer != nil { + if obj.Spec.Consumer != nil { unstruct := &unstructured.Unstructured{} - gv, err := schema.ParseGroupVersion(subnet.Spec.Consumer.APIVersion) + gv, err := schema.ParseGroupVersion(obj.Spec.Consumer.APIVersion) if err != nil { message := fmt.Sprintf( "unable to parse APIVersion of consumer resource, therefore allowing to delete Subnet."+ - " name: %s, api version: %s", subnet.Name, subnet.Spec.Consumer.APIVersion) + " name: %s, api version: %s", obj.Name, obj.Spec.Consumer.APIVersion) subnetlog.Error( err, message) return append(warnings, message), nil } - gvk := gv.WithKind(subnet.Spec.Consumer.Kind) + gvk := gv.WithKind(obj.Spec.Consumer.Kind) unstruct.SetGroupVersionKind(gvk) namespacedName := types.NamespacedName{ - Namespace: subnet.Namespace, - Name: subnet.Spec.Consumer.Name, + Namespace: obj.Namespace, + Name: obj.Spec.Consumer.Name, } ctx := context.Background() @@ -289,22 +237,22 @@ func (v *SubnetCustomValidator) ValidateDelete(ctx context.Context, obj runtime. deletionTimestamp, _, err := unstructured.NestedString(consumerUnstruct, "metadata", "deletionTimestamp") switch { case err != nil: - allErrs = append(allErrs, field.Invalid(field.NewPath("spec.consumer"), subnet.Spec.Consumer, err.Error())) + allErrs = append(allErrs, field.Invalid(field.NewPath("spec.consumer"), obj.Spec.Consumer, err.Error())) case deletionTimestamp == "": - allErrs = append(allErrs, field.Invalid(field.NewPath("spec.consumer"), subnet.Spec.Consumer, "Consumer is not deleted")) + allErrs = append(allErrs, field.Invalid(field.NewPath("spec.consumer"), obj.Spec.Consumer, "Consumer is not deleted")) } } } childSubnetsMatchingFields := client.MatchingFields{ - FinishedChildSubnetToSubnetIndexKey: subnet.Name, + FinishedChildSubnetToSubnetIndexKey: obj.Name, } subnets := &v1alpha1.SubnetList{} - if err := v.List(context.Background(), subnets, client.InNamespace(subnet.Namespace), childSubnetsMatchingFields, client.Limit(1)); err != nil { + if err := v.List(context.Background(), subnets, client.InNamespace(obj.Namespace), childSubnetsMatchingFields, client.Limit(1)); err != nil { wrappedErr := errors.Wrap(err, "unable to get connected child subnets") subnetlog.Error(wrappedErr, - "", "name", types.NamespacedName{Namespace: subnet.Namespace, Name: subnet.Name}) + "", "name", types.NamespacedName{Namespace: obj.Namespace, Name: obj.Name}) return append(warnings, wrappedErr.Error()), wrappedErr } @@ -315,13 +263,13 @@ func (v *SubnetCustomValidator) ValidateDelete(ctx context.Context, obj runtime. } childIPsMatchingFields := client.MatchingFields{ - FinishedChildIPToSubnetIndexKey: subnet.Name, + FinishedChildIPToSubnetIndexKey: obj.Name, } ips := &v1alpha1.IPList{} - if err := v.List(context.Background(), ips, client.InNamespace(subnet.Namespace), childIPsMatchingFields, client.Limit(1)); err != nil { + if err := v.List(context.Background(), ips, client.InNamespace(obj.Namespace), childIPsMatchingFields, client.Limit(1)); err != nil { wrappedErr := errors.Wrap(err, "unable to get connected child ips") - subnetlog.Error(wrappedErr, "", "name", types.NamespacedName{Namespace: subnet.Namespace, Name: subnet.Name}) + subnetlog.Error(wrappedErr, "", "name", types.NamespacedName{Namespace: obj.Namespace, Name: obj.Name}) return append(warnings, wrappedErr.Error()), wrappedErr } @@ -334,7 +282,7 @@ func (v *SubnetCustomValidator) ValidateDelete(ctx context.Context, obj runtime. schema.GroupKind{ Group: v1alpha1.SchemeGroupVersion.Group, Kind: "Subnet", - }, subnet.Name, allErrs) + }, obj.Name, allErrs) } return warnings, nil