diff --git a/api/go.mod b/api/go.mod index 556f32815..77f934fff 100644 --- a/api/go.mod +++ b/api/go.mod @@ -5,28 +5,27 @@ go 1.26.0 require ( github.com/fluxcd/pkg/apis/kustomize v1.20.0 github.com/fluxcd/pkg/apis/meta v1.31.0 - k8s.io/apiextensions-apiserver v0.36.2 - k8s.io/apimachinery v0.36.2 + k8s.io/apiextensions-apiserver v0.37.0 + k8s.io/apimachinery v0.37.0 sigs.k8s.io/yaml v1.6.0 ) require ( - github.com/fxamacker/cbor/v2 v2.9.0 // indirect + github.com/fxamacker/cbor/v2 v2.9.1 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/kr/text v0.2.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/onsi/gomega v1.39.0 // indirect github.com/x448/float16 v0.8.4 // indirect - go.yaml.in/yaml/v2 v2.4.3 // indirect - golang.org/x/net v0.55.0 // indirect - golang.org/x/text v0.37.0 // indirect + go.yaml.in/yaml/v2 v2.4.4 // indirect + golang.org/x/net v0.57.0 // indirect + golang.org/x/text v0.40.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect k8s.io/klog/v2 v2.140.0 // indirect - k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a // indirect - k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 // indirect + k8s.io/kube-openapi v0.0.0-20260721132016-d427ff9ee9ad // indirect + k8s.io/utils v0.0.0-20260626114624-be93311217bd // indirect sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect sigs.k8s.io/randfill v1.0.0 // indirect - sigs.k8s.io/structured-merge-diff/v6 v6.3.2 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.4.2 // indirect ) diff --git a/api/go.sum b/api/go.sum index f3f50ff9f..2f0616049 100644 --- a/api/go.sum +++ b/api/go.sum @@ -1,4 +1,3 @@ -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 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= @@ -7,8 +6,8 @@ github.com/fluxcd/pkg/apis/kustomize v1.20.0 h1:Aur2337TwSYGUffDQVlawOR3SJfRvxH7 github.com/fluxcd/pkg/apis/kustomize v1.20.0/go.mod h1:9FUs77fd/Rh5/mDgZbGBUCL0UqmXiGj8rYywG3T3x+s= github.com/fluxcd/pkg/apis/meta v1.31.0 h1:5niQvTirK0wTE0TfRjnUSdmu6GTSbAFzrdnovtZ9rJ8= github.com/fluxcd/pkg/apis/meta v1.31.0/go.mod h1:Gx+YRq26a+mTbCjotSXC7/6kSSyo0zXQ8JnsEXf2vVk= -github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= -github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/fxamacker/cbor/v2 v2.9.1 h1:2rWm8B193Ll4VdjsJY28jxs70IdDsHRWgQYAI80+rMQ= +github.com/fxamacker/cbor/v2 v2.9.1/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= @@ -16,10 +15,6 @@ 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/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -31,46 +26,41 @@ github.com/onsi/gomega v1.39.0/go.mod h1:ZCU1pkQcXDO5Sl9/VVEGlDyp+zm0m1cmeG5TOzL github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= -github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= -github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY= -github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= -go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= -go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= +go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= +go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= -golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= -golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= -golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= -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= +golang.org/x/net v0.57.0 h1:K5+3DljvIuDG9/Jv9rvyMywYNFCQ9RSUY6OOTTkT+tE= +golang.org/x/net v0.57.0/go.mod h1:KpXc8iv+r3XplLAG/f7Jsf9RPszJzdR0f58q9vGOuEU= +golang.org/x/text v0.40.0 h1:Ub2Z6/xjgF1WrYQz2nuITOEegKFtiIy+rieRJ5lHZKs= +golang.org/x/text v0.40.0/go.mod h1:hpnzDAfGV753zIKo+wk3u1bVKCGPbrnF7+7LBF/UHVY= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/apiextensions-apiserver v0.36.2 h1:3O5gqOj/dt2XWWbpMe+TXWpE9yU6pjM/tXxtHHJT/K4= -k8s.io/apiextensions-apiserver v0.36.2/go.mod h1:cL1tBWe8XSaP1H30iWKGo7hf6iAUUUJPEU70dskmAnA= -k8s.io/apimachinery v0.36.2 h1:0PE/W/WNy1UX61NLbXY5TMbJ6UwLL6E6lAPkYrKFxbQ= -k8s.io/apimachinery v0.36.2/go.mod h1:fvf/HOLXq9RId0rnDIbN1OEBvHXdQbLMM8nu0LcBUf4= +k8s.io/apiextensions-apiserver v0.37.0 h1:zRMQ3+/LIE5oZ0tVvXwYHC+dIkSP5cjNWju7AZU1LOI= +k8s.io/apiextensions-apiserver v0.37.0/go.mod h1:HU0PfSBwchHL5iDau6jjt9zU6ryWkDDlaVUiq91NK80= +k8s.io/apimachinery v0.37.0 h1:Np2AbDtf8x6RDHiD8T9LbKJ9gaegeVNa8yNm5FuGKm0= +k8s.io/apimachinery v0.37.0/go.mod h1:RN3nhprFSCxOi5Selxd7oMTXOe/c+ZbcE7Im+TS2zkE= k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc= k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0= -k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a h1:xCeOEAOoGYl2jnJoHkC3hkbPJgdATINPMAxaynU2Ovg= -k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0= -k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 h1:AZYQSJemyQB5eRxqcPky+/7EdBj0xi3g0ZcxxJ7vbWU= -k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= +k8s.io/kube-openapi v0.0.0-20260721132016-d427ff9ee9ad h1:oXImqH8mQNk7PmvzKhmN3ddJoY6OnyM225MXwGHPm0A= +k8s.io/kube-openapi v0.0.0-20260721132016-d427ff9ee9ad/go.mod h1:0/mqHCVhlumdJ3BhCfnjSZQE037nAhNodh1/hK0T8/I= +k8s.io/utils v0.0.0-20260626114624-be93311217bd h1:Ea7fgQ5we8Y9T0OX5o0dAHzQOBRI07D/dEYRaB9ZZEs= +k8s.io/utils v0.0.0-20260626114624-be93311217bd/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/structured-merge-diff/v6 v6.3.2 h1:kwVWMx5yS1CrnFWA/2QHyRVJ8jM6dBA80uLmm0wJkk8= -sigs.k8s.io/structured-merge-diff/v6 v6.3.2/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= +sigs.k8s.io/structured-merge-diff/v6 v6.4.2 h1:qdOxHwrl2Kaag1aQEarlYcOA9vSyGCp3CIki3aW8c4Q= +sigs.k8s.io/structured-merge-diff/v6 v6.4.2/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/go.mod b/go.mod index 52cae0b87..c2ab67bb2 100644 --- a/go.mod +++ b/go.mod @@ -29,8 +29,8 @@ require ( github.com/fluxcd/pkg/ssa v0.77.0 github.com/fluxcd/pkg/testserver v0.14.0 github.com/fluxcd/source-controller/api v1.9.0 - github.com/go-logr/logr v1.4.3 - github.com/google/cel-go v0.26.1 + github.com/go-logr/logr v1.4.4 + github.com/google/cel-go v0.29.2 github.com/google/go-cmp v0.7.0 github.com/hashicorp/go-retryablehttp v0.7.8 github.com/mitchellh/copystructure v1.2.0 @@ -40,16 +40,16 @@ require ( github.com/spf13/pflag v1.0.10 github.com/wI2L/jsondiff v0.7.1 go.uber.org/zap v1.28.0 - golang.org/x/text v0.38.0 + golang.org/x/text v0.41.0 helm.sh/helm/v4 v4.2.2 - k8s.io/api v0.36.2 - k8s.io/apiextensions-apiserver v0.36.2 - k8s.io/apimachinery v0.36.2 - k8s.io/cli-runtime v0.36.2 - k8s.io/client-go v0.36.2 - k8s.io/kubectl v0.36.2 - k8s.io/utils v0.0.0-20260507154919-ff6756f316d2 - sigs.k8s.io/controller-runtime v0.24.1 + k8s.io/api v0.37.0 + k8s.io/apiextensions-apiserver v0.37.0 + k8s.io/apimachinery v0.37.0 + k8s.io/cli-runtime v0.37.0 + k8s.io/client-go v0.37.0 + k8s.io/kubectl v0.37.0 + k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3 + sigs.k8s.io/controller-runtime v0.25.0 sigs.k8s.io/kustomize/api v0.21.1 sigs.k8s.io/kustomize/kyaml v0.21.1 sigs.k8s.io/yaml v1.6.0 @@ -110,32 +110,32 @@ require ( github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect github.com/extism/go-sdk v1.7.1 // indirect github.com/fatih/color v1.19.0 // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.9.0 // indirect - github.com/fxamacker/cbor/v2 v2.9.2 // indirect + github.com/felixge/httpsnoop v1.1.0 // indirect + github.com/fsnotify/fsnotify v1.10.1 // indirect + github.com/fxamacker/cbor/v2 v2.9.3 // indirect github.com/go-errors/errors v1.5.1 // indirect github.com/go-gorp/gorp/v3 v3.1.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-logr/zapr v1.3.0 // indirect - github.com/go-openapi/jsonpointer v0.22.0 // indirect - github.com/go-openapi/jsonreference v0.21.1 // indirect - github.com/go-openapi/swag v0.25.4 // indirect - github.com/go-openapi/swag/cmdutils v0.25.4 // indirect - github.com/go-openapi/swag/conv v0.25.4 // indirect - github.com/go-openapi/swag/fileutils v0.25.4 // indirect - github.com/go-openapi/swag/jsonname v0.25.4 // indirect - github.com/go-openapi/swag/jsonutils v0.25.4 // indirect - github.com/go-openapi/swag/loading v0.25.4 // indirect - github.com/go-openapi/swag/mangling v0.25.4 // indirect - github.com/go-openapi/swag/netutils v0.25.4 // indirect - github.com/go-openapi/swag/stringutils v0.25.4 // indirect - github.com/go-openapi/swag/typeutils v0.25.4 // indirect - github.com/go-openapi/swag/yamlutils v0.25.4 // indirect + github.com/go-openapi/jsonpointer v1.0.0 // indirect + github.com/go-openapi/jsonreference v1.0.1 // indirect + github.com/go-openapi/swag v0.29.1 // indirect + github.com/go-openapi/swag/cmdutils v0.29.1 // indirect + github.com/go-openapi/swag/conv v0.29.1 // indirect + github.com/go-openapi/swag/fileutils v0.29.1 // indirect + github.com/go-openapi/swag/jsonutils v0.29.1 // indirect + github.com/go-openapi/swag/loading v0.29.1 // indirect + github.com/go-openapi/swag/mangling v0.29.1 // indirect + github.com/go-openapi/swag/netutils v0.29.1 // indirect + github.com/go-openapi/swag/pools v0.29.1 // indirect + github.com/go-openapi/swag/stringutils v0.29.1 // indirect + github.com/go-openapi/swag/typeutils v0.29.1 // indirect + github.com/go-openapi/swag/yamlutils v0.29.1 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/gofrs/flock v0.13.0 // indirect github.com/golang-jwt/jwt/v5 v5.3.1 // indirect github.com/google/btree v1.1.3 // indirect - github.com/google/gnostic-models v0.7.0 // indirect + github.com/google/gnostic-models v0.7.1 // indirect github.com/google/go-containerregistry v0.21.5 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect @@ -170,10 +170,10 @@ require ( github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.23.2 // indirect - github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.67.5 // indirect - github.com/prometheus/procfs v0.20.1 // indirect + github.com/prometheus/client_golang v1.24.1 // indirect + github.com/prometheus/client_model v0.6.3 // indirect + github.com/prometheus/common v0.71.0 // indirect + github.com/prometheus/procfs v0.22.0 // indirect github.com/rubenv/sql-migrate v1.8.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect @@ -181,8 +181,7 @@ require ( github.com/sirupsen/logrus v1.9.4 // indirect github.com/spf13/cast v1.7.0 // indirect github.com/spf13/cobra v1.10.2 // indirect - github.com/stoewer/go-strcase v1.3.0 // indirect - github.com/stretchr/testify v1.11.1 // indirect + github.com/stretchr/testify v1.12.1 // indirect github.com/tetratelabs/wabin v0.0.0-20230304001439-f6f874872834 // indirect github.com/tetratelabs/wazero v1.12.0 // indirect github.com/tidwall/gjson v1.18.0 // indirect @@ -193,37 +192,36 @@ require ( github.com/xlab/treeprint v1.2.0 // indirect github.com/zeebo/blake3 v0.2.3 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 // indirect - go.opentelemetry.io/otel v1.43.0 // indirect - go.opentelemetry.io/otel/metric v1.43.0 // indirect - go.opentelemetry.io/otel/trace v1.43.0 // indirect - go.opentelemetry.io/proto/otlp v1.10.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.71.0 // indirect + go.opentelemetry.io/otel v1.46.0 // indirect + go.opentelemetry.io/otel/metric v1.46.0 // indirect + go.opentelemetry.io/otel/trace v1.46.0 // indirect + go.opentelemetry.io/proto/otlp v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect - go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/crypto v0.53.0 // indirect - golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 // indirect - golang.org/x/net v0.56.0 // indirect + go.yaml.in/yaml/v3 v3.0.5 // indirect + golang.org/x/crypto v0.55.0 // indirect + golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f // indirect + golang.org/x/net v0.58.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect - golang.org/x/sync v0.21.0 // indirect - golang.org/x/sys v0.46.0 // indirect - golang.org/x/term v0.44.0 // indirect + golang.org/x/sync v0.22.0 // indirect + golang.org/x/sys v0.47.0 // indirect + golang.org/x/term v0.45.0 // indirect golang.org/x/time v0.15.0 // indirect gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect google.golang.org/api v0.278.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260427160629-7cedc36a6bc4 // indirect - google.golang.org/grpc v1.80.0 // indirect - google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260720211330-0afa2a65878a // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260720211330-0afa2a65878a // indirect + google.golang.org/grpc v1.82.1 // indirect + google.golang.org/protobuf v1.36.12 // indirect gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiserver v0.36.2 // indirect - k8s.io/component-base v0.36.2 // indirect + k8s.io/apiserver v0.37.0 // indirect + k8s.io/component-base v0.37.0 // indirect k8s.io/klog/v2 v2.140.0 // indirect - k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25 // indirect + k8s.io/kube-openapi v0.0.0-20260821135717-be32def86098 // indirect oras.land/oras-go/v2 v2.6.1 // 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.4.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.4.2 // indirect ) diff --git a/go.sum b/go.sum index 4a418c281..6031cc47c 100644 --- a/go.sum +++ b/go.sum @@ -144,14 +144,12 @@ github.com/extism/go-sdk v1.7.1 h1:lWJos6uY+tRFdlIHR+SJjwFDApY7OypS/2nMhiVQ9Sw= github.com/extism/go-sdk v1.7.1/go.mod h1:IT+Xdg5AZM9hVtpFUA+uZCJMge/hbvshl8bwzLtFyKA= github.com/fatih/color v1.19.0 h1:Zp3PiM21/9Ld6FzSKyL5c/BULoe/ONr9KlbYVOfG8+w= github.com/fatih/color v1.19.0/go.mod h1:zNk67I0ZUT1bEGsSGyCZYZNrHuTkJJB+r6Q9VuMi0LE= -github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.1.0 h1:3YtUj32ZZkqZtt3sZZsClsymw/QDuVfpNhoA31zeORc= +github.com/felixge/httpsnoop v1.1.0/go.mod h1:Zqxgdd+1Rkcz8euOqdr7lqgCRJztwr5hp9vDSi5UZCE= github.com/fluxcd/cli-utils v1.2.2 h1:adDOmwE+LSwTzmYUaoEFPblruOuaQEKAg1ZNTmPJObE= github.com/fluxcd/cli-utils v1.2.2/go.mod h1:FsghNGY+3Sr70c0FOB7I5So0kzoYVdvQ8GTid3XXVWM= github.com/fluxcd/pkg/apis/acl v0.10.0 h1:KPfAmELNvtvaz8wixnm/MYXqa+MJf7ntVVMUU93Aenk= github.com/fluxcd/pkg/apis/acl v0.10.0/go.mod h1:a87i2A7AlFO5N2J8CxtzaUCCDmuLLWOHwkKu3eJF5fY= -github.com/fluxcd/pkg/apis/event v0.28.0 h1:08XVnuhPff/UowZ7hsxOnEoBGC/+F6r2kcvTtqpbWQc= -github.com/fluxcd/pkg/apis/event v0.28.0/go.mod h1:ThqUZxG48o5PDN9Qh0tVTdpb+6PlVa6J2beEeMZoKMk= github.com/fluxcd/pkg/apis/kustomize v1.20.0 h1:Aur2337TwSYGUffDQVlawOR3SJfRvxH7ikEKD6cJSxs= github.com/fluxcd/pkg/apis/kustomize v1.20.0/go.mod h1:9FUs77fd/Rh5/mDgZbGBUCL0UqmXiGj8rYywG3T3x+s= github.com/fluxcd/pkg/apis/meta v1.31.0 h1:5niQvTirK0wTE0TfRjnUSdmu6GTSbAFzrdnovtZ9rJ8= @@ -162,8 +160,6 @@ github.com/fluxcd/pkg/cache v0.14.0 h1:wEwJA8NhYj+nH9P6ifcsglDZARWlcbxbmwngGOzfU github.com/fluxcd/pkg/cache v0.14.0/go.mod h1:KwzU2gyVQ83YOHJsbBeveJ0HsXmLrH0I668zX19d/+s= github.com/fluxcd/pkg/chartutil v1.28.0 h1:a26RGirtMFH9dsLd1Kg7WiESF52WDUCx7EcbHCyIDbk= github.com/fluxcd/pkg/chartutil v1.28.0/go.mod h1:BjFiOw9CMGB8DlWdgG5thEV40nglABlYAhKykaNfzCc= -github.com/fluxcd/pkg/runtime v0.112.0 h1:FnE+98Fg2LJYRBxMYGOIuE4C7nwtLMCXxFFJpMizdsA= -github.com/fluxcd/pkg/runtime v0.112.0/go.mod h1:YUljTAXVaeWG+GLnXNZopFFMZstUoTxJs7+vl91OV58= github.com/fluxcd/pkg/ssa v0.77.0 h1:HaDg7XDQGfVTFY379GrnnhrON1CQLjrLmyGbbTw5Ohc= github.com/fluxcd/pkg/ssa v0.77.0/go.mod h1:bNImnO/GHtjjgp7BtGXVk181CoZbH9rEVEJfOwg1Xo8= github.com/fluxcd/pkg/testserver v0.14.0 h1:wVv/JPY3i4OEJ8xakfriuN2oHiUyZZ+BfhC/6RCD2nI= @@ -174,10 +170,10 @@ github.com/foxcpp/go-mockdns v1.2.0 h1:omK3OrHRD1IWJz1FuFBCFquhXslXoF17OvBS6JPzZ github.com/foxcpp/go-mockdns v1.2.0/go.mod h1:IhLeSFGed3mJIAXPH2aiRQB+kqz7oqu8ld2qVbOu7Wk= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= -github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/fxamacker/cbor/v2 v2.9.2 h1:X4Ksno9+x3cz0TZv69ec1hxP/+tymuR8PXQJyDwfh78= -github.com/fxamacker/cbor/v2 v2.9.2/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/fsnotify/fsnotify v1.10.1 h1:b0/UzAf9yR5rhf3RPm9gf3ehBPpf0oZKIjtpKrx59Ho= +github.com/fsnotify/fsnotify v1.10.1/go.mod h1:TLheqan6HD6GBK6PrDWyDPBaEV8LspOxvPSjC+bVfgo= +github.com/fxamacker/cbor/v2 v2.9.3 h1:oQBnFATpNdY8gJHTndDDv5Xl4QqNaz51G5LLEPhng3Q= +github.com/fxamacker/cbor/v2 v2.9.3/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/go-errors/errors v1.5.1 h1:ZwEMSLRCapFLflTpT7NKaAc7ukJ8ZPEjzlxt8rPN8bk= github.com/go-errors/errors v1.5.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gorp/gorp/v3 v3.1.0 h1:ItKF/Vbuj31dmV4jxA1qblpSwkl9g1typ24xoe70IGs= @@ -185,46 +181,46 @@ github.com/go-gorp/gorp/v3 v3.1.0/go.mod h1:dLEjIyyRNiXvNZ8PSmzpt1GsWAUK8kjVhEpj github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= -github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.4 h1:tG4xh9yMsRCAiodLVTxyrkzSZ9+o0L1Kg/+cPVcbP/8= +github.com/go-logr/logr v1.4.4/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= -github.com/go-openapi/jsonpointer v0.22.0 h1:TmMhghgNef9YXxTu1tOopo+0BGEytxA+okbry0HjZsM= -github.com/go-openapi/jsonpointer v0.22.0/go.mod h1:xt3jV88UtExdIkkL7NloURjRQjbeUgcxFblMjq2iaiU= -github.com/go-openapi/jsonreference v0.21.1 h1:bSKrcl8819zKiOgxkbVNRUBIr6Wwj9KYrDbMjRs0cDA= -github.com/go-openapi/jsonreference v0.21.1/go.mod h1:PWs8rO4xxTUqKGu+lEvvCxD5k2X7QYkKAepJyCmSTT8= -github.com/go-openapi/swag v0.25.4 h1:OyUPUFYDPDBMkqyxOTkqDYFnrhuhi9NR6QVUvIochMU= -github.com/go-openapi/swag v0.25.4/go.mod h1:zNfJ9WZABGHCFg2RnY0S4IOkAcVTzJ6z2Bi+Q4i6qFQ= -github.com/go-openapi/swag/cmdutils v0.25.4 h1:8rYhB5n6WawR192/BfUu2iVlxqVR9aRgGJP6WaBoW+4= -github.com/go-openapi/swag/cmdutils v0.25.4/go.mod h1:pdae/AFo6WxLl5L0rq87eRzVPm/XRHM3MoYgRMvG4A0= -github.com/go-openapi/swag/conv v0.25.4 h1:/Dd7p0LZXczgUcC/Ikm1+YqVzkEeCc9LnOWjfkpkfe4= -github.com/go-openapi/swag/conv v0.25.4/go.mod h1:3LXfie/lwoAv0NHoEuY1hjoFAYkvlqI/Bn5EQDD3PPU= -github.com/go-openapi/swag/fileutils v0.25.4 h1:2oI0XNW5y6UWZTC7vAxC8hmsK/tOkWXHJQH4lKjqw+Y= -github.com/go-openapi/swag/fileutils v0.25.4/go.mod h1:cdOT/PKbwcysVQ9Tpr0q20lQKH7MGhOEb6EwmHOirUk= -github.com/go-openapi/swag/jsonname v0.25.4 h1:bZH0+MsS03MbnwBXYhuTttMOqk+5KcQ9869Vye1bNHI= -github.com/go-openapi/swag/jsonname v0.25.4/go.mod h1:GPVEk9CWVhNvWhZgrnvRA6utbAltopbKwDu8mXNUMag= -github.com/go-openapi/swag/jsonutils v0.25.4 h1:VSchfbGhD4UTf4vCdR2F4TLBdLwHyUDTd1/q4i+jGZA= -github.com/go-openapi/swag/jsonutils v0.25.4/go.mod h1:7OYGXpvVFPn4PpaSdPHJBtF0iGnbEaTk8AvBkoWnaAY= -github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.4 h1:IACsSvBhiNJwlDix7wq39SS2Fh7lUOCJRmx/4SN4sVo= -github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.4/go.mod h1:Mt0Ost9l3cUzVv4OEZG+WSeoHwjWLnarzMePNDAOBiM= -github.com/go-openapi/swag/loading v0.25.4 h1:jN4MvLj0X6yhCDduRsxDDw1aHe+ZWoLjW+9ZQWIKn2s= -github.com/go-openapi/swag/loading v0.25.4/go.mod h1:rpUM1ZiyEP9+mNLIQUdMiD7dCETXvkkC30z53i+ftTE= -github.com/go-openapi/swag/mangling v0.25.4 h1:2b9kBJk9JvPgxr36V23FxJLdwBrpijI26Bx5JH4Hp48= -github.com/go-openapi/swag/mangling v0.25.4/go.mod h1:6dxwu6QyORHpIIApsdZgb6wBk/DPU15MdyYj/ikn0Hg= -github.com/go-openapi/swag/netutils v0.25.4 h1:Gqe6K71bGRb3ZQLusdI8p/y1KLgV4M/k+/HzVSqT8H0= -github.com/go-openapi/swag/netutils v0.25.4/go.mod h1:m2W8dtdaoX7oj9rEttLyTeEFFEBvnAx9qHd5nJEBzYg= -github.com/go-openapi/swag/stringutils v0.25.4 h1:O6dU1Rd8bej4HPA3/CLPciNBBDwZj9HiEpdVsb8B5A8= -github.com/go-openapi/swag/stringutils v0.25.4/go.mod h1:GTsRvhJW5xM5gkgiFe0fV3PUlFm0dr8vki6/VSRaZK0= -github.com/go-openapi/swag/typeutils v0.25.4 h1:1/fbZOUN472NTc39zpa+YGHn3jzHWhv42wAJSN91wRw= -github.com/go-openapi/swag/typeutils v0.25.4/go.mod h1:Ou7g//Wx8tTLS9vG0UmzfCsjZjKhpjxayRKTHXf2pTE= -github.com/go-openapi/swag/yamlutils v0.25.4 h1:6jdaeSItEUb7ioS9lFoCZ65Cne1/RZtPBZ9A56h92Sw= -github.com/go-openapi/swag/yamlutils v0.25.4/go.mod h1:MNzq1ulQu+yd8Kl7wPOut/YHAAU/H6hL91fF+E2RFwc= -github.com/go-openapi/testify/enable/yaml/v2 v2.0.2 h1:0+Y41Pz1NkbTHz8NngxTuAXxEodtNSI1WG1c/m5Akw4= -github.com/go-openapi/testify/enable/yaml/v2 v2.0.2/go.mod h1:kme83333GCtJQHXQ8UKX3IBZu6z8T5Dvy5+CW3NLUUg= -github.com/go-openapi/testify/v2 v2.0.2 h1:X999g3jeLcoY8qctY/c/Z8iBHTbwLz7R2WXd6Ub6wls= -github.com/go-openapi/testify/v2 v2.0.2/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54= +github.com/go-openapi/jsonpointer v1.0.0 h1:kR9tHqY0CtZaOPVFm622dPVNhrvYpwr4uCxgL3h1H8s= +github.com/go-openapi/jsonpointer v1.0.0/go.mod h1:Z3rw7dWu1p9IgitXCFamSlA5lmDiklEB6vkaxcNZW5Y= +github.com/go-openapi/jsonreference v1.0.1 h1:4zJ7AmYDKNmD3aSpfPnFNCFA5E80/xMHUNKgydaLh38= +github.com/go-openapi/jsonreference v1.0.1/go.mod h1:dYplQXa6p5lXprLcJ8LE2iU7vNpXsAHDQ5ZAgL+Qx3A= +github.com/go-openapi/swag v0.29.1 h1:C6EeWzUwQtcWEhE9eqBdUubGXxhWY4PlzHMLD7kLaiQ= +github.com/go-openapi/swag v0.29.1/go.mod h1:BzxEXKiPlSXRsRTv1KSBF/BpGKHxA/YciCnr4tv9bvA= +github.com/go-openapi/swag/cmdutils v0.29.1 h1:3DorPGfUdE80BogKY22EzoHBcHMrkVomZMoV7kS4ANY= +github.com/go-openapi/swag/cmdutils v0.29.1/go.mod h1:Sm1MVFMkF6guJJ+pQqHnQA3N0j9qALV3NxzDSv6bETM= +github.com/go-openapi/swag/conv v0.29.1 h1:AC4Eh/5c/eUDOUCzzsRC9ghmFgOSBHeRMGIngY0ZUGA= +github.com/go-openapi/swag/conv v0.29.1/go.mod h1:S1X7/ZrBEZOC0Wc8AGxjbcGS92l3WEjA7aPtpl+RaqM= +github.com/go-openapi/swag/fileutils v0.29.1 h1:ZcPzMceVhU1WPbK6N1G6sNQKdd1CWJlf3cA08UHuoM0= +github.com/go-openapi/swag/fileutils v0.29.1/go.mod h1:/wofKYckbtRl2p3+EwQsosie5CT1B38+dQ+PS579BzI= +github.com/go-openapi/swag/jsonutils v0.29.1 h1:AFCxs0eQZ24/QyfhVHM2t49rMz7Vv3XCsZQI6yrNy+c= +github.com/go-openapi/swag/jsonutils v0.29.1/go.mod h1:u3+sCfJpttDpcmS5kpm0yxL6GK0eWgODsx8Yw8fcqNM= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.29.1 h1:BiiXE31Bx9SfpsMmOQj5KYpUhTZBpLVriVhJDuLuY2o= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.29.1/go.mod h1:julgTUKZ9/D0j6O7GKajmRs+812FWxQg/mMpGunWSjg= +github.com/go-openapi/swag/loading v0.29.1 h1:FCv5fG8UhTdDJa2R7w+5O9Ekpcbw7tt0nFWvmDKGBjc= +github.com/go-openapi/swag/loading v0.29.1/go.mod h1:N0ESuem4p2oedKal8EJhciqnJ9Q9Wmt83L1CRB3Fouw= +github.com/go-openapi/swag/mangling v0.29.1 h1:lHALtvYCdxVnRl4GrHmFPwfBTZYIObqdGNSKyu/8D6I= +github.com/go-openapi/swag/mangling v0.29.1/go.mod h1:SAop9pB7PUjQ/CGCNf/JmCKTRK+GDO+RqE9UHqC/N6s= +github.com/go-openapi/swag/netutils v0.29.1 h1:IjIvdEP5duKcghFqJEPSUraRnkKYHoM65kTluTu+Jb4= +github.com/go-openapi/swag/netutils v0.29.1/go.mod h1:DUde7x4Bx00k5jYl2AdRpNAO0m7atUvD2x6X+bWkbno= +github.com/go-openapi/swag/pools v0.29.1 h1:NRogYxdEW9SjRM4mkAOji9iefO4MRXq3p/ZJcoQbUKg= +github.com/go-openapi/swag/pools v0.29.1/go.mod h1:leDcaghjkRAhCuCRv9NfJU5f0mjoU3cT/XZObhMk3pc= +github.com/go-openapi/swag/stringutils v0.29.1 h1:1ykunK7iJQk1uOO7+oUH1ukbsK85fFCOiCFMOVSY+F0= +github.com/go-openapi/swag/stringutils v0.29.1/go.mod h1:7fSqZ+z8Qc0tOfAAK0jVa5qFGrnIlRi6n7NeGGrr1vc= +github.com/go-openapi/swag/typeutils v0.29.1 h1:Nzv9nhnlLCRBPQqfOX+7lB6Guju370or8StT+lIOf6M= +github.com/go-openapi/swag/typeutils v0.29.1/go.mod h1:hxpgDZJVBkBsi/d3MIUosafoFdE5exaQRmVp0zwu3YE= +github.com/go-openapi/swag/yamlutils v0.29.1 h1:69w3tsBajm7MR/fejLy7HD/3J68Ys1SeeZMEzZ3w2sk= +github.com/go-openapi/swag/yamlutils v0.29.1/go.mod h1:rgsp3vT/QdWzKwn43CigDwjOGIenPyTZMKnxEM8jZOA= +github.com/go-openapi/testify/enable/yaml/v2 v2.6.1 h1:Jm+/ze2rMtbD98yen92AhATGLGREDYXG56Xr4gMjEtE= +github.com/go-openapi/testify/enable/yaml/v2 v2.6.1/go.mod h1:YDPnwCRDu38/oJBVMBVXOUDiJ9cIeBHWvfImHaXqnv4= +github.com/go-openapi/testify/v2 v2.6.1 h1:6CNJhTjMzgaeaH8WhshcsZNPIvRemiOcFpU7seO/y7Q= +github.com/go-openapi/testify/v2 v2.6.1/go.mod h1:SgsVHtfooshd0tublTtJ50FPKhujf47YRqauXXOUxfw= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= @@ -239,10 +235,10 @@ github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/cel-go v0.26.1 h1:iPbVVEdkhTX++hpe3lzSk7D3G3QSYqLGoHOcEio+UXQ= -github.com/google/cel-go v0.26.1/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM= -github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= -github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= +github.com/google/cel-go v0.29.2 h1:ZtDxkeiMmz0mxbKDYiNkE5Lk7V5edMRcaaDf2jX002k= +github.com/google/cel-go v0.29.2/go.mod h1:X0bD6iVNR8pkROSOoHVdgTkzmRcosof7WQqCD6wcMc8= +github.com/google/gnostic-models v0.7.1 h1:SisTfuFKJSKM5CPZkffwi6coztzzeYUhc3v4yxLWH8c= +github.com/google/gnostic-models v0.7.1/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/go-containerregistry v0.21.5 h1:KTJG9Pn/jC0VdZR6ctV3/jcN+q6/Iqlx0sTVz3ywZlM= @@ -250,8 +246,8 @@ github.com/google/go-containerregistry v0.21.5/go.mod h1:ySvMuiWg+dOsRW0Hw8GYwfM 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-20260115054156-294ebfa9ad83 h1:z2ogiKUYzX5Is6zr/vP9vJGqPwcdqsWjOt+V8J7+bTc= -github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI= +github.com/google/pprof v0.0.0-20260402051712-545e8a4df936 h1:EwtI+Al+DeppwYX2oXJCETMO23COyaKGP6fHVpkpWpg= +github.com/google/pprof v0.0.0-20260402051712-545e8a4df936/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI= github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -266,8 +262,8 @@ github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 h1:5VipnvEpbqr2gA2VbM+nYVbkIF28c5ZQfqCBQ5g2xfk= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0/go.mod h1:Hyl3n6Twe1hvtd9XUXDec4pTvgMSEixRuQKPTMH2bNs= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= @@ -290,8 +286,8 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/keybase/go-keychain v0.0.1 h1:way+bWYa6lDppZoZcgMbYsvC7GxljxrskdNInRtuthU= github.com/keybase/go-keychain v0.0.1/go.mod h1:PdEILRW3i9D8JcdM+FmY6RwkHGnhHxXwkPPMeUgOK1k= -github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE= -github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= +github.com/klauspost/compress v1.19.1 h1:VsB4HPswih7mmZ8WleSFQ75c/Ui1M4trX5oAsJnhSlk= +github.com/klauspost/compress v1.19.1/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= @@ -340,8 +336,8 @@ github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/ github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/onsi/ginkgo/v2 v2.28.1 h1:S4hj+HbZp40fNKuLUQOYLDgZLwNUVn19N3Atb98NCyI= -github.com/onsi/ginkgo/v2 v2.28.1/go.mod h1:CLtbVInNckU3/+gC8LzkGUb9oF+e8W8TdUsxPwvdOgE= +github.com/onsi/ginkgo/v2 v2.32.0 h1:Hw7s2pVrQo/8Yz5N77qdnpHaoc+c6cC9WIV1Jce+J6E= +github.com/onsi/ginkgo/v2 v2.32.0/go.mod h1:+aXOY+vzZ5mu2iI2HpTZUPmM//oQfsNFX6gU9kNcA44= github.com/onsi/gomega v1.42.1 h1:iN1rCUX+44NZ1Dc97MPoeFYbFR0vh8zxoxMFwKdyZ6I= github.com/onsi/gomega v1.42.1/go.mod h1:REff/hsDsodHoKlWsP2mAPhu1+5/6hVYNf9rIEBpeSg= github.com/opencontainers/go-digest v1.0.1-0.20231025023718-d50d2fec9c98 h1:H55sU3giNgBkIvmAo0vI/AAFwVTwfWsf6MN3+9H6U8o= @@ -361,16 +357,16 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/poy/onpar v1.1.2 h1:QaNrNiZx0+Nar5dLgTVp5mXkyoVFIbepjyEoGSnhbAY= github.com/poy/onpar v1.1.2/go.mod h1:6X8FLNoxyr9kkmnlqpK6LSoiOtrO6MICtWwEuWkLjzg= -github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= -github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= -github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= -github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= -github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= +github.com/prometheus/client_golang v1.24.1 h1:JnJkREXzWxUdCuPFpIWZiPispT9xVV59uiuyR2bPlnU= +github.com/prometheus/client_golang v1.24.1/go.mod h1:F+oSRECHg4sse5ucfYpYDeIv/hu68Zo0uoHKetWnzcE= +github.com/prometheus/client_model v0.6.3 h1:O0jaTVAYNxTHYInEPFJt5I3+sN8zqBtVMPTB1qyxiEo= +github.com/prometheus/client_model v0.6.3/go.mod h1:gpN5P9S7Rr6Yr92PiQ+Ixvhf6JZEkF1dnxsYL2aPBEM= +github.com/prometheus/common v0.71.0 h1:9KDAKb7Mj3HEVKyFCK6Dc/HIwlBzZIN2l7/lrHl3KK8= +github.com/prometheus/common v0.71.0/go.mod h1:CLJ5H8TEsGX8bl31BdMkfhIZ+QmZ9tBPPotUxUbfcmk= github.com/prometheus/otlptranslator v1.0.0 h1:s0LJW/iN9dkIH+EnhiD3BlkkP5QVIUVEoIwkU+A6qos= github.com/prometheus/otlptranslator v1.0.0/go.mod h1:vRYWnXvI6aWGpsdY/mOT/cbeVRBlPWtBNDb7kGR3uKM= -github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc= -github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo= +github.com/prometheus/procfs v0.22.0 h1:6q9+/JL9IKAPbCmBrv9n5O5Ty3NKnciV5X7YGw0oics= +github.com/prometheus/procfs v0.22.0/go.mod h1:CvmFr/GVhIjIvWJZW3tgkODBQMRIf0EyWMQLHCHab58= github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5 h1:EaDatTxkdHG+U3Bk4EUr+DZ7fOGwTfezUiUJMaIcaho= github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5/go.mod h1:fyalQWdtzDBECAQFBJuQe5bzQ02jGd5Qcbgb97Flm7U= github.com/redis/go-redis/extra/redisotel/v9 v9.0.5 h1:EfpWLLCyXw8PSM2/XNJLjI3Pb27yVE+gIAfeqp8LUCc= @@ -398,22 +394,15 @@ github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiT github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs= -github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -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/objx v0.5.3 h1:jmXUvGomnU1o3W/V5h2VEradbpJDwGrzugQQvL0POH4= +github.com/stretchr/objx v0.5.3/go.mod h1:rDQraq+vQZU7Fde9LOZLr8Tax6zZvy4kuNKF+QYS+U0= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 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.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= -github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/stretchr/testify v1.12.1 h1:EuwCh5fleGS7H32xRwO3wRGT7DxrDhLAT6FF8MpWDWE= +github.com/stretchr/testify v1.12.1/go.mod h1:MDEgiDPPsNp5cuIrHPPCyornHKgEVbtFUmoNlxoYthg= github.com/tetratelabs/wabin v0.0.0-20230304001439-f6f874872834 h1:ZF+QBjOI+tILZjBaFj3HgFonKXUcwgJ4djLb6i42S3Q= github.com/tetratelabs/wabin v0.0.0-20230304001439-f6f874872834/go.mod h1:m9ymHTgNSEjuxvw8E7WWe4Pl4hZQHXONY8wE6dMLaRk= github.com/tetratelabs/wazero v1.12.0 h1:DuWcpNu/FzgEXgGBDp8J1Spc+CWOvvtvVyjKlaZopYU= @@ -446,10 +435,10 @@ go.opentelemetry.io/contrib/bridges/prometheus v0.67.0 h1:dkBzNEAIKADEaFnuESzcXv go.opentelemetry.io/contrib/bridges/prometheus v0.67.0/go.mod h1:Z5RIwRkZgauOIfnG5IpidvLpERjhTninpP1dTG2jTl4= go.opentelemetry.io/contrib/exporters/autoexport v0.67.0 h1:4fnRcNpc6YFtG3zsFw9achKn3XgmxPxuMuqIL5rE8e8= go.opentelemetry.io/contrib/exporters/autoexport v0.67.0/go.mod h1:qTvIHMFKoxW7HXg02gm6/Wofhq5p3Ib/A/NNt1EoBSQ= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 h1:OyrsyzuttWTSur2qN/Lm0m2a8yqyIjUVBZcxFPuXq2o= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0/go.mod h1:C2NGBr+kAB4bk3xtMXfZ94gqFDtg/GkI7e9zqGh5Beg= -go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= -go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.71.0 h1:3g7B90UzBltIDKq1/5mrTGxTnOFDV0ICOhLoxiZ8jlg= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.71.0/go.mod h1:Ef8SuTh59BT7+ofpDxN9z+yOlc4t2GjLmKDgYNJL/NU= +go.opentelemetry.io/otel v1.46.0 h1:FHt5/CDyVxi/8IM1CH7VE/rRgq3kLHa2mSTVMO8AWyc= +go.opentelemetry.io/otel v1.46.0/go.mod h1:Gj3SEScelsNC45tp4nSxRYlS+f5iez7W8XPMCt905kE= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.18.0 h1:deI9UQMoGFgrg5iLPgzueqFPHevDl+28YKfSpPTI6rY= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.18.0/go.mod h1:PFx9NgpNUKXdf7J4Q3agRxMs3Y07QhTCVipKmLsMKnU= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.19.0 h1:HIBTQ3VO5aupLKjC90JgMqpezVXwFuq6Ryjn0/izoag= @@ -458,10 +447,10 @@ go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.42.0 h1:MdK go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.42.0/go.mod h1:RolT8tWtfHcjajEH5wFIZ4Dgh5jpPdFXYV9pTAk/qjc= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.43.0 h1:w1K+pCJoPpQifuVpsKamUdn9U0zM3xUziVOqsGksUrY= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.43.0/go.mod h1:HBy4BjzgVE8139ieRI75oXm3EcDN+6GhD88JT1Kjvxg= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 h1:88Y4s2C8oTui1LGM6bTWkw0ICGcOLCAI5l6zsD1j20k= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0/go.mod h1:Vl1/iaggsuRlrHf/hfPJPvVag77kKyvrLeD10kpMl+A= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0 h1:zWWrB1U6nqhS/k6zYB74CjRpuiitRtLLi68VcgmOEto= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0/go.mod h1:2qXPNBX1OVRC0IwOnfo1ljoid+RD0QK3443EaqVlsOU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 h1:4YsVu3B8+3qtWYYrsUYgn0OG78pN0rnNPRGX4SbokQI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0/go.mod h1:+wnlSn0mD1ADVMe3v9Z/WIaiz6q6gL2J/ejaAmdmv80= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 h1:qazEJlUOQzhCpzQpFETGby7EdqjI1wsd0W+6Gg1SCTU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0/go.mod h1:fOD2Yefuxixkx3ahVNf0O/PERb6r4OlbxfATVnYvzCo= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0 h1:3iZJKlCZufyRzPzlQhUIWVmfltrXuGyfjREgGP3UUjc= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0/go.mod h1:/G+nUPfhq2e+qiXMGxMwumDrP5jtzU+mWN7/sjT2rak= go.opentelemetry.io/otel/exporters/prometheus v0.64.0 h1:g0LRDXMX/G1SEZtK8zl8Chm4K6GBwRkjPKE36LxiTYs= @@ -474,18 +463,18 @@ go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.42.0 h1:s/1iRkCKDfhlh1J go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.42.0/go.mod h1:UI3wi0FXg1Pofb8ZBiBLhtMzgoTm1TYkMvn71fAqDzs= go.opentelemetry.io/otel/log v0.19.0 h1:KUZs/GOsw79TBBMfDWsXS+KZ4g2Ckzksd1ymzsIEbo4= go.opentelemetry.io/otel/log v0.19.0/go.mod h1:5DQYeGmxVIr4n0/BcJvF4upsraHjg6vudJJpnkL6Ipk= -go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= -go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= -go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= -go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/metric v1.46.0 h1:yBnkXvgV7AXFILZc5K6IZe/CBFF3OS7BJ8ov6/lj0K8= +go.opentelemetry.io/otel/metric v1.46.0/go.mod h1:iPmdWqifKUdzziPkvvzIJXITl56fQx2mGM/DHLB3/2o= +go.opentelemetry.io/otel/sdk v1.46.0 h1:h5CNQQjEbuQXY/JfZtgt3i7HVFV3aHPO2OAwO2eTYPI= +go.opentelemetry.io/otel/sdk v1.46.0/go.mod h1:GAERFXFt5SYCEB+YiKUbMBeza6UaDH7GmGOZEfh2gSM= go.opentelemetry.io/otel/sdk/log v0.19.0 h1:scYVLqT22D2gqXItnWiocLUKGH9yvkkeql5dBDiXyko= go.opentelemetry.io/otel/sdk/log v0.19.0/go.mod h1:vFBowwXGLlW9AvpuF7bMgnNI95LiW10szrOdvzBHlAg= -go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= -go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= -go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= -go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= -go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= -go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= +go.opentelemetry.io/otel/sdk/metric v1.46.0 h1:0piZ26EG4RBfebb2jhDH6ERCYHoVWduc3kLgPCwSnSE= +go.opentelemetry.io/otel/sdk/metric v1.46.0/go.mod h1:I1PbKrdVc8Qu8HYVDNtqVIwLwjNrhsV/uFuxfwg8mO4= +go.opentelemetry.io/otel/trace v1.46.0 h1:OULy7ccdJnZtJ0UDYFOIGaCmiWzJ8Vi2G/Rsu60qs1c= +go.opentelemetry.io/otel/trace v1.46.0/go.mod h1:J7GAXweO77XSFkB/rmAqk9D6ihszhFjLU+d9WuUxDLI= +go.opentelemetry.io/proto/otlp v1.11.0 h1:5rrYs0Ykyj50sdU/JU0x8etU+LubXWb+gED6TbEdMIk= +go.opentelemetry.io/proto/otlp v1.11.0/go.mod h1:SmVizdCOAm3XBtG1g1NnOdhW6jtddT72hLMhv8VwA8E= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -494,34 +483,35 @@ go.uber.org/zap v1.28.0 h1:IZzaP1Fv73/T/pBMLk4VutPl36uNC+OSUh3JLG3FIjo= go.uber.org/zap v1.28.0/go.mod h1:rDLpOi171uODNm/mxFcuYWxDsqWSAVkFdX4XojSKg/Q= go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= -go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto= -golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio= -golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 h1:fQsdNF2N+/YewlRZiricy4P1iimyPKZ/xwniHj8Q2a0= -golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93/go.mod h1:EPRbTFwzwjXj9NpYyyrvenVh9Y+GFeEvMNh7Xuz7xgU= -golang.org/x/mod v0.36.0 h1:JJjpVx6myfUsUdAzZuOSTTmRE0PfZeNWzzvKrP7amb4= -golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ= -golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= -golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= +go.yaml.in/yaml/v3 v3.0.5 h1:N6y/pJk8buWs9NY5ERU2HSMfm+IuD/OtfdAnq6kESPw= +go.yaml.in/yaml/v3 v3.0.5/go.mod h1:HVTZu1O7/Vkt2N+BFy8Zza+lnLsABggaTM2ZpNIGuKg= +golang.org/x/crypto v0.55.0 h1:+KWHjbgOaAQ66dh/YlkZKHlz9ZUlq61AFirAR9ntP8M= +golang.org/x/crypto v0.55.0/go.mod h1:uq0V9dE/fzQuJtbnL+2EhWOE63vo164FY8xqEnV9xis= +golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f h1:W3F4c+6OLc6H2lb//N1q4WpJkhzJCK5J6kUi1NTVXfM= +golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f/go.mod h1:J1xhfL/vlindoeF/aINzNzt2Bket5bjo9sdOYzOsU80= +golang.org/x/mod v0.38.0 h1:MECBjubtXD7yj4HrhIUcywNaGeNVUdfVnxmPajOk4yk= +golang.org/x/mod v0.38.0/go.mod h1:V6Xz0pq8TQ3dGqVQ1FVHuelZpAL0uNhSkk9ogYP3c40= +golang.org/x/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To= +golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= -golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM= -golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= +golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= -golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/term v0.44.0 h1:0rLvDRCtNj0gZkyIXhCyOb2OAzEhLVqc4B+hrsBhrmc= -golang.org/x/term v0.44.0/go.mod h1:7ze4MdzUzLXpSAoFP1H0bOI9aXDqveSvatT5vKcFh2Y= -golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE= -golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= +golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= +golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/term v0.45.0 h1:NwWyBmoJCbfTHpxrWoZ9C6/VxOf7ic219I8xZZFdrf0= +golang.org/x/term v0.45.0/go.mod h1:9aqxs0blBcrm/n0L9QW0aRVD+ktan8ssZromtqJC43w= +golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= +golang.org/x/text v0.41.0/go.mod h1:jvf1O8ajNzZqhSrQBPbutR/EB83Cc0CFrezNQIwbb5M= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= -golang.org/x/tools v0.45.0 h1:18qN3FAooORvApf5XjCXgsuayZOEtXf6JK18I3+ONa8= -golang.org/x/tools v0.45.0/go.mod h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0= +golang.org/x/tools v0.48.0 h1:3+hClM1aLL5mjMKm5ovokw9epgRXPuu2tILgismM6RE= +golang.org/x/tools v0.48.0/go.mod h1:08xX0orndb/F7jJxGDicx061tyd5pcMto75YMAXr6lk= 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.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= @@ -530,14 +520,14 @@ google.golang.org/api v0.278.0 h1:W7jiRvRi53VYFfZ/HoZjQBtJk7gOFbHD8ot1RzVZU6E= google.golang.org/api v0.278.0/go.mod h1:B9TqLBwJqVjp1mtt7WeoQwWRwvu/400y5lETOql+giQ= google.golang.org/genproto v0.0.0-20260319201613-d00831a3d3e7 h1:XzmzkmB14QhVhgnawEVsOn6OFsnpyxNPRY9QV01dNB0= google.golang.org/genproto v0.0.0-20260319201613-d00831a3d3e7/go.mod h1:L43LFes82YgSonw6iTXTxXUX1OlULt4AQtkik4ULL/I= -google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 h1:VPWxll4HlMw1Vs/qXtN7BvhZqsS9cdAittCNvVENElA= -google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:7QBABkRtR8z+TEnmXTqIqwJLlzrZKVfAUm7tY3yGv0M= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260427160629-7cedc36a6bc4 h1:tEkOQcXgF6dH1G+MVKZrfpYvozGrzb91k6ha7jireSM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260427160629-7cedc36a6bc4/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM= -google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4= -google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af h1:+5/Sw3GsDNlEmu7TfklWKPdQ0Ykja5VEmq2i817+jbI= -google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +google.golang.org/genproto/googleapis/api v0.0.0-20260720211330-0afa2a65878a h1:97PfJ4tCxY5C7NzzgGqQEMZmXbISdvSArNNEOoUGKBg= +google.golang.org/genproto/googleapis/api v0.0.0-20260720211330-0afa2a65878a/go.mod h1:1brfde68Npq6+WA75c1EHWPijZEG1kMus61ygPZfn4A= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260720211330-0afa2a65878a h1:qI/YMH1ep2qQtqcp00gMQyoU7mjvbhg88GJKCvfoLj0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260720211330-0afa2a65878a/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.82.1 h1:NnAxzGRA0677vCa4BUkOAnO5+FfQqVl9iUXeD0IqcGE= +google.golang.org/grpc v1.82.1/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA= +google.golang.org/protobuf v1.36.12 h1:pJOKDDOyeXErUroCihFAd5LQuwXBSpVnKGrj5o/fwxc= +google.golang.org/protobuf v1.36.12/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= @@ -554,32 +544,32 @@ gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= helm.sh/helm/v4 v4.2.2 h1:E2zSCA2uUm9PNiZsSC/BioDVGsYk7nF2jNJFg/i+Dng= helm.sh/helm/v4 v4.2.2/go.mod h1:dp3ihfy1AhCLKANDaPETmVWhqPkOmwvJtpK/biHfopE= -k8s.io/api v0.36.2 h1:TF6YDLIzKfccK7cq9YpTcGX8TJmEkHVRv78DM51fRYY= -k8s.io/api v0.36.2/go.mod h1:F4LbMO4brjZYh7yFkXWhynSvtB7YauxV4c+HHkNRGNg= -k8s.io/apiextensions-apiserver v0.36.2 h1:3O5gqOj/dt2XWWbpMe+TXWpE9yU6pjM/tXxtHHJT/K4= -k8s.io/apiextensions-apiserver v0.36.2/go.mod h1:cL1tBWe8XSaP1H30iWKGo7hf6iAUUUJPEU70dskmAnA= -k8s.io/apimachinery v0.36.2 h1:0PE/W/WNy1UX61NLbXY5TMbJ6UwLL6E6lAPkYrKFxbQ= -k8s.io/apimachinery v0.36.2/go.mod h1:fvf/HOLXq9RId0rnDIbN1OEBvHXdQbLMM8nu0LcBUf4= -k8s.io/apiserver v0.36.2 h1:6vMnkmHZPeBloNkHUhmZYq7Ylv8WIB8xjyEl+eSt26E= -k8s.io/apiserver v0.36.2/go.mod h1:9PoQ2ikCytrZyZg11mGhLEF5m8Rgsb5FJmYJ4Wvnl1k= -k8s.io/cli-runtime v0.36.2 h1:CconTvEeV4DJs4ZX3HQKCFbFRGsm6OtuBM9yjmMP2VM= -k8s.io/cli-runtime v0.36.2/go.mod h1:LddcjiMf4YlnHO7c1Y7rEtDqL84FyiYVLco7V679GUU= -k8s.io/client-go v0.36.2 h1:bfgxmFKc9CgqsgX4xKLAAdmTQlWee7Ob/HlDOrJ5TBI= -k8s.io/client-go v0.36.2/go.mod h1:1vgO4OAlfPnoLcb+Rze2GF5rAr14w8qjrYMoyXJzQj0= -k8s.io/component-base v0.36.2 h1:Z0VH80O7Ng0HDZnZj3WRR3urEGa0kTwmO8CwEwjVK1w= -k8s.io/component-base v0.36.2/go.mod h1:mGfFOA7Gwpdm1VW2cwSQYbiDIlz8GD2WGwH88QSeCyA= +k8s.io/api v0.37.0 h1:Z//Vj9N7RA/yS2sDmxyeo7h+RR4zbUrd2vrd3Z0TbB4= +k8s.io/api v0.37.0/go.mod h1:LKXgcJWMc+f4OLbP5SFR8rulEg07zZhpi/zMULiBImk= +k8s.io/apiextensions-apiserver v0.37.0 h1:zRMQ3+/LIE5oZ0tVvXwYHC+dIkSP5cjNWju7AZU1LOI= +k8s.io/apiextensions-apiserver v0.37.0/go.mod h1:HU0PfSBwchHL5iDau6jjt9zU6ryWkDDlaVUiq91NK80= +k8s.io/apimachinery v0.37.0 h1:Np2AbDtf8x6RDHiD8T9LbKJ9gaegeVNa8yNm5FuGKm0= +k8s.io/apimachinery v0.37.0/go.mod h1:RN3nhprFSCxOi5Selxd7oMTXOe/c+ZbcE7Im+TS2zkE= +k8s.io/apiserver v0.37.0 h1:TXg7OxsOWrAH8J4Zi/gBAZuMw1Dfdd+6cca2h4qjRqo= +k8s.io/apiserver v0.37.0/go.mod h1:OddHDF4gy9qyIb8o/3+qaeP6S0vEObWLgOygVqXksv0= +k8s.io/cli-runtime v0.37.0 h1:U3XakUeirBQJMz5688r04z74SIHSE7V5SIZ6Ho5JyBM= +k8s.io/cli-runtime v0.37.0/go.mod h1:qiQMFkKwFFuPH6zy953On+nc3qfpEHAIDrJmAuRz5Vg= +k8s.io/client-go v0.37.0 h1:nsN31fy8wBySuZ+QRnKmrjRSQLOG2rvoGN0tKd12zhQ= +k8s.io/client-go v0.37.0/go.mod h1:FcGqw+Ll/gNQiq+nPGY1Oyt9y7SgDh1d3MW3RFDEbn0= +k8s.io/component-base v0.37.0 h1:3SdSa4+itMdFTDFTeR8CxKGmSTSMXFlKL4ky8OqjguM= +k8s.io/component-base v0.37.0/go.mod h1:LjOebp4R9y6LODWZQv102ZQxGheLcDO2ZJLAw6bbh4I= k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc= k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0= -k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25 h1:mPMaPMpBij2V1Wv/fR+HW124vVGXXvOSS9ver/9yjWs= -k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25/go.mod h1:V/QaCUYDa+0QpcHhVVc5l99Uz56wEMEXBSj9oCDkNDY= -k8s.io/kubectl v0.36.2 h1:rpUGGpeL09XVOLep2yle5jrtk//JA1L6ZHfkQQtVEwk= -k8s.io/kubectl v0.36.2/go.mod h1:gVbQ3B/yb4bSR2ggQ7rd0W6icUSWs7sduH4e16Vii+0= -k8s.io/utils v0.0.0-20260507154919-ff6756f316d2 h1:wU4tMEhLGgIbLvXQb1cfN+EcM0wf7zC6CPF+C79jroc= -k8s.io/utils v0.0.0-20260507154919-ff6756f316d2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= +k8s.io/kube-openapi v0.0.0-20260821135717-be32def86098 h1:z5+pcu1jTyKK5mNTe2/+x+U6Uuv9jRVOJQLaBJJMpeI= +k8s.io/kube-openapi v0.0.0-20260821135717-be32def86098/go.mod h1:0/mqHCVhlumdJ3BhCfnjSZQE037nAhNodh1/hK0T8/I= +k8s.io/kubectl v0.37.0 h1:cici6hiofx93ASldmprDmZF55SfhVt4o3HniltVLjTc= +k8s.io/kubectl v0.37.0/go.mod h1:RSeEl8e/yqDx6srG8Azr0uAtVPNIZljA0PNh9HCBcdg= +k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3 h1:jVkFFVfXdXP74B/zbO3hM3hpSFD0xvhQ5U686DPurkE= +k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3/go.mod h1:M2s5JB1lIYP3jzZdorPLHXIPJzt9vv2muW5a6L9DtNM= oras.land/oras-go/v2 v2.6.1 h1:bonOEkjLfp8tt6qXWRRWP6p1F+9octchOf2EqnWB4Zs= oras.land/oras-go/v2 v2.6.1/go.mod h1:dhtFrFOuZuDtAVeZ9FUnaa5zfzplG3ZnFX9/uH1J/Yk= -sigs.k8s.io/controller-runtime v0.24.1 h1:miPEwrmirImAvgME1L9qebGHrOnGJoVmVdtOU9fRfo4= -sigs.k8s.io/controller-runtime v0.24.1/go.mod h1:vFkfY5fGt5xAC/sKb8IBFKgWPNKG9OUG29dR8Y2wImw= +sigs.k8s.io/controller-runtime v0.25.0 h1:44KgRUPew331KSJpNu8zJow3iTR5W0p/SfrHdw3lV40= +sigs.k8s.io/controller-runtime v0.25.0/go.mod h1:4QqLdT6z/L6Olj8JJCtvztid4/fnIiYsfaTFScegctc= sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= sigs.k8s.io/kustomize/api v0.21.1 h1:lzqbzvz2CSvsjIUZUBNFKtIMsEw7hVLJp0JeSIVmuJs= @@ -588,7 +578,7 @@ sigs.k8s.io/kustomize/kyaml v0.21.1 h1:IVlbmhC076nf6foyL6Taw4BkrLuEsXUXNpsE+ScX7 sigs.k8s.io/kustomize/kyaml v0.21.1/go.mod h1:hmxADesM3yUN2vbA5z1/YTBnzLJ1dajdqpQonwBL1FQ= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/structured-merge-diff/v6 v6.4.0 h1:qmp2e3ZfFi1/jJbDGpD4mt3wyp6PE1NfKHCYLqgNQJo= -sigs.k8s.io/structured-merge-diff/v6 v6.4.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= +sigs.k8s.io/structured-merge-diff/v6 v6.4.2 h1:qdOxHwrl2Kaag1aQEarlYcOA9vSyGCp3CIki3aW8c4Q= +sigs.k8s.io/structured-merge-diff/v6 v6.4.2/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/internal/controller/helmrelease_controller.go b/internal/controller/helmrelease_controller.go index e4d201f15..f0605b7e5 100644 --- a/internal/controller/helmrelease_controller.go +++ b/internal/controller/helmrelease_controller.go @@ -39,13 +39,13 @@ import ( "k8s.io/apimachinery/pkg/util/wait" "k8s.io/cli-runtime/pkg/genericclioptions" "k8s.io/client-go/rest" - kuberecorder "k8s.io/client-go/tools/record" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "sigs.k8s.io/controller-runtime/pkg/reconcile" aclv1 "github.com/fluxcd/pkg/apis/acl" + eventv1 "github.com/fluxcd/pkg/apis/event/v1" "github.com/fluxcd/pkg/apis/meta" "github.com/fluxcd/pkg/auth" authutils "github.com/fluxcd/pkg/auth/utils" @@ -56,14 +56,13 @@ import ( runtimeClient "github.com/fluxcd/pkg/runtime/client" "github.com/fluxcd/pkg/runtime/conditions" helper "github.com/fluxcd/pkg/runtime/controller" + "github.com/fluxcd/pkg/runtime/events" "github.com/fluxcd/pkg/runtime/jitter" "github.com/fluxcd/pkg/runtime/logger" "github.com/fluxcd/pkg/runtime/object" "github.com/fluxcd/pkg/runtime/patch" "github.com/fluxcd/pkg/ssa" - sourcev1 "github.com/fluxcd/source-controller/api/v1" - v2 "github.com/fluxcd/helm-controller/api/v2" intacl "github.com/fluxcd/helm-controller/internal/acl" "github.com/fluxcd/helm-controller/internal/action" @@ -72,6 +71,7 @@ import ( "github.com/fluxcd/helm-controller/internal/kube" "github.com/fluxcd/helm-controller/internal/loader" intreconcile "github.com/fluxcd/helm-controller/internal/reconcile" + sourcev1 "github.com/fluxcd/source-controller/api/v1" ) // +kubebuilder:rbac:groups=helm.toolkit.fluxcd.io,resources=helmreleases,verbs=get;list;watch;create;update;patch;delete @@ -86,7 +86,7 @@ import ( // HelmReleaseReconciler reconciles a HelmRelease object. type HelmReleaseReconciler struct { client.Client - kuberecorder.EventRecorder + events.EventRecorder helper.Metrics // Kubernetes configuration @@ -207,7 +207,7 @@ func (r *HelmReleaseReconciler) Reconcile(ctx context.Context, req ctrl.Request) conditions.MarkFalse(obj, meta.ReadyCondition, meta.InvalidCELExpressionReason, "%s", errMsg) conditions.MarkStalled(obj, meta.InvalidCELExpressionReason, "%s", errMsg) obj.Status.ObservedGeneration = obj.Generation - r.Eventf(obj, corev1.EventTypeWarning, meta.InvalidCELExpressionReason, "%s", err.Error()) + r.Eventf(obj, nil, corev1.EventTypeWarning, meta.InvalidCELExpressionReason, eventv1.ActionFailed, "%s", err.Error()) return ctrl.Result{}, reconcile.TerminalError(err) } @@ -248,7 +248,7 @@ func (r *HelmReleaseReconciler) reconcileRelease(ctx context.Context, errMsg := fmt.Sprintf("%s: %v", terminalErrorMessage, err) conditions.MarkFalse(obj, meta.ReadyCondition, meta.InvalidCELExpressionReason, "%s", errMsg) conditions.MarkStalled(obj, meta.InvalidCELExpressionReason, "%s", errMsg) - r.Eventf(obj, corev1.EventTypeWarning, meta.InvalidCELExpressionReason, "%s", err.Error()) + r.Eventf(obj, nil, corev1.EventTypeWarning, meta.InvalidCELExpressionReason, eventv1.ActionFailed, "%s", err.Error()) return ctrl.Result{}, err } @@ -256,7 +256,7 @@ func (r *HelmReleaseReconciler) reconcileRelease(ctx context.Context, msg := fmt.Sprintf("dependencies do not meet ready condition (%s): retrying in %s", err.Error(), r.DependencyRequeueInterval.String()) conditions.MarkFalse(obj, meta.ReadyCondition, v2.DependencyNotReadyReason, "%s", err) - r.Eventf(obj, corev1.EventTypeNormal, v2.DependencyNotReadyReason, "%s", err.Error()) + r.Eventf(obj, nil, corev1.EventTypeNormal, v2.DependencyNotReadyReason, eventv1.ActionWaiting, "%s", err.Error()) log.Info(msg) // Exponential backoff would cause execution to be prolonged too much, @@ -278,7 +278,7 @@ func (r *HelmReleaseReconciler) reconcileRelease(ctx context.Context, conditions.MarkStalled(obj, aclv1.AccessDeniedReason, "%s", err) conditions.MarkFalse(obj, meta.ReadyCondition, aclv1.AccessDeniedReason, "%s", err) conditions.Delete(obj, meta.ReconcilingCondition) - r.Eventf(obj, corev1.EventTypeWarning, aclv1.AccessDeniedReason, "%s", err.Error()) + r.Eventf(obj, source, corev1.EventTypeWarning, aclv1.AccessDeniedReason, eventv1.ActionFailed, "%s", err.Error()) // Recovering from this is not possible without a restart of the // controller or a change of spec, both triggering a new @@ -317,7 +317,7 @@ func (r *HelmReleaseReconciler) reconcileRelease(ctx context.Context, obj.Spec.ValuesFrom...) if err != nil { conditions.MarkFalse(obj, meta.ReadyCondition, "ValuesError", "%s", err) - r.Eventf(obj, corev1.EventTypeWarning, "ValuesError", "%s", err.Error()) + r.Eventf(obj, source, corev1.EventTypeWarning, "ValuesError", eventv1.ActionFailed, "%s", err.Error()) return ctrl.Result{}, err } // Remove any stale corresponding Ready=False condition with Unknown. @@ -336,7 +336,7 @@ func (r *HelmReleaseReconciler) reconcileRelease(ctx context.Context, } conditions.MarkFalse(obj, meta.ReadyCondition, v2.ArtifactFailedReason, "Could not load chart: %s", err) - r.Eventf(obj, corev1.EventTypeWarning, v2.ArtifactFailedReason, "%s", err.Error()) + r.Eventf(obj, source, corev1.EventTypeWarning, v2.ArtifactFailedReason, eventv1.ActionFailed, "%s", err.Error()) return ctrl.Result{}, err } // Remove any stale corresponding Ready=False condition with Unknown. @@ -375,7 +375,7 @@ func (r *HelmReleaseReconciler) reconcileRelease(ctx context.Context, if reason, changed := action.ReleaseTargetChanged(obj, loadedChart.Name()); changed && (reason != action.TargetChartName || obj.GetUpgrade().GetChartNameChangeStrategy() == v2.ChartNameChangeStrategyReinstall) { log.Info(fmt.Sprintf("release target configuration changed (%s): running uninstall for current release", reason)) - if err = r.reconcileUninstall(ctx, getter, obj); err != nil && !errors.Is(err, intreconcile.ErrNoLatest) { + if err = r.reconcileUninstall(ctx, getter, obj, source); err != nil && !errors.Is(err, intreconcile.ErrNoLatest) { return ctrl.Result{}, err } obj.Status.ClearHistory() @@ -420,6 +420,7 @@ func (r *HelmReleaseReconciler) reconcileRelease(ctx context.Context, // Off we go! if err = intreconcile.NewAtomicRelease(patchHelper, cfg, r.EventRecorder, r.FieldManager, r.DisallowedFieldManagers, r.DefaultToRetryOnFailure).Reconcile(ctx, &intreconcile.Request{ Object: obj, + Source: source, Chart: loadedChart, Values: values, }); err != nil { @@ -429,8 +430,8 @@ func (r *HelmReleaseReconciler) reconcileRelease(ctx context.Context, conditions.MarkFalse(obj, meta.ReadyCondition, meta.HealthCheckCanceledReason, "New reconciliation triggered by %s/%s/%s", qes.Kind, qes.Namespace, qes.Name) log.Info("New reconciliation triggered, canceling health checks", "trigger", qes) - r.Eventf(obj, corev1.EventTypeNormal, meta.HealthCheckCanceledReason, - "Health checks canceled due to new reconciliation triggered by %s/%s/%s", + r.Eventf(obj, source, corev1.EventTypeNormal, meta.HealthCheckCanceledReason, + eventv1.ActionReconciling, "Health checks canceled due to new reconciliation triggered by %s/%s/%s", qes.Kind, qes.Namespace, qes.Name) return ctrl.Result{Requeue: true}, nil } @@ -555,7 +556,7 @@ func (r *HelmReleaseReconciler) reconcileReleaseDeletion(ctx context.Context, ob } // Attempt to uninstall the release. - if err = r.reconcileUninstall(ctx, getter, obj); err != nil && !errors.Is(err, intreconcile.ErrNoLatest) { + if err = r.reconcileUninstall(ctx, getter, obj, nil); err != nil && !errors.Is(err, intreconcile.ErrNoLatest) { return err } if err == nil { @@ -578,7 +579,7 @@ func (r *HelmReleaseReconciler) reconcileChartTemplate(ctx context.Context, obj }) } -func (r *HelmReleaseReconciler) reconcileUninstall(ctx context.Context, getter genericclioptions.RESTClientGetter, obj *v2.HelmRelease) error { +func (r *HelmReleaseReconciler) reconcileUninstall(ctx context.Context, getter genericclioptions.RESTClientGetter, obj *v2.HelmRelease, source sourcev1.Source) error { // Construct config factory for current release first to validate // storage configuration before building the resource manager. cfg, err := action.NewConfigFactory(getter, @@ -601,7 +602,7 @@ func (r *HelmReleaseReconciler) reconcileUninstall(ctx context.Context, getter g cfg.NewResourceManager = resourceManager // Run uninstall. - return intreconcile.NewUninstall(cfg, r.EventRecorder).Reconcile(ctx, &intreconcile.Request{Object: obj}) + return intreconcile.NewUninstall(cfg, r.EventRecorder).Reconcile(ctx, &intreconcile.Request{Object: obj, Source: source}) } // checkDependencies checks if the dependencies of the current HelmRelease are ready. diff --git a/internal/controller/helmrelease_controller_test.go b/internal/controller/helmrelease_controller_test.go index 090092c82..c8edb025c 100644 --- a/internal/controller/helmrelease_controller_test.go +++ b/internal/controller/helmrelease_controller_test.go @@ -39,7 +39,6 @@ import ( "k8s.io/cli-runtime/pkg/genericclioptions" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" - "k8s.io/client-go/tools/record" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" "sigs.k8s.io/controller-runtime/pkg/client/interceptor" @@ -52,6 +51,7 @@ import ( "github.com/fluxcd/pkg/apis/meta" "github.com/fluxcd/pkg/chartutil" "github.com/fluxcd/pkg/runtime/conditions" + "github.com/fluxcd/pkg/runtime/events" "github.com/fluxcd/pkg/runtime/patch" sourcev1 "github.com/fluxcd/source-controller/api/v1" @@ -106,7 +106,7 @@ func TestHelmReleaseReconciler_reconcileRelease(t *testing.T) { WithStatusSubresource(&v2.HelmRelease{}). WithObjects(dependency, obj). Build(), - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), DependencyRequeueInterval: 5 * time.Second, } r.APIReader = r.Client @@ -171,7 +171,7 @@ func TestHelmReleaseReconciler_reconcileRelease(t *testing.T) { WithStatusSubresource(&v2.HelmRelease{}). WithObjects(obj). Build(), - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } r.APIReader = r.Client @@ -347,7 +347,7 @@ func TestHelmReleaseReconciler_reconcileRelease(t *testing.T) { WithStatusSubresource(&v2.HelmRelease{}). WithObjects(chart, obj). Build(), - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } r.APIReader = r.Client @@ -468,7 +468,7 @@ func TestHelmReleaseReconciler_reconcileRelease(t *testing.T) { Client: c, APIReader: c, GetClusterConfig: GetTestClusterConfig, - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } res, err := r.reconcileRelease(context.TODO(), patch.NewSerialPatcher(obj, c), obj, nil) @@ -565,7 +565,7 @@ func TestHelmReleaseReconciler_reconcileRelease(t *testing.T) { r := &HelmReleaseReconciler{ Client: c, GetClusterConfig: GetTestClusterConfig, - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } //Store the Helm release mock in the test namespace. @@ -667,7 +667,7 @@ func TestHelmReleaseReconciler_reconcileRelease(t *testing.T) { r := &HelmReleaseReconciler{ Client: c, GetClusterConfig: GetTestClusterConfig, - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } //Store the Helm release mock in the test namespace. @@ -752,7 +752,7 @@ func TestHelmReleaseReconciler_reconcileRelease(t *testing.T) { Client: c, APIReader: c, GetClusterConfig: GetTestClusterConfig, - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } _, err = r.reconcileRelease(context.TODO(), patch.NewSerialPatcher(obj, c), obj, nil) @@ -825,7 +825,7 @@ func TestHelmReleaseReconciler_reconcileRelease(t *testing.T) { Client: c, APIReader: c, GetClusterConfig: GetTestClusterConfig, - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } res, err := r.reconcileRelease(context.TODO(), patch.NewSerialPatcher(obj, c), obj, nil) @@ -913,7 +913,7 @@ func TestHelmReleaseReconciler_reconcileRelease(t *testing.T) { Client: c, APIReader: c, GetClusterConfig: GetTestClusterConfig, - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } _, err = r.reconcileRelease(context.TODO(), patch.NewSerialPatcher(obj, c), obj, nil) @@ -1003,7 +1003,7 @@ func TestHelmReleaseReconciler_reconcileRelease(t *testing.T) { Client: c, APIReader: c, GetClusterConfig: GetTestClusterConfig, - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), FieldManager: "test", } @@ -1119,7 +1119,7 @@ func TestHelmReleaseReconciler_reconcileReleaseFromHelmChartSource(t *testing.T) WithStatusSubresource(&v2.HelmRelease{}). WithObjects(obj). Build(), - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } _, err := r.reconcileRelease(context.TODO(), patch.NewSerialPatcher(obj, r.Client), obj, nil) @@ -1154,7 +1154,7 @@ func TestHelmReleaseReconciler_reconcileReleaseFromHelmChartSource(t *testing.T) WithStatusSubresource(&v2.HelmRelease{}). WithObjects(obj). Build(), - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } res, err := r.reconcileRelease(context.TODO(), patch.NewSerialPatcher(obj, r.Client), obj, nil) @@ -1272,7 +1272,7 @@ func TestHelmReleaseReconciler_reconcileReleaseFromHelmChartSource(t *testing.T) WithObjects(chart, obj). Build(), DependencyRequeueInterval: 10 * time.Second, - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } res, err := r.reconcileRelease(context.TODO(), patch.NewSerialPatcher(obj, r.Client), obj, nil) @@ -1352,7 +1352,7 @@ func TestHelmReleaseReconciler_reconcileReleaseFromHelmChartSource(t *testing.T) WithObjects(chart, sharedChart, obj). Build(), DependencyRequeueInterval: 10 * time.Second, - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } res, err := r.reconcileRelease(context.TODO(), patch.NewSerialPatcher(obj, r.Client), obj, nil) @@ -1479,7 +1479,7 @@ func TestHelmReleaseReconciler_reconcileReleaseFromHelmChartSource(t *testing.T) r := &HelmReleaseReconciler{ Client: c, GetClusterConfig: GetTestClusterConfig, - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } //Store the Helm release mock in the test namespace. @@ -1586,7 +1586,7 @@ func TestHelmReleaseReconciler_reconcileReleaseFromOCIRepositorySource(t *testin WithStatusSubresource(&v2.HelmRelease{}). WithObjects(obj). Build(), - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } _, err := r.reconcileRelease(context.TODO(), patch.NewSerialPatcher(obj, r.Client), obj, nil) @@ -1621,7 +1621,7 @@ func TestHelmReleaseReconciler_reconcileReleaseFromOCIRepositorySource(t *testin WithStatusSubresource(&v2.HelmRelease{}). WithObjects(obj). Build(), - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } res, err := r.reconcileRelease(context.TODO(), patch.NewSerialPatcher(obj, r.Client), obj, nil) @@ -1742,7 +1742,7 @@ func TestHelmReleaseReconciler_reconcileReleaseFromOCIRepositorySource(t *testin WithStatusSubresource(&v2.HelmRelease{}). WithObjects(ocirepo, obj). Build(), - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } _, err := r.reconcileRelease(context.TODO(), patch.NewSerialPatcher(obj, r.Client), obj, nil) @@ -1801,7 +1801,7 @@ func TestHelmReleaseReconciler_reconcileReleaseFromOCIRepositorySource(t *testin WithObjects(ocirepo, obj). Build(), DependencyRequeueInterval: 10 * time.Second, - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } res, err := r.reconcileRelease(context.TODO(), patch.NewSerialPatcher(obj, r.Client), obj, nil) @@ -1881,7 +1881,7 @@ func TestHelmReleaseReconciler_reconcileReleaseFromOCIRepositorySource(t *testin WithObjects(chart, ocirepo, obj). Build(), DependencyRequeueInterval: 10 * time.Second, - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } res, err := r.reconcileRelease(context.TODO(), patch.NewSerialPatcher(obj, r.Client), obj, nil) @@ -1945,7 +1945,7 @@ func TestHelmReleaseReconciler_reconcileReleaseFromOCIRepositorySource(t *testin WithObjects(ocirepo, obj). Build(), GetClusterConfig: GetTestClusterConfig, - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } _, err = r.reconcileRelease(context.TODO(), patch.NewSerialPatcher(obj, r.Client), obj, nil) @@ -2039,7 +2039,7 @@ func TestHelmReleaseReconciler_reconcileReleaseFromOCIRepositorySource(t *testin r := &HelmReleaseReconciler{ Client: c, GetClusterConfig: GetTestClusterConfig, - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } _, err = r.reconcileRelease(context.TODO(), patch.NewSerialPatcher(obj, r.Client), obj, nil) @@ -2136,7 +2136,7 @@ func TestHelmReleaseReconciler_reconcileReleaseFromOCIRepositorySource(t *testin r := &HelmReleaseReconciler{ Client: c, GetClusterConfig: GetTestClusterConfig, - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } _, err = r.reconcileRelease(context.TODO(), patch.NewSerialPatcher(obj, r.Client), obj, nil) @@ -2213,7 +2213,7 @@ func TestHelmReleaseReconciler_reconcileReleaseFromOCIRepositorySource(t *testin r := &HelmReleaseReconciler{ Client: c, GetClusterConfig: GetTestClusterConfig, - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } _, err = r.reconcileRelease(context.TODO(), patch.NewSerialPatcher(obj, r.Client), obj, nil) @@ -2332,7 +2332,7 @@ func TestHelmReleaseReconciler_reconcileReleaseFromOCIRepositorySource(t *testin r := &HelmReleaseReconciler{ Client: c, GetClusterConfig: GetTestClusterConfig, - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } // Store the Helm release mock in the test namespace. @@ -2427,7 +2427,7 @@ func TestHelmReleaseReconciler_reconcileDelete(t *testing.T) { Client: testEnv.Client, APIReader: testEnv.Client, GetClusterConfig: GetTestClusterConfig, - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } // Store the Helm release mock in the test namespace. @@ -2538,7 +2538,7 @@ func TestHelmReleaseReconciler_reconcileReleaseDeletion(t *testing.T) { Client: testEnv.Client, APIReader: testEnv.Client, GetClusterConfig: GetTestClusterConfig, - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } // Store the Helm release mock in the test namespace. @@ -2787,7 +2787,7 @@ func TestHelmReleaseReconciler_reconcileReleaseDeletion(t *testing.T) { Host: "https://failing-mock.local", }, nil }, - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } obj := &v2.HelmRelease{ @@ -2877,7 +2877,7 @@ func TestHelmReleaseReconciler_reconcileChartTemplate(t *testing.T) { r := &HelmReleaseReconciler{ Client: fake.NewClientBuilder().WithScheme(NewTestScheme()).Build(), - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } obj := &v2.HelmRelease{ @@ -2909,7 +2909,7 @@ func TestHelmReleaseReconciler_reconcileUninstall(t *testing.T) { } // We do not care about the result of the uninstall, only that it was attempted. - err := (&HelmReleaseReconciler{}).reconcileUninstall(context.TODO(), getter, obj) + err := (&HelmReleaseReconciler{}).reconcileUninstall(context.TODO(), getter, obj, nil) g.Expect(err).To(HaveOccurred()) g.Expect(errors.Is(err, intreconcile.ErrNoLatest)).To(BeTrue()) }) @@ -2923,7 +2923,7 @@ func TestHelmReleaseReconciler_reconcileUninstall(t *testing.T) { }, } - err := (&HelmReleaseReconciler{}).reconcileUninstall(context.TODO(), nil, obj) + err := (&HelmReleaseReconciler{}).reconcileUninstall(context.TODO(), nil, obj, nil) g.Expect(err).To(HaveOccurred()) g.Expect(conditions.IsFalse(obj, meta.ReadyCondition)).To(BeTrue()) @@ -2973,7 +2973,7 @@ func TestHelmReleaseReconciler_reconcileUninstall(t *testing.T) { Client: testEnv.Client, APIReader: testEnv.Client, GetClusterConfig: GetTestClusterConfig, - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } // Store the Helm release mock in the test namespace. @@ -2986,7 +2986,7 @@ func TestHelmReleaseReconciler_reconcileUninstall(t *testing.T) { store := helmstorage.Init(cfg.Driver) g.Expect(store.Create(rls)).To(Succeed()) - err = r.reconcileUninstall(context.TODO(), getter, obj) + err = r.reconcileUninstall(context.TODO(), getter, obj, nil) g.Expect(err).To(HaveOccurred()) // Verify status of Helm release has not been updated. @@ -3613,7 +3613,7 @@ func TestHelmReleaseReconciler_getHelmChart(t *testing.T) { r := &HelmReleaseReconciler{ Client: c.Build(), - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } curAllow := intacl.AllowCrossNamespaceRef @@ -3732,7 +3732,7 @@ func TestHelmReleaseReconciler_getSourceFromOCIRef_DirectSourceFetch(t *testing. Client: fakeClient, APIReader: fakeAPIReader, DirectSourceFetch: tt.directSourceFetch, - EventRecorder: record.NewFakeRecorder(32), + EventRecorder: events.NewFakeRecorder(32, false), } rel := &v2.HelmRelease{ diff --git a/internal/controller_test/suite_test.go b/internal/controller_test/suite_test.go index f78053ef6..4def9f73d 100644 --- a/internal/controller_test/suite_test.go +++ b/internal/controller_test/suite_test.go @@ -28,6 +28,7 @@ import ( "go.uber.org/zap/zapcore" "helm.sh/helm/v4/pkg/kube" corev1 "k8s.io/api/core/v1" + eventsv1 "k8s.io/api/events/v1" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -44,10 +45,10 @@ import ( helper "github.com/fluxcd/pkg/runtime/controller" "github.com/fluxcd/pkg/runtime/testenv" "github.com/fluxcd/pkg/testserver" - sourcev1 "github.com/fluxcd/source-controller/api/v1" v2 "github.com/fluxcd/helm-controller/api/v2" "github.com/fluxcd/helm-controller/internal/controller" + sourcev1 "github.com/fluxcd/source-controller/api/v1" // +kubebuilder:scaffold:imports ) @@ -75,6 +76,7 @@ func randStringRunes(n int) string { func NewTestScheme() *runtime.Scheme { s := runtime.NewScheme() utilruntime.Must(corev1.AddToScheme(s)) + utilruntime.Must(eventsv1.AddToScheme(s)) utilruntime.Must(apiextensionsv1.AddToScheme(s)) utilruntime.Must(sourcev1.AddToScheme(s)) utilruntime.Must(v2.AddToScheme(s)) @@ -166,7 +168,7 @@ func StartController() error { timeout := time.Second * 10 reconciler = &controller.HelmReleaseReconciler{ Client: testEnv, - EventRecorder: testEnv.GetEventRecorderFor(controllerName), + EventRecorder: testEnv.GetEventRecorder(controllerName), Metrics: helper.Metrics{}, GetClusterConfig: GetTestClusterConfig, ClientOpts: rclient.Options{ @@ -279,24 +281,3 @@ func applyHelmChart(objKey client.ObjectKey, artifact *meta.Artifact) error { } return nil } - -func getEvents(objName string, annotations map[string]string) []corev1.Event { - var result []corev1.Event - events := &corev1.EventList{} - _ = k8sClient.List(testCtx, events) - for _, event := range events.Items { - if event.InvolvedObject.Name == objName { - if len(annotations) == 0 { - result = append(result, event) - } else { - for ak, av := range annotations { - if event.GetAnnotations()[ak] == av { - result = append(result, event) - break - } - } - } - } - } - return result -} diff --git a/internal/controller_test/wait_test.go b/internal/controller_test/wait_test.go index 3c03dc868..9602d37f3 100644 --- a/internal/controller_test/wait_test.go +++ b/internal/controller_test/wait_test.go @@ -23,7 +23,7 @@ import ( "time" "github.com/opencontainers/go-digest" - corev1 "k8s.io/api/core/v1" + eventsv1 "k8s.io/api/events/v1" apimeta "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" @@ -31,6 +31,7 @@ import ( "github.com/fluxcd/pkg/apis/kustomize" "github.com/fluxcd/pkg/apis/meta" + "github.com/fluxcd/pkg/runtime/testenv" sourcev1 "github.com/fluxcd/source-controller/api/v1" . "github.com/onsi/gomega" @@ -226,10 +227,10 @@ func TestHelmReleaseReconciler_CancelHealthCheckOnNewRevision(t *testing.T) { // Verify the HealthCheckCanceled event was emitted. g.Eventually(func() bool { - events := getEvents(resultHR.GetName(), nil) + events := testenv.GetEvents(testCtx, k8sClient, resultHR.GetName(), "", nil) for _, event := range events { if event.Reason == meta.HealthCheckCanceledReason { - t.Logf("Found HealthCheckCanceled event: %s", event.Message) + t.Logf("Found HealthCheckCanceled event: %s", event.Note) return true } } @@ -237,8 +238,8 @@ func TestHelmReleaseReconciler_CancelHealthCheckOnNewRevision(t *testing.T) { }, timeout, time.Second).Should(BeTrue(), "HealthCheckCanceled event should be recorded") // Verify the event message indicates the trigger source. - events := getEvents(resultHR.GetName(), nil) - var cancelEvent *corev1.Event + events := testenv.GetEvents(testCtx, k8sClient, resultHR.GetName(), "", nil) + var cancelEvent *eventsv1.Event for i := range events { if events[i].Reason == meta.HealthCheckCanceledReason { cancelEvent = &events[i] @@ -246,8 +247,8 @@ func TestHelmReleaseReconciler_CancelHealthCheckOnNewRevision(t *testing.T) { } } g.Expect(cancelEvent).ToNot(BeNil()) - g.Expect(cancelEvent.Message).To(ContainSubstring("Health checks canceled")) - g.Expect(cancelEvent.Message).To(ContainSubstring("HelmChart")) + g.Expect(cancelEvent.Note).To(ContainSubstring("Health checks canceled")) + g.Expect(cancelEvent.Note).To(ContainSubstring("HelmChart")) // Verify the HelmRelease becomes Ready after the fixed revision is reconciled. g.Eventually(func() bool { diff --git a/internal/reconcile/atomic_release.go b/internal/reconcile/atomic_release.go index 5f5a1f1b3..2fc0a60ed 100644 --- a/internal/reconcile/atomic_release.go +++ b/internal/reconcile/atomic_release.go @@ -26,11 +26,12 @@ import ( "helm.sh/helm/v4/pkg/kube" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/tools/record" ctrl "sigs.k8s.io/controller-runtime" + eventv1 "github.com/fluxcd/pkg/apis/event/v1" "github.com/fluxcd/pkg/apis/meta" "github.com/fluxcd/pkg/runtime/conditions" + "github.com/fluxcd/pkg/runtime/events" "github.com/fluxcd/pkg/runtime/logger" "github.com/fluxcd/pkg/runtime/patch" "github.com/fluxcd/pkg/ssa/jsondiff" @@ -113,7 +114,7 @@ var ( type AtomicRelease struct { patchHelper *patch.SerialPatcher configFactory *action.ConfigFactory - eventRecorder record.EventRecorder + eventRecorder events.EventRecorder strategy releaseStrategy fieldManager string disallowedFieldManagers []string @@ -122,7 +123,7 @@ type AtomicRelease struct { // NewAtomicRelease returns a new AtomicRelease reconciler configured with the // provided values. -func NewAtomicRelease(patchHelper *patch.SerialPatcher, cfg *action.ConfigFactory, recorder record.EventRecorder, fieldManager string, disallowedFieldManagers []string, defaultToRetryOnFailure bool) *AtomicRelease { +func NewAtomicRelease(patchHelper *patch.SerialPatcher, cfg *action.ConfigFactory, recorder events.EventRecorder, fieldManager string, disallowedFieldManagers []string, defaultToRetryOnFailure bool) *AtomicRelease { return &AtomicRelease{ patchHelper: patchHelper, eventRecorder: recorder, @@ -458,7 +459,7 @@ func (r *AtomicRelease) actionForState(ctx context.Context, req *Request, state msg := fmt.Sprintf("Cluster state of release %s has drifted from the desired state:\n%s", req.Object.Status.History.Latest().FullReleaseName(), diff.SummarizeDiffSet(state.Diff)) - r.eventRecorder.Eventf(req.Object, corev1.EventTypeWarning, v2.DriftDetectedReason, "%s", msg) + r.eventRecorder.Eventf(req.Object, req.Source, corev1.EventTypeWarning, v2.DriftDetectedReason, eventv1.ActionReconciling, "%s", msg) conditions.MarkTrue(req.Object, v2.DriftedCondition, v2.DriftDetectedReason, "%s", msg) if req.Object.GetDriftDetection().GetMode() == v2.DriftDetectionEnabled { diff --git a/internal/reconcile/atomic_release_test.go b/internal/reconcile/atomic_release_test.go index 55bf6ea09..f42603979 100644 --- a/internal/reconcile/atomic_release_test.go +++ b/internal/reconcile/atomic_release_test.go @@ -31,14 +31,16 @@ import ( helmstorage "helm.sh/helm/v4/pkg/storage" helmdriver "helm.sh/helm/v4/pkg/storage/driver" corev1 "k8s.io/api/core/v1" + eventsv1 "k8s.io/api/events/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/client-go/tools/record" "k8s.io/utils/ptr" "sigs.k8s.io/controller-runtime/pkg/client/fake" + eventv1 "github.com/fluxcd/pkg/apis/event/v1" "github.com/fluxcd/pkg/apis/meta" "github.com/fluxcd/pkg/runtime/conditions" + "github.com/fluxcd/pkg/runtime/events" "github.com/fluxcd/pkg/runtime/patch" "github.com/fluxcd/pkg/ssa/jsondiff" @@ -171,7 +173,7 @@ func TestAtomicRelease_Reconcile(t *testing.T) { WithStatusSubresource(&v2.HelmRelease{}). Build() patchHelper := patch.NewSerialPatcher(obj, client) - recorder := new(record.FakeRecorder) + recorder := new(events.FakeRecorder) req := &Request{ Object: obj, @@ -1222,7 +1224,7 @@ func TestAtomicRelease_Reconcile_Scenarios(t *testing.T) { WithStatusSubresource(&v2.HelmRelease{}). Build() patchHelper := patch.NewSerialPatcher(obj, client) - recorder := new(record.FakeRecorder) + recorder := new(events.FakeRecorder) req := &Request{ Object: obj, @@ -1454,7 +1456,7 @@ func TestAtomicRelease_Reconcile_PostRenderers_Scenarios(t *testing.T) { WithStatusSubresource(&v2.HelmRelease{}). Build() patchHelper := patch.NewSerialPatcher(obj, client) - recorder := new(record.FakeRecorder) + recorder := new(events.FakeRecorder) req := &Request{ Object: obj, @@ -1483,7 +1485,7 @@ func TestAtomicRelease_actionForState(t *testing.T) { status func(releases []*helmrelease.Release) v2.HelmReleaseStatus state ReleaseState want ActionReconciler - wantEvent *corev1.Event + wantEvent *eventsv1.Event wantErr error assertConditions []metav1.Condition }{ @@ -1706,10 +1708,11 @@ func TestAtomicRelease_actionForState(t *testing.T) { } }, want: &CorrectClusterDrift{}, - wantEvent: &corev1.Event{ - Reason: "DriftDetected", + wantEvent: &eventsv1.Event{ + Reason: v2.DriftDetectedReason, Type: corev1.EventTypeWarning, - Message: fmt.Sprintf( + Action: eventv1.ActionReconciling, + Note: fmt.Sprintf( "Cluster state of release %s has drifted from the desired state:\n%s", mockReleaseNamespace+"/"+mockReleaseName+".v1", "Deployment/something/mock removed", @@ -1778,10 +1781,11 @@ func TestAtomicRelease_actionForState(t *testing.T) { }}, want: nil, wantErr: nil, - wantEvent: &corev1.Event{ - Reason: "DriftDetected", + wantEvent: &eventsv1.Event{ + Reason: v2.DriftDetectedReason, Type: corev1.EventTypeWarning, - Message: fmt.Sprintf( + Action: eventv1.ActionReconciling, + Note: fmt.Sprintf( "Cluster state of release %s has drifted from the desired state:\n%s", mockReleaseNamespace+"/"+mockReleaseName+".v1", "Deployment/something/mock changed (0 additions, 1 changes, 0 removals)", @@ -2152,7 +2156,7 @@ func TestAtomicRelease_actionForState(t *testing.T) { } } - recorder := testutil.NewFakeRecorder(1, false) + recorder := events.NewFakeRecorder(1, false) r := &AtomicRelease{configFactory: cfg, eventRecorder: recorder} got, err := r.actionForState(context.TODO(), &Request{Object: obj}, tt.state) @@ -2170,7 +2174,7 @@ func TestAtomicRelease_actionForState(t *testing.T) { g.Expect(got).To(want) if tt.wantEvent != nil { - g.Expect(recorder.GetEvents()).To(ConsistOf([]corev1.Event{*tt.wantEvent})) + g.Expect(recorder.GetEvents()).To(ConsistOf([]eventsv1.Event{*tt.wantEvent})) } else { g.Expect(recorder.GetEvents()).To(BeEmpty()) } @@ -2501,7 +2505,7 @@ func TestAtomicRelease_Reconcile_CommonMetadata_Scenarios(t *testing.T) { WithStatusSubresource(&v2.HelmRelease{}). Build() patchHelper := patch.NewSerialPatcher(obj, client) - recorder := new(record.FakeRecorder) + recorder := new(events.FakeRecorder) req := &Request{ Object: obj, diff --git a/internal/reconcile/correct_cluster_drift.go b/internal/reconcile/correct_cluster_drift.go index 6a5675683..f9991561c 100644 --- a/internal/reconcile/correct_cluster_drift.go +++ b/internal/reconcile/correct_cluster_drift.go @@ -22,12 +22,14 @@ import ( corev1 "k8s.io/api/core/v1" apierrutil "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/record" + eventv1 "github.com/fluxcd/pkg/apis/event/v1" "github.com/fluxcd/pkg/apis/meta" "github.com/fluxcd/pkg/runtime/conditions" + "github.com/fluxcd/pkg/runtime/events" "github.com/fluxcd/pkg/ssa" "github.com/fluxcd/pkg/ssa/jsondiff" + sourcev1 "github.com/fluxcd/source-controller/api/v1" v2 "github.com/fluxcd/helm-controller/api/v2" "github.com/fluxcd/helm-controller/internal/action" @@ -44,12 +46,12 @@ import ( // whether the cluster state was successfully corrected or not. type CorrectClusterDrift struct { configFactory *action.ConfigFactory - eventRecorder record.EventRecorder + eventRecorder events.EventRecorder diff jsondiff.DiffSet fieldManager string } -func NewCorrectClusterDrift(configFactory *action.ConfigFactory, recorder record.EventRecorder, diff jsondiff.DiffSet, fieldManager string) *CorrectClusterDrift { +func NewCorrectClusterDrift(configFactory *action.ConfigFactory, recorder events.EventRecorder, diff jsondiff.DiffSet, fieldManager string) *CorrectClusterDrift { return &CorrectClusterDrift{ configFactory: configFactory, eventRecorder: recorder, @@ -70,11 +72,11 @@ func (r *CorrectClusterDrift) Reconcile(ctx context.Context, req *Request) error conditions.MarkUnknown(req.Object, meta.ReadyCondition, meta.ProgressingReason, "correcting cluster drift") changeSet, err := action.ApplyDiff(ctx, r.configFactory.Build(nil), r.diff, r.fieldManager) - r.report(req.Object, changeSet, err) + r.report(req.Object, req.Source, changeSet, err) return nil } -func (r *CorrectClusterDrift) report(obj *v2.HelmRelease, changeSet *ssa.ChangeSet, err error) { +func (r *CorrectClusterDrift) report(obj *v2.HelmRelease, source sourcev1.Source, changeSet *ssa.ChangeSet, err error) { cur := obj.Status.History.Latest() switch { @@ -104,13 +106,13 @@ func (r *CorrectClusterDrift) report(obj *v2.HelmRelease, changeSet *ssa.ChangeS sb.WriteString(changeSet.String()) } - r.eventRecorder.AnnotatedEventf(obj, eventMeta(cur.ChartVersion, cur.ConfigDigest, + r.eventRecorder.AnnotatedEventf(obj, source, eventMeta(cur.ChartVersion, cur.ConfigDigest, addAppVersion(cur.AppVersion), addOCIDigest(cur.OCIDigest)), corev1.EventTypeWarning, - "DriftCorrectionFailed", "%s", sb.String()) + "DriftCorrectionFailed", eventv1.ActionFailed, "%s", sb.String()) case changeSet != nil && len(changeSet.Entries) > 0: - r.eventRecorder.AnnotatedEventf(obj, eventMeta(cur.ChartVersion, cur.ConfigDigest, + r.eventRecorder.AnnotatedEventf(obj, source, eventMeta(cur.ChartVersion, cur.ConfigDigest, addAppVersion(cur.AppVersion), addOCIDigest(cur.OCIDigest)), corev1.EventTypeNormal, - "DriftCorrected", "Cluster state of release %s has been corrected:\n%s", + "DriftCorrected", eventv1.ActionApplied, "Cluster state of release %s has been corrected:\n%s", obj.Status.History.Latest().FullReleaseName(), changeSet.String()) } } diff --git a/internal/reconcile/correct_cluster_drift_test.go b/internal/reconcile/correct_cluster_drift_test.go index b3d27ac45..d94c03ef5 100644 --- a/internal/reconcile/correct_cluster_drift_test.go +++ b/internal/reconcile/correct_cluster_drift_test.go @@ -24,19 +24,21 @@ import ( . "github.com/onsi/gomega" extjsondiff "github.com/wI2L/jsondiff" corev1 "k8s.io/api/core/v1" + eventsv1 "k8s.io/api/events/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" apierrutil "k8s.io/apimachinery/pkg/util/errors" "sigs.k8s.io/controller-runtime/pkg/client" + eventv1 "github.com/fluxcd/pkg/apis/event/v1" "github.com/fluxcd/pkg/apis/meta" "github.com/fluxcd/pkg/runtime/conditions" + "github.com/fluxcd/pkg/runtime/events" "github.com/fluxcd/pkg/ssa" "github.com/fluxcd/pkg/ssa/jsondiff" v2 "github.com/fluxcd/helm-controller/api/v2" "github.com/fluxcd/helm-controller/internal/action" - "github.com/fluxcd/helm-controller/internal/testutil" ) func TestCorrectClusterDrift_Reconcile(t *testing.T) { @@ -145,7 +147,7 @@ func TestCorrectClusterDrift_Reconcile(t *testing.T) { cfg, err := action.NewConfigFactory(getter, action.WithStorage(action.DefaultStorageDriver, namedNS.Name)) g.Expect(err).ToNot(HaveOccurred()) - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, false) r := NewCorrectClusterDrift(cfg, recorder, tt.diff(namedNS.Name), testFieldManager) g.Expect(r.Reconcile(context.TODO(), &Request{ @@ -183,7 +185,7 @@ func TestCorrectClusterDrift_report(t *testing.T) { obj *v2.HelmRelease changeSet *ssa.ChangeSet err error - wantEvent []corev1.Event + wantEvent []eventsv1.Event }{ { name: "with multiple changes", @@ -200,11 +202,12 @@ func TestCorrectClusterDrift_report(t *testing.T) { }, }, }, - wantEvent: []corev1.Event{ + wantEvent: []eventsv1.Event{ { Type: corev1.EventTypeNormal, Reason: "DriftCorrected", - Message: `Cluster state of release mock-ns/mock-release.v3 has been corrected: + Action: eventv1.ActionApplied, + Note: `Cluster state of release mock-ns/mock-release.v3 has been corrected: Secret/namespace/name created Deployment/namespace/name configured`, }, @@ -233,11 +236,12 @@ Deployment/namespace/name configured`, errors.New("error 1"), errors.New("error 2"), }), - wantEvent: []corev1.Event{ + wantEvent: []eventsv1.Event{ { Type: corev1.EventTypeWarning, Reason: "DriftCorrectionFailed", - Message: `Failed to partially correct cluster state of release mock-ns/mock-release.v3: + Action: eventv1.ActionFailed, + Note: `Failed to partially correct cluster state of release mock-ns/mock-release.v3: error 1 error 2 @@ -255,11 +259,12 @@ ConfigMap/namespace/name configured`, errors.New("error 1"), errors.New("error 2"), }), - wantEvent: []corev1.Event{ + wantEvent: []eventsv1.Event{ { + Action: eventv1.ActionFailed, Type: corev1.EventTypeWarning, Reason: "DriftCorrectionFailed", - Message: `Failed to correct cluster state of release mock-ns/mock-release.v3: + Note: `Failed to correct cluster state of release mock-ns/mock-release.v3: error 1 error 2`, }, @@ -276,11 +281,12 @@ error 2`, }, }, }, - wantEvent: []corev1.Event{ + wantEvent: []eventsv1.Event{ { + Action: eventv1.ActionApplied, Type: corev1.EventTypeNormal, Reason: "DriftCorrected", - Message: `Cluster state of release mock-ns/mock-release.v3 has been corrected: + Note: `Cluster state of release mock-ns/mock-release.v3 has been corrected: Secret/namespace/name created`, }, }, @@ -289,11 +295,12 @@ Secret/namespace/name created`, name: "with single error", obj: mockObj.DeepCopy(), err: errors.New("error 1"), - wantEvent: []corev1.Event{ + wantEvent: []eventsv1.Event{ { Type: corev1.EventTypeWarning, Reason: "DriftCorrectionFailed", - Message: `Failed to correct cluster state of release mock-ns/mock-release.v3: + Action: eventv1.ActionFailed, + Note: `Failed to correct cluster state of release mock-ns/mock-release.v3: error 1`, }, }, @@ -301,7 +308,7 @@ error 1`, { name: "empty change set", obj: mockObj.DeepCopy(), - wantEvent: []corev1.Event{}, + wantEvent: []eventsv1.Event{}, }, } @@ -309,12 +316,12 @@ error 1`, t.Run(tt.name, func(t *testing.T) { g := NewWithT(t) - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, false) r := &CorrectClusterDrift{ eventRecorder: recorder, } - r.report(tt.obj, tt.changeSet, tt.err) + r.report(tt.obj, nil, tt.changeSet, tt.err) g.Expect(recorder.GetEvents()).To(ConsistOf(tt.wantEvent)) }) } diff --git a/internal/reconcile/helmchart_template.go b/internal/reconcile/helmchart_template.go index 31700205c..59f6c51d1 100644 --- a/internal/reconcile/helmchart_template.go +++ b/internal/reconcile/helmchart_template.go @@ -25,12 +25,12 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" - "k8s.io/client-go/tools/record" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/apiutil" - eventv1 "github.com/fluxcd/pkg/apis/event/v1beta1" + eventv1 "github.com/fluxcd/pkg/apis/event/v1" + "github.com/fluxcd/pkg/runtime/events" "github.com/fluxcd/pkg/ssa" sourcev1 "github.com/fluxcd/source-controller/api/v1" @@ -62,13 +62,13 @@ import ( // not continue to attempt to create or update the v1.HelmChart. type HelmChartTemplate struct { client client.Client - eventRecorder record.EventRecorder + eventRecorder events.EventRecorder fieldManager string } // NewHelmChartTemplate returns a new HelmChartTemplate reconciler configured // with the provided values. -func NewHelmChartTemplate(client client.Client, recorder record.EventRecorder, fieldManager string) *HelmChartTemplate { +func NewHelmChartTemplate(client client.Client, recorder events.EventRecorder, fieldManager string) *HelmChartTemplate { return &HelmChartTemplate{ client: client, eventRecorder: recorder, @@ -92,7 +92,7 @@ func (r *HelmChartTemplate) Reconcile(ctx context.Context, req *Request) error { if (obj.Status.HelmChart != "" && obj.Status.HelmChart != chartRef.String()) || !obj.DeletionTimestamp.IsZero() { // If the HelmRelease is being deleted, we need to short-circuit to // avoid recreating the HelmChart. - if err := r.reconcileDelete(ctx, req.Object); err != nil || !obj.DeletionTimestamp.IsZero() { + if err := r.reconcileDelete(ctx, req.Object, req.Source); err != nil || !obj.DeletionTimestamp.IsZero() { return err } } @@ -100,7 +100,7 @@ func (r *HelmChartTemplate) Reconcile(ctx context.Context, req *Request) error { if mustCleanDeployedChart(obj) { // If the HelmRelease has a ChartRef and no Chart template, and the // HelmChart is present, we need to clean it up. - if err := r.reconcileDelete(ctx, req.Object); err != nil { + if err := r.reconcileDelete(ctx, req.Object, req.Source); err != nil { return err } return nil @@ -145,7 +145,7 @@ func (r *HelmChartTemplate) Reconcile(ctx context.Context, req *Request) error { entry, err := rm.Apply(ctx, u, ssa.DefaultApplyOptions()) if err != nil { err = fmt.Errorf("failed to run server-side apply: %w", err) - r.eventRecorder.Eventf(req.Object, eventv1.EventTypeTrace, "HelmChartSyncErr", "%s", err.Error()) + r.eventRecorder.Eventf(req.Object, req.Source, eventv1.EventTypeTrace, "HelmChartSyncErr", eventv1.ActionFailed, "%s", err.Error()) return err } @@ -158,8 +158,8 @@ func (r *HelmChartTemplate) Reconcile(ctx context.Context, req *Request) error { )) ctrl.LoggerFrom(ctx).Info(msg) - r.eventRecorder.Eventf(req.Object, eventv1.EventTypeTrace, - fmt.Sprintf("HelmChart%s", strings.Title(entry.Action.String())), "%s", msg) + r.eventRecorder.Eventf(req.Object, req.Source, eventv1.EventTypeTrace, + fmt.Sprintf("HelmChart%s", strings.Title(entry.Action.String())), entry.Action.String(), "%s", msg) case ssa.UnchangedAction: msg := fmt.Sprintf("%s with SourceRef '%s/%s/%s' is in-sync", entry.Subject, newChart.Spec.SourceRef.Kind, newChart.GetNamespace(), newChart.Spec.SourceRef.Name) @@ -178,7 +178,7 @@ func (r *HelmChartTemplate) Reconcile(ctx context.Context, req *Request) error { // reconcileDelete handles the garbage collection of the current HelmChart in // the Status object of the given HelmRelease. -func (r *HelmChartTemplate) reconcileDelete(ctx context.Context, obj *v2.HelmRelease) error { +func (r *HelmChartTemplate) reconcileDelete(ctx context.Context, obj *v2.HelmRelease, src sourcev1.Source) error { if !obj.Spec.Suspend && obj.Status.HelmChart != "" { ns, name := obj.Status.GetHelmChart() namespacedName := types.NamespacedName{Namespace: ns, Name: name} @@ -202,7 +202,7 @@ func (r *HelmChartTemplate) reconcileDelete(ctx context.Context, obj *v2.HelmRel err = fmt.Errorf("failed to delete HelmChart '%s': %w", obj.Status.HelmChart, err) return err } - r.eventRecorder.Eventf(obj, eventv1.EventTypeTrace, "HelmChartDeleted", "deleted HelmChart '%s'", obj.Status.HelmChart) + r.eventRecorder.Eventf(obj, src, eventv1.EventTypeTrace, "HelmChartDeleted", eventv1.ActionDeleted, "deleted HelmChart '%s'", obj.Status.HelmChart) } // Truncate the chart reference in the status object. diff --git a/internal/reconcile/helmchart_template_test.go b/internal/reconcile/helmchart_template_test.go index 69ee1bc07..f6506c046 100644 --- a/internal/reconcile/helmchart_template_test.go +++ b/internal/reconcile/helmchart_template_test.go @@ -27,16 +27,16 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" - "k8s.io/client-go/tools/record" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" "sigs.k8s.io/controller-runtime/pkg/client/interceptor" "github.com/fluxcd/pkg/apis/meta" - sourcev1 "github.com/fluxcd/source-controller/api/v1" + "github.com/fluxcd/pkg/runtime/events" v2 "github.com/fluxcd/helm-controller/api/v2" "github.com/fluxcd/helm-controller/internal/acl" + sourcev1 "github.com/fluxcd/source-controller/api/v1" ) func TestHelmChartTemplate_Reconcile(t *testing.T) { @@ -79,10 +79,9 @@ func TestHelmChartTemplate_Reconcile(t *testing.T) { g.Expect(testEnv.Cleanup(context.Background(), &existingChart)).To(Succeed()) }) - recorder := record.NewFakeRecorder(32) r := &HelmChartTemplate{ client: testEnv, - eventRecorder: recorder, + eventRecorder: events.NewFakeRecorder(32, false), fieldManager: testFieldManager, } @@ -135,7 +134,7 @@ func TestHelmChartTemplate_Reconcile(t *testing.T) { r := &HelmChartTemplate{ client: testEnv, - eventRecorder: record.NewFakeRecorder(32), + eventRecorder: events.NewFakeRecorder(32, false), fieldManager: testFieldManager, } @@ -180,10 +179,9 @@ func TestHelmChartTemplate_Reconcile(t *testing.T) { t.Run("HelmChart NotFound creates HelmChart", func(t *testing.T) { g := NewWithT(t) - recorder := record.NewFakeRecorder(32) r := &HelmChartTemplate{ client: testEnv, - eventRecorder: recorder, + eventRecorder: events.NewFakeRecorder(32, false), fieldManager: testFieldManager, } @@ -252,10 +250,9 @@ func TestHelmChartTemplate_Reconcile(t *testing.T) { g.Expect(testEnv.Cleanup(context.Background(), &existingChart)).To(Succeed()) }) - recorder := record.NewFakeRecorder(32) r := &HelmChartTemplate{ client: testEnv, - eventRecorder: recorder, + eventRecorder: events.NewFakeRecorder(32, false), fieldManager: testFieldManager, } @@ -323,10 +320,9 @@ func TestHelmChartTemplate_Reconcile(t *testing.T) { g.Expect(testEnv.Cleanup(context.Background(), existingChart)).To(Succeed()) }) - recorder := record.NewFakeRecorder(32) r := &HelmChartTemplate{ client: testEnv, - eventRecorder: recorder, + eventRecorder: events.NewFakeRecorder(32, false), fieldManager: testFieldManager, } @@ -366,10 +362,9 @@ func TestHelmChartTemplate_Reconcile(t *testing.T) { t.Run("sets owner labels on HelmChart", func(t *testing.T) { g := NewWithT(t) - recorder := record.NewFakeRecorder(32) r := &HelmChartTemplate{ client: testEnv, - eventRecorder: recorder, + eventRecorder: events.NewFakeRecorder(32, false), fieldManager: testFieldManager, } @@ -471,10 +466,9 @@ func TestHelmChartTemplate_Reconcile(t *testing.T) { g.Expect(testEnv.Cleanup(context.Background(), &existingChart)).To(Succeed()) }) - recorder := record.NewFakeRecorder(32) r := &HelmChartTemplate{ client: testEnv, - eventRecorder: recorder, + eventRecorder: events.NewFakeRecorder(32, false), fieldManager: testFieldManager, } @@ -515,10 +509,9 @@ func TestHelmChartTemplate_reconcileDelete(t *testing.T) { }, }) - recorder := record.NewFakeRecorder(32) r := &HelmChartTemplate{ client: builder.Build(), - eventRecorder: recorder, + eventRecorder: events.NewFakeRecorder(32, false), } obj := &v2.HelmRelease{ @@ -530,7 +523,13 @@ func TestHelmChartTemplate_reconcileDelete(t *testing.T) { HelmChart: "default/chart", }, } - err := r.reconcileDelete(context.TODO(), obj) + srcObj := &sourcev1.HelmChart{ + ObjectMeta: metav1.ObjectMeta{ + Name: "chart", + Namespace: "default", + }, + } + err := r.reconcileDelete(context.TODO(), obj, srcObj) g.Expect(err).ToNot(HaveOccurred()) g.Expect(obj.Status.HelmChart).To(BeEmpty()) @@ -558,7 +557,7 @@ func TestHelmChartTemplate_reconcileDelete(t *testing.T) { r := &HelmChartTemplate{ client: builder.Build(), - eventRecorder: record.NewFakeRecorder(32), + eventRecorder: events.NewFakeRecorder(32, false), } obj := &v2.HelmRelease{ @@ -570,7 +569,7 @@ func TestHelmChartTemplate_reconcileDelete(t *testing.T) { HelmChart: "default/chart", }, } - err := r.reconcileDelete(context.TODO(), obj) + err := r.reconcileDelete(context.TODO(), obj, nil) g.Expect(err).ToNot(HaveOccurred()) g.Expect(obj.Status.HelmChart).To(BeEmpty()) }) @@ -590,7 +589,13 @@ func TestHelmChartTemplate_reconcileDelete(t *testing.T) { HelmChart: "default/chart", }, } - err := r.reconcileDelete(context.TODO(), obj) + srcObj := &sourcev1.HelmChart{ + ObjectMeta: metav1.ObjectMeta{ + Name: "chart", + Namespace: "default", + }, + } + err := r.reconcileDelete(context.TODO(), obj, srcObj) g.Expect(err).ToNot(HaveOccurred()) g.Expect(obj.Status.HelmChart).To(BeEmpty()) }) @@ -607,10 +612,9 @@ func TestHelmChartTemplate_reconcileDelete(t *testing.T) { }, }) - recorder := record.NewFakeRecorder(32) r := &HelmChartTemplate{ client: builder.Build(), - eventRecorder: recorder, + eventRecorder: events.NewFakeRecorder(32, false), } obj := &v2.HelmRelease{ @@ -626,7 +630,13 @@ func TestHelmChartTemplate_reconcileDelete(t *testing.T) { HelmChart: "default/chart", }, } - err := r.reconcileDelete(context.TODO(), obj) + srcObj := &sourcev1.HelmChart{ + ObjectMeta: metav1.ObjectMeta{ + Name: "chart", + Namespace: "default", + }, + } + err := r.reconcileDelete(context.TODO(), obj, srcObj) g.Expect(err).ToNot(HaveOccurred()) g.Expect(obj.Status.HelmChart).ToNot(BeEmpty()) @@ -661,12 +671,18 @@ func TestHelmChartTemplate_reconcileDelete(t *testing.T) { HelmChart: "other/chart", }, } + srcObj := &sourcev1.HelmChart{ + ObjectMeta: metav1.ObjectMeta{ + Name: "chart", + Namespace: "default", + }, + } currentAllow := acl.AllowCrossNamespaceRef acl.AllowCrossNamespaceRef = false t.Cleanup(func() { acl.AllowCrossNamespaceRef = currentAllow }) - err := r.reconcileDelete(context.TODO(), obj) + err := r.reconcileDelete(context.TODO(), obj, srcObj) g.Expect(err).To(HaveOccurred()) g.Expect(obj.Status.HelmChart).ToNot(BeEmpty()) @@ -685,7 +701,10 @@ func TestHelmChartTemplate_reconcileDelete(t *testing.T) { obj := &v2.HelmRelease{ Status: v2.HelmReleaseStatus{}, } - err := r.reconcileDelete(context.TODO(), obj) + srcObj := &sourcev1.HelmChart{ + Status: sourcev1.HelmChartStatus{}, + } + err := r.reconcileDelete(context.TODO(), obj, srcObj) g.Expect(err).ToNot(HaveOccurred()) }) } diff --git a/internal/reconcile/install.go b/internal/reconcile/install.go index 58428604b..b1f6fe564 100644 --- a/internal/reconcile/install.go +++ b/internal/reconcile/install.go @@ -24,10 +24,10 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/tools/record" "github.com/fluxcd/pkg/chartutil" "github.com/fluxcd/pkg/runtime/conditions" + "github.com/fluxcd/pkg/runtime/events" v2 "github.com/fluxcd/helm-controller/api/v2" "github.com/fluxcd/helm-controller/internal/action" @@ -58,13 +58,13 @@ import ( // e.g. action.VerifySnapshot before calling Reconcile. type Install struct { configFactory *action.ConfigFactory - eventRecorder record.EventRecorder + eventRecorder events.EventRecorder defaultToRetryOnFailure bool } // NewInstall returns a new Install reconciler configured with the provided // values. -func NewInstall(cfg *action.ConfigFactory, recorder record.EventRecorder, defaultToRetryOnFailure bool) *Install { +func NewInstall(cfg *action.ConfigFactory, recorder events.EventRecorder, defaultToRetryOnFailure bool) *Install { return &Install{configFactory: cfg, eventRecorder: recorder, defaultToRetryOnFailure: defaultToRetryOnFailure} } @@ -72,7 +72,7 @@ func (r *Install) Reconcile(ctx context.Context, req *Request) error { var ( logBuf = action.NewDebugLogBuffer(ctx) obsReleases = make(observedReleases) - cfg = r.configFactory.Build(logBuf, observeRelease(obsReleases), observeInventory(req.Object, req.Chart, r.configFactory.Getter, r.eventRecorder)) + cfg = r.configFactory.Build(logBuf, observeRelease(obsReleases), observeInventory(req.Object, req.Source, req.Chart, r.configFactory.Getter, r.eventRecorder)) startTime = time.Now() ) @@ -161,10 +161,12 @@ func (r *Install) failure(req *Request, buffer *action.LogBuffer, err error) { // Condition summary. r.eventRecorder.AnnotatedEventf( req.Object, + req.Source, eventMeta(req.Chart.Metadata.Version, chartutil.DigestValues(digest.Canonical, req.Values).String(), addAppVersion(req.Chart.AppVersion()), addOCIDigest(req.Object.Status.LastAttemptedRevisionDigest)), corev1.EventTypeWarning, v2.InstallFailedReason, + string(v2.ReleaseActionInstall), "%s", eventMessageWithLog(msg, buffer), ) @@ -196,9 +198,11 @@ func (r *Install) success(req *Request) { // Record event. r.eventRecorder.AnnotatedEventf( req.Object, + req.Source, eventMeta(cur.ChartVersion, cur.ConfigDigest, addAppVersion(cur.AppVersion), addOCIDigest(cur.OCIDigest)), corev1.EventTypeNormal, v2.InstallSucceededReason, + string(v2.ReleaseActionInstall), "%s", msg, ) diff --git a/internal/reconcile/install_test.go b/internal/reconcile/install_test.go index 1150d3297..aaaa93815 100644 --- a/internal/reconcile/install_test.go +++ b/internal/reconcile/install_test.go @@ -32,15 +32,16 @@ import ( helmstorage "helm.sh/helm/v4/pkg/storage" helmdriver "helm.sh/helm/v4/pkg/storage/driver" corev1 "k8s.io/api/core/v1" + eventsv1 "k8s.io/api/events/v1" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/tools/record" "sigs.k8s.io/controller-runtime/pkg/client" - eventv1 "github.com/fluxcd/pkg/apis/event/v1beta1" + eventv1 "github.com/fluxcd/pkg/apis/event/v1" "github.com/fluxcd/pkg/apis/meta" "github.com/fluxcd/pkg/chartutil" "github.com/fluxcd/pkg/runtime/conditions" + "github.com/fluxcd/pkg/runtime/events" v2 "github.com/fluxcd/helm-controller/api/v2" "github.com/fluxcd/helm-controller/internal/action" @@ -48,6 +49,7 @@ import ( "github.com/fluxcd/helm-controller/internal/release" "github.com/fluxcd/helm-controller/internal/storage" "github.com/fluxcd/helm-controller/internal/testutil" + sourcev1 "github.com/fluxcd/source-controller/api/v1" ) func TestInstall_Reconcile(t *testing.T) { @@ -345,7 +347,7 @@ func TestInstall_Reconcile(t *testing.T) { cfg.Driver = tt.driver(cfg.Driver) } - recorder := new(record.FakeRecorder) + recorder := new(events.FakeRecorder) got := (NewInstall(cfg, recorder, false)).Reconcile(context.TODO(), &Request{ Object: obj, Chart: tt.chart, @@ -467,7 +469,7 @@ func TestInstall_Reconcile_withSubchartWithCRDs(t *testing.T) { store := helmstorage.Init(cfg.Driver) chart := testutil.BuildChartWithSubchartWithCRD() - recorder := new(record.FakeRecorder) + recorder := new(events.FakeRecorder) got := (NewInstall(cfg, recorder, false)).Reconcile(context.TODO(), &Request{ Object: obj, Chart: chart, @@ -528,6 +530,14 @@ func TestInstall_Reconcile_withSubchartWithCRDs(t *testing.T) { func TestInstall_failure(t *testing.T) { var ( obj = &v2.HelmRelease{ + TypeMeta: metav1.TypeMeta{ + Kind: v2.HelmReleaseKind, + APIVersion: v2.GroupVersion.String(), + }, + ObjectMeta: metav1.ObjectMeta{ + Name: mockReleaseName, + Namespace: mockReleaseNamespace, + }, Spec: v2.HelmReleaseSpec{ ReleaseName: mockReleaseName, TargetNamespace: mockReleaseNamespace, @@ -536,6 +546,16 @@ func TestInstall_failure(t *testing.T) { LastAttemptedRevisionDigest: "sha256:1234567890", }, } + source = &sourcev1.GitRepository{ + TypeMeta: metav1.TypeMeta{ + Kind: sourcev1.GitRepositoryKind, + APIVersion: sourcev1.GroupVersion.String(), + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "test-source", + Namespace: mockReleaseNamespace, + }, + } chrt = testutil.BuildChart() err = errors.New("installation error") ) @@ -543,12 +563,17 @@ func TestInstall_failure(t *testing.T) { t.Run("records failure", func(t *testing.T) { g := NewWithT(t) - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, true) r := &Install{ eventRecorder: recorder, } - req := &Request{Object: obj.DeepCopy(), Chart: chrt, Values: map[string]any{"foo": "bar"}} + req := &Request{ + Object: obj.DeepCopy(), + Source: source, + Chart: chrt, + Values: map[string]any{"foo": "bar"}, + } r.failure(req, nil, err) expectMsg := fmt.Sprintf(fmtInstallFailure, mockReleaseNamespace, mockReleaseName, chrt.Name(), @@ -558,11 +583,24 @@ func TestInstall_failure(t *testing.T) { *conditions.FalseCondition(v2.ReleasedCondition, v2.InstallFailedReason, "%s", expectMsg), })) g.Expect(req.Object.Status.Failures).To(Equal(int64(1))) - g.Expect(recorder.GetEvents()).To(ConsistOf([]corev1.Event{ + g.Expect(recorder.GetEvents()).To(ConsistOf([]eventsv1.Event{ { - Type: corev1.EventTypeWarning, - Reason: v2.InstallFailedReason, - Message: expectMsg, + Type: corev1.EventTypeWarning, + Reason: v2.InstallFailedReason, + Note: expectMsg, + Action: string(v2.ReleaseActionInstall), + Regarding: corev1.ObjectReference{ + Kind: v2.HelmReleaseKind, + APIVersion: v2.GroupVersion.String(), + Name: mockReleaseName, + Namespace: mockReleaseNamespace, + }, + Related: &corev1.ObjectReference{ + Kind: sourcev1.GitRepositoryKind, + APIVersion: sourcev1.GroupVersion.String(), + Name: "test-source", + Namespace: mockReleaseNamespace, + }, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ eventMetaGroupKey(metaOCIDigestKey): obj.Status.LastAttemptedRevisionDigest, @@ -578,7 +616,7 @@ func TestInstall_failure(t *testing.T) { t.Run("records failure with logs", func(t *testing.T) { g := NewWithT(t) - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, false) r := &Install{ eventRecorder: recorder, } @@ -591,7 +629,7 @@ func TestInstall_failure(t *testing.T) { events := recorder.GetEvents() g.Expect(events).To(HaveLen(1)) - g.Expect(events[0].Message).To(ContainSubstring(expectSubStr)) + g.Expect(events[0].Note).To(ContainSubstring(expectSubStr)) }) } @@ -603,24 +641,43 @@ func TestInstall_success(t *testing.T) { Chart: testutil.BuildChart(), }) obj = &v2.HelmRelease{ + TypeMeta: metav1.TypeMeta{ + Kind: v2.HelmReleaseKind, + APIVersion: v2.GroupVersion.String(), + }, + ObjectMeta: metav1.ObjectMeta{ + Name: mockReleaseName, + Namespace: mockReleaseNamespace, + }, Status: v2.HelmReleaseStatus{ History: v2.Snapshots{ release.ObservedToSnapshot(release.ObserveRelease(cur)), }, }, } + source = &sourcev1.GitRepository{ + TypeMeta: metav1.TypeMeta{ + Kind: sourcev1.GitRepositoryKind, + APIVersion: sourcev1.GroupVersion.String(), + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "test-source", + Namespace: mockReleaseNamespace, + }, + } ) t.Run("records success", func(t *testing.T) { g := NewWithT(t) - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, true) r := &Install{ eventRecorder: recorder, } req := &Request{ Object: obj.DeepCopy(), + Source: source, } r.success(req) @@ -631,11 +688,24 @@ func TestInstall_success(t *testing.T) { g.Expect(req.Object.Status.Conditions).To(conditions.MatchConditions([]metav1.Condition{ *conditions.TrueCondition(v2.ReleasedCondition, v2.InstallSucceededReason, "%s", expectMsg), })) - g.Expect(recorder.GetEvents()).To(ConsistOf([]corev1.Event{ + g.Expect(recorder.GetEvents()).To(ConsistOf([]eventsv1.Event{ { - Type: corev1.EventTypeNormal, - Reason: v2.InstallSucceededReason, - Message: expectMsg, + Type: corev1.EventTypeNormal, + Reason: v2.InstallSucceededReason, + Note: expectMsg, + Action: string(v2.ReleaseActionInstall), + Regarding: corev1.ObjectReference{ + Kind: v2.HelmReleaseKind, + APIVersion: v2.GroupVersion.String(), + Name: mockReleaseName, + Namespace: mockReleaseNamespace, + }, + Related: &corev1.ObjectReference{ + Kind: sourcev1.GitRepositoryKind, + APIVersion: sourcev1.GroupVersion.String(), + Name: "test-source", + Namespace: mockReleaseNamespace, + }, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ eventMetaGroupKey(eventv1.MetaRevisionKey): obj.Status.History.Latest().ChartVersion, @@ -650,7 +720,7 @@ func TestInstall_success(t *testing.T) { t.Run("clears failures if retry strategy is configured", func(t *testing.T) { g := NewWithT(t) - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, false) r := &Install{ eventRecorder: recorder, } @@ -676,7 +746,7 @@ func TestInstall_success(t *testing.T) { t.Run("records success with TestSuccess=False", func(t *testing.T) { g := NewWithT(t) - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, false) r := &Install{ eventRecorder: recorder, } diff --git a/internal/reconcile/reconcile.go b/internal/reconcile/reconcile.go index de98349a9..d9e56d076 100644 --- a/internal/reconcile/reconcile.go +++ b/internal/reconcile/reconcile.go @@ -23,6 +23,7 @@ import ( helmchart "helm.sh/helm/v4/pkg/chart/v2" v2 "github.com/fluxcd/helm-controller/api/v2" + v1 "github.com/fluxcd/source-controller/api/v1" ) const ( @@ -78,6 +79,8 @@ type Request struct { // Object is the Helm release to be reconciled, and describes the desired // state to the ActionReconciler. Object *v2.HelmRelease + // Source is the source object containing the HelmChart + Source v1.Source // Chart is the Helm chart to be installed or upgraded. Chart *helmchart.Chart // Values is the Helm chart values to be used for the installation or diff --git a/internal/reconcile/release.go b/internal/reconcile/release.go index 3bedcb54c..57d39b3a3 100644 --- a/internal/reconcile/release.go +++ b/internal/reconcile/release.go @@ -24,12 +24,13 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/cli-runtime/pkg/genericclioptions" - "k8s.io/client-go/tools/record" "sigs.k8s.io/controller-runtime/pkg/client" - eventv1 "github.com/fluxcd/pkg/apis/event/v1beta1" + eventv1 "github.com/fluxcd/pkg/apis/event/v1" "github.com/fluxcd/pkg/apis/meta" "github.com/fluxcd/pkg/runtime/conditions" + "github.com/fluxcd/pkg/runtime/events" + sourcev1 "github.com/fluxcd/source-controller/api/v1" helmchart "helm.sh/helm/v4/pkg/chart/v2" helmrelease "helm.sh/helm/v4/pkg/release" helmreleasev1 "helm.sh/helm/v4/pkg/release/v1" @@ -149,7 +150,7 @@ func observeRelease(observed observedReleases) storage.ObserveFunc { // observeInventory returns a storage.ObserveFunc that builds an inventory // from the release manifest and chart CRDs, and stores it in the HelmRelease // status. -func observeInventory(obj *v2.HelmRelease, chart *helmchart.Chart, getter genericclioptions.RESTClientGetter, recorder record.EventRecorder) storage.ObserveFunc { +func observeInventory(obj *v2.HelmRelease, src sourcev1.Source, chart *helmchart.Chart, getter genericclioptions.RESTClientGetter, recorder events.EventRecorder) storage.ObserveFunc { return func(rls helmrelease.Releaser) { rlsTyped, ok := rls.(*helmreleasev1.Release) if !ok { @@ -158,13 +159,13 @@ func observeInventory(obj *v2.HelmRelease, chart *helmchart.Chart, getter generi restCfg, err := getter.ToRESTConfig() if err != nil { - recorder.Eventf(obj, corev1.EventTypeWarning, v2.InventoryBuildFailedReason, + recorder.Eventf(obj, src, corev1.EventTypeWarning, v2.InventoryBuildFailedReason, eventv1.ActionFailed, "failed to build inventory for %s/%s: %s", obj.GetNamespace(), obj.GetName(), err.Error()) return } c, err := client.New(restCfg, client.Options{}) if err != nil { - recorder.Eventf(obj, corev1.EventTypeWarning, v2.InventoryBuildFailedReason, + recorder.Eventf(obj, src, corev1.EventTypeWarning, v2.InventoryBuildFailedReason, eventv1.ActionFailed, "failed to build inventory for %s/%s: %s", obj.GetNamespace(), obj.GetName(), err.Error()) return } @@ -172,17 +173,17 @@ func observeInventory(obj *v2.HelmRelease, chart *helmchart.Chart, getter generi inv := inventory.New() warnings, err := inventory.AddManifest(inv, rlsTyped.Manifest, rlsTyped.Namespace, c) if err != nil { - recorder.Eventf(obj, corev1.EventTypeWarning, v2.InventoryBuildFailedReason, + recorder.Eventf(obj, src, corev1.EventTypeWarning, v2.InventoryBuildFailedReason, eventv1.ActionFailed, "failed to build inventory for %s/%s: %s", obj.GetNamespace(), obj.GetName(), err.Error()) return } if len(warnings) > 0 { - recorder.Eventf(obj, corev1.EventTypeWarning, v2.NamespaceCheckSkippedReason, + recorder.Eventf(obj, src, corev1.EventTypeWarning, v2.NamespaceCheckSkippedReason, eventv1.ActionWaiting, "%s", strings.Join(warnings, "; ")) } if chart != nil { if err := inventory.AddCRDs(inv, chart); err != nil { - recorder.Eventf(obj, corev1.EventTypeWarning, v2.InventoryBuildFailedReason, + recorder.Eventf(obj, src, corev1.EventTypeWarning, v2.InventoryBuildFailedReason, eventv1.ActionFailed, "failed to build inventory for %s/%s: %s", obj.GetNamespace(), obj.GetName(), err.Error()) return } diff --git a/internal/reconcile/rollback_remediation.go b/internal/reconcile/rollback_remediation.go index b855d9777..18818df78 100644 --- a/internal/reconcile/rollback_remediation.go +++ b/internal/reconcile/rollback_remediation.go @@ -24,9 +24,9 @@ import ( helmrelease "helm.sh/helm/v4/pkg/release" helmreleasev1 "helm.sh/helm/v4/pkg/release/v1" corev1 "k8s.io/api/core/v1" - "k8s.io/client-go/tools/record" "github.com/fluxcd/pkg/runtime/conditions" + "github.com/fluxcd/pkg/runtime/events" v2 "github.com/fluxcd/helm-controller/api/v2" "github.com/fluxcd/helm-controller/internal/action" @@ -60,12 +60,12 @@ import ( // e.g. action.VerifySnapshot before calling Reconcile. type RollbackRemediation struct { configFactory *action.ConfigFactory - eventRecorder record.EventRecorder + eventRecorder events.EventRecorder } // NewRollbackRemediation returns a new RollbackRemediation reconciler // configured with the provided values. -func NewRollbackRemediation(configFactory *action.ConfigFactory, eventRecorder record.EventRecorder) *RollbackRemediation { +func NewRollbackRemediation(configFactory *action.ConfigFactory, eventRecorder events.EventRecorder) *RollbackRemediation { return &RollbackRemediation{ configFactory: configFactory, eventRecorder: eventRecorder, @@ -76,7 +76,7 @@ func (r *RollbackRemediation) Reconcile(ctx context.Context, req *Request) error var ( cur = req.Object.Status.History.Latest().DeepCopy() logBuf = action.NewDebugLogBuffer(ctx) - cfg = r.configFactory.Build(logBuf, observeRollback(req.Object), observeInventory(req.Object, req.Chart, r.configFactory.Getter, r.eventRecorder)) + cfg = r.configFactory.Build(logBuf, observeRollback(req.Object), observeInventory(req.Object, req.Source, req.Chart, r.configFactory.Getter, r.eventRecorder)) ) defer summarize(req) @@ -142,10 +142,12 @@ func (r *RollbackRemediation) failure(req *Request, prev *v2.Snapshot, buffer *a // Condition summary. r.eventRecorder.AnnotatedEventf( req.Object, + req.Source, eventMeta(prev.ChartVersion, chartutil.DigestValues(digest.Canonical, req.Values).String(), addAppVersion(prev.AppVersion), addOCIDigest(prev.OCIDigest)), corev1.EventTypeWarning, v2.RollbackFailedReason, + string(v2.ReleaseActionRollback), "%s", eventMessageWithLog(msg, buffer), ) @@ -163,10 +165,12 @@ func (r *RollbackRemediation) success(req *Request, prev *v2.Snapshot) { // Record event. r.eventRecorder.AnnotatedEventf( req.Object, + req.Source, eventMeta(prev.ChartVersion, chartutil.DigestValues(digest.Canonical, req.Values).String(), addAppVersion(prev.AppVersion), addOCIDigest(prev.OCIDigest)), corev1.EventTypeNormal, v2.RollbackSucceededReason, + string(v2.ReleaseActionRollback), "%s", msg, ) @@ -197,6 +201,7 @@ func observeRollback(obj *v2.HelmRelease) storage.ObserveFunc { } obs := release.ObserveRelease(rls) + obs.Action = v2.ReleaseActionRollback obj.Status.History = append(v2.Snapshots{release.ObservedToSnapshot(obs)}, obj.Status.History...) } } diff --git a/internal/reconcile/rollback_remediation_test.go b/internal/reconcile/rollback_remediation_test.go index 43c85ce85..3722e4cfc 100644 --- a/internal/reconcile/rollback_remediation_test.go +++ b/internal/reconcile/rollback_remediation_test.go @@ -31,12 +31,13 @@ import ( helmstorage "helm.sh/helm/v4/pkg/storage" helmdriver "helm.sh/helm/v4/pkg/storage/driver" corev1 "k8s.io/api/core/v1" + eventsv1 "k8s.io/api/events/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/tools/record" - eventv1 "github.com/fluxcd/pkg/apis/event/v1beta1" + eventv1 "github.com/fluxcd/pkg/apis/event/v1" "github.com/fluxcd/pkg/apis/meta" "github.com/fluxcd/pkg/runtime/conditions" + "github.com/fluxcd/pkg/runtime/events" "github.com/fluxcd/pkg/chartutil" @@ -195,7 +196,7 @@ func TestRollbackRemediation_Reconcile(t *testing.T) { }, expectHistory: func(releases []*helmrelease.Release) v2.Snapshots { return v2.Snapshots{ - release.ObservedToSnapshot(release.ObserveRelease(releases[2])), + observeReleaseWithAction(releases[2], v2.ReleaseActionRollback), release.ObservedToSnapshot(release.ObserveRelease(releases[1])), release.ObservedToSnapshot(release.ObserveRelease(releases[0])), } @@ -293,7 +294,7 @@ func TestRollbackRemediation_Reconcile(t *testing.T) { }, expectHistory: func(releases []*helmrelease.Release) v2.Snapshots { return v2.Snapshots{ - release.ObservedToSnapshot(release.ObserveRelease(releases[2])), + observeReleaseWithAction(releases[2], v2.ReleaseActionRollback), release.ObservedToSnapshot(release.ObserveRelease(releases[1])), release.ObservedToSnapshot(release.ObserveRelease(releases[0])), } @@ -394,7 +395,7 @@ func TestRollbackRemediation_Reconcile(t *testing.T) { cfg.Driver = tt.driver(cfg.Driver) } - recorder := new(record.FakeRecorder) + recorder := new(events.FakeRecorder) got := (NewRollbackRemediation(cfg, recorder)).Reconcile(context.TODO(), &Request{ Object: obj, }) @@ -446,7 +447,7 @@ func TestRollbackRemediation_failure(t *testing.T) { t.Run("records failure", func(t *testing.T) { g := NewWithT(t) - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, false) r := &RollbackRemediation{ eventRecorder: recorder, } @@ -462,11 +463,12 @@ func TestRollbackRemediation_failure(t *testing.T) { *conditions.FalseCondition(v2.RemediatedCondition, v2.RollbackFailedReason, "%s", expectMsg), })) g.Expect(req.Object.Status.Failures).To(Equal(int64(1))) - g.Expect(recorder.GetEvents()).To(ConsistOf([]corev1.Event{ + g.Expect(recorder.GetEvents()).To(ConsistOf([]eventsv1.Event{ { - Type: corev1.EventTypeWarning, - Reason: v2.RollbackFailedReason, - Message: expectMsg, + Type: corev1.EventTypeWarning, + Reason: v2.RollbackFailedReason, + Note: expectMsg, + Action: string(v2.ReleaseActionRollback), ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ eventMetaGroupKey(eventv1.MetaRevisionKey): prev.Chart.Metadata.Version, @@ -481,7 +483,7 @@ func TestRollbackRemediation_failure(t *testing.T) { t.Run("records failure with logs", func(t *testing.T) { g := NewWithT(t) - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, false) r := &RollbackRemediation{ eventRecorder: recorder, } @@ -494,7 +496,7 @@ func TestRollbackRemediation_failure(t *testing.T) { events := recorder.GetEvents() g.Expect(events).To(HaveLen(1)) - g.Expect(events[0].Message).To(ContainSubstring(expectSubStr)) + g.Expect(events[0].Note).To(ContainSubstring(expectSubStr)) }) } @@ -507,7 +509,7 @@ func TestRollbackRemediation_success(t *testing.T) { Version: 4, }) - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, false) r := &RollbackRemediation{ eventRecorder: recorder, } @@ -522,11 +524,12 @@ func TestRollbackRemediation_success(t *testing.T) { *conditions.TrueCondition(v2.RemediatedCondition, v2.RollbackSucceededReason, "%s", expectMsg), })) g.Expect(req.Object.Status.Failures).To(Equal(int64(0))) - g.Expect(recorder.GetEvents()).To(ConsistOf([]corev1.Event{ + g.Expect(recorder.GetEvents()).To(ConsistOf([]eventsv1.Event{ { - Type: corev1.EventTypeNormal, - Reason: v2.RollbackSucceededReason, - Message: expectMsg, + Type: corev1.EventTypeNormal, + Reason: v2.RollbackSucceededReason, + Action: string(v2.ReleaseActionRollback), + Note: expectMsg, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ eventMetaGroupKey(eventv1.MetaRevisionKey): prev.Chart.Metadata.Version, @@ -551,6 +554,7 @@ func Test_observeRollback(t *testing.T) { }) observeRollback(obj)(rls) expect := release.ObservedToSnapshot(release.ObserveRelease(rls)) + expect.Action = v2.ReleaseActionRollback g.Expect(obj.Status.History).To(testutil.Equal(v2.Snapshots{ expect, @@ -580,6 +584,7 @@ func Test_observeRollback(t *testing.T) { Status: helmreleasecommon.StatusPendingRollback, }) expect := release.ObservedToSnapshot(release.ObserveRelease(rls)) + expect.Action = v2.ReleaseActionRollback observeRollback(obj)(rls) g.Expect(obj.Status.History).To(testutil.Equal(v2.Snapshots{ diff --git a/internal/reconcile/test.go b/internal/reconcile/test.go index 56127834f..1a7785a5b 100644 --- a/internal/reconcile/test.go +++ b/internal/reconcile/test.go @@ -24,9 +24,10 @@ import ( helmrelease "helm.sh/helm/v4/pkg/release" helmreleasev1 "helm.sh/helm/v4/pkg/release/v1" corev1 "k8s.io/api/core/v1" - "k8s.io/client-go/tools/record" + eventv1 "github.com/fluxcd/pkg/apis/event/v1" "github.com/fluxcd/pkg/runtime/conditions" + "github.com/fluxcd/pkg/runtime/events" v2 "github.com/fluxcd/helm-controller/api/v2" "github.com/fluxcd/helm-controller/internal/action" @@ -61,11 +62,11 @@ import ( // e.g. action.VerifySnapshot before calling Reconcile. type Test struct { configFactory *action.ConfigFactory - eventRecorder record.EventRecorder + eventRecorder events.EventRecorder } // NewTest returns a new Test reconciler configured with the provided values. -func NewTest(cfg *action.ConfigFactory, recorder record.EventRecorder) *Test { +func NewTest(cfg *action.ConfigFactory, recorder events.EventRecorder) *Test { return &Test{configFactory: cfg, eventRecorder: recorder} } @@ -144,9 +145,11 @@ func (r *Test) failure(req *Request, err error) { // Condition summary. r.eventRecorder.AnnotatedEventf( req.Object, + req.Source, eventMeta(cur.ChartVersion, cur.ConfigDigest, addAppVersion(cur.AppVersion), addOCIDigest(cur.OCIDigest)), corev1.EventTypeWarning, v2.TestFailedReason, + eventv1.ActionFailed, "%s", msg, ) @@ -181,9 +184,11 @@ func (r *Test) success(req *Request) { // Record event. r.eventRecorder.AnnotatedEventf( req.Object, + req.Source, eventMeta(cur.ChartVersion, cur.ConfigDigest, addAppVersion(cur.AppVersion), addOCIDigest(cur.OCIDigest)), corev1.EventTypeNormal, v2.TestSucceededReason, + eventv1.ActionValidated, "%s", msg, ) diff --git a/internal/reconcile/test_test.go b/internal/reconcile/test_test.go index 346c6fcb4..d57964ac8 100644 --- a/internal/reconcile/test_test.go +++ b/internal/reconcile/test_test.go @@ -30,12 +30,13 @@ import ( helmstorage "helm.sh/helm/v4/pkg/storage" helmdriver "helm.sh/helm/v4/pkg/storage/driver" corev1 "k8s.io/api/core/v1" + eventsv1 "k8s.io/api/events/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/tools/record" - eventv1 "github.com/fluxcd/pkg/apis/event/v1beta1" + eventv1 "github.com/fluxcd/pkg/apis/event/v1" "github.com/fluxcd/pkg/apis/meta" "github.com/fluxcd/pkg/runtime/conditions" + "github.com/fluxcd/pkg/runtime/events" "github.com/fluxcd/pkg/chartutil" @@ -320,7 +321,7 @@ func TestTest_Reconcile(t *testing.T) { cfg.Driver = tt.driver(cfg.Driver) } - recorder := new(record.FakeRecorder) + recorder := new(events.FakeRecorder) got := (NewTest(cfg, recorder)).Reconcile(context.TODO(), &Request{ Object: obj, }) @@ -546,7 +547,7 @@ func TestTest_failure(t *testing.T) { t.Run("records failure", func(t *testing.T) { g := NewWithT(t) - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, false) r := &Test{ eventRecorder: recorder, } @@ -565,11 +566,12 @@ func TestTest_failure(t *testing.T) { g.Expect(req.Object.Status.Failures).To(Equal(int64(1))) g.Expect(req.Object.Status.InstallFailures).To(BeZero()) g.Expect(req.Object.Status.UpgradeFailures).To(BeZero()) - g.Expect(recorder.GetEvents()).To(ConsistOf([]corev1.Event{ + g.Expect(recorder.GetEvents()).To(ConsistOf([]eventsv1.Event{ { - Type: corev1.EventTypeWarning, - Reason: v2.TestFailedReason, - Message: expectMsg, + Type: corev1.EventTypeWarning, + Reason: v2.TestFailedReason, + Action: eventv1.ActionFailed, + Note: expectMsg, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ eventMetaGroupKey(eventv1.MetaRevisionKey): cur.Chart.Metadata.Version, @@ -584,7 +586,7 @@ func TestTest_failure(t *testing.T) { t.Run("increases remediation failure count", func(t *testing.T) { g := NewWithT(t) - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, false) r := &Test{ eventRecorder: recorder, } @@ -601,7 +603,7 @@ func TestTest_failure(t *testing.T) { t.Run("follows ignore failure instructions", func(t *testing.T) { g := NewWithT(t) - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, false) r := &Test{ eventRecorder: recorder, } @@ -636,7 +638,7 @@ func TestTest_success(t *testing.T) { ) t.Run("records success", func(t *testing.T) { - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, false) r := &Test{ eventRecorder: recorder, } @@ -662,11 +664,12 @@ func TestTest_success(t *testing.T) { *conditions.TrueCondition(v2.TestSuccessCondition, v2.TestSucceededReason, "%s", expectMsg), })) g.Expect(req.Object.Status.Failures).To(Equal(int64(0))) - g.Expect(recorder.GetEvents()).To(ConsistOf([]corev1.Event{ + g.Expect(recorder.GetEvents()).To(ConsistOf([]eventsv1.Event{ { - Type: corev1.EventTypeNormal, - Reason: v2.TestSucceededReason, - Message: expectMsg, + Type: corev1.EventTypeNormal, + Reason: v2.TestSucceededReason, + Action: eventv1.ActionValidated, + Note: expectMsg, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ eventMetaGroupKey(eventv1.MetaRevisionKey): cur.Chart.Metadata.Version, @@ -680,7 +683,7 @@ func TestTest_success(t *testing.T) { t.Run("records success without hooks", func(t *testing.T) { r := &Test{ - eventRecorder: new(testutil.FakeRecorder), + eventRecorder: new(events.FakeRecorder), } obj := obj.DeepCopy() diff --git a/internal/reconcile/uninstall.go b/internal/reconcile/uninstall.go index 3cd546c42..866e47420 100644 --- a/internal/reconcile/uninstall.go +++ b/internal/reconcile/uninstall.go @@ -27,9 +27,9 @@ import ( helmreleasev1 "helm.sh/helm/v4/pkg/release/v1" helmdriver "helm.sh/helm/v4/pkg/storage/driver" corev1 "k8s.io/api/core/v1" - "k8s.io/client-go/tools/record" "github.com/fluxcd/pkg/runtime/conditions" + "github.com/fluxcd/pkg/runtime/events" v2 "github.com/fluxcd/helm-controller/api/v2" "github.com/fluxcd/helm-controller/internal/action" @@ -69,12 +69,12 @@ import ( // e.g. action.VerifySnapshot before calling Reconcile. type Uninstall struct { configFactory *action.ConfigFactory - eventRecorder record.EventRecorder + eventRecorder events.EventRecorder } // NewUninstall returns a new Uninstall reconciler configured with the provided // values. -func NewUninstall(cfg *action.ConfigFactory, recorder record.EventRecorder) *Uninstall { +func NewUninstall(cfg *action.ConfigFactory, recorder events.EventRecorder) *Uninstall { return &Uninstall{configFactory: cfg, eventRecorder: recorder} } @@ -183,8 +183,10 @@ func (r *Uninstall) failure(req *Request, buffer *action.LogBuffer, err error) { // Condition summary. r.eventRecorder.AnnotatedEventf( req.Object, + req.Source, eventMeta(cur.ChartVersion, cur.ConfigDigest, addAppVersion(cur.AppVersion), addOCIDigest(cur.OCIDigest)), corev1.EventTypeWarning, v2.UninstallFailedReason, + string(v2.ReleaseActionUninstall), "%s", eventMessageWithLog(msg, buffer), ) @@ -208,9 +210,11 @@ func (r *Uninstall) success(req *Request) { // Condition summary. r.eventRecorder.AnnotatedEventf( req.Object, + req.Source, eventMeta(cur.ChartVersion, cur.ConfigDigest, addAppVersion(cur.AppVersion), addOCIDigest(cur.OCIDigest)), corev1.EventTypeNormal, v2.UninstallSucceededReason, + string(v2.ReleaseActionUninstall), "%s", msg, ) diff --git a/internal/reconcile/uninstall_remediation.go b/internal/reconcile/uninstall_remediation.go index 843a65d11..3c10ce352 100644 --- a/internal/reconcile/uninstall_remediation.go +++ b/internal/reconcile/uninstall_remediation.go @@ -24,9 +24,9 @@ import ( helmreleasev1 "helm.sh/helm/v4/pkg/release/v1" corev1 "k8s.io/api/core/v1" - "k8s.io/client-go/tools/record" "github.com/fluxcd/pkg/runtime/conditions" + "github.com/fluxcd/pkg/runtime/events" v2 "github.com/fluxcd/helm-controller/api/v2" "github.com/fluxcd/helm-controller/internal/action" @@ -68,12 +68,12 @@ var ( // e.g. action.VerifySnapshot before calling Reconcile. type UninstallRemediation struct { configFactory *action.ConfigFactory - eventRecorder record.EventRecorder + eventRecorder events.EventRecorder } // NewUninstallRemediation returns a new UninstallRemediation reconciler // configured with the provided values. -func NewUninstallRemediation(cfg *action.ConfigFactory, recorder record.EventRecorder) *UninstallRemediation { +func NewUninstallRemediation(cfg *action.ConfigFactory, recorder events.EventRecorder) *UninstallRemediation { return &UninstallRemediation{configFactory: cfg, eventRecorder: recorder} } @@ -159,9 +159,11 @@ func (r *UninstallRemediation) failure(req *Request, buffer *action.LogBuffer, e // Condition summary. r.eventRecorder.AnnotatedEventf( req.Object, + req.Source, eventMeta(cur.ChartVersion, cur.ConfigDigest, addAppVersion(cur.AppVersion), addOCIDigest(cur.OCIDigest)), corev1.EventTypeWarning, v2.UninstallFailedReason, + string(v2.ReleaseActionUninstallRemediation), "%s", eventMessageWithLog(msg, buffer), ) @@ -181,9 +183,11 @@ func (r *UninstallRemediation) success(req *Request) { // Record event. r.eventRecorder.AnnotatedEventf( req.Object, + req.Source, eventMeta(cur.ChartVersion, cur.ConfigDigest, addAppVersion(cur.AppVersion), addOCIDigest(cur.OCIDigest)), corev1.EventTypeNormal, v2.UninstallSucceededReason, + string(v2.ReleaseActionUninstallRemediation), "%s", msg, ) diff --git a/internal/reconcile/uninstall_remediation_test.go b/internal/reconcile/uninstall_remediation_test.go index 3179a1862..b1baf7f00 100644 --- a/internal/reconcile/uninstall_remediation_test.go +++ b/internal/reconcile/uninstall_remediation_test.go @@ -30,11 +30,12 @@ import ( helmstorage "helm.sh/helm/v4/pkg/storage" helmdriver "helm.sh/helm/v4/pkg/storage/driver" corev1 "k8s.io/api/core/v1" + eventsv1 "k8s.io/api/events/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/tools/record" - eventv1 "github.com/fluxcd/pkg/apis/event/v1beta1" + eventv1 "github.com/fluxcd/pkg/apis/event/v1" "github.com/fluxcd/pkg/runtime/conditions" + "github.com/fluxcd/pkg/runtime/events" "github.com/fluxcd/pkg/chartutil" @@ -390,7 +391,7 @@ func TestUninstallRemediation_Reconcile(t *testing.T) { cfg.Driver = tt.driver(cfg.Driver) } - recorder := new(record.FakeRecorder) + recorder := new(events.FakeRecorder) got := NewUninstallRemediation(cfg, recorder).Reconcile(context.TODO(), &Request{ Object: obj, }) @@ -442,7 +443,7 @@ func TestUninstallRemediation_failure(t *testing.T) { t.Run("records failure", func(t *testing.T) { g := NewWithT(t) - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, false) r := &UninstallRemediation{ eventRecorder: recorder, } @@ -459,11 +460,12 @@ func TestUninstallRemediation_failure(t *testing.T) { *conditions.FalseCondition(v2.RemediatedCondition, v2.UninstallFailedReason, "%s", expectMsg), })) g.Expect(req.Object.Status.Failures).To(Equal(int64(1))) - g.Expect(recorder.GetEvents()).To(ConsistOf([]corev1.Event{ + g.Expect(recorder.GetEvents()).To(ConsistOf([]eventsv1.Event{ { - Type: corev1.EventTypeWarning, - Reason: v2.UninstallFailedReason, - Message: expectMsg, + Type: corev1.EventTypeWarning, + Reason: v2.UninstallFailedReason, + Action: string(v2.ReleaseActionUninstallRemediation), + Note: expectMsg, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ eventMetaGroupKey(eventv1.MetaRevisionKey): cur.Chart.Metadata.Version, @@ -478,7 +480,7 @@ func TestUninstallRemediation_failure(t *testing.T) { t.Run("records failure with logs", func(t *testing.T) { g := NewWithT(t) - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, false) r := &UninstallRemediation{ eventRecorder: recorder, } @@ -491,7 +493,7 @@ func TestUninstallRemediation_failure(t *testing.T) { events := recorder.GetEvents() g.Expect(events).To(HaveLen(1)) - g.Expect(events[0].Message).To(ContainSubstring(expectSubStr)) + g.Expect(events[0].Note).To(ContainSubstring(expectSubStr)) }) } @@ -505,7 +507,7 @@ func TestUninstallRemediation_success(t *testing.T) { Version: 4, }) - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, false) r := &UninstallRemediation{ eventRecorder: recorder, } @@ -529,11 +531,12 @@ func TestUninstallRemediation_success(t *testing.T) { *conditions.TrueCondition(v2.RemediatedCondition, v2.UninstallSucceededReason, "%s", expectMsg), })) g.Expect(req.Object.Status.Failures).To(Equal(int64(0))) - g.Expect(recorder.GetEvents()).To(ConsistOf([]corev1.Event{ + g.Expect(recorder.GetEvents()).To(ConsistOf([]eventsv1.Event{ { - Type: corev1.EventTypeNormal, - Reason: v2.UninstallSucceededReason, - Message: expectMsg, + Type: corev1.EventTypeNormal, + Reason: v2.UninstallSucceededReason, + Action: string(v2.ReleaseActionUninstallRemediation), + Note: expectMsg, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ eventMetaGroupKey(eventv1.MetaRevisionKey): cur.Chart.Metadata.Version, diff --git a/internal/reconcile/uninstall_test.go b/internal/reconcile/uninstall_test.go index 29e8534e0..563f73c2e 100644 --- a/internal/reconcile/uninstall_test.go +++ b/internal/reconcile/uninstall_test.go @@ -30,12 +30,13 @@ import ( helmstorage "helm.sh/helm/v4/pkg/storage" helmdriver "helm.sh/helm/v4/pkg/storage/driver" corev1 "k8s.io/api/core/v1" + eventsv1 "k8s.io/api/events/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/tools/record" - eventv1 "github.com/fluxcd/pkg/apis/event/v1beta1" + eventv1 "github.com/fluxcd/pkg/apis/event/v1" "github.com/fluxcd/pkg/apis/meta" "github.com/fluxcd/pkg/runtime/conditions" + "github.com/fluxcd/pkg/runtime/events" "github.com/fluxcd/pkg/chartutil" @@ -535,7 +536,7 @@ func TestUninstall_Reconcile(t *testing.T) { cfg.Driver = tt.driver(cfg.Driver) } - recorder := new(record.FakeRecorder) + recorder := new(events.FakeRecorder) got := NewUninstall(cfg, recorder).Reconcile(context.TODO(), &Request{ Object: obj, }) @@ -593,7 +594,7 @@ func TestUninstall_failure(t *testing.T) { t.Run("records failure", func(t *testing.T) { g := NewWithT(t) - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, false) r := &Uninstall{ eventRecorder: recorder, } @@ -610,11 +611,12 @@ func TestUninstall_failure(t *testing.T) { *conditions.FalseCondition(v2.ReleasedCondition, v2.UninstallFailedReason, "%s", expectMsg), })) g.Expect(req.Object.Status.Failures).To(Equal(int64(1))) - g.Expect(recorder.GetEvents()).To(ConsistOf([]corev1.Event{ + g.Expect(recorder.GetEvents()).To(ConsistOf([]eventsv1.Event{ { - Type: corev1.EventTypeWarning, - Reason: v2.UninstallFailedReason, - Message: expectMsg, + Type: corev1.EventTypeWarning, + Reason: v2.UninstallFailedReason, + Action: string(v2.ReleaseActionUninstall), + Note: expectMsg, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ eventMetaGroupKey(eventv1.MetaRevisionKey): cur.Chart.Metadata.Version, @@ -629,7 +631,7 @@ func TestUninstall_failure(t *testing.T) { t.Run("records failure with logs", func(t *testing.T) { g := NewWithT(t) - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, false) r := &Uninstall{ eventRecorder: recorder, } @@ -642,7 +644,7 @@ func TestUninstall_failure(t *testing.T) { events := recorder.GetEvents() g.Expect(events).To(HaveLen(1)) - g.Expect(events[0].Message).To(ContainSubstring(expectSubStr)) + g.Expect(events[0].Note).To(ContainSubstring(expectSubStr)) }) } @@ -656,7 +658,7 @@ func TestUninstall_success(t *testing.T) { Version: 4, }) - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, false) r := &Uninstall{ eventRecorder: recorder, } @@ -679,11 +681,12 @@ func TestUninstall_success(t *testing.T) { *conditions.FalseCondition(v2.ReleasedCondition, v2.UninstallSucceededReason, "%s", expectMsg), })) g.Expect(req.Object.Status.Failures).To(Equal(int64(0))) - g.Expect(recorder.GetEvents()).To(ConsistOf([]corev1.Event{ + g.Expect(recorder.GetEvents()).To(ConsistOf([]eventsv1.Event{ { - Type: corev1.EventTypeNormal, - Reason: v2.UninstallSucceededReason, - Message: expectMsg, + Type: corev1.EventTypeNormal, + Reason: v2.UninstallSucceededReason, + Action: string(v2.ReleaseActionUninstall), + Note: expectMsg, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ eventMetaGroupKey(eventv1.MetaRevisionKey): cur.Chart.Metadata.Version, diff --git a/internal/reconcile/unlock.go b/internal/reconcile/unlock.go index c78a194eb..46c88894e 100644 --- a/internal/reconcile/unlock.go +++ b/internal/reconcile/unlock.go @@ -26,9 +26,10 @@ import ( helmreleasecommon "helm.sh/helm/v4/pkg/release/common" helmreleasev1 "helm.sh/helm/v4/pkg/release/v1" corev1 "k8s.io/api/core/v1" - "k8s.io/client-go/tools/record" + eventv1 "github.com/fluxcd/pkg/apis/event/v1" "github.com/fluxcd/pkg/runtime/conditions" + "github.com/fluxcd/pkg/runtime/events" v2 "github.com/fluxcd/helm-controller/api/v2" "github.com/fluxcd/helm-controller/internal/action" @@ -51,12 +52,12 @@ import ( // propagated to the Ready condition on the Request.Object. type Unlock struct { configFactory *action.ConfigFactory - eventRecorder record.EventRecorder + eventRecorder events.EventRecorder } // NewUnlock returns a new Unlock reconciler configured with the provided // values. -func NewUnlock(cfg *action.ConfigFactory, recorder record.EventRecorder) *Unlock { +func NewUnlock(cfg *action.ConfigFactory, recorder events.EventRecorder) *Unlock { return &Unlock{configFactory: cfg, eventRecorder: recorder} } @@ -121,9 +122,11 @@ func (r *Unlock) failure(req *Request, cur *v2.Snapshot, status helmreleasecommo // Record warning event. r.eventRecorder.AnnotatedEventf( req.Object, + req.Source, eventMeta(cur.ChartVersion, cur.ConfigDigest, addAppVersion(cur.AppVersion), addOCIDigest(cur.OCIDigest)), corev1.EventTypeWarning, "PendingRelease", + eventv1.ActionFailed, "%s", msg, ) @@ -141,9 +144,11 @@ func (r *Unlock) success(req *Request, cur *v2.Snapshot, status helmreleasecommo // Record event. r.eventRecorder.AnnotatedEventf( req.Object, + req.Source, eventMeta(cur.ChartVersion, cur.ConfigDigest, addAppVersion(cur.AppVersion), addOCIDigest(cur.OCIDigest)), corev1.EventTypeNormal, "PendingRelease", + eventv1.ActionValidated, "%s", msg, ) diff --git a/internal/reconcile/unlock_test.go b/internal/reconcile/unlock_test.go index 4a67b5a14..047667d46 100644 --- a/internal/reconcile/unlock_test.go +++ b/internal/reconcile/unlock_test.go @@ -30,12 +30,13 @@ import ( helmstorage "helm.sh/helm/v4/pkg/storage" helmdriver "helm.sh/helm/v4/pkg/storage/driver" corev1 "k8s.io/api/core/v1" + eventsv1 "k8s.io/api/events/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/tools/record" - eventv1 "github.com/fluxcd/pkg/apis/event/v1beta1" + eventv1 "github.com/fluxcd/pkg/apis/event/v1" "github.com/fluxcd/pkg/apis/meta" "github.com/fluxcd/pkg/runtime/conditions" + "github.com/fluxcd/pkg/runtime/events" "github.com/fluxcd/pkg/chartutil" @@ -338,7 +339,7 @@ func TestUnlock_Reconcile(t *testing.T) { cfg.Driver = tt.driver(cfg.Driver) } - recorder := new(record.FakeRecorder) + recorder := new(events.FakeRecorder) got := NewUnlock(cfg, recorder).Reconcile(context.TODO(), &Request{ Object: obj, }) @@ -380,8 +381,7 @@ func TestUnlock_failure(t *testing.T) { status = helmreleasecommon.StatusPendingInstall err = fmt.Errorf("unlock error") ) - - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, false) r := &Unlock{ eventRecorder: recorder, } @@ -398,11 +398,12 @@ func TestUnlock_failure(t *testing.T) { *conditions.FalseCondition(v2.ReleasedCondition, "PendingRelease", "%s", expectMsg), })) g.Expect(req.Object.Status.Failures).To(Equal(int64(1))) - g.Expect(recorder.GetEvents()).To(ConsistOf([]corev1.Event{ + g.Expect(recorder.GetEvents()).To(ConsistOf([]eventsv1.Event{ { - Type: corev1.EventTypeWarning, - Reason: "PendingRelease", - Message: expectMsg, + Type: corev1.EventTypeWarning, + Reason: "PendingRelease", + Action: eventv1.ActionFailed, + Note: expectMsg, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ eventMetaGroupKey(eventv1.MetaRevisionKey): cur.Chart.Metadata.Version, @@ -428,7 +429,7 @@ func TestUnlock_success(t *testing.T) { status = helmreleasecommon.StatusPendingInstall ) - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, false) r := &Unlock{ eventRecorder: recorder, } @@ -445,11 +446,12 @@ func TestUnlock_success(t *testing.T) { *conditions.FalseCondition(v2.ReleasedCondition, "PendingRelease", "%s", expectMsg), })) g.Expect(req.Object.Status.Failures).To(Equal(int64(0))) - g.Expect(recorder.GetEvents()).To(ConsistOf([]corev1.Event{ + g.Expect(recorder.GetEvents()).To(ConsistOf([]eventsv1.Event{ { - Type: corev1.EventTypeNormal, - Reason: "PendingRelease", - Message: expectMsg, + Type: corev1.EventTypeNormal, + Reason: "PendingRelease", + Action: eventv1.ActionValidated, + Note: expectMsg, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ eventMetaGroupKey(eventv1.MetaRevisionKey): cur.Chart.Metadata.Version, @@ -508,7 +510,7 @@ func TestUnlock_withOCIDigest(t *testing.T) { store := helmstorage.Init(cfg.Driver) g.Expect(store.Create(rls)).To(Succeed()) - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, false) got := NewUnlock(cfg, recorder).Reconcile(context.TODO(), &Request{ Object: obj, }) @@ -534,11 +536,12 @@ func TestUnlock_withOCIDigest(t *testing.T) { fmt.Sprintf("%s@%s", rls.Chart.Name(), rls.Chart.Metadata.Version), rls.Info.Status.String()) - g.Expect(recorder.GetEvents()).To(ConsistOf([]corev1.Event{ + g.Expect(recorder.GetEvents()).To(ConsistOf([]eventsv1.Event{ { - Type: corev1.EventTypeNormal, - Reason: "PendingRelease", - Message: expectMsg, + Type: corev1.EventTypeNormal, + Reason: "PendingRelease", + Action: eventv1.ActionValidated, + Note: expectMsg, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ eventMetaGroupKey(metaOCIDigestKey): expected.OCIDigest, diff --git a/internal/reconcile/upgrade.go b/internal/reconcile/upgrade.go index d5e43f3ba..ad38366f7 100644 --- a/internal/reconcile/upgrade.go +++ b/internal/reconcile/upgrade.go @@ -24,10 +24,10 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/tools/record" "github.com/fluxcd/pkg/chartutil" "github.com/fluxcd/pkg/runtime/conditions" + "github.com/fluxcd/pkg/runtime/events" v2 "github.com/fluxcd/helm-controller/api/v2" "github.com/fluxcd/helm-controller/internal/action" @@ -54,13 +54,13 @@ import ( // e.g. action.VerifySnapshot before calling Reconcile. type Upgrade struct { configFactory *action.ConfigFactory - eventRecorder record.EventRecorder + eventRecorder events.EventRecorder defaultToRetryOnFailure bool } // NewUpgrade returns a new Upgrade reconciler configured with the provided // values. -func NewUpgrade(cfg *action.ConfigFactory, recorder record.EventRecorder, defaultToRetryOnFailure bool) *Upgrade { +func NewUpgrade(cfg *action.ConfigFactory, recorder events.EventRecorder, defaultToRetryOnFailure bool) *Upgrade { return &Upgrade{configFactory: cfg, eventRecorder: recorder, defaultToRetryOnFailure: defaultToRetryOnFailure} } @@ -68,7 +68,7 @@ func (r *Upgrade) Reconcile(ctx context.Context, req *Request) error { var ( logBuf = action.NewDebugLogBuffer(ctx) obsReleases = make(observedReleases) - cfg = r.configFactory.Build(logBuf, observeRelease(obsReleases), observeInventory(req.Object, req.Chart, r.configFactory.Getter, r.eventRecorder)) + cfg = r.configFactory.Build(logBuf, observeRelease(obsReleases), observeInventory(req.Object, req.Source, req.Chart, r.configFactory.Getter, r.eventRecorder)) startTime = time.Now() ) @@ -151,10 +151,12 @@ func (r *Upgrade) failure(req *Request, buffer *action.LogBuffer, err error) { // Condition summary. r.eventRecorder.AnnotatedEventf( req.Object, + req.Source, eventMeta(req.Chart.Metadata.Version, chartutil.DigestValues(digest.Canonical, req.Values).String(), addAppVersion(req.Chart.AppVersion()), addOCIDigest(req.Object.Status.LastAttemptedRevisionDigest)), corev1.EventTypeWarning, v2.UpgradeFailedReason, + string(v2.ReleaseActionUpgrade), "%s", eventMessageWithLog(msg, buffer), ) @@ -186,9 +188,11 @@ func (r *Upgrade) success(req *Request) { // Record event. r.eventRecorder.AnnotatedEventf( req.Object, + req.Source, eventMeta(cur.ChartVersion, cur.ConfigDigest, addAppVersion(cur.AppVersion), addOCIDigest(cur.OCIDigest)), corev1.EventTypeNormal, v2.UpgradeSucceededReason, + string(v2.ReleaseActionUpgrade), "%s", msg, ) diff --git a/internal/reconcile/upgrade_test.go b/internal/reconcile/upgrade_test.go index 674c1b16f..799db4458 100644 --- a/internal/reconcile/upgrade_test.go +++ b/internal/reconcile/upgrade_test.go @@ -32,15 +32,16 @@ import ( helmstorage "helm.sh/helm/v4/pkg/storage" helmdriver "helm.sh/helm/v4/pkg/storage/driver" corev1 "k8s.io/api/core/v1" + eventsv1 "k8s.io/api/events/v1" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/tools/record" "sigs.k8s.io/controller-runtime/pkg/client" - eventv1 "github.com/fluxcd/pkg/apis/event/v1beta1" + eventv1 "github.com/fluxcd/pkg/apis/event/v1" "github.com/fluxcd/pkg/apis/meta" "github.com/fluxcd/pkg/chartutil" "github.com/fluxcd/pkg/runtime/conditions" + "github.com/fluxcd/pkg/runtime/events" v2 "github.com/fluxcd/helm-controller/api/v2" "github.com/fluxcd/helm-controller/internal/action" @@ -497,7 +498,7 @@ func TestUpgrade_Reconcile(t *testing.T) { cfg.Driver = tt.driver(cfg.Driver) } - recorder := new(record.FakeRecorder) + recorder := new(events.FakeRecorder) got := NewUpgrade(cfg, recorder, false).Reconcile(context.TODO(), &Request{ Object: obj, Chart: tt.chart, @@ -653,7 +654,7 @@ func TestUpgrade_Reconcile_withSubchartWithCRDs(t *testing.T) { _ = testEnv.Delete(context.TODO(), subChartCRD) chart := testutil.BuildChartWithSubchartWithCRD() - recorder := new(record.FakeRecorder) + recorder := new(events.FakeRecorder) got := NewUpgrade(cfg, recorder, false).Reconcile(context.TODO(), &Request{ Object: obj, Chart: chart, @@ -724,7 +725,7 @@ func TestUpgrade_failure(t *testing.T) { t.Run("records failure", func(t *testing.T) { g := NewWithT(t) - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, true) r := &Upgrade{ eventRecorder: recorder, } @@ -739,11 +740,12 @@ func TestUpgrade_failure(t *testing.T) { *conditions.FalseCondition(v2.ReleasedCondition, v2.UpgradeFailedReason, "%s", expectMsg), })) g.Expect(req.Object.Status.Failures).To(Equal(int64(1))) - g.Expect(recorder.GetEvents()).To(ConsistOf([]corev1.Event{ + g.Expect(recorder.GetEvents()).To(ConsistOf([]eventsv1.Event{ { - Type: corev1.EventTypeWarning, - Reason: v2.UpgradeFailedReason, - Message: expectMsg, + Type: corev1.EventTypeWarning, + Reason: v2.UpgradeFailedReason, + Action: string(v2.ReleaseActionUpgrade), + Note: expectMsg, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ eventMetaGroupKey(metaOCIDigestKey): obj.Status.LastAttemptedRevisionDigest, @@ -759,7 +761,7 @@ func TestUpgrade_failure(t *testing.T) { t.Run("records failure with logs", func(t *testing.T) { g := NewWithT(t) - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, false) r := &Upgrade{ eventRecorder: recorder, } @@ -772,7 +774,7 @@ func TestUpgrade_failure(t *testing.T) { events := recorder.GetEvents() g.Expect(events).To(HaveLen(1)) - g.Expect(events[0].Message).To(ContainSubstring(expectSubStr)) + g.Expect(events[0].Note).To(ContainSubstring(expectSubStr)) }) } @@ -795,7 +797,7 @@ func TestUpgrade_success(t *testing.T) { t.Run("records success", func(t *testing.T) { g := NewWithT(t) - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, true) r := &Upgrade{ eventRecorder: recorder, } @@ -812,11 +814,12 @@ func TestUpgrade_success(t *testing.T) { g.Expect(req.Object.Status.Conditions).To(conditions.MatchConditions([]metav1.Condition{ *conditions.TrueCondition(v2.ReleasedCondition, v2.UpgradeSucceededReason, "%s", expectMsg), })) - g.Expect(recorder.GetEvents()).To(ConsistOf([]corev1.Event{ + g.Expect(recorder.GetEvents()).To(ConsistOf([]eventsv1.Event{ { - Type: corev1.EventTypeNormal, - Reason: v2.UpgradeSucceededReason, - Message: expectMsg, + Type: corev1.EventTypeNormal, + Reason: v2.UpgradeSucceededReason, + Action: string(v2.ReleaseActionUpgrade), + Note: expectMsg, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ eventMetaGroupKey(eventv1.MetaRevisionKey): obj.Status.History.Latest().ChartVersion, @@ -831,7 +834,7 @@ func TestUpgrade_success(t *testing.T) { t.Run("clears failures if retry strategy is configured", func(t *testing.T) { g := NewWithT(t) - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, false) r := &Upgrade{ eventRecorder: recorder, } @@ -857,7 +860,7 @@ func TestUpgrade_success(t *testing.T) { t.Run("records success with TestSuccess=False", func(t *testing.T) { g := NewWithT(t) - recorder := testutil.NewFakeRecorder(10, false) + recorder := events.NewFakeRecorder(10, false) r := &Upgrade{ eventRecorder: recorder, } diff --git a/internal/testutil/fake_recorder.go b/internal/testutil/fake_recorder.go deleted file mode 100644 index d64b0bb3a..000000000 --- a/internal/testutil/fake_recorder.go +++ /dev/null @@ -1,117 +0,0 @@ -/* -Copyright 2022 The Flux 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 testutil - -import ( - "fmt" - - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/runtime" - - _ "k8s.io/client-go/tools/record" -) - -// FakeRecorder is used as a fake during tests. -// -// It was invented to be used in tests which require more precise control over -// e.g. assertions of specific event fields like Reason. For which string -// comparisons on the concentrated event message using record.FakeRecorder is -// not sufficient. -// -// To empty the Events channel into a slice of the recorded events, use -// GetEvents(). Not initializing Events will cause the recorder to not record -// any messages. -type FakeRecorder struct { - Events chan corev1.Event - IncludeObject bool -} - -// NewFakeRecorder creates new fake event recorder with an Events channel with -// the given size. Setting includeObject to true will cause the recorder to -// include the object reference in the events. -// -// To initialize a recorder which does not record any events, simply use: -// -// recorder := new(FakeRecorder) -func NewFakeRecorder(bufferSize int, includeObject bool) *FakeRecorder { - return &FakeRecorder{ - Events: make(chan corev1.Event, bufferSize), - IncludeObject: includeObject, - } -} - -// Event emits an event with the given message. -func (f *FakeRecorder) Event(obj runtime.Object, eventType, reason, message string) { - f.Eventf(obj, eventType, reason, "%s", message) -} - -// Eventf emits an event with the given message. -func (f *FakeRecorder) Eventf(obj runtime.Object, eventType, reason, message string, args ...any) { - if f.Events != nil { - f.Events <- f.generateEvent(obj, nil, eventType, reason, message, args...) - } -} - -// AnnotatedEventf emits an event with annotations. -func (f *FakeRecorder) AnnotatedEventf(obj runtime.Object, annotations map[string]string, eventType, reason, message string, args ...any) { - if f.Events != nil { - f.Events <- f.generateEvent(obj, annotations, eventType, reason, message, args...) - } -} - -// GetEvents empties the Events channel and returns a slice of recorded events. -// If the Events channel is nil, it returns nil. -func (f *FakeRecorder) GetEvents() (events []corev1.Event) { - if f.Events != nil { - for { - select { - case e := <-f.Events: - events = append(events, e) - default: - return events - } - } - } - return nil -} - -// generateEvent generates a new mocked event with the given parameters. -func (f *FakeRecorder) generateEvent(obj runtime.Object, annotations map[string]string, eventType, reason, message string, args ...any) corev1.Event { - event := corev1.Event{ - InvolvedObject: objectReference(obj, f.IncludeObject), - Type: eventType, - Reason: reason, - Message: fmt.Sprintf(message, args...), - } - if annotations != nil { - event.ObjectMeta.Annotations = annotations - } - return event -} - -// objectReference returns an object reference for the given object with the -// kind and (group) API version set. -func objectReference(obj runtime.Object, includeObject bool) corev1.ObjectReference { - if !includeObject { - return corev1.ObjectReference{} - } - - return corev1.ObjectReference{ - Kind: obj.GetObjectKind().GroupVersionKind().Kind, - APIVersion: obj.GetObjectKind().GroupVersionKind().GroupVersion().String(), - } -} diff --git a/main.go b/main.go index a2153982e..21c9e2872 100644 --- a/main.go +++ b/main.go @@ -321,8 +321,8 @@ func main() { probes.SetupChecks(mgr, setupLog) metricsH := helper.NewMetrics(mgr, metrics.MustMakeRecorder(), v2.HelmReleaseFinalizer) - var eventRecorder *events.Recorder - if eventRecorder, err = events.NewRecorder(mgr, ctrl.Log, eventsAddr, controllerName); err != nil { + eventRecorder, err := events.NewRecorder(ctrl.Log, eventsAddr, controllerName, events.WithManager(mgr)) + if err != nil { setupLog.Error(err, "unable to create event recorder") os.Exit(1) }