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-04-17 16:09:20
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/istioctl (Old)
 and      /work/SRC/openSUSE:Factory/.istioctl.new.30101 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "istioctl"

Thu Apr 17 16:09:20 2025 rev:33 rq:1270127 version:1.25.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/istioctl/istioctl.changes        2025-03-27 
22:32:08.628215048 +0100
+++ /work/SRC/openSUSE:Factory/.istioctl.new.30101/istioctl.changes     
2025-04-20 19:56:36.724508612 +0200
@@ -1,0 +2,8 @@
+Wed Apr 16 19:20:25 UTC 2025 - Johannes Kastl 
<opensuse_buildserv...@ojkastl.de>
+
+- update to 1.25.2:
+  https://istio.io/latest/news/releases/1.25.x/announcing-1.25.2/
+  * Changes
+    - no apparent CLI-related changes
+
+-------------------------------------------------------------------

Old:
----
  istioctl-1.25.1.obscpio

New:
----
  istioctl-1.25.2.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ istioctl.spec ++++++
--- /var/tmp/diff_new_pack.qmb8JN/_old  2025-04-20 19:56:37.704549641 +0200
+++ /var/tmp/diff_new_pack.qmb8JN/_new  2025-04-20 19:56:37.708549808 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           istioctl
-Version:        1.25.1
+Version:        1.25.2
 Release:        0
 Summary:        CLI for the istio servic mesh in Kubernetes
 License:        Apache-2.0

++++++ _service ++++++
--- /var/tmp/diff_new_pack.qmb8JN/_old  2025-04-20 19:56:37.744551315 +0200
+++ /var/tmp/diff_new_pack.qmb8JN/_new  2025-04-20 19:56:37.748551483 +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.25.1</param>
+    <param name="revision">1.25.2</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="changesgenerate">disable</param>
     <param name="filename">istioctl</param>

++++++ istioctl-1.25.1.obscpio -> istioctl-1.25.2.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istioctl-1.25.1/.devcontainer/devcontainer.json 
new/istioctl-1.25.2/.devcontainer/devcontainer.json
--- old/istioctl-1.25.1/.devcontainer/devcontainer.json 2025-03-22 
06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/.devcontainer/devcontainer.json 2025-04-11 
16:24:19.000000000 +0200
@@ -1,6 +1,6 @@
 {
   "name": "istio build-tools",
-  "image": 
"gcr.io/istio-testing/build-tools:master-6bfe0028e941afdae35a3c5d4374bc08e3c04153",
+  "image": 
"gcr.io/istio-testing/build-tools:release-1.25-3860042a009e8b9d8a63eca8756803d0e7aad5bb",
   "privileged": true,
   "remoteEnv": {
     "USE_GKE_GCLOUD_AUTH_PLUGIN": "True",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istioctl-1.25.1/.gitattributes 
new/istioctl-1.25.2/.gitattributes
--- old/istioctl-1.25.1/.gitattributes  2025-03-22 06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/.gitattributes  1970-01-01 01:00:00.000000000 +0100
@@ -1,16 +0,0 @@
-*.descriptor      linguist-generated=true
-*.descriptor      -diff -merge
-*.descriptor_set  linguist-generated=true
-*.descriptor_set  -diff -merge
-*.pb.html linguist-generated=true
-*.pb.go linguist-generated=true
-*.gen.go linguist-generated=true
-*.gen.yaml linguist-generated=true
-*.gen.json linguist-generated=true
-*_pb2.py linguist-generated=true
-manifests/charts/**/profile*.yaml linguist-generated=true
-go.sum merge=union
-vendor/**  linguist-vendored
-common/**  linguist-vendored
-archive/**  linquist-vendored
-**/vmlinux.h  linquist-vendored
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/.github/ISSUE_TEMPLATE/bug_report.yml 
new/istioctl-1.25.2/.github/ISSUE_TEMPLATE/bug_report.yml
--- old/istioctl-1.25.1/.github/ISSUE_TEMPLATE/bug_report.yml   2025-03-22 
06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/.github/ISSUE_TEMPLATE/bug_report.yml   1970-01-01 
01:00:00.000000000 +0100
@@ -1,74 +0,0 @@
-name: Bug report
-description: Report a bug to help us improve Istio
-body:
-  - type: markdown
-    attributes:
-      value: |
-        Thanks for taking the time to fill out this bug report!
-  - type: checkboxes
-    id: security-check
-    attributes:
-      label: Is this the right place to submit this?
-      description: |-
-        This is used to report product bugs:
-        To report a security vulnerability, please visit 
<https://istio.io/about/security-vulnerabilities>.
-        Any crashes are potentially security vulnerabilities and should be 
treated as such.
-        To ask questions about how to use Istio, please visit 
<https://github.com/istio/istio/discussions>.
-      options:
-        - label: "This is not a security vulnerability or a crashing bug"
-          required: true
-        - label: "This is not a question about how to use Istio"
-          required: true
-  - type: textarea
-    id: bug-description
-    attributes:
-      label: Bug Description
-      description: Tell us what issues you ran into.
-      placeholder: Include information about what you tried, what you expected 
to happen, and what actually happened. The more details, the better!
-    validations:
-      required: true
-  - type: textarea
-    id: version
-    attributes:
-      label: Version
-      description: Include the output of `istioctl version`, `kubectl version 
--short`, and `helm version --short` (if you used Helm)
-      placeholder: |
-        $ istioctl version
-        client version: 1.0.0
-        control plane version: 1.0.0
-        data plane version: 1.0.0 (100 proxies)
-        $ kubectl version
-        Client Version: v1.0.0
-        Kustomize Version: v1.0.0
-        Server Version: v1.0.0
-      render: Text
-    validations:
-      required: true
-  - type: textarea
-    id: additional-info
-    attributes:
-      label: Additional Information
-      description: |
-        Please include the output of [`istioctl 
bug-report`](https://istio.io/help/bugs/#generating-a-cluster-state-archive).
-        If you are unable to do so, please ensure you have collected the 
relevant debugging information manually and attached below;
-        issue without enough information will not be resolvable.
-  - type: checkboxes
-    id: area
-    attributes:
-      label: Affected product area
-      options:
-      - label: "Ambient"
-      - label: "Docs"
-      - label: "Dual Stack"
-      - label: "Installation"
-      - label: "Networking"
-      - label: "Performance and Scalability"
-      - label: "Extensions and Telemetry"
-      - label: "Security"
-      - label: "Test and Release"
-      - label: "User Experience"
-      - label: "Developer Infrastructure"
-      - label: "Upgrade"
-      - label: "Multi Cluster"
-      - label: "Virtual Machine"
-      - label: "Control Plane Revisions"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istioctl-1.25.1/.github/ISSUE_TEMPLATE/config.yml 
new/istioctl-1.25.2/.github/ISSUE_TEMPLATE/config.yml
--- old/istioctl-1.25.1/.github/ISSUE_TEMPLATE/config.yml       2025-03-22 
06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/.github/ISSUE_TEMPLATE/config.yml       1970-01-01 
01:00:00.000000000 +0100
@@ -1,4 +0,0 @@
-contact_links:
-- name: "Crash bug"
-  url: https://istio.io/about/security-vulnerabilities/
-  about: "Please file any bug causing a crash to 
istio-security-vulnerability-repo...@googlegroups.com."
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/.github/ISSUE_TEMPLATE/feature_request.md 
new/istioctl-1.25.2/.github/ISSUE_TEMPLATE/feature_request.md
--- old/istioctl-1.25.1/.github/ISSUE_TEMPLATE/feature_request.md       
2025-03-22 06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/.github/ISSUE_TEMPLATE/feature_request.md       
1970-01-01 01:00:00.000000000 +0100
@@ -1,32 +0,0 @@
----
-name: Feature request
-about: Suggest an idea to improve Istio
-
----
-(This is used to request new product features, please visit 
<https://github.com/istio/istio/discussions> for questions on using Istio)
-
-**Describe the feature request**
-
-**Describe alternatives you've considered**
-
-**Affected product area (please put an X in all that apply)**
-
-[ ] Ambient
-[ ] Docs
-[ ] Dual Stack
-[ ] Installation
-[ ] Networking
-[ ] Performance and Scalability
-[ ] Extensions and Telemetry
-[ ] Security
-[ ] Test and Release
-[ ] User Experience
-[ ] Developer Infrastructure
-
-**Affected features (please put an X in all that apply)**
-
-[ ] Multi Cluster
-[ ] Virtual Machine
-[ ] Multi Control Plane
-
-**Additional context**
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istioctl-1.25.1/.github/SECURITY.md 
new/istioctl-1.25.2/.github/SECURITY.md
--- old/istioctl-1.25.1/.github/SECURITY.md     2025-03-22 06:37:44.000000000 
+0100
+++ new/istioctl-1.25.2/.github/SECURITY.md     1970-01-01 01:00:00.000000000 
+0100
@@ -1,23 +0,0 @@
-# Security Policy
-
-## Supported Versions
-
-Information about supported Istio versions can be found on the
-[Support Announcements] page on Istio's website.
-
-## Reporting a Vulnerability
-
-Instructions for reporting a vulnerability can be found on the
-[Istio Security Vulnerabilities] page. The Istio Product Security Working 
Group receives
-vulnerability and security issue reports, and the company affiliation of the 
members of
-the group can be found at [Early Disclosure Membership].
-
-## Security Bulletins
-
-Information about previous Istio vulnerabilities can be found on the
-[Security Bulletins] page.
-
-[Support Announcements]: https://istio.io/news/support/
-[Istio Security Vulnerabilities]: 
https://istio.io/about/security-vulnerabilities/
-[Security Bulletins]: https://istio.io/news/security/
-[Early Disclosure Membership]: 
https://github.com/istio/community/blob/master/EARLY-DISCLOSURE.md#membership
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istioctl-1.25.1/.github/dependabot.yml 
new/istioctl-1.25.2/.github/dependabot.yml
--- old/istioctl-1.25.1/.github/dependabot.yml  2025-03-22 06:37:44.000000000 
+0100
+++ new/istioctl-1.25.2/.github/dependabot.yml  1970-01-01 01:00:00.000000000 
+0100
@@ -1,14 +0,0 @@
-# Configures Depdendabot to PR go security updates only
-
-version: 2
-updates:
-  # Go configuration for master branch
-  - package-ecosystem: "gomod"
-    directory: "/"
-    schedule:
-      interval: "daily"
-    # Limit number of open PRs to 0 so that we only get security updates
-    # See 
https://docs.github.com/en/code-security/dependabot/dependabot-security-updates/configuring-dependabot-security-updates
-    open-pull-requests-limit: 0
-    labels:
-      - "release-notes-none"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istioctl-1.25.1/.github/pull_request_template.md 
new/istioctl-1.25.2/.github/pull_request_template.md
--- old/istioctl-1.25.1/.github/pull_request_template.md        2025-03-22 
06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/.github/pull_request_template.md        1970-01-01 
01:00:00.000000000 +0100
@@ -1,26 +0,0 @@
-**Please provide a description of this PR:**
-
-
-
-**To help us figure out who should review this PR, please put an X in all the 
areas that this PR affects.**
-
-- [ ] Ambient
-- [ ] Configuration Infrastructure
-- [ ] Docs
-- [ ] Dual Stack
-- [ ] Installation
-- [ ] Networking
-- [ ] Performance and Scalability
-- [ ] Extensions and Telemetry
-- [ ] Security
-- [ ] Test and Release
-- [ ] User Experience
-- [ ] Developer Infrastructure
-- [ ] Upgrade
-- [ ] Multi Cluster
-- [ ] Virtual Machine
-- [ ] Control Plane Revisions
-
-**Please check any characteristics that apply to this pull request.**
-
-- [ ] Does not have any 
[user-facing](https://github.com/istio/istio/tree/master/releasenotes#when-to-add-release-notes)
 changes. This may include CLI changes, API changes, behavior changes, 
performance improvements, etc.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istioctl-1.25.1/.gitignore 
new/istioctl-1.25.2/.gitignore
--- old/istioctl-1.25.1/.gitignore      2025-03-22 06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/.gitignore      1970-01-01 01:00:00.000000000 +0100
@@ -1,65 +0,0 @@
-# git history files
-.history_rewritten_*
-# Eclipse artifacts
-.project
-.pydevproject
-#Vagrant
-tools/vagrant/.vagrant/
-# Intellij
-*.iml
-.idea/
-.run/
-# Visual Studio Code
-.vscode/
-# Bazel
-/bazel-*
-# vi swap files
-.*.swp
-# vi backups
-*.bak
-# common backups
-*~
-# python artifacts
-*.pyc
-# pilot
-pilot/pkg/kube/config
-pilot/pkg/proxy/envoy/envoy
-# lint
-lintconfig.gen.json
-.istiorc
-.istiorc.mk
-# codegen stuff
-bin/adapterlinter
-bin/protoc-gen-gogoslick*
-bin/protoc-min-version*
-bin/protoc-gen-docs*
-bin/testlinter
-bin/envvarlinter
-bin/istioctl
-*.orig
-# Avoid accidental istio.VERSION changes
-istio.VERSION
-LICENSES.txt
-# Proxy generated proxy config in integration test
-tests/integration/component/proxy/envoy.conf
-**/var/run/secrets/
-# Certs generated by testing
-security/cmd/node_agent/na/cert_file
-security/cmd/node_agent/na/pkey
-# istioctl bash completion file
-tools/istioctl.bash
-vendor
-# Contains the built artifacts
-out/
-etc/
-var/
-# Go compiled tests
-*.test
-# Profiles
-*.prof
-# MacOS extended attributes
-._*
-# MacOS Desktop Services Store
-.DS_Store
-/manifests/charts/**/charts/
-/manifests/charts/**/Chart.lock
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istioctl-1.25.1/Makefile.core.mk 
new/istioctl-1.25.2/Makefile.core.mk
--- old/istioctl-1.25.1/Makefile.core.mk        2025-03-22 06:37:44.000000000 
+0100
+++ new/istioctl-1.25.2/Makefile.core.mk        2025-04-11 16:24:19.000000000 
+0200
@@ -49,7 +49,7 @@
 export VERSION
 
 # Base version of Istio image to use
-BASE_VERSION ?= 1.25-2025-03-04T19-01-37
+BASE_VERSION ?= 1.25-2025-04-04T19-01-15
 ISTIO_BASE_REGISTRY ?= gcr.io/istio-release
 
 export GO111MODULE ?= on
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istioctl-1.25.1/cni/pkg/cmd/root.go 
new/istioctl-1.25.2/cni/pkg/cmd/root.go
--- old/istioctl-1.25.1/cni/pkg/cmd/root.go     2025-03-22 06:37:44.000000000 
+0100
+++ new/istioctl-1.25.2/cni/pkg/cmd/root.go     2025-04-11 16:24:19.000000000 
+0200
@@ -293,6 +293,7 @@
                MonitoringPort:   viper.GetInt(constants.MonitoringPort),
 
                ExcludeNamespaces: viper.GetString(constants.ExcludeNamespaces),
+               PodNamespace:      viper.GetString(constants.PodNamespace),
                ZtunnelUDSAddress: viper.GetString(constants.ZtunnelUDSAddress),
 
                AmbientEnabled:                    
viper.GetBool(constants.AmbientEnabled),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istioctl-1.25.1/cni/pkg/config/config.go 
new/istioctl-1.25.2/cni/pkg/config/config.go
--- old/istioctl-1.25.1/cni/pkg/config/config.go        2025-03-22 
06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/cni/pkg/config/config.go        2025-04-11 
16:24:19.000000000 +0200
@@ -48,6 +48,9 @@
        // Comma-separated list of K8S namespaces that CNI should ignore
        ExcludeNamespaces string
 
+       // Singular namespace that the istio CNI node agent resides in
+       PodNamespace string
+
        // KUBERNETES_SERVICE_PROTOCOL
        K8sServiceProtocol string
        // KUBERNETES_SERVICE_HOST
@@ -133,6 +136,7 @@
        b.WriteString("SkipTLSVerify: " + fmt.Sprint(c.SkipTLSVerify) + "\n")
 
        b.WriteString("ExcludeNamespaces: " + fmt.Sprint(c.ExcludeNamespaces) + 
"\n")
+       b.WriteString("PodNamespace: " + fmt.Sprint(c.PodNamespace) + "\n")
        b.WriteString("K8sServiceProtocol: " + c.K8sServiceProtocol + "\n")
        b.WriteString("K8sServiceHost: " + c.K8sServiceHost + "\n")
        b.WriteString("K8sServicePort: " + fmt.Sprint(c.K8sServicePort) + "\n")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istioctl-1.25.1/cni/pkg/constants/constants.go 
new/istioctl-1.25.2/cni/pkg/constants/constants.go
--- old/istioctl-1.25.1/cni/pkg/constants/constants.go  2025-03-22 
06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/cni/pkg/constants/constants.go  2025-04-11 
16:24:19.000000000 +0200
@@ -32,6 +32,7 @@
        CNIEventSocket                    = "cni-event-address"
        CNIAgentRunDir                    = "cni-agent-run-dir"
        ExcludeNamespaces                 = "exclude-namespaces"
+       PodNamespace                      = "pod-namespace"
        AmbientEnabled                    = "ambient-enabled"
        AmbientDNSCapture                 = "ambient-dns-capture"
        AmbientIPv6                       = "ambient-ipv6"
@@ -63,6 +64,8 @@
        UDSLogPath            = "/log"
        CNIEventSocketName    = "pluginevent.sock"
        LogUDSSocketName      = "log.sock"
+       LocalRollingLogName   = "istio-cni.log"
+       RollingLogMaxSizeMB   = 10
        CNIPluginKubeconfName = "istio-cni-kubeconfig"
        // K8s liveness and readiness endpoints
        LivenessEndpoint   = "/healthz"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istioctl-1.25.1/cni/pkg/install/cniconfig.go 
new/istioctl-1.25.2/cni/pkg/install/cniconfig.go
--- old/istioctl-1.25.1/cni/pkg/install/cniconfig.go    2025-03-22 
06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/cni/pkg/install/cniconfig.go    2025-04-11 
16:24:19.000000000 +0200
@@ -37,6 +37,7 @@
                CNIAgentRunDir:    cfg.CNIAgentRunDir,
                AmbientEnabled:    cfg.AmbientEnabled,
                ExcludeNamespaces: strings.Split(cfg.ExcludeNamespaces, ","),
+               PodNamespace:      cfg.PodNamespace,
        }
 
        pluginConfig.Name = "istio-cni"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istioctl-1.25.1/cni/pkg/install/cniconfig_test.go 
new/istioctl-1.25.2/cni/pkg/install/cniconfig_test.go
--- old/istioctl-1.25.1/cni/pkg/install/cniconfig_test.go       2025-03-22 
06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/cni/pkg/install/cniconfig_test.go       2025-04-11 
16:24:19.000000000 +0200
@@ -366,6 +366,7 @@
   "name": "istio-cni",
   "type": "istio-cni",
   "plugin_log_level": "__LOG_LEVEL__",
+  "pod_namespace": "__POD_NAMESPACE__",
   "kubernetes": {
       "kubeconfig": "__KUBECONFIG_FILENAME__",
       "cni_bin_dir": "/path/cni/bin"
@@ -451,6 +452,7 @@
                        ChainedCNIPlugin: c.chainedCNIPlugin,
                        PluginLogLevel:   "debug",
                        CNIAgentRunDir:   kubeconfigFilename,
+                       PodNamespace:     "my-namespace",
                }
 
                cfg := config.InstallConfig{
@@ -458,6 +460,7 @@
                        ChainedCNIPlugin: c.chainedCNIPlugin,
                        PluginLogLevel:   "debug",
                        CNIAgentRunDir:   kubeconfigFilename,
+                       PodNamespace:     "my-namespace",
                }
                test := func(cfg config.InstallConfig) func(t *testing.T) {
                        return func(t *testing.T) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/cni/pkg/install/testdata/bridge.conf.golden 
new/istioctl-1.25.2/cni/pkg/install/testdata/bridge.conf.golden
--- old/istioctl-1.25.1/cni/pkg/install/testdata/bridge.conf.golden     
2025-03-22 06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/cni/pkg/install/testdata/bridge.conf.golden     
2025-04-11 16:24:19.000000000 +0200
@@ -27,6 +27,7 @@
       "ipam": {},
       "name": "istio-cni",
       "plugin_log_level": "debug",
+      "pod_namespace": "my-namespace",
       "type": "istio-cni"
     }
   ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/cni/pkg/install/testdata/istio-cni.conf 
new/istioctl-1.25.2/cni/pkg/install/testdata/istio-cni.conf
--- old/istioctl-1.25.1/cni/pkg/install/testdata/istio-cni.conf 2025-03-22 
06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/cni/pkg/install/testdata/istio-cni.conf 2025-04-11 
16:24:19.000000000 +0200
@@ -9,5 +9,6 @@
   "ambient_enabled": false,
   "exclude_namespaces": [
     ""
-  ]
+  ],
+  "pod_namespace": "my-namespace"
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/cni/pkg/install/testdata/list-with-istio.conflist.golden 
new/istioctl-1.25.2/cni/pkg/install/testdata/list-with-istio.conflist.golden
--- 
old/istioctl-1.25.1/cni/pkg/install/testdata/list-with-istio.conflist.golden    
    2025-03-22 06:37:44.000000000 +0100
+++ 
new/istioctl-1.25.2/cni/pkg/install/testdata/list-with-istio.conflist.golden    
    2025-04-11 16:24:19.000000000 +0200
@@ -37,6 +37,7 @@
       "ipam": {},
       "name": "istio-cni",
       "plugin_log_level": "debug",
+      "pod_namespace": "my-namespace",
       "type": "istio-cni"
     }
   ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/cni/pkg/install/testdata/list.conflist.golden 
new/istioctl-1.25.2/cni/pkg/install/testdata/list.conflist.golden
--- old/istioctl-1.25.1/cni/pkg/install/testdata/list.conflist.golden   
2025-03-22 06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/cni/pkg/install/testdata/list.conflist.golden   
2025-04-11 16:24:19.000000000 +0200
@@ -37,6 +37,7 @@
       "ipam": {},
       "name": "istio-cni",
       "plugin_log_level": "debug",
+      "pod_namespace": "my-namespace",
       "type": "istio-cni"
     }
   ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istioctl-1.25.1/cni/pkg/plugin/plugin.go 
new/istioctl-1.25.2/cni/pkg/plugin/plugin.go
--- old/istioctl-1.25.1/cni/pkg/plugin/plugin.go        2025-03-22 
06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/cni/pkg/plugin/plugin.go        2025-04-11 
16:24:19.000000000 +0200
@@ -24,6 +24,7 @@
        "path/filepath"
        "runtime/debug"
        "strconv"
+       "strings"
        "time"
 
        "github.com/containernetworking/cni/pkg/skel"
@@ -66,6 +67,7 @@
        CNIAgentRunDir    string   `json:"cni_agent_run_dir"`
        AmbientEnabled    bool     `json:"ambient_enabled"`
        ExcludeNamespaces []string `json:"exclude_namespaces"`
+       PodNamespace      string   `json:"pod_namespace"`
 }
 
 // K8sArgs is the valid CNI_ARGS used for Kubernetes
@@ -109,6 +111,8 @@
        return &conf, nil
 }
 
+// Logging with CNI plugins is special - we *cannot* log to stdout, as the CNI 
spec uses stdin/stdout to pass context between invoked plugins.
+// So, we log to a rolling logfile, and also forward logs via UDS to the node 
agent (if available)
 func GetLoggingOptions(cfg *Config) *log.Options {
        loggingOptions := log.DefaultOptions()
        loggingOptions.OutputPaths = []string{"stderr"}
@@ -120,6 +124,10 @@
                if file.Exists(udsAddr) {
                        loggingOptions.WithTeeToUDS(udsAddr, 
constants.UDSLogPath)
                }
+
+               // Also tee to a rolling log on the node's local filesystem, in 
case the UDS server is down.
+               
loggingOptions.WithTeeToRollingLocal(filepath.Join(cfg.CNIAgentRunDir, 
constants.LocalRollingLogName), constants.RollingLogMaxSizeMB)
+
                // Override plugin log level based on their config. Not we use 
"all" (OverrideScopeName) since there is no scoping in the plugin.
                if cfg.PluginLogLevel != "" {
                        
loggingOptions.SetDefaultOutputLevel(log.OverrideScopeName, 
log.StringToLevel(cfg.PluginLogLevel))
@@ -222,8 +230,9 @@
                        cniEventAddr := filepath.Join(conf.CNIAgentRunDir, 
constants.CNIEventSocketName)
                        cniClient := newCNIClient(cniEventAddr, 
constants.CNIAddEventPath)
                        if err = PushCNIEvent(cniClient, args, prevResIps, 
podName, podNamespace); err != nil {
-                               log.Errorf("istio-cni cmdAdd failed to signal 
node Istio CNI agent: %s", err)
-                               return err
+                               // return a more informative error in the pod 
event log if CNI plugin fails
+                               wrapErr := fmt.Errorf("istio-cni cmdAdd failed 
to contact node Istio CNI agent: %s", err)
+                               return wrapErr
                        }
                        return nil
                }
@@ -231,6 +240,8 @@
        }
        // End ambient plugin logic
 
+       maybeCNIPod := string(k8sArgs.K8S_POD_NAME)
+       maybeCNINS := string(k8sArgs.K8S_POD_NAMESPACE)
        pi := &PodInfo{}
        var k8sErr error
        for attempt := 1; attempt <= podRetrievalMaxRetries; attempt++ {
@@ -239,8 +250,35 @@
                        break
                }
                log.Debugf("Failed to get %s/%s pod info: %v", podNamespace, 
podName, k8sErr)
+
+               // Failsafe - if we get here, we could be in a state where
+               // 1. We are being upgraded - `istio-cni` node agent pod is gone
+               // 2. This plugin was left in place to stall pod spawns until 
the
+               // replacement arrives.
+               // 3. This plugin can't contact the K8S API server (creds 
expired/invalid)
+               // 4. The pod this plugin would be blocking by returning this 
error
+               // *is* our replacement `istio-cni` pod (which would refresh 
our creds)
+               //
+               // So, if we can't contact the K8S API server at all, fall back 
to checking the
+               // K8S_POD/K8S_NAMESPACE values from the CNI layer, and let 
this pod through
+               // if it looks like it might be our `istio-cni` node agent.
+               //
+               // We could do this check unconditionally above, but it seems 
smarter to only
+               // fall back to this (lightly) relaxed check when we know we 
are in a degraded state.
+               //
+               // Is this fail open? Not really, the K8S args come from the 
cluster's CNI and are as-authoritative
+               // as the hard query we would otherwise make against the API.
+               //
+               // TODO NRI could probably give us more identifying information 
here OOB from k8s.
+               if strings.HasPrefix(maybeCNIPod, "istio-cni-node-") &&
+                       maybeCNINS == conf.PodNamespace {
+                       log.Infof("in a degraded state and %v looks like our 
own agent pod, skipping", maybeCNIPod)
+                       return nil
+               }
+
                time.Sleep(podRetrievalInterval)
        }
+
        if k8sErr != nil {
                log.Errorf("Failed to get %s/%s pod info: %v", podNamespace, 
podName, k8sErr)
                return k8sErr
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/cni/test/testdata/expected/10-calico.conflist-istioconfig 
new/istioctl-1.25.2/cni/test/testdata/expected/10-calico.conflist-istioconfig
--- 
old/istioctl-1.25.1/cni/test/testdata/expected/10-calico.conflist-istioconfig   
    2025-03-22 06:37:44.000000000 +0100
+++ 
new/istioctl-1.25.2/cni/test/testdata/expected/10-calico.conflist-istioconfig   
    2025-04-11 16:24:19.000000000 +0200
@@ -34,6 +34,7 @@
       "ipam": {},
       "name": "istio-cni",
       "plugin_log_level": "debug",
+      "pod_namespace": "",
       "type": "istio-cni"
     }
   ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/cni/test/testdata/expected/YYY-istio-cni.conf 
new/istioctl-1.25.2/cni/test/testdata/expected/YYY-istio-cni.conf
--- old/istioctl-1.25.1/cni/test/testdata/expected/YYY-istio-cni.conf   
2025-03-22 06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/cni/test/testdata/expected/YYY-istio-cni.conf   
2025-04-11 16:24:19.000000000 +0200
@@ -9,5 +9,6 @@
   "ambient_enabled": false,
   "exclude_namespaces": [
     "istio-system"
-  ]
+  ],
+  "pod_namespace": ""
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/cni/test/testdata/expected/minikube_cni.conflist.expected 
new/istioctl-1.25.2/cni/test/testdata/expected/minikube_cni.conflist.expected
--- 
old/istioctl-1.25.1/cni/test/testdata/expected/minikube_cni.conflist.expected   
    2025-03-22 06:37:44.000000000 +0100
+++ 
new/istioctl-1.25.2/cni/test/testdata/expected/minikube_cni.conflist.expected   
    2025-04-11 16:24:19.000000000 +0200
@@ -31,6 +31,7 @@
       "ipam": {},
       "name": "istio-cni",
       "plugin_log_level": "debug",
+      "pod_namespace": "",
       "type": "istio-cni"
     }
   ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istioctl-1.25.1/common/.commonfiles.sha 
new/istioctl-1.25.2/common/.commonfiles.sha
--- old/istioctl-1.25.1/common/.commonfiles.sha 2025-03-22 06:37:44.000000000 
+0100
+++ new/istioctl-1.25.2/common/.commonfiles.sha 2025-04-11 16:24:19.000000000 
+0200
@@ -1 +1 @@
-cc5b9dbfa2da642c086e67c6dae3a27076f40e4b
+e2468dc1777226309f31a3bc29a1a3d1620240bb
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istioctl-1.25.1/common/scripts/run.sh 
new/istioctl-1.25.2/common/scripts/run.sh
--- old/istioctl-1.25.1/common/scripts/run.sh   2025-03-22 06:37:44.000000000 
+0100
+++ new/istioctl-1.25.2/common/scripts/run.sh   2025-04-11 16:24:19.000000000 
+0200
@@ -47,7 +47,6 @@
     "${DOCKER_RUN_OPTIONS[@]}" \
     --init \
     --sig-proxy=true \
-    --cap-add=SYS_ADMIN \
     ${DOCKER_SOCKET_MOUNT:--v /var/run/docker.sock:/var/run/docker.sock} \
     $CONTAINER_OPTIONS \
     --env-file <(env | grep -v ${ENV_BLOCKLIST}) \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istioctl-1.25.1/common/scripts/setup_env.sh 
new/istioctl-1.25.2/common/scripts/setup_env.sh
--- old/istioctl-1.25.1/common/scripts/setup_env.sh     2025-03-22 
06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/common/scripts/setup_env.sh     2025-04-11 
16:24:19.000000000 +0200
@@ -75,7 +75,7 @@
 TOOLS_REGISTRY_PROVIDER=${TOOLS_REGISTRY_PROVIDER:-gcr.io}
 PROJECT_ID=${PROJECT_ID:-istio-testing}
 if [[ "${IMAGE_VERSION:-}" == "" ]]; then
-  IMAGE_VERSION=release-1.25-78fa2111903203d3003f2fca26dd8c42112fe29e
+  IMAGE_VERSION=release-1.25-3860042a009e8b9d8a63eca8756803d0e7aad5bb
 fi
 if [[ "${IMAGE_NAME:-}" == "" ]]; then
   IMAGE_NAME=build-tools
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istioctl-1.25.1/go.mod new/istioctl-1.25.2/go.mod
--- old/istioctl-1.25.1/go.mod  2025-03-22 06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/go.mod  2025-04-11 16:24:19.000000000 +0200
@@ -89,11 +89,12 @@
        google.golang.org/genproto/googleapis/rpc 
v0.0.0-20250122153221-138b5a5a4fd4
        google.golang.org/grpc v1.69.4
        google.golang.org/protobuf v1.36.3
+       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.0
-       istio.io/api v1.25.1-0.20250321204246-eb3f2673759c
-       istio.io/client-go v1.25.1-0.20250321204545-b102c2d01354
+       istio.io/api v1.25.2-0.20250410212420-84c271001f68
+       istio.io/client-go v1.25.2-0.20250410213018-e5f6074bc228
        k8s.io/api v0.32.1
        k8s.io/apiextensions-apiserver v0.32.1
        k8s.io/apimachinery v0.32.1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istioctl-1.25.1/go.sum new/istioctl-1.25.2/go.sum
--- old/istioctl-1.25.1/go.sum  2025-03-22 06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/go.sum  2025-04-11 16:24:19.000000000 +0200
@@ -652,6 +652,8 @@
 gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
 gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
 gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/natefinch/lumberjack.v2 v2.2.1 
h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
+gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod 
h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
@@ -666,10 +668,10 @@
 helm.sh/helm/v3 v3.17.0/go.mod h1:Mo7eGyKPPHlS0Ml67W8z/lbkox/gD9Xt1XpD6bxvZZA=
 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.25.1-0.20250321204246-eb3f2673759c 
h1:noezmv3FpPUjO4SFBjy/dDkW51YvyqMFTQczsD5foSc=
-istio.io/api v1.25.1-0.20250321204246-eb3f2673759c/go.mod 
h1:QFzEXv/IT582T0FHZVp1QoolvE4ws0zz/vVO55blmlE=
-istio.io/client-go v1.25.1-0.20250321204545-b102c2d01354 
h1:PpZL9h/qUGBu3ByxXi50S9ITHAID7DEs/RB9IIycRYY=
-istio.io/client-go v1.25.1-0.20250321204545-b102c2d01354/go.mod 
h1:Vap9OyHJMvvDegYoZczcNybS4wbPaTk+4bZcWMb8+vE=
+istio.io/api v1.25.2-0.20250410212420-84c271001f68 
h1:v+9w/OYqRpsGXJirWT/1k+rCPxI7FL8SblJbrQAUC6c=
+istio.io/api v1.25.2-0.20250410212420-84c271001f68/go.mod 
h1:QFzEXv/IT582T0FHZVp1QoolvE4ws0zz/vVO55blmlE=
+istio.io/client-go v1.25.2-0.20250410213018-e5f6074bc228 
h1:U6Hto4YRRdZHBaALhoSYvzwyUfWxdLz/OldQSyVGWPw=
+istio.io/client-go v1.25.2-0.20250410213018-e5f6074bc228/go.mod 
h1:E2LTxTcCVe4cqpKy4/9Y4VmwSoLiH6ff9MEG7EhfSDo=
 k8s.io/api v0.32.1 h1:f562zw9cy+GvXzXf0CKlVQ7yHJVYzLfL6JAS4kOAaOc=
 k8s.io/api v0.32.1/go.mod h1:/Yi/BqkuueW1BgpoePYBRdDYfjPF5sgTr5+YqDZra5k=
 k8s.io/apiextensions-apiserver v0.32.1 
h1:hjkALhRUeCariC8DiVmb5jj0VjIc1N0DREP32+6UXZw=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istioctl-1.25.1/istio.deps 
new/istioctl-1.25.2/istio.deps
--- old/istioctl-1.25.1/istio.deps      2025-03-22 06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/istio.deps      2025-04-11 16:24:19.000000000 +0200
@@ -4,13 +4,13 @@
     "name": "PROXY_REPO_SHA",
     "repoName": "proxy",
     "file": "",
-    "lastStableSHA": "d1333136f077ed86411257320fe37d4b5f8b8ddd"
+    "lastStableSHA": "8d14f6fc8fe9703ff17d4377d9053b3cbbe85dea"
   },
   {
     "_comment": "",
     "name": "ZTUNNEL_REPO_SHA",
     "repoName": "ztunnel",
     "file": "",
-    "lastStableSHA": "31902c7512acadf3a93e148c74b24a5683360f5d"
+    "lastStableSHA": "b8527fc5f2a27c0cdc463420f87db67373eac2d8"
   }
 ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/istioctl/pkg/writer/ztunnel/configdump/api.go 
new/istioctl-1.25.2/istioctl/pkg/writer/ztunnel/configdump/api.go
--- old/istioctl-1.25.1/istioctl/pkg/writer/ztunnel/configdump/api.go   
2025-03-22 06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/istioctl/pkg/writer/ztunnel/configdump/api.go   
2025-04-11 16:24:19.000000000 +0200
@@ -126,6 +126,7 @@
        Identity  string  `json:"identity"`
        State     string  `json:"state"`
        CertChain []*Cert `json:"certChain"`
+       RootCert  []*Cert `json:"rootCerts"`
 }
 
 type Cert struct {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/istioctl/pkg/writer/ztunnel/configdump/certificates.go 
new/istioctl-1.25.2/istioctl/pkg/writer/ztunnel/configdump/certificates.go
--- old/istioctl-1.25.1/istioctl/pkg/writer/ztunnel/configdump/certificates.go  
2025-03-22 06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/istioctl/pkg/writer/ztunnel/configdump/certificates.go  
2025-04-11 16:24:19.000000000 +0200
@@ -63,11 +63,13 @@
                        fmt.Fprintf(w, "%v\t%v\t%v\t%v\t%v\t%v\t%v\n",
                                secret.Identity, valueOrNA(""), secret.State, 
false, valueOrNA(""), valueOrNA(""), valueOrNA(""))
                } else {
+                       // Before, the root was part of the certChain.
+                       legacyFormat := len(secret.RootCert) == 0
                        for i, ca := range secret.CertChain {
                                t := "Intermediate"
                                if i == 0 {
                                        t = "Leaf"
-                               } else if i == len(secret.CertChain)-1 {
+                               } else if i == len(secret.CertChain)-1 && 
legacyFormat {
                                        t = "Root"
                                }
                                n := new(big.Int)
@@ -75,6 +77,12 @@
                                fmt.Fprintf(w, "%v\t%v\t%v\t%v\t%x\t%v\t%v\n",
                                        secret.Identity, t, secret.State, 
certNotExpired(ca), n, valueOrNA(ca.ExpirationTime), valueOrNA(ca.ValidFrom))
                        }
+                       for _, ca := range secret.RootCert {
+                               n := new(big.Int)
+                               n, _ = n.SetString(ca.SerialNumber, 10)
+                               fmt.Fprintf(w, "%v\t%v\t%v\t%v\t%x\t%v\t%v\n",
+                                       secret.Identity, "Root", secret.State, 
certNotExpired(ca), n, valueOrNA(ca.ExpirationTime), valueOrNA(ca.ValidFrom))
+                       }
                }
        }
        return w.Flush()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/licenses/gopkg.in/natefinch/lumberjack.v2/LICENSE 
new/istioctl-1.25.2/licenses/gopkg.in/natefinch/lumberjack.v2/LICENSE
--- old/istioctl-1.25.1/licenses/gopkg.in/natefinch/lumberjack.v2/LICENSE       
1970-01-01 01:00:00.000000000 +0100
+++ new/istioctl-1.25.2/licenses/gopkg.in/natefinch/lumberjack.v2/LICENSE       
2025-04-11 16:24:19.000000000 +0200
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Nate Finch 
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/manifests/charts/istio-cni/templates/configmap-cni.yaml 
new/istioctl-1.25.2/manifests/charts/istio-cni/templates/configmap-cni.yaml
--- old/istioctl-1.25.1/manifests/charts/istio-cni/templates/configmap-cni.yaml 
2025-03-22 06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/manifests/charts/istio-cni/templates/configmap-cni.yaml 
2025-04-11 16:24:19.000000000 +0200
@@ -21,8 +21,8 @@
   CNI_CONF_NAME: {{ .Values.cniConfFileName }} # Name of the CNI config file 
to create. Only override if you know the exact path your CNI requires..
   {{- end }}
   CHAINED_CNI_PLUGIN: {{ .Values.chained | quote }}
-  EXCLUDED_NAMESPACES: "{{ range $idx, $ns := .Values.excludeNamespaces }}{{ 
if $idx }},{{ end }}{{ $ns }}{{ end }}"
-  REPAIR_ENABLED: {{ .Values.chained | quote }}
+  EXCLUDE_NAMESPACES: "{{ range $idx, $ns := .Values.excludeNamespaces }}{{ if 
$idx }},{{ end }}{{ $ns }}{{ end }}"
+  REPAIR_ENABLED: {{ .Values.repair.enabled | quote }}
   REPAIR_LABEL_PODS: {{ .Values.repair.labelPods | quote }}
   REPAIR_DELETE_PODS: {{ .Values.repair.deletePods | quote }}
   REPAIR_REPAIR_PODS: {{ .Values.repair.repairPods | quote }}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/manifests/charts/istio-cni/templates/daemonset.yaml 
new/istioctl-1.25.2/manifests/charts/istio-cni/templates/daemonset.yaml
--- old/istioctl-1.25.1/manifests/charts/istio-cni/templates/daemonset.yaml     
2025-03-22 06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/manifests/charts/istio-cni/templates/daemonset.yaml     
2025-04-11 16:24:19.000000000 +0200
@@ -14,6 +14,10 @@
 kind: DaemonSet
 apiVersion: apps/v1
 metadata:
+  # Note that this is templated but evaluates to a fixed name
+  # which the CNI plugin may fall back onto in some failsafe scenarios.
+  # if this name is changed, CNI plugin logic that checks for this name
+  # format should also be updated.
   name: {{ template "name" . }}-node
   namespace: {{ .Release.Namespace }}
   labels:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/manifests/charts/istio-control/istio-discovery/templates/deployment.yaml
 
new/istioctl-1.25.2/manifests/charts/istio-control/istio-discovery/templates/deployment.yaml
--- 
old/istioctl-1.25.1/manifests/charts/istio-control/istio-discovery/templates/deployment.yaml
        2025-03-22 06:37:44.000000000 +0100
+++ 
new/istioctl-1.25.2/manifests/charts/istio-control/istio-discovery/templates/deployment.yaml
        2025-04-11 16:24:19.000000000 +0200
@@ -169,9 +169,10 @@
           # Also, check for an explicit ENV override (legacy approach) and 
prefer that
           # if present
           {{ $ztTrustedNS := or .Values.trustedZtunnelNamespace 
.Release.Namespace }}
+          {{ $ztTrustedName := or .Values.trustedZtunnelName "ztunnel" }}
           {{- if not .Values.env.CA_TRUSTED_NODE_ACCOUNTS }}
           - name: CA_TRUSTED_NODE_ACCOUNTS
-            value: "{{ $ztTrustedNS }}/ztunnel"
+            value: "{{ $ztTrustedNS }}/{{ $ztTrustedName }}"
           {{- end }}
           {{- if .Values.env }}
           {{- range $key, $val := .Values.env }}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/manifests/charts/istio-control/istio-discovery/values.yaml 
new/istioctl-1.25.2/manifests/charts/istio-control/istio-discovery/values.yaml
--- 
old/istioctl-1.25.1/manifests/charts/istio-control/istio-discovery/values.yaml  
    2025-03-22 06:37:44.000000000 +0100
+++ 
new/istioctl-1.25.2/manifests/charts/istio-control/istio-discovery/values.yaml  
    2025-04-11 16:24:19.000000000 +0200
@@ -104,6 +104,8 @@
   # If unset, `istiod` will assume the trusted node proxy ztunnel resides
   # in the same namespace as itself.
   trustedZtunnelNamespace: ""
+  # Set this if you install ztunnel with a name different from the default.
+  trustedZtunnelName: ""
 
   sidecarInjectorWebhook:
     # You can use the field called alwaysInjectSelector and 
neverInjectSelector which will always inject the sidecar or
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/pilot/cmd/pilot-agent/options/security.go 
new/istioctl-1.25.2/pilot/cmd/pilot-agent/options/security.go
--- old/istioctl-1.25.1/pilot/cmd/pilot-agent/options/security.go       
2025-03-22 06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/pilot/cmd/pilot-agent/options/security.go       
2025-04-11 16:24:19.000000000 +0200
@@ -16,6 +16,7 @@
 
 import (
        "fmt"
+       "os"
        "strings"
 
        meshconfig "istio.io/api/mesh/v1alpha1"
@@ -28,6 +29,9 @@
        "istio.io/istio/security/pkg/nodeagent/cafile"
 )
 
+// Similar with ISTIO_META_, which is used to customize the node metadata - 
this customizes extra CA header.
+const caHeaderPrefix = "CA_HEADER_"
+
 func NewSecurityOptions(proxyConfig *meshconfig.ProxyConfig, stsPort int, 
tokenManagerPlugin string) (*security.Options, error) {
        o := &security.Options{
                CAEndpoint:                           caEndpointEnv,
@@ -55,6 +59,7 @@
                CertChainFilePath:                    
security.DefaultCertChainFilePath,
                KeyFilePath:                          
security.DefaultKeyFilePath,
                RootCertFilePath:                     
security.DefaultRootCertFilePath,
+               CAHeaders:                            map[string]string{},
        }
 
        o, err := SetupSecurityOptions(proxyConfig, o, jwtPolicy.Get(),
@@ -63,6 +68,8 @@
                return o, err
        }
 
+       extractCAHeadersFromEnv(o)
+
        return o, err
 }
 
@@ -124,3 +131,19 @@
        }
        return o, nil
 }
+
+// extractCAHeadersFromEnv extracts CA headers from environment variables.
+func extractCAHeadersFromEnv(o *security.Options) {
+       envs := os.Environ()
+       for _, e := range envs {
+               if !strings.HasPrefix(e, caHeaderPrefix) {
+                       continue
+               }
+
+               parts := strings.SplitN(e, "=", 2)
+               if len(parts) != 2 {
+                       continue
+               }
+               o.CAHeaders[parts[0][len(caHeaderPrefix):]] = parts[1]
+       }
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/pilot/cmd/pilot-agent/options/security_test.go 
new/istioctl-1.25.2/pilot/cmd/pilot-agent/options/security_test.go
--- old/istioctl-1.25.1/pilot/cmd/pilot-agent/options/security_test.go  
2025-03-22 06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/pilot/cmd/pilot-agent/options/security_test.go  
2025-04-11 16:24:19.000000000 +0200
@@ -59,3 +59,81 @@
                }
        }
 }
+
+func TestExtractCAHeadersFromEnv(t *testing.T) {
+       tests := []struct {
+               name              string
+               envVars           map[string]string
+               expectedCAHeaders map[string]string
+       }{
+               {
+                       name: "no CA headers",
+                       envVars: map[string]string{
+                               "RANDOM_KEY": "value",
+                       },
+                       expectedCAHeaders: map[string]string{},
+               },
+               {
+                       name: "single CA header",
+                       envVars: map[string]string{
+                               "CA_HEADER_FOO": "foo",
+                       },
+                       expectedCAHeaders: map[string]string{
+                               "FOO": "foo",
+                       },
+               },
+               {
+                       name: "multiple CA headers",
+                       envVars: map[string]string{
+                               "CA_HEADER_FOO": "foo",
+                               "CA_HEADER_BAR": "bar",
+                       },
+                       expectedCAHeaders: map[string]string{
+                               "FOO": "foo",
+                               "BAR": "bar",
+                       },
+               },
+               {
+                       name: "mixed CA and non-CA headers",
+                       envVars: map[string]string{
+                               "CA_HEADER_FOO":  "foo",
+                               "XDS_HEADER_BAR": "bar",
+                               "CA_HEADER_BAZ":  "=baz",
+                       },
+                       expectedCAHeaders: map[string]string{
+                               "FOO": "foo",
+                               "BAZ": "=baz",
+                       },
+               },
+       }
+
+       for _, tt := range tests {
+               t.Run(tt.name, func(t *testing.T) {
+                       // Set environment variables
+                       for k, v := range tt.envVars {
+                               os.Setenv(k, v)
+                       }
+                       // Clean up environment variables after test
+                       defer func() {
+                               for k := range tt.envVars {
+                                       os.Unsetenv(k)
+                               }
+                       }()
+
+                       o := &security.Options{
+                               CAHeaders: map[string]string{},
+                       }
+                       extractCAHeadersFromEnv(o)
+
+                       if len(o.CAHeaders) != len(tt.expectedCAHeaders) {
+                               t.Errorf("expected %d CA headers, got %d", 
len(tt.expectedCAHeaders), len(o.CAHeaders))
+                       }
+
+                       for k, v := range tt.expectedCAHeaders {
+                               if o.CAHeaders[k] != v {
+                                       t.Errorf("expected CA header %s to be 
%s, got %s", k, v, o.CAHeaders[k])
+                               }
+                       }
+               })
+       }
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/pilot/pkg/networking/core/httproute.go 
new/istioctl-1.25.2/pilot/pkg/networking/core/httproute.go
--- old/istioctl-1.25.1/pilot/pkg/networking/core/httproute.go  2025-03-22 
06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/pilot/pkg/networking/core/httproute.go  2025-04-11 
16:24:19.000000000 +0200
@@ -116,7 +116,7 @@
 // TODO: trace decorators, inbound timeouts
 func buildSidecarInboundHTTPRouteConfig(lb *ListenerBuilder, cc 
inboundChainConfig) *route.RouteConfiguration {
        traceOperation := 
telemetry.TraceOperation(string(cc.telemetryMetadata.InstanceHostname), 
cc.port.Port)
-       defaultRoute := istio_route.BuildDefaultHTTPInboundRoute(lb.node, 
cc.clusterName, traceOperation)
+       defaultRoute := istio_route.BuildDefaultHTTPInboundRoute(lb.node, 
cc.clusterName, traceOperation, cc.port.Protocol)
 
        inboundVHost := &route.VirtualHost{
                Name:    inboundVirtualHostPrefix + strconv.Itoa(cc.port.Port), 
// Format: "inbound|http|%d"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/pilot/pkg/networking/core/route/route.go 
new/istioctl-1.25.2/pilot/pkg/networking/core/route/route.go
--- old/istioctl-1.25.1/pilot/pkg/networking/core/route/route.go        
2025-03-22 06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/pilot/pkg/networking/core/route/route.go        
2025-04-11 16:24:19.000000000 +0200
@@ -47,6 +47,7 @@
        "istio.io/istio/pkg/config/constants"
        "istio.io/istio/pkg/config/host"
        "istio.io/istio/pkg/config/labels"
+       "istio.io/istio/pkg/config/protocol"
        "istio.io/istio/pkg/jwt"
        "istio.io/istio/pkg/log"
        "istio.io/istio/pkg/util/grpc"
@@ -1241,7 +1242,7 @@
 }
 
 // BuildDefaultHTTPInboundRoute builds a default inbound route.
-func BuildDefaultHTTPInboundRoute(proxy *model.Proxy, clusterName string, 
operation string) *route.Route {
+func BuildDefaultHTTPInboundRoute(proxy *model.Proxy, clusterName string, 
operation string, protocol protocol.Instance) *route.Route {
        out := buildDefaultHTTPRoute(clusterName, operation)
        // For inbound, configure with notimeout.
        out.GetRoute().Timeout = Notimeout
@@ -1251,7 +1252,8 @@
                // gRPC requests time out like any other requests using timeout 
or its default.
                GrpcTimeoutHeaderMax: Notimeout,
        }
-       if util.VersionGreaterOrEqual124(proxy) && 
features.EnableInboundRetryPolicy {
+       // "reset-before-request" does not work well for gRPC streaming 
services.
+       if util.VersionGreaterOrEqual124(proxy) && 
features.EnableInboundRetryPolicy && !protocol.IsGRPC() {
                out.GetRoute().RetryPolicy = &route.RetryPolicy{
                        RetryOn: "reset-before-request",
                        NumRetries: &wrapperspb.UInt32Value{
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/pilot/pkg/networking/core/route/route_cache.go 
new/istioctl-1.25.2/pilot/pkg/networking/core/route/route_cache.go
--- old/istioctl-1.25.1/pilot/pkg/networking/core/route/route_cache.go  
2025-03-22 06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/pilot/pkg/networking/core/route/route_cache.go  
2025-04-11 16:24:19.000000000 +0200
@@ -147,6 +147,12 @@
                h.Write(Slash)
                h.WriteString(svc.Attributes.Namespace)
                h.Write(Separator)
+               for _, alias := range svc.Attributes.Aliases {
+                       h.WriteString(string(alias.Hostname))
+                       h.Write(Slash)
+                       h.WriteString(alias.Namespace)
+                       h.Write(Separator)
+               }
        }
        h.Write(Separator)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/pilot/pkg/networking/core/route/route_test.go 
new/istioctl-1.25.2/pilot/pkg/networking/core/route/route_test.go
--- old/istioctl-1.25.1/pilot/pkg/networking/core/route/route_test.go   
2025-03-22 06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/pilot/pkg/networking/core/route/route_test.go   
2025-04-11 16:24:19.000000000 +0200
@@ -2988,11 +2988,13 @@
        testCases := []struct {
                name        string
                enableRetry bool
+               protocol    protocol.Instance
                expected    *envoyroute.Route
        }{
                {
-                       name:        "enable retry",
+                       name:        "enable retry, http protocol",
                        enableRetry: true,
+                       protocol:    protocol.HTTP,
                        expected: &envoyroute.Route{
                                Name:  "default",
                                Match: 
route.TranslateRouteMatch(config.Config{}, nil),
@@ -3018,8 +3020,31 @@
                        },
                },
                {
+                       name:        "enable retry, grpc protocol",
+                       enableRetry: true,
+                       protocol:    protocol.GRPC,
+                       expected: &envoyroute.Route{
+                               Name:  "default",
+                               Match: 
route.TranslateRouteMatch(config.Config{}, nil),
+                               Action: &envoyroute.Route_Route{
+                                       Route: &envoyroute.RouteAction{
+                                               ClusterSpecifier: 
&envoyroute.RouteAction_Cluster{Cluster: "cluster"},
+                                               Timeout:          
route.Notimeout,
+                                               MaxStreamDuration: 
&envoyroute.RouteAction_MaxStreamDuration{
+                                                       MaxStreamDuration:    
route.Notimeout,
+                                                       GrpcTimeoutHeaderMax: 
route.Notimeout,
+                                               },
+                                       },
+                               },
+                               Decorator: &envoyroute.Decorator{
+                                       Operation: "operation",
+                               },
+                       },
+               },
+               {
                        name:        "disable retry",
                        enableRetry: false,
+                       protocol:    protocol.HTTP,
                        expected: &envoyroute.Route{
                                Name:  "default",
                                Match: 
route.TranslateRouteMatch(config.Config{}, nil),
@@ -3043,7 +3068,7 @@
                t.Run(tc.name, func(t *testing.T) {
                        test.SetForTest(t, &features.EnableInboundRetryPolicy, 
tc.enableRetry)
                        inroute := 
route.BuildDefaultHTTPInboundRoute(&model.Proxy{IstioVersion: 
&model.IstioVersion{Major: 1, Minor: 24, Patch: -1}},
-                               "cluster", "operation")
+                               "cluster", "operation", tc.protocol)
                        if !reflect.DeepEqual(tc.expected, inroute) {
                                t.Errorf("error in inbound routes. Got: %v, 
Want: %v", inroute, tc.expected)
                        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/pilot/pkg/serviceregistry/kube/controller/ambient/ambientindex.go
 
new/istioctl-1.25.2/pilot/pkg/serviceregistry/kube/controller/ambient/ambientindex.go
--- 
old/istioctl-1.25.1/pilot/pkg/serviceregistry/kube/controller/ambient/ambientindex.go
       2025-03-22 06:37:44.000000000 +0100
+++ 
new/istioctl-1.25.2/pilot/pkg/serviceregistry/kube/controller/ambient/ambientindex.go
       2025-04-11 16:24:19.000000000 +0200
@@ -221,6 +221,8 @@
                        Waypoints,
                        Services,
                        ServiceEntries,
+                       GatewayClasses,
+                       MeshConfig,
                        Namespaces,
                        opts,
                )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/pilot/pkg/serviceregistry/kube/controller/ambient/authorization_test.go
 
new/istioctl-1.25.2/pilot/pkg/serviceregistry/kube/controller/ambient/authorization_test.go
--- 
old/istioctl-1.25.1/pilot/pkg/serviceregistry/kube/controller/ambient/authorization_test.go
 2025-03-22 06:37:44.000000000 +0100
+++ 
new/istioctl-1.25.2/pilot/pkg/serviceregistry/kube/controller/ambient/authorization_test.go
 2025-04-11 16:24:19.000000000 +0200
@@ -16,6 +16,7 @@
 
 import (
        "context"
+       "fmt"
        "testing"
        "time"
 
@@ -32,10 +33,13 @@
        securityclient "istio.io/client-go/pkg/apis/security/v1"
        "istio.io/istio/pilot/pkg/model"
        "istio.io/istio/pkg/config/constants"
+       "istio.io/istio/pkg/config/mesh"
+       "istio.io/istio/pkg/config/mesh/meshwatcher"
        "istio.io/istio/pkg/config/schema/gvk"
        "istio.io/istio/pkg/kube"
        "istio.io/istio/pkg/kube/kclient"
        "istio.io/istio/pkg/kube/krt"
+       "istio.io/istio/pkg/kube/krt/krttest"
        "istio.io/istio/pkg/test/util/assert"
        "istio.io/istio/pkg/test/util/retry"
        "istio.io/istio/pkg/workloadapi"
@@ -228,6 +232,16 @@
        clientSe := kclient.New[*networkingclient.ServiceEntry](c)
        seCol := krt.WrapClient(clientSe)
 
+       clientGwClass := kclient.New[*gtwapiv1beta1.GatewayClass](c)
+       gwClassCol := krt.WrapClient(clientGwClass)
+
+       meshConfigMock := krttest.NewMock(t, []any{
+               meshwatcher.MeshConfigResource{
+                       MeshConfig: mesh.DefaultMeshConfig(),
+               },
+       })
+       meshConfigCol := GetMeshConfig(meshConfigMock)
+
        clientNs := kclient.New[*v1.Namespace](c)
        nsCol := krt.WrapClient(clientNs)
 
@@ -258,7 +272,7 @@
                }
        })
 
-       wpsCollection := WaypointPolicyStatusCollection(authzPolCol, 
waypointCol, svcCol, seCol, nsCol, krt.OptionsBuilder{})
+       wpsCollection := WaypointPolicyStatusCollection(authzPolCol, 
waypointCol, svcCol, seCol, gwClassCol, meshConfigCol, nsCol, 
krt.OptionsBuilder{})
        c.RunAndWait(ctx.Done())
 
        _, err := clientNs.Create(&v1.Namespace{
@@ -978,6 +992,165 @@
                                },
                        },
                },
+               {
+                       testName: "single-bind-gateway-class",
+                       gatewayClasses: []gtwapiv1beta1.GatewayClass{
+                               {
+                                       ObjectMeta: metav1.ObjectMeta{
+                                               Name: "istio-waypoint",
+                                       },
+                                       Spec: gtwapiv1beta1.GatewayClassSpec{
+                                               ControllerName: 
constants.ManagedGatewayMeshController,
+                                       },
+                               },
+                       },
+                       policy: securityclient.AuthorizationPolicy{
+                               ObjectMeta: metav1.ObjectMeta{
+                                       Name:       "single-gateway-class-pol",
+                                       Namespace:  "istio-system",
+                                       Generation: 1,
+                               },
+                               Spec: v1beta1.AuthorizationPolicy{
+                                       TargetRefs: 
[]*apiv1beta1.PolicyTargetReference{
+                                               {
+                                                       Group: 
gvk.GatewayClass.Group,
+                                                       Kind:  
gvk.GatewayClass.Kind,
+                                                       Name:  "istio-waypoint",
+                                               },
+                                       },
+                                       Rules:  []*v1beta1.Rule{},
+                                       Action: 0,
+                               },
+                       },
+                       expect: []model.PolicyBindingStatus{
+                               {
+                                       Ancestor: 
"GatewayClass.gateway.networking.k8s.io:istio-system/istio-waypoint",
+                                       Status: &model.StatusMessage{
+                                               Reason:  
model.WaypointPolicyReasonAccepted,
+                                               Message: "bound to 
istio-waypoint",
+                                       },
+                                       Bound:              true,
+                                       ObservedGeneration: 1,
+                               },
+                       },
+               },
+               {
+                       testName:       "nonexistent-gateway-class",
+                       gatewayClasses: []gtwapiv1beta1.GatewayClass{},
+                       policy: securityclient.AuthorizationPolicy{
+                               ObjectMeta: metav1.ObjectMeta{
+                                       Name:       
"single-no-gateway-class-pol",
+                                       Namespace:  "istio-system",
+                                       Generation: 1,
+                               },
+                               Spec: v1beta1.AuthorizationPolicy{
+                                       TargetRefs: 
[]*apiv1beta1.PolicyTargetReference{
+                                               {
+                                                       Group: 
gvk.GatewayClass.Group,
+                                                       Kind:  
gvk.GatewayClass.Kind,
+                                                       Name:  
"nonexistent-gateway-class",
+                                               },
+                                       },
+                                       Rules:  []*v1beta1.Rule{},
+                                       Action: 0,
+                               },
+                       },
+                       expect: []model.PolicyBindingStatus{
+                               {
+                                       Ancestor: 
"GatewayClass.gateway.networking.k8s.io:istio-system/nonexistent-gateway-class",
+                                       Status: &model.StatusMessage{
+                                               Reason:  
model.WaypointPolicyReasonTargetNotFound,
+                                               Message: "not bound",
+                                       },
+                                       Bound:              false,
+                                       ObservedGeneration: 1,
+                               },
+                       },
+               },
+               {
+                       testName: "non-waypoint-gateway-class",
+                       gatewayClasses: []gtwapiv1beta1.GatewayClass{
+                               {
+                                       ObjectMeta: metav1.ObjectMeta{
+                                               Name: "not-for-waypoint",
+                                       },
+                                       Spec: gtwapiv1beta1.GatewayClassSpec{
+                                               ControllerName: 
"random-controller",
+                                       },
+                               },
+                       },
+                       policy: securityclient.AuthorizationPolicy{
+                               ObjectMeta: metav1.ObjectMeta{
+                                       Name:       
"non-waypoint-gateway-class-pol",
+                                       Namespace:  "istio-system",
+                                       Generation: 1,
+                               },
+                               Spec: v1beta1.AuthorizationPolicy{
+                                       TargetRefs: 
[]*apiv1beta1.PolicyTargetReference{
+                                               {
+                                                       Group: 
gvk.GatewayClass.Group,
+                                                       Kind:  
gvk.GatewayClass.Kind,
+                                                       Name:  
"not-for-waypoint",
+                                               },
+                                       },
+                                       Rules:  []*v1beta1.Rule{},
+                                       Action: 0,
+                               },
+                       },
+                       expect: []model.PolicyBindingStatus{
+                               {
+                                       Ancestor: 
"GatewayClass.gateway.networking.k8s.io:istio-system/not-for-waypoint",
+                                       Status: &model.StatusMessage{
+                                               Reason:  
model.WaypointPolicyReasonInvalid,
+                                               Message: 
fmt.Sprintf("GatewayClass must use controller name `%s` for waypoints", 
constants.ManagedGatewayMeshController),
+                                       },
+                                       Bound:              false,
+                                       ObservedGeneration: 1,
+                               },
+                       },
+               },
+               {
+                       testName: "gateway-class-ap-not-in-root-ns",
+                       gatewayClasses: []gtwapiv1beta1.GatewayClass{
+                               {
+                                       ObjectMeta: metav1.ObjectMeta{
+                                               Name: "waypoint",
+                                       },
+                                       Spec: gtwapiv1beta1.GatewayClassSpec{
+                                               ControllerName: 
constants.ManagedGatewayMeshController,
+                                       },
+                               },
+                       },
+                       policy: securityclient.AuthorizationPolicy{
+                               ObjectMeta: metav1.ObjectMeta{
+                                       Name:       
"gateway-class-ap-not-in-root-ns-pol",
+                                       Namespace:  "other-ns",
+                                       Generation: 1,
+                               },
+                               Spec: v1beta1.AuthorizationPolicy{
+                                       TargetRefs: 
[]*apiv1beta1.PolicyTargetReference{
+                                               {
+                                                       Group: 
gvk.GatewayClass.Group,
+                                                       Kind:  
gvk.GatewayClass.Kind,
+                                                       Name:  "waypoint",
+                                               },
+                                       },
+                                       Rules:  []*v1beta1.Rule{},
+                                       Action: 0,
+                               },
+                       },
+                       expect: []model.PolicyBindingStatus{
+                               {
+                                       Ancestor: 
"GatewayClass.gateway.networking.k8s.io:other-ns/waypoint",
+                                       Status: &model.StatusMessage{
+                                               Reason:  
model.WaypointPolicyReasonInvalid,
+                                               Message: "AuthorizationPolicy 
must be in the root namespace `istio-system` when referencing a GatewayClass",
+                                       },
+                                       Bound:              false,
+                                       ObservedGeneration: 1,
+                               },
+                       },
+               },
        }
 
        // these nolint are to suppress findings regarding copying the mutex 
contained within our service entry proto fields
@@ -996,6 +1169,11 @@
                                assert.NoError(t, err)
                        }
 
+                       for _, gwClass := range tc.gatewayClasses {
+                               _, err := clientGwClass.Create(&gwClass)
+                               assert.NoError(t, err)
+                       }
+
                        _, err := clientAuthzPol.Create(&tc.policy)
                        assert.NoError(t, err)
 
@@ -1014,6 +1192,7 @@
        testName       string
        serviceEntries []networkingclient.ServiceEntry
        services       []v1.Service
+       gatewayClasses []gtwapiv1beta1.GatewayClass
        policy         securityclient.AuthorizationPolicy
        expect         []model.PolicyBindingStatus
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/pilot/pkg/serviceregistry/kube/controller/ambient/policies.go
 
new/istioctl-1.25.2/pilot/pkg/serviceregistry/kube/controller/ambient/policies.go
--- 
old/istioctl-1.25.1/pilot/pkg/serviceregistry/kube/controller/ambient/policies.go
   2025-03-22 06:37:44.000000000 +0100
+++ 
new/istioctl-1.25.2/pilot/pkg/serviceregistry/kube/controller/ambient/policies.go
   2025-04-11 16:24:19.000000000 +0200
@@ -17,16 +17,21 @@
 
 import (
        "fmt"
+       "strconv"
        "strings"
 
        corev1 "k8s.io/api/core/v1"
+       "sigs.k8s.io/gateway-api/apis/v1beta1"
 
+       "istio.io/api/annotation"
        networkingclient "istio.io/client-go/pkg/apis/networking/v1"
        securityclient "istio.io/client-go/pkg/apis/security/v1"
        "istio.io/istio/pilot/pkg/model"
+       "istio.io/istio/pkg/config/constants"
        "istio.io/istio/pkg/config/schema/gvk"
        "istio.io/istio/pkg/kube/krt"
        "istio.io/istio/pkg/log"
+       "istio.io/istio/pkg/ptr"
        "istio.io/istio/pkg/slices"
        "istio.io/istio/pkg/spiffe"
        "istio.io/istio/pkg/workloadapi/security"
@@ -37,6 +42,8 @@
        waypoints krt.Collection[Waypoint],
        services krt.Collection[*corev1.Service],
        serviceEntries krt.Collection[*networkingclient.ServiceEntry],
+       gatewayClasses krt.Collection[*v1beta1.GatewayClass],
+       meshConfig krt.Singleton[MeshConfig],
        namespaces krt.Collection[*corev1.Namespace],
        opts krt.OptionsBuilder,
 ) krt.Collection[model.WaypointPolicyStatus] {
@@ -47,7 +54,14 @@
                                return nil // targetRef is required for binding 
to waypoint
                        }
 
-                       var conditions []model.PolicyBindingStatus
+                       var (
+                               conditions []model.PolicyBindingStatus
+                               rootNs     string
+                       )
+
+                       if meshConfig.Get() != nil {
+                               rootNs = 
meshConfig.Get().MeshConfig.RootNamespace
+                       }
 
                        for _, target := range targetRefs {
                                namespace := i.GetNamespace()
@@ -59,6 +73,28 @@
                                reason := "unknown"
                                bound := false
                                switch target.GetKind() {
+                               case gvk.GatewayClass_v1.Kind:
+                                       // first verify the AP is in the root 
namespace, if not it's ignored
+                                       if namespace != rootNs {
+                                               reason = 
model.WaypointPolicyReasonInvalid
+                                               message = 
fmt.Sprintf("AuthorizationPolicy must be in the root namespace `%s` when 
referencing a GatewayClass", rootNs)
+                                               break
+                                       }
+
+                                       fetchedGatewayClass := 
ptr.Flatten(krt.FetchOne(ctx, gatewayClasses, krt.FilterKey(target.GetName())))
+                                       if fetchedGatewayClass == nil {
+                                               reason = 
model.WaypointPolicyReasonTargetNotFound
+                                       } else {
+                                               // verify GatewayClass is for 
waypoint
+                                               if 
fetchedGatewayClass.Spec.ControllerName != 
constants.ManagedGatewayMeshController {
+                                                       reason = 
model.WaypointPolicyReasonInvalid
+                                                       message = 
fmt.Sprintf("GatewayClass must use controller name `%s` for waypoints", 
constants.ManagedGatewayMeshController)
+                                               } else {
+                                                       bound = true
+                                                       reason = 
model.WaypointPolicyReasonAccepted
+                                                       message = 
fmt.Sprintf("bound to %s", fetchedGatewayClass.GetName())
+                                               }
+                                       }
                                case gvk.KubernetesGateway.Kind:
                                        fetchedWaypoints := krt.Fetch(ctx, 
waypoints, krt.FilterKey(key))
                                        if len(fetchedWaypoints) == 1 {
@@ -132,6 +168,10 @@
        flags FeatureFlags,
 ) (krt.Collection[model.WorkloadAuthorization], 
krt.Collection[model.WorkloadAuthorization]) {
        AuthzDerivedPolicies := krt.NewCollection(authzPolicies, func(ctx 
krt.HandlerContext, i *securityclient.AuthorizationPolicy) 
*model.WorkloadAuthorization {
+               dryRun, _ := 
strconv.ParseBool(i.Annotations[annotation.IoIstioDryRun.Name])
+               if dryRun {
+                       return nil
+               }
                meshCfg := krt.FetchOne(ctx, meshConfig.AsCollection())
                pol, status := 
convertAuthorizationPolicy(meshCfg.GetRootNamespace(), i)
                if status == nil && pol == nil {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istioctl-1.25.1/pkg/log/options.go 
new/istioctl-1.25.2/pkg/log/options.go
--- old/istioctl-1.25.1/pkg/log/options.go      2025-03-22 06:37:44.000000000 
+0100
+++ new/istioctl-1.25.2/pkg/log/options.go      2025-04-11 16:24:19.000000000 
+0200
@@ -130,6 +130,15 @@
        })
 }
 
+// WithTeeToRolling configures a parallel logging pipeline that writes logs to 
a local rolling log of fixed size.
+// This is mainly used by the CNI plugin, and so the size and rollover is 
intentionally kept small.
+// rollingPath is the path the rolling log(s) will be written to.
+func (o *Options) WithTeeToRollingLocal(rollingPath string, maxSizeInMB int) 
*Options {
+       return o.WithExtension(func(c zapcore.Core) (zapcore.Core, func() 
error, error) {
+               return teeToRollingLocal(c, rollingPath, maxSizeInMB), func() 
error { return nil }, nil
+       })
+}
+
 // Extension provides an extension mechanism for logs.
 // This is essentially like https://pkg.go.dev/golang.org/x/exp/slog#Handler.
 // This interface should be considered unstable; we will likely swap it for 
slog in the future and not expose zap internals.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istioctl-1.25.1/pkg/log/uds.go 
new/istioctl-1.25.2/pkg/log/uds.go
--- old/istioctl-1.25.1/pkg/log/uds.go  2025-03-22 06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/pkg/log/uds.go  2025-04-11 16:24:19.000000000 +0200
@@ -24,8 +24,10 @@
        "sync"
        "time"
 
+       "go.uber.org/zap"
        "go.uber.org/zap/buffer"
        "go.uber.org/zap/zapcore"
+       lj "gopkg.in/natefinch/lumberjack.v2"
 )
 
 // An udsCore write entries to an UDS server with HTTP Post. Log messages will 
be encoded into a JSON array.
@@ -60,9 +62,30 @@
                        break
                }
        }
+
        return zapcore.NewTee(baseCore, uc)
 }
 
+// Creates a small/fixed rolling log on the node's local FS.
+// This can be useful as a backup/fallback in case the node agent is down
+// and the UDS logging consequently fails (losing logs).
+func teeToRollingLocal(baseCore zapcore.Core, path string, maxSizeMB int) 
zapcore.Core {
+       w := zapcore.AddSync(&lj.Logger{
+               Filename:   path,
+               MaxSize:    maxSizeMB,
+               MaxBackups: 1,
+               MaxAge:     2, // days
+       })
+
+       core := zapcore.NewCore(
+               zapcore.NewJSONEncoder(defaultEncoderConfig),
+               w,
+               zap.InfoLevel,
+       )
+
+       return zapcore.NewTee(baseCore, core)
+}
+
 // Enabled implements zapcore.Core.
 func (u *udsCore) Enabled(l zapcore.Level) bool {
        return l >= u.minimumLevel
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istioctl-1.25.1/pkg/security/security.go 
new/istioctl-1.25.2/pkg/security/security.go
--- old/istioctl-1.25.1/pkg/security/security.go        2025-03-22 
06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/pkg/security/security.go        2025-04-11 
16:24:19.000000000 +0200
@@ -255,6 +255,9 @@
        KeyFilePath string
        // The path for an existing root certificate bundle
        RootCertFilePath string
+
+       // Extra headers to add to the CA connection.
+       CAHeaders map[string]string
 }
 
 // Client interface defines the clients need to implement to talk to CA for 
CSR.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istioctl-1.25.1/releasenotes/notes/55304.yaml 
new/istioctl-1.25.2/releasenotes/notes/55304.yaml
--- old/istioctl-1.25.1/releasenotes/notes/55304.yaml   1970-01-01 
01:00:00.000000000 +0100
+++ new/istioctl-1.25.2/releasenotes/notes/55304.yaml   2025-04-11 
16:24:19.000000000 +0200
@@ -0,0 +1,8 @@
+apiVersion: release-notes/v2
+kind: bug-fix
+area: traffic-management
+issue:
+  - 55215
+releaseNotes:
+  - |
+    **Fixed** Corner cases where `istio-cni` might block its own upgrade. 
Added fallback logging (in case agent is down) to a fixed-size node-local 
logfile.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/releasenotes/notes/add-customized-ca-metadata-support-to-istio-agent.yaml
 
new/istioctl-1.25.2/releasenotes/notes/add-customized-ca-metadata-support-to-istio-agent.yaml
--- 
old/istioctl-1.25.1/releasenotes/notes/add-customized-ca-metadata-support-to-istio-agent.yaml
       1970-01-01 01:00:00.000000000 +0100
+++ 
new/istioctl-1.25.2/releasenotes/notes/add-customized-ca-metadata-support-to-istio-agent.yaml
       2025-04-11 16:24:19.000000000 +0200
@@ -0,0 +1,8 @@
+apiVersion: release-notes/v2
+kind: feature
+area: traffic-management
+issue:
+- 55064
+releaseNotes:
+- |
+  **Added** an environment variable prefix `CA_HEADER_` (similar to 
`XDS_HEADER_``) that can be added to CA requests for different purposes, such 
as routing to appropriate external Istiods. Istio sidecar proxy, router, and 
waypoint now support this feature.
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/releasenotes/notes/ap-gateway-class-status.yml 
new/istioctl-1.25.2/releasenotes/notes/ap-gateway-class-status.yml
--- old/istioctl-1.25.1/releasenotes/notes/ap-gateway-class-status.yml  
1970-01-01 01:00:00.000000000 +0100
+++ new/istioctl-1.25.2/releasenotes/notes/ap-gateway-class-status.yml  
2025-04-11 16:24:19.000000000 +0200
@@ -0,0 +1,6 @@
+apiVersion: release-notes/v2
+kind: bug-fix
+area: traffic-management
+releaseNotes:
+- |
+  **Fixed** an issue where `AuthorizationPolicy`'s WaypointAccepted status 
condition was not being updated to reflect the resolution of a `GatewayClass` 
target reference.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/releasenotes/notes/ap-not-in-root-ns-gwclass-targetref.yml 
new/istioctl-1.25.2/releasenotes/notes/ap-not-in-root-ns-gwclass-targetref.yml
--- 
old/istioctl-1.25.1/releasenotes/notes/ap-not-in-root-ns-gwclass-targetref.yml  
    1970-01-01 01:00:00.000000000 +0100
+++ 
new/istioctl-1.25.2/releasenotes/notes/ap-not-in-root-ns-gwclass-targetref.yml  
    2025-04-11 16:24:19.000000000 +0200
@@ -0,0 +1,6 @@
+apiVersion: release-notes/v2
+kind: bug-fix
+area: traffic-management
+releaseNotes:
+- |
+  **Fixed** an issue where WaypointAccepted status condition for 
AuthorizationPolicies that reference a GatewayClass and do not reside in the 
root namespace was not being updated with the correct reason and message.
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/releasenotes/notes/grpc-inbound-retry.yaml 
new/istioctl-1.25.2/releasenotes/notes/grpc-inbound-retry.yaml
--- old/istioctl-1.25.1/releasenotes/notes/grpc-inbound-retry.yaml      
1970-01-01 01:00:00.000000000 +0100
+++ new/istioctl-1.25.2/releasenotes/notes/grpc-inbound-retry.yaml      
2025-04-11 16:24:19.000000000 +0200
@@ -0,0 +1,6 @@
+apiVersion: release-notes/v2
+kind: bug-fix
+area: traffic-management
+releaseNotes:
+  - |
+    **Fixed** an issue where proxy memory goes up with gRPC streaming services.
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/releasenotes/notes/rds-cache-alias.yaml 
new/istioctl-1.25.2/releasenotes/notes/rds-cache-alias.yaml
--- old/istioctl-1.25.1/releasenotes/notes/rds-cache-alias.yaml 1970-01-01 
01:00:00.000000000 +0100
+++ new/istioctl-1.25.2/releasenotes/notes/rds-cache-alias.yaml 2025-04-11 
16:24:19.000000000 +0200
@@ -0,0 +1,6 @@
+apiVersion: release-notes/v2
+kind: bug-fix
+area: traffic-management
+releaseNotes:
+  - |
+    **Fixed** an issue causing changes to ExternalName services to sometimes 
be skipped due to a cache eviction bug.
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/istioctl-1.25.1/security/pkg/nodeagent/caclient/providers/citadel/client.go 
new/istioctl-1.25.2/security/pkg/nodeagent/caclient/providers/citadel/client.go
--- 
old/istioctl-1.25.1/security/pkg/nodeagent/caclient/providers/citadel/client.go 
    2025-03-22 06:37:44.000000000 +0100
+++ 
new/istioctl-1.25.2/security/pkg/nodeagent/caclient/providers/citadel/client.go 
    2025-04-11 16:24:19.000000000 +0200
@@ -105,6 +105,10 @@
        }()
 
        ctx := metadata.NewOutgoingContext(context.Background(), 
metadata.Pairs("ClusterID", c.opts.ClusterID))
+       for k, v := range c.opts.CAHeaders {
+               ctx = metadata.AppendToOutgoingContext(ctx, k, v)
+       }
+
        resp, err := c.client.CreateCertificate(ctx, req)
        if err != nil {
                return nil, fmt.Errorf("create certificate: %v", err)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istioctl-1.25.1/security/pkg/server/ca/server.go 
new/istioctl-1.25.2/security/pkg/server/ca/server.go
--- old/istioctl-1.25.1/security/pkg/server/ca/server.go        2025-03-22 
06:37:44.000000000 +0100
+++ new/istioctl-1.25.2/security/pkg/server/ca/server.go        2025-04-11 
16:24:19.000000000 +0200
@@ -137,10 +137,6 @@
                        serverCaLog.Debugf("Append cert chain to response, %s", 
string(certChainBytes))
                }
        }
-       if len(rootCertBytes) != 0 {
-               respCertChain = append(respCertChain, string(rootCertBytes))
-       }
-
        // expand `respCertChain` since each element might be a concatenated 
multi-cert PEM
        // the expanded structure (one cert per `string` in `certChain`) is 
specifically expected by `ztunnel`
        response := &pb.IstioCertificateResponse{}
@@ -151,6 +147,13 @@
                        response.CertChain = append(response.CertChain, 
cert+"\n")
                }
        }
+       // Per the spec: "... the root cert is the last element." so we do not 
want to flatten the root cert.
+       // If we did, the client cannot distinguish the root.
+       // A better API would put the root in a separate field entirely...
+       if len(rootCertBytes) != 0 {
+               response.CertChain = append(response.CertChain, 
string(rootCertBytes))
+       }
+
        serverCaLog.Debugf("Responding with cert chain, %q", response.CertChain)
        s.monitoring.Success.Increment()
        serverCaLog.Debugf("CSR successfully signed, sans %v.", sans)

++++++ istioctl.obsinfo ++++++
--- /var/tmp/diff_new_pack.qmb8JN/_old  2025-04-20 19:56:39.524625836 +0200
+++ /var/tmp/diff_new_pack.qmb8JN/_new  2025-04-20 19:56:39.528626004 +0200
@@ -1,5 +1,5 @@
 name: istioctl
-version: 1.25.1
-mtime: 1742621864
-commit: be4b14ad8be844c5f876a41ad4437217a2e03cf8
+version: 1.25.2
+mtime: 1744381459
+commit: 0d83506c28834f5f12553ee11d76a18e7ea75f20
 

++++++ vendor.tar.gz ++++++
/work/SRC/openSUSE:Factory/istioctl/vendor.tar.gz 
/work/SRC/openSUSE:Factory/.istioctl.new.30101/vendor.tar.gz differ: char 5, 
line 1

Reply via email to