Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package istioctl for openSUSE:Factory checked in at 2025-05-31 19:17:35 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/istioctl (Old) and /work/SRC/openSUSE:Factory/.istioctl.new.16005 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "istioctl" Sat May 31 19:17:35 2025 rev:35 rq:1281591 version:1.26.1 Changes: -------- --- /work/SRC/openSUSE:Factory/istioctl/istioctl.changes 2025-05-09 18:52:01.010722729 +0200 +++ /work/SRC/openSUSE:Factory/.istioctl.new.16005/istioctl.changes 2025-05-31 19:18:35.771066322 +0200 @@ -1,0 +2,10 @@ +Sat May 31 07:05:33 UTC 2025 - Johannes Kastl <opensuse_buildserv...@ojkastl.de> + +- update to 1.26.1: + https://istio.io/latest/news/releases/1.26.x/announcing-1.26.1/ + * Changes + - Fixed false positives when istioctl analyze raised error IST0134 + even when PILOT_ENABLE_IP_AUTOALLOCATE was set to true. + (Issue #56083) + +------------------------------------------------------------------- Old: ---- istioctl-1.26.0.obscpio New: ---- istioctl-1.26.1.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ istioctl.spec ++++++ --- /var/tmp/diff_new_pack.7e3C7D/_old 2025-05-31 19:18:36.915114515 +0200 +++ /var/tmp/diff_new_pack.7e3C7D/_new 2025-05-31 19:18:36.919114684 +0200 @@ -17,7 +17,7 @@ Name: istioctl -Version: 1.26.0 +Version: 1.26.1 Release: 0 Summary: CLI for the istio servic mesh in Kubernetes License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.7e3C7D/_old 2025-05-31 19:18:36.955116200 +0200 +++ /var/tmp/diff_new_pack.7e3C7D/_new 2025-05-31 19:18:36.955116200 +0200 @@ -3,7 +3,7 @@ <param name="url">https://github.com/istio/istio</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">1.26.0</param> + <param name="revision">1.26.1</param> <param name="versionformat">@PARENT_TAG@</param> <param name="changesgenerate">disable</param> <param name="filename">istioctl</param> ++++++ istioctl-1.26.0.obscpio -> istioctl-1.26.1.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istioctl-1.26.0/go.mod new/istioctl-1.26.1/go.mod --- old/istioctl-1.26.0/go.mod 2025-05-06 20:19:44.000000000 +0200 +++ new/istioctl-1.26.1/go.mod 2025-05-27 19:44:34.000000000 +0200 @@ -44,7 +44,7 @@ github.com/howardjohn/unshare-go v0.5.0 github.com/lestrrat-go/jwx v1.2.30 github.com/mattn/go-isatty v0.0.20 - github.com/miekg/dns v1.1.64 + github.com/miekg/dns v1.1.65 github.com/mitchellh/copystructure v1.2.0 github.com/moby/buildkit v0.20.1 github.com/onsi/gomega v1.36.2 @@ -79,10 +79,10 @@ go.opentelemetry.io/proto/otlp v1.5.0 go.uber.org/atomic v1.11.0 go.uber.org/zap v1.27.0 - golang.org/x/net v0.38.0 + golang.org/x/net v0.39.0 golang.org/x/oauth2 v0.28.0 - golang.org/x/sync v0.12.0 - golang.org/x/sys v0.31.0 + golang.org/x/sync v0.13.0 + golang.org/x/sys v0.32.0 golang.org/x/time v0.11.0 gomodules.xyz/jsonpatch/v2 v2.5.0 google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463 @@ -92,7 +92,7 @@ gopkg.in/natefinch/lumberjack.v2 v2.2.1 gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.1 - helm.sh/helm/v3 v3.17.1 + helm.sh/helm/v3 v3.17.3 istio.io/api v1.26.0-beta.0 istio.io/client-go v1.26.0-beta.0 k8s.io/api v0.32.3 @@ -105,7 +105,7 @@ k8s.io/kubectl v0.32.3 k8s.io/utils v0.0.0-20241210054802-24370beab758 sigs.k8s.io/controller-runtime v0.20.4 - sigs.k8s.io/gateway-api v1.3.0-rc.1.0.20250404104637-92efbedcc2b4 + sigs.k8s.io/gateway-api v1.3.0 sigs.k8s.io/mcs-api v0.1.1-0.20240624222831-d7001fe1d21c sigs.k8s.io/yaml v1.4.0 ) @@ -208,11 +208,11 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect go.uber.org/mock v0.5.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.36.0 // indirect + golang.org/x/crypto v0.37.0 // indirect golang.org/x/exp v0.0.0-20241215155358-4a5509556b9e // indirect golang.org/x/mod v0.23.0 // indirect - golang.org/x/term v0.30.0 // indirect - golang.org/x/text v0.23.0 // indirect + golang.org/x/term v0.31.0 // indirect + golang.org/x/text v0.24.0 // indirect golang.org/x/tools v0.30.0 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect @@ -223,5 +223,5 @@ sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect sigs.k8s.io/kustomize/api v0.18.0 // indirect sigs.k8s.io/kustomize/kyaml v0.18.1 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.7.0 // indirect ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istioctl-1.26.0/go.sum new/istioctl-1.26.1/go.sum --- old/istioctl-1.26.0/go.sum 2025-05-06 20:19:44.000000000 +0200 +++ new/istioctl-1.26.1/go.sum 2025-05-27 19:44:34.000000000 +0200 @@ -300,8 +300,8 @@ github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/miekg/dns v1.1.64 h1:wuZgD9wwCE6XMT05UU/mlSko71eRSXEAm2EbjQXLKnQ= -github.com/miekg/dns v1.1.64/go.mod h1:Dzw9769uoKVaLuODMDZz9M6ynFU6Em65csPuoi8G0ck= +github.com/miekg/dns v1.1.65 h1:0+tIPHzUW0GCge7IiK3guGP57VAw7hoPDfApjkMD1Fc= +github.com/miekg/dns v1.1.65/go.mod h1:Dzw9769uoKVaLuODMDZz9M6ynFU6Em65csPuoi8G0ck= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= @@ -499,8 +499,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= -golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= +golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= +golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20241215155358-4a5509556b9e h1:4qufH0hlUYs6AO6XmZC3GqfDPGSXHVXUFR6OND+iJX4= golang.org/x/exp v0.0.0-20241215155358-4a5509556b9e/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c= @@ -520,8 +520,8 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= -golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= +golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc= golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= @@ -530,8 +530,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= -golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= +golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -544,14 +544,14 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= -golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= -golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= +golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= +golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= +golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= -golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= +golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -613,8 +613,8 @@ gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -helm.sh/helm/v3 v3.17.1 h1:gzVoAD+qVuoJU6KDMSAeo0xRJ6N1znRxz3wyuXRmJDk= -helm.sh/helm/v3 v3.17.1/go.mod h1:nvreuhuR+j78NkQcLC3TYoprCKStLyw5P4T7E5itv2w= +helm.sh/helm/v3 v3.17.3 h1:3n5rW3D0ArjFl0p4/oWO8IbY/HKaNNwJtOQFdH2AZHg= +helm.sh/helm/v3 v3.17.3/go.mod h1:+uJKMH/UiMzZQOALR3XUf3BLIoczI2RKKD6bMhPh4G8= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= istio.io/api v1.26.0-beta.0 h1:m1WxHjHdAOrjuz0YzSFgzlKRmf3hvVmspkWTM6FX/po= @@ -647,8 +647,8 @@ sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.1/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= sigs.k8s.io/controller-runtime v0.20.4 h1:X3c+Odnxz+iPTRobG4tp092+CvBU9UK0t/bRf+n0DGU= sigs.k8s.io/controller-runtime v0.20.4/go.mod h1:xg2XB0K5ShQzAgsoujxuKN4LNXR2LfwwHsPj7Iaw+XY= -sigs.k8s.io/gateway-api v1.3.0-rc.1.0.20250404104637-92efbedcc2b4 h1:B5WxrbbwAJQpC5UatORrm0MArdaQgj2NhAlMRQwAqho= -sigs.k8s.io/gateway-api v1.3.0-rc.1.0.20250404104637-92efbedcc2b4/go.mod h1:uM5idPTEQZVyd0bRSu00mbtF4VEgraPyU1OFNbY6lqk= +sigs.k8s.io/gateway-api v1.3.0 h1:q6okN+/UKDATola4JY7zXzx40WO4VISk7i9DIfOvr9M= +sigs.k8s.io/gateway-api v1.3.0/go.mod h1:d8NV8nJbaRbEKem+5IuxkL8gJGOZ+FJ+NvOIltV8gDk= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= sigs.k8s.io/kustomize/api v0.18.0 h1:hTzp67k+3NEVInwz5BHyzc9rGxIauoXferXyjv5lWPo= @@ -659,7 +659,7 @@ sigs.k8s.io/mcs-api v0.1.1-0.20240624222831-d7001fe1d21c/go.mod h1:DPFniRsBzCeLB4ANjlPEvQQt9QGIX489d1faK+GPvI4= sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016 h1:kXv6kKdoEtedwuqMmkqhbkgvYKeycVbC8+iPCP9j5kQ= sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/structured-merge-diff/v4 v4.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW1TdblaLVAc= -sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= +sigs.k8s.io/structured-merge-diff/v4 v4.7.0 h1:qPeWmscJcXP0snki5IYF79Z8xrl8ETFxgMd7wez1XkI= +sigs.k8s.io/structured-merge-diff/v4 v4.7.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istioctl-1.26.0/istio.deps new/istioctl-1.26.1/istio.deps --- old/istioctl-1.26.0/istio.deps 2025-05-06 20:19:44.000000000 +0200 +++ new/istioctl-1.26.1/istio.deps 2025-05-27 19:44:34.000000000 +0200 @@ -4,13 +4,13 @@ "name": "PROXY_REPO_SHA", "repoName": "proxy", "file": "", - "lastStableSHA": "71a753428f4479887db4b686ca9d01cfc6e11068" + "lastStableSHA": "19d31b12e62848c5e9f3f786c6c9a650ebc00b64" }, { "_comment": "", "name": "ZTUNNEL_REPO_SHA", "repoName": "ztunnel", "file": "", - "lastStableSHA": "2f601957bd172b34990612f4d8f847cadf4e880d" + "lastStableSHA": "c5c31102fd1ddefe95bf3c40dbbe36652dcd7889" } ] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istioctl-1.26.0/operator/cmd/mesh/manifest-translate.go new/istioctl-1.26.1/operator/cmd/mesh/manifest-translate.go --- old/istioctl-1.26.0/operator/cmd/mesh/manifest-translate.go 2025-05-06 20:19:44.000000000 +0200 +++ new/istioctl-1.26.1/operator/cmd/mesh/manifest-translate.go 2025-05-27 19:44:34.000000000 +0200 @@ -25,6 +25,8 @@ "github.com/spf13/cobra" "istio.io/istio/istioctl/pkg/cli" + "istio.io/istio/operator/pkg/component" + "istio.io/istio/operator/pkg/manifest" "istio.io/istio/operator/pkg/render" "istio.io/istio/operator/pkg/util/clog" "istio.io/istio/pkg/kube" @@ -110,11 +112,14 @@ if err != nil { return err } + generatedManifestMap := make(map[component.Name]manifest.ManifestSet) + for _, m := range istioctlGeneratedManifests { + generatedManifestMap[m.Component] = m + } res, err := render.Migrate(mgArgs.InFilenames, setFlags, kubeClient) if err != nil { return err } - _ = res out := mgArgs.Output write := func(name string, contents string) error { perm := 0o644 @@ -124,7 +129,7 @@ return os.WriteFile(filepath.Join(out, name), []byte(contents), fs.FileMode(perm)) } results := []string{} - for idx, info := range res.Components { + for _, info := range res.Components { name := ptr.NonEmptyOrDefault(info.ComponentSpec.Name, info.Component.SpecName) if info.Component.ReleaseName == "" { results = append(results, fmt.Sprintf(`* ❌ **Component %s**: migration is **NOT** directly supported!`, @@ -158,7 +163,11 @@ } diffWarn := "" helmManifests := strings.Join(sortManifests(info.Manifest), "\n---\n") - istioctlManifests := strings.Join(sortManifests(istioctlGeneratedManifests[idx].Manifests), "\n---\n") + generatedManifest, ok := generatedManifestMap[info.Component.UserFacingName] + if !ok { + continue + } + istioctlManifests := strings.Join(sortManifests(generatedManifest.Manifests), "\n---\n") if helmManifests != istioctlManifests { helmName := fmt.Sprintf("diff-%s-helm-output.yaml", name) istioctlName := fmt.Sprintf("diff-%s-istioctl-output.yaml", name) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istioctl-1.26.0/pilot/pkg/bootstrap/istio_ca.go new/istioctl-1.26.1/pilot/pkg/bootstrap/istio_ca.go --- old/istioctl-1.26.0/pilot/pkg/bootstrap/istio_ca.go 2025-05-06 20:19:44.000000000 +0200 +++ new/istioctl-1.26.1/pilot/pkg/bootstrap/istio_ca.go 2025-05-27 19:44:34.000000000 +0200 @@ -263,13 +263,24 @@ return nil } - signingKeyFile := path.Join(dir, ca.CAPrivateKeyFile) - if _, err := os.Stat(signingKeyFile); err == nil { + // Skip remote fetch if a complete CA bundle is already mounted + signingCABundleComplete, bundleExists, err := checkCABundleCompleteness( + path.Join(dir, ca.CAPrivateKeyFile), + path.Join(dir, ca.CACertFile), + path.Join(dir, ca.RootCertFile), + []string{path.Join(dir, ca.CertChainFile)}, + ) + if err != nil && !os.IsNotExist(err) { + return fmt.Errorf("error loading remote CA certs: %w", err) + } + if signingCABundleComplete { return nil - } else if !os.IsNotExist(err) { - return fmt.Errorf("signing key file %s already exists", signingKeyFile) + } + if bundleExists { + log.Warnf("incomplete signing CA bundle detected at %s", dir) } + // if locally mounted signing bundle not found or is incomplete, try loading from remote cluster secrets secret, err := s.kubeClient.Kube().CoreV1().Secrets(caOpts.Namespace).Get( context.TODO(), ca.CACertsSecret, metav1.GetOptions{}) if err != nil { @@ -279,6 +290,9 @@ return err } + // TODO(deveshdama): writing cacerts files from remote cluster will always fail, + // since etc/cacerts is mounted as readonly volume + // tracking issue: https://github.com/istio/istio/issues/55698 log.Infof("cacerts Secret found in config cluster, saving contents to %s", dir) if err := os.MkdirAll(dir, 0o700); err != nil { return err @@ -427,7 +441,7 @@ // which may contain multiple roots. A 'cert-chain.pem' file has the full cert chain. func (s *Server) createIstioCA(opts *caOptions) (*ca.IstioCA, error) { var caOpts *ca.IstioCAOptions - var detectedSigningCABundle bool + var signingCABundleComplete bool var istioGenerated bool var err error @@ -435,14 +449,28 @@ if err != nil { return nil, fmt.Errorf("unable to determine signing file format %v", err) } - if _, err := os.Stat(fileBundle.SigningKeyFile); err == nil { - detectedSigningCABundle = true + + signingCABundleComplete, bundleExists, err := checkCABundleCompleteness( + fileBundle.SigningKeyFile, + fileBundle.SigningCertFile, + fileBundle.RootCertFile, + fileBundle.CertChainFiles, + ) + if err != nil { + return nil, fmt.Errorf("failed to create an istiod CA: %w", err) + } + if !signingCABundleComplete && bundleExists { + return nil, fmt.Errorf("failed to create an istiod CA: incomplete signing CA bundle detected") + } + + if signingCABundleComplete { if _, err := os.Stat(path.Join(LocalCertDir.Get(), ca.IstioGenerated)); err == nil { istioGenerated = true } } - if !detectedSigningCABundle || (features.UseCacertsForSelfSignedCA && istioGenerated) { + useSelfSignedCA := !signingCABundleComplete || (features.UseCacertsForSelfSignedCA && istioGenerated) + if useSelfSignedCA { if features.UseCacertsForSelfSignedCA && istioGenerated { log.Infof("IstioGenerated %s secret found, use it as the CA certificate", ca.CACertsSecret) @@ -568,3 +596,72 @@ }) return raServer, err } + +// checkCABundleCompleteness checks if all required CA certificate files exist +// this function may return bundleExists as false even when some files exist in case of an error +func checkCABundleCompleteness( + signingKeyFile, signingCertFile, rootCertFile string, + chainFiles []string, +) ( + signingCABundleComplete bool, + bundleExists bool, + err error, +) { + signingKeyExists, err := fileExists(signingKeyFile) + if err != nil { + return false, false, err + } + + signingCertExists, err := fileExists(signingCertFile) + if err != nil { + return false, signingKeyExists, err + } + + rootCertExists, err := fileExists(rootCertFile) + if err != nil { + return false, signingKeyExists || signingCertExists, err + } + + chainFilesExist, err := hasValidChainFiles(chainFiles) + if err != nil { + return false, signingKeyExists || signingCertExists || rootCertExists, err + } + + bundleExists = signingKeyExists || signingCertExists || rootCertExists || chainFilesExist + signingCABundleComplete = signingKeyExists && signingCertExists && rootCertExists && chainFilesExist + + return signingCABundleComplete, bundleExists, nil +} + +// fileExists checks if a file exists and is accessible +func fileExists(filename string) (bool, error) { + if filename == "" { + return false, nil + } + _, err := os.Stat(filename) + if err != nil { + if os.IsNotExist(err) { + return false, nil + } + return false, fmt.Errorf("error checking file %s: %v", filename, err) + } + return true, nil +} + +// hasValidChainFiles checks if there is at least one valid cert chain file +func hasValidChainFiles(files []string) (bool, error) { + if len(files) == 0 { + return false, nil + } + + for _, file := range files { + exists, err := fileExists(file) + if err != nil { + return false, err + } + if exists { + return true, nil + } + } + return false, nil +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istioctl-1.26.0/pilot/pkg/bootstrap/istio_ca_test.go new/istioctl-1.26.1/pilot/pkg/bootstrap/istio_ca_test.go --- old/istioctl-1.26.0/pilot/pkg/bootstrap/istio_ca_test.go 2025-05-06 20:19:44.000000000 +0200 +++ new/istioctl-1.26.1/pilot/pkg/bootstrap/istio_ca_test.go 2025-05-27 19:44:34.000000000 +0200 @@ -32,6 +32,61 @@ const testNamespace = "istio-system" +func TestCheckCABundleCompleteness(t *testing.T) { + g := NewWithT(t) + + dir := t.TempDir() + + // Create partial certificate files (missing signing key) + rootCertFile := path.Join(dir, "root-cert.pem") + certChainFile := path.Join(dir, "cert-chain.pem") + caCertFile := path.Join(dir, "ca-cert.pem") + + // Create some files but not all + rootCert, err := readSampleCertFromFile("root-cert.pem") + g.Expect(err).Should(BeNil()) + err = os.WriteFile(rootCertFile, rootCert, 0o600) + g.Expect(err).Should(BeNil()) + + certChain, err := readSampleCertFromFile("cert-chain.pem") + g.Expect(err).Should(BeNil()) + err = os.WriteFile(certChainFile, certChain, 0o600) + g.Expect(err).Should(BeNil()) + + caCert, err := readSampleCertFromFile("ca-cert.pem") + g.Expect(err).Should(BeNil()) + err = os.WriteFile(caCertFile, caCert, 0o600) + g.Expect(err).Should(BeNil()) + + // Test with incomplete bundle + signingCABundleComplete, bundleExists, err := checkCABundleCompleteness( + path.Join(dir, "ca-key.pem"), + path.Join(dir, "ca-cert.pem"), + path.Join(dir, "root-cert.pem"), + []string{path.Join(dir, "cert-chain.pem")}, + ) + g.Expect(err).Should(BeNil()) + g.Expect(signingCABundleComplete).Should(Equal(false)) + g.Expect(bundleExists).Should(Equal(true)) + + // Add missing key file to complete the bundle + caKey, err := readSampleCertFromFile("ca-key.pem") + g.Expect(err).Should(BeNil()) + err = os.WriteFile(path.Join(dir, "ca-key.pem"), caKey, 0o600) + g.Expect(err).Should(BeNil()) + + // Test with complete bundle + signingCABundleComplete, bundleExists, err = checkCABundleCompleteness( + path.Join(dir, "ca-key.pem"), + path.Join(dir, "ca-cert.pem"), + path.Join(dir, "root-cert.pem"), + []string{path.Join(dir, "cert-chain.pem")}, + ) + g.Expect(err).Should(BeNil()) + g.Expect(signingCABundleComplete).Should(Equal(true)) + g.Expect(bundleExists).Should(Equal(true)) +} + func TestRemoteCerts(t *testing.T) { g := NewWithT(t) @@ -60,7 +115,6 @@ expectedRoot, err := readSampleCertFromFile("root-cert.pem") g.Expect(err).Should(BeNil()) - g.Expect(os.ReadFile(path.Join(dir, "root-cert.pem"))).Should(Equal(expectedRoot)) // Should do nothing because certs already exist locally. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istioctl-1.26.0/pilot/pkg/config/kube/gateway/conversion.go new/istioctl-1.26.1/pilot/pkg/config/kube/gateway/conversion.go --- old/istioctl-1.26.0/pilot/pkg/config/kube/gateway/conversion.go 2025-05-06 20:19:44.000000000 +0200 +++ new/istioctl-1.26.1/pilot/pkg/config/kube/gateway/conversion.go 2025-05-27 19:44:34.000000000 +0200 @@ -613,8 +613,17 @@ out: for _, routeHostname := range hostnames { for _, parentHostNamespace := range parent.Hostnames { - spl := strings.Split(parentHostNamespace, "/") - parentNamespace, parentHostname := spl[0], spl[1] + var parentNamespace, parentHostname string + // When parentHostNamespace lacks a '/', it was likely sanitized from '*/host' to 'host' + // by sanitizeServerHostNamespace. Set parentNamespace to '*' to reflect the wildcard namespace + // and parentHostname to the sanitized host to prevent an index out of range panic. + if strings.Contains(parentHostNamespace, "/") { + spl := strings.Split(parentHostNamespace, "/") + parentNamespace, parentHostname = spl[0], spl[1] + } else { + parentNamespace, parentHostname = "*", parentHostNamespace + } + hostnameMatch := host.Name(parentHostname).Matches(host.Name(routeHostname)) namespaceMatch := parentNamespace == "*" || parentNamespace == localNamespace hostMatched = hostMatched || hostnameMatch @@ -1442,7 +1451,7 @@ // AllowedKinds indicates which kinds can be admitted by this parent AllowedKinds []k8s.RouteGroupKind // Hostnames is the hostnames that must be match to reference to the parent. For gateway this is listener hostname - // Format is ns/hostname + // Format is ns/hostname or just hostname, which is equivalent to */hostname Hostnames []string // OriginalHostname is the unprocessed form of Hostnames; how it appeared in users' config OriginalHostname string diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istioctl-1.26.0/pilot/pkg/config/kube/gateway/conversion_test.go new/istioctl-1.26.1/pilot/pkg/config/kube/gateway/conversion_test.go --- old/istioctl-1.26.0/pilot/pkg/config/kube/gateway/conversion_test.go 2025-05-06 20:19:44.000000000 +0200 +++ new/istioctl-1.26.1/pilot/pkg/config/kube/gateway/conversion_test.go 2025-05-27 19:44:34.000000000 +0200 @@ -29,6 +29,7 @@ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" + k8s "sigs.k8s.io/gateway-api/apis/v1" "sigs.k8s.io/gateway-api/pkg/consts" "sigs.k8s.io/yaml" @@ -1153,6 +1154,65 @@ } }) } +} + +// Test is a little janky, but it checks if we can pass a `parent.Hostnames` in the form +// of `*.example.com` and `*/*.example.com` without a panic and successfully match. +func TestGatewayReferenceAllowedParentHostnameParsing(t *testing.T) { + cases := []struct { + Name string + ParentHostnames []string + RouteHostnames []k8s.Hostname + }{ + { + Name: "implied wildcard", + ParentHostnames: []string{"*.example.com"}, + RouteHostnames: []k8s.Hostname{"bookinfo.example.com"}, + }, + { + Name: "explicit wildcard", + ParentHostnames: []string{"*/*.example.com"}, + RouteHostnames: []k8s.Hostname{"bookinfo.example.com"}, + }, + } + + for _, tt := range cases { + t.Run(tt.Name, func(t *testing.T) { + // ctx doesn't end up getting used, but we need to pass something + ctx := RouteContext{} + routeKind := gvk.HTTPRoute + parent := parentInfo{ + InternalName: "default/bookinfo-gateway-istio-autogenerated-k8s-gateway-http", + Hostnames: []string{"*.example.com"}, + AllowedKinds: []k8s.RouteGroupKind{ + toRouteKind(gvk.HTTPRoute), + toRouteKind(gvk.GRPCRoute), + }, + OriginalHostname: "", + SectionName: "http", + Port: 80, + Protocol: "HTTP", + } + parentRef := parentReference{ + parentKey: parentKey{ + Kind: gvk.Gateway, + Name: "bookinfo-gateway", + Namespace: "default", + }, + SectionName: "", + Port: 0, + } + hostnames := []k8s.Hostname{"bookinfo.example.com"} + + parentError, waypointError := referenceAllowed(ctx, &parent, routeKind, parentRef, hostnames, "default") + if parentError != nil { + t.Fatalf("expected no error, got %v", parentError) + } + if waypointError != nil { + t.Fatalf("expected no error, got %v", waypointError) + } + }) + } } func TestReferencePolicy(t *testing.T) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istioctl-1.26.0/pkg/config/analysis/analyzers/serviceentry/protocoladdresses.go new/istioctl-1.26.1/pkg/config/analysis/analyzers/serviceentry/protocoladdresses.go --- old/istioctl-1.26.0/pkg/config/analysis/analyzers/serviceentry/protocoladdresses.go 2025-05-06 20:19:44.000000000 +0200 +++ new/istioctl-1.26.1/pkg/config/analysis/analyzers/serviceentry/protocoladdresses.go 2025-05-27 19:44:34.000000000 +0200 @@ -53,6 +53,9 @@ if v, ok := mc.DefaultConfig.ProxyMetadata["ISTIO_META_DNS_AUTO_ALLOCATE"]; ok && v == "true" { autoAllocated = true } + if v, ok := mc.DefaultConfig.ProxyMetadata["PILOT_ENABLE_IP_AUTOALLOCATE"]; ok && v == "true" { + autoAllocated = true + } return true }) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istioctl-1.26.0/pkg/config/analysis/msg/messages.gen.go new/istioctl-1.26.1/pkg/config/analysis/msg/messages.gen.go --- old/istioctl-1.26.0/pkg/config/analysis/msg/messages.gen.go 2025-05-06 20:19:44.000000000 +0200 +++ new/istioctl-1.26.1/pkg/config/analysis/msg/messages.gen.go 2025-05-27 19:44:34.000000000 +0200 @@ -105,7 +105,7 @@ SchemaWarning = diag.NewMessageType(diag.Warning, "IST0133", "Schema validation warning: %v") // ServiceEntryAddressesRequired defines a diag.MessageType for message "ServiceEntryAddressesRequired". - // Description: Virtual IP addresses are required for ports serving TCP (or unset) protocol when ISTIO_META_DNS_AUTO_ALLOCATE is not set on a proxy + // Description: Virtual IP addresses are required for ports serving TCP (or unset) protocol when PILOT_ENABLE_IP_AUTOALLOCATE is not set on a proxy ServiceEntryAddressesRequired = diag.NewMessageType(diag.Warning, "IST0134", "ServiceEntry addresses are required for this protocol.") // DeprecatedAnnotation defines a diag.MessageType for message "DeprecatedAnnotation". @@ -259,6 +259,14 @@ // NegativeConditionStatus defines a diag.MessageType for message "NegativeConditionStatus". // Description: A condition with a negative status is present NegativeConditionStatus = diag.NewMessageType(diag.Warning, "IST0171", "A condition with a negative status is present: type=%s, reason=%s, message=%s.") + + // DestinationRuleSubsetNotSelectPods defines a diag.MessageType for message "DestinationRuleSubsetNotSelectPods". + // Description: Subsets defined in destination does not select any pods. + DestinationRuleSubsetNotSelectPods = diag.NewMessageType(diag.Error, "IST0173", "The Subset %s defined in the DestinationRule does not select any pods. Which may lead to 503 UH (NoHealthyUpstream).") + + // UnknownDestinationRuleHost defines a diag.MessageType for message "UnknownDestinationRuleHost". + // Description: Host defined in destination rule does not match any services in the mesh. + UnknownDestinationRuleHost = diag.NewMessageType(diag.Warning, "IST0174", "The host %s defined in the DestinationRule does not match any services in the mesh.") ) // All returns a list of all known message types. @@ -327,6 +335,8 @@ UpdateIncompatibility, MultiClusterInconsistentService, NegativeConditionStatus, + DestinationRuleSubsetNotSelectPods, + UnknownDestinationRuleHost, } } @@ -950,3 +960,21 @@ message, ) } + +// NewDestinationRuleSubsetNotSelectPods returns a new diag.Message based on DestinationRuleSubsetNotSelectPods. +func NewDestinationRuleSubsetNotSelectPods(r *resource.Instance, subset string) diag.Message { + return diag.NewMessage( + DestinationRuleSubsetNotSelectPods, + r, + subset, + ) +} + +// NewUnknownDestinationRuleHost returns a new diag.Message based on UnknownDestinationRuleHost. +func NewUnknownDestinationRuleHost(r *resource.Instance, host string) diag.Message { + return diag.NewMessage( + UnknownDestinationRuleHost, + r, + host, + ) +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istioctl-1.26.0/pkg/config/analysis/msg/messages.yaml new/istioctl-1.26.1/pkg/config/analysis/msg/messages.yaml --- old/istioctl-1.26.0/pkg/config/analysis/msg/messages.yaml 2025-05-06 20:19:44.000000000 +0200 +++ new/istioctl-1.26.1/pkg/config/analysis/msg/messages.yaml 2025-05-27 19:44:34.000000000 +0200 @@ -286,7 +286,8 @@ - name: "ServiceEntryAddressesRequired" code: IST0134 level: Warning - description: "Virtual IP addresses are required for ports serving TCP (or unset) protocol when ISTIO_META_DNS_AUTO_ALLOCATE is not set on a proxy" + description: "Virtual IP addresses are required for ports serving TCP (or unset) protocol when PILOT_ENABLE_IP_AUTOALLOCATE is not set on a proxy" + template: "ServiceEntry addresses are required for this protocol." - name: "DeprecatedAnnotation" @@ -681,3 +682,21 @@ type: string - name: message type: string + + - name: "DestinationRuleSubsetNotSelectPods" + code: IST0173 + level: Error + description: "Subsets defined in destination does not select any pods." + template: "The Subset %s defined in the DestinationRule does not select any pods. Which may lead to 503 UH (NoHealthyUpstream)." + args: + - name: subset + type: string + + - name: "UnknownDestinationRuleHost" + code: IST0174 + level: Warning + description: "Host defined in destination rule does not match any services in the mesh." + template: "The host %s defined in the DestinationRule does not match any services in the mesh." + args: + - name: host + type: string diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istioctl-1.26.0/releasenotes/notes/56083.yaml new/istioctl-1.26.1/releasenotes/notes/56083.yaml --- old/istioctl-1.26.0/releasenotes/notes/56083.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/istioctl-1.26.1/releasenotes/notes/56083.yaml 2025-05-27 19:44:34.000000000 +0200 @@ -0,0 +1,34 @@ +apiVersion: release-notes/v2 + +# This YAML file describes the format for specifying a release notes entry for Istio. +# This should be filled in for all user facing changes. + +# kind describes the type of change that this represents. +# Valid Values are: +# - bug-fix -- Used to specify that this change represents a bug fix. +# - security-fix -- Used to specify that this change represents a vulnerability fix. +# - feature -- Used to specify a new feature that has been added. +# - test -- Used to describe additional testing added. This file is optional for +# tests, but included for completeness. +kind: bug-fix + +# area describes the area that this change affects. +# Valid values are: +# - traffic-management +# - security +# - telemetry +# - installation +# - istioctl +# - documentation +area: istioctl + +# issue is a list of GitHub issues resolved in this note. +# If issue is not in the current repo, specify its full URL instead. +issue: [56083] + +# releaseNotes is a markdown listing of any user facing changes. This will appear in the +# release notes. +releaseNotes: + - | + **Fixed** false positive with `istioctl analyze` raising IST0134 even when `PILOT_ENABLE_IP_AUTOALLOCATE` is set to `true`. + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istioctl-1.26.0/releasenotes/notes/56240.yaml new/istioctl-1.26.1/releasenotes/notes/56240.yaml --- old/istioctl-1.26.0/releasenotes/notes/56240.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/istioctl-1.26.1/releasenotes/notes/56240.yaml 2025-05-27 19:44:34.000000000 +0200 @@ -0,0 +1,7 @@ +apiVersion: release-notes/v2 +kind: bug-fix +area: installation +issue: [56223] +releaseNotes: + - | + **Fixed** a panic in `istioctl manifest translate` when the IstioOperator config contains multiple gateways. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istioctl-1.26.0/releasenotes/notes/56300.yaml new/istioctl-1.26.1/releasenotes/notes/56300.yaml --- old/istioctl-1.26.0/releasenotes/notes/56300.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/istioctl-1.26.1/releasenotes/notes/56300.yaml 2025-05-27 19:44:34.000000000 +0200 @@ -0,0 +1,9 @@ +apiVersion: release-notes/v2 +kind: bug-fix +area: traffic-management +issue: +- 56300 + +releaseNotes: +- | + **Fixed** Regression in Istio 1.26.0 that caused a panic in istiod when processing Gateway API hostnames. \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istioctl-1.26.0/releasenotes/notes/check-cacerts-completeness.yaml new/istioctl-1.26.1/releasenotes/notes/check-cacerts-completeness.yaml --- old/istioctl-1.26.0/releasenotes/notes/check-cacerts-completeness.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/istioctl-1.26.1/releasenotes/notes/check-cacerts-completeness.yaml 2025-05-27 19:44:34.000000000 +0200 @@ -0,0 +1,13 @@ +apiVersion: release-notes/v2 +kind: bug-fix +area: security +releaseNotes: + - | + **Fixed** an issue in the `pluginca` feature where `istiod` would silently fallback to the self-signed CA if the provided `cacerts` bundle was incomplete. + The system now properly validates the presence of all required CA files and fails with an error if the bundle is incomplete. +upgradeNote: + - title: Pluginca CA Bundle Validation + content: | + Previously, `istiod` would silently fallback to the self-signed CA if the `cacerts` bundle was incomplete—only the signing key file was being checked for presence. + This behavior could lead to unexpected use of a self-signed CA without operator awareness. + With this fix, `istiod` will now validate the entire CA bundle and return an explicit error if any required file is missing, rather than falling back silently. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istioctl-1.26.0/tests/integration/pilot/analysis/analysis_test.go new/istioctl-1.26.1/tests/integration/pilot/analysis/analysis_test.go --- old/istioctl-1.26.0/tests/integration/pilot/analysis/analysis_test.go 2025-05-06 20:19:44.000000000 +0200 +++ new/istioctl-1.26.1/tests/integration/pilot/analysis/analysis_test.go 2025-05-27 19:44:34.000000000 +0200 @@ -80,7 +80,7 @@ // Status should report error retry.UntilSuccessOrFail(t, func() error { return expectVirtualServiceStatus(t, ns, true) - }, retry.Timeout(time.Second*5)) + }, retry.Timeout(time.Second*10)) // Apply config to make this not invalid t.ConfigIstio().YAML(ns.Name(), ` apiVersion: networking.istio.io/v1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istioctl-1.26.0/tests/integration/pilot/testdata/gateway-api-crd.yaml new/istioctl-1.26.1/tests/integration/pilot/testdata/gateway-api-crd.yaml --- old/istioctl-1.26.0/tests/integration/pilot/testdata/gateway-api-crd.yaml 2025-05-06 20:19:44.000000000 +0200 +++ new/istioctl-1.26.1/tests/integration/pilot/testdata/gateway-api-crd.yaml 2025-05-27 19:44:34.000000000 +0200 @@ -1,10 +1,10 @@ -# Generated with `kubectl kustomize "https://github.com/kubernetes-sigs/gateway-api/config/crd/experimental?ref=92efbedcc2b40dc097b7ea0eacb894a6033057e1"` +# Generated with `kubectl kustomize "https://github.com/kubernetes-sigs/gateway-api/config/crd/experimental?ref=v1.3.0"` apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328 - gateway.networking.k8s.io/bundle-version: v1.3.0-rc.1 + gateway.networking.k8s.io/bundle-version: v1.3.0 gateway.networking.k8s.io/channel: experimental creationTimestamp: null labels: @@ -652,7 +652,7 @@ metadata: annotations: api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328 - gateway.networking.k8s.io/bundle-version: v1.3.0-rc.1 + gateway.networking.k8s.io/bundle-version: v1.3.0 gateway.networking.k8s.io/channel: experimental creationTimestamp: null name: gatewayclasses.gateway.networking.k8s.io @@ -1169,7 +1169,7 @@ metadata: annotations: api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328 - gateway.networking.k8s.io/bundle-version: v1.3.0-rc.1 + gateway.networking.k8s.io/bundle-version: v1.3.0 gateway.networking.k8s.io/channel: experimental creationTimestamp: null name: gateways.gateway.networking.k8s.io @@ -1824,7 +1824,6 @@ - All - Selector - Same - - None type: string selector: description: |- @@ -3163,7 +3162,6 @@ - All - Selector - Same - - None type: string selector: description: |- @@ -3876,7 +3874,7 @@ metadata: annotations: api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328 - gateway.networking.k8s.io/bundle-version: v1.3.0-rc.1 + gateway.networking.k8s.io/bundle-version: v1.3.0 gateway.networking.k8s.io/channel: experimental creationTimestamp: null name: grpcroutes.gateway.networking.k8s.io @@ -6094,7 +6092,7 @@ metadata: annotations: api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328 - gateway.networking.k8s.io/bundle-version: v1.3.0-rc.1 + gateway.networking.k8s.io/bundle-version: v1.3.0 gateway.networking.k8s.io/channel: experimental creationTimestamp: null name: httproutes.gateway.networking.k8s.io @@ -13373,7 +13371,7 @@ metadata: annotations: api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328 - gateway.networking.k8s.io/bundle-version: v1.3.0-rc.1 + gateway.networking.k8s.io/bundle-version: v1.3.0 gateway.networking.k8s.io/channel: experimental creationTimestamp: null name: referencegrants.gateway.networking.k8s.io @@ -13563,7 +13561,7 @@ metadata: annotations: api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328 - gateway.networking.k8s.io/bundle-version: v1.3.0-rc.1 + gateway.networking.k8s.io/bundle-version: v1.3.0 gateway.networking.k8s.io/channel: experimental creationTimestamp: null name: tcproutes.gateway.networking.k8s.io @@ -14296,7 +14294,7 @@ metadata: annotations: api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328 - gateway.networking.k8s.io/bundle-version: v1.3.0-rc.1 + gateway.networking.k8s.io/bundle-version: v1.3.0 gateway.networking.k8s.io/channel: experimental creationTimestamp: null name: tlsroutes.gateway.networking.k8s.io @@ -15092,7 +15090,7 @@ metadata: annotations: api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328 - gateway.networking.k8s.io/bundle-version: v1.3.0-rc.1 + gateway.networking.k8s.io/bundle-version: v1.3.0 gateway.networking.k8s.io/channel: experimental creationTimestamp: null name: udproutes.gateway.networking.k8s.io @@ -15825,7 +15823,7 @@ metadata: annotations: api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328 - gateway.networking.k8s.io/bundle-version: v1.3.0-rc.1 + gateway.networking.k8s.io/bundle-version: v1.3.0 gateway.networking.k8s.io/channel: experimental creationTimestamp: null labels: @@ -15916,21 +15914,21 @@ interval: default: 10s description: |- - BudgetInterval defines the duration in which requests will be considered + Interval defines the duration in which requests will be considered for calculating the budget for retries. Support: Extended pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$ type: string x-kubernetes-validations: - - message: budgetInterval can not be greater than one hour - or less than one second + - message: interval can not be greater than one hour or less + than one second rule: '!(duration(self) < duration(''1s'') || duration(self) > duration(''1h''))' percent: default: 20 description: |- - BudgetPercent defines the maximum percentage of active requests that may + Percent defines the maximum percentage of active requests that may be made up of retries. Support: Extended @@ -16431,7 +16429,7 @@ metadata: annotations: api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328 - gateway.networking.k8s.io/bundle-version: v1.3.0-rc.1 + gateway.networking.k8s.io/bundle-version: v1.3.0 gateway.networking.k8s.io/channel: experimental creationTimestamp: null name: xlistenersets.gateway.networking.x-k8s.io @@ -16602,7 +16600,6 @@ - All - Selector - Same - - None type: string selector: description: |- @@ -16943,6 +16940,7 @@ > 0 || size(self.options) > 0 : true' required: - name + - port - protocol type: object maxItems: 64 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istioctl-1.26.0/tests/integration/security/ingress_test.go new/istioctl-1.26.1/tests/integration/security/ingress_test.go --- old/istioctl-1.26.0/tests/integration/security/ingress_test.go 2025-05-06 20:19:44.000000000 +0200 +++ new/istioctl-1.26.1/tests/integration/security/ingress_test.go 2025-05-27 19:44:34.000000000 +0200 @@ -411,7 +411,10 @@ }, hostName: "testmultitlsgateway-invalidsecret1.example.com", expectedResponse: ingressutil.ExpectedResponse{ - ErrorMessage: "connection reset by peer", + AllowedErrorMessages: []string{ + "connection reset by peer", + "EOF", + }, }, callType: ingressutil.TLS, tlsContext: ingressutil.TLSContext{ @@ -427,7 +430,10 @@ }, hostName: "testmultitlsgateway-invalidsecret2.example.com", expectedResponse: ingressutil.ExpectedResponse{ - ErrorMessage: "connection reset by peer", + AllowedErrorMessages: []string{ + "connection reset by peer", + "EOF", + }, }, callType: ingressutil.TLS, tlsContext: ingressutil.TLSContext{ @@ -443,7 +449,10 @@ }, hostName: "testmultitlsgateway-invalidsecret3.example.com", expectedResponse: ingressutil.ExpectedResponse{ - ErrorMessage: "connection reset by peer", + AllowedErrorMessages: []string{ + "connection reset by peer", + "EOF", + }, }, callType: ingressutil.TLS, tlsContext: ingressutil.TLSContext{ @@ -458,7 +467,10 @@ }, hostName: "testmultitlsgateway-invalidsecret4.example.com", expectedResponse: ingressutil.ExpectedResponse{ - ErrorMessage: "connection reset by peer", + AllowedErrorMessages: []string{ + "connection reset by peer", + "EOF", + }, }, callType: ingressutil.TLS, tlsContext: ingressutil.TLSContext{ @@ -473,7 +485,10 @@ }, hostName: "testmultitlsgateway-invalidsecret5.example.com", expectedResponse: ingressutil.ExpectedResponse{ - ErrorMessage: "connection reset by peer", + AllowedErrorMessages: []string{ + "connection reset by peer", + "EOF", + }, }, callType: ingressutil.TLS, tlsContext: ingressutil.TLSContext{ @@ -540,7 +555,10 @@ }, hostName: "testmultimtlsgateway-invalidsecret1.example.com", expectedResponse: ingressutil.ExpectedResponse{ - ErrorMessage: "connection reset by peer", + AllowedErrorMessages: []string{ + "connection reset by peer", + "EOF", + }, }, callType: ingressutil.Mtls, tlsContext: ingressutil.TLSContext{ @@ -558,7 +576,10 @@ }, hostName: "testmultimtlsgateway-invalidsecret2.example.com", expectedResponse: ingressutil.ExpectedResponse{ - ErrorMessage: "connection reset by peer", + AllowedErrorMessages: []string{ + "connection reset by peer", + "EOF", + }, }, callType: ingressutil.Mtls, tlsContext: ingressutil.TLSContext{ @@ -577,7 +598,10 @@ }, hostName: "testmultimtlsgateway-invalidsecret3.example.com", expectedResponse: ingressutil.ExpectedResponse{ - ErrorMessage: "error decrypting message", + AllowedErrorMessages: []string{ + "connection reset by peer", + "tls: error decrypting message", + }, }, callType: ingressutil.Mtls, tlsContext: ingressutil.TLSContext{ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istioctl-1.26.0/tests/integration/security/sds_ingress/util/util.go new/istioctl-1.26.1/tests/integration/security/sds_ingress/util/util.go --- old/istioctl-1.26.0/tests/integration/security/sds_ingress/util/util.go 2025-05-06 20:19:44.000000000 +0200 +++ new/istioctl-1.26.1/tests/integration/security/sds_ingress/util/util.go 2025-05-27 19:44:34.000000000 +0200 @@ -269,6 +269,7 @@ StatusCode int SkipErrorMessageVerification bool ErrorMessage string + AllowedErrorMessages []string } type TLSContext struct { @@ -321,12 +322,24 @@ // message then it should be treated as error when error message // verification is not skipped. Error message verification is skipped // when the error message is non-deterministic. - if !exRsp.SkipErrorMessageVerification && len(exRsp.ErrorMessage) == 0 { - return fmt.Errorf("unexpected error: %w", err) - } - if !exRsp.SkipErrorMessageVerification && !strings.Contains(err.Error(), exRsp.ErrorMessage) { - return fmt.Errorf("expected response error message %s but got %w", - exRsp.ErrorMessage, err) + if !exRsp.SkipErrorMessageVerification { + if len(exRsp.ErrorMessage) == 0 && len(exRsp.AllowedErrorMessages) == 0 { + return fmt.Errorf("unexpected error: %w", err) + } + matched := false + if exRsp.ErrorMessage != "" && strings.Contains(err.Error(), exRsp.ErrorMessage) { + matched = true + } + for _, allowed := range exRsp.AllowedErrorMessages { + if strings.Contains(err.Error(), allowed) { + matched = true + break + } + } + if !matched { + return fmt.Errorf("expected one of %v but got error: %w", + append([]string{exRsp.ErrorMessage}, exRsp.AllowedErrorMessages...), err) + } } return nil } ++++++ istioctl.obsinfo ++++++ --- /var/tmp/diff_new_pack.7e3C7D/_old 2025-05-31 19:18:42.751360363 +0200 +++ /var/tmp/diff_new_pack.7e3C7D/_new 2025-05-31 19:18:42.775361373 +0200 @@ -1,5 +1,5 @@ name: istioctl -version: 1.26.0 -mtime: 1746555584 -commit: c2e9871f340c0e0b114bcd1b73208284f1d17c9e +version: 1.26.1 +mtime: 1748367874 +commit: 2ce3ad897b984a045d9d5f80a8c1bb8eefdf88f5 ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/istioctl/vendor.tar.gz /work/SRC/openSUSE:Factory/.istioctl.new.16005/vendor.tar.gz differ: char 13, line 1