Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package linkerd-cli-edge for 
openSUSE:Factory checked in at 2026-04-11 22:25:54
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/linkerd-cli-edge (Old)
 and      /work/SRC/openSUSE:Factory/.linkerd-cli-edge.new.21863 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "linkerd-cli-edge"

Sat Apr 11 22:25:54 2026 rev:71 rq:1346034 version:26.4.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/linkerd-cli-edge/linkerd-cli-edge.changes        
2026-04-04 19:08:12.331063799 +0200
+++ 
/work/SRC/openSUSE:Factory/.linkerd-cli-edge.new.21863/linkerd-cli-edge.changes 
    2026-04-11 22:30:11.769769634 +0200
@@ -1,0 +2,37 @@
+Sat Apr 11 06:59:32 UTC 2026 - Johannes Kastl 
<[email protected]>
+
+- Update to version 26.4.2:
+  * build(deps): bump github.com/mattn/go-runewidth from 0.0.22 to
+    0.0.23 (#15145)
+  * build(deps-dev): bump webpack from 5.105.4 to 5.106.0 in
+    /web/app (#15148)
+  * chore(deps): ignore major lingui updates (#15135)
+  * build(deps): bump github.com/mattn/go-isatty from 0.0.20 to
+    0.0.21 (#15146)
+  * build(deps): bump tokio from 1.51.0 to 1.51.1 (#15147)
+  * build(deps): bump tokio from 1.50.0 to 1.51.0 (#15139)
+  * build(deps): bump cc from 1.2.58 to 1.2.59 (#15140)
+  * build(deps): bump fastrand from 2.3.0 to 2.4.1 (#15137)
+  * build(deps): bump semver from 1.0.27 to 1.0.28 (#15138)
+  * build(deps): bump libc from 0.2.183 to 0.2.184 (#15117)
+  * build(deps): bump indexmap from 2.13.0 to 2.13.1 (#15121)
+  * build(deps): bump google.golang.org/grpc from 1.79.3 to 1.80.0
+    (#15115)
+  * build(deps): bump github.com/mattn/go-runewidth from 0.0.21 to
+    0.0.22 (#15120)
+  * build(deps): bump lodash from 4.17.23 to 4.18.1 in /web/app
+    (#15127)
+  * build(deps-dev): bump jest-environment-jsdom in /web/app
+    (#15128)
+  * build(deps): bump github.com/clarketm/json from 1.15.7 to
+    1.17.1 (#15116)
+  * build(deps): bump docker/login-action from 4.0.0 to 4.1.0
+    (#15122)
+  * build(deps-dev): bump webpack-bundle-analyzer in /web/app
+    (#15129)
+  * build(deps-dev): bump sinon from 21.0.2 to 21.0.3 in /web/app
+    (#15130)
+  * build(deps): bump extractions/setup-just from 3.1.0 to 4.0.0
+    (#15132)
+
+-------------------------------------------------------------------

Old:
----
  linkerd-cli-edge-26.4.1.obscpio

New:
----
  linkerd-cli-edge-26.4.2.obscpio

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

Other differences:
------------------
++++++ linkerd-cli-edge.spec ++++++
--- /var/tmp/diff_new_pack.uPfifx/_old  2026-04-11 22:30:14.193868780 +0200
+++ /var/tmp/diff_new_pack.uPfifx/_new  2026-04-11 22:30:14.197868944 +0200
@@ -19,7 +19,7 @@
 %define linkerd_executable_name linkerd
 
 Name:           linkerd-cli-edge
-Version:        26.4.1
+Version:        26.4.2
 Release:        0
 Summary:        CLI for the linkerd service mesh for Kubernetes
 License:        Apache-2.0

++++++ _service ++++++
--- /var/tmp/diff_new_pack.uPfifx/_old  2026-04-11 22:30:14.465879906 +0200
+++ /var/tmp/diff_new_pack.uPfifx/_new  2026-04-11 22:30:14.501881378 +0200
@@ -3,7 +3,7 @@
     <param name="url">https://github.com/linkerd/linkerd2</param>
     <param name="scm">git</param>
     <param name="exclude">.git</param>
-    <param name="revision">edge-26.4.1</param>
+    <param name="revision">edge-26.4.2</param>
     <param name="match-tag">edge-*.*.*</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="versionrewrite-pattern">edge-(.*)</param>

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.uPfifx/_old  2026-04-11 22:30:14.677888577 +0200
+++ /var/tmp/diff_new_pack.uPfifx/_new  2026-04-11 22:30:14.721890377 +0200
@@ -1,6 +1,6 @@
 <servicedata>
 <service name="tar_scm">
                 <param name="url">https://github.com/linkerd/linkerd2</param>
-              <param 
name="changesrevision">372abd361635ec27e4ba39b40776f93647e7fb13</param></service></servicedata>
+              <param 
name="changesrevision">cda7b5cbafb58d3aeab313e3f5fc51c0e63e1a5b</param></service></servicedata>
 (No newline at EOF)
 

++++++ linkerd-cli-edge-26.4.1.obscpio -> linkerd-cli-edge-26.4.2.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/linkerd-cli-edge-26.4.1/.proxy-version 
new/linkerd-cli-edge-26.4.2/.proxy-version
--- old/linkerd-cli-edge-26.4.1/.proxy-version  2026-04-02 22:49:01.000000000 
+0200
+++ new/linkerd-cli-edge-26.4.2/.proxy-version  2026-04-09 21:36:43.000000000 
+0200
@@ -1 +1 @@
-v2.347.0
+v2.348.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/linkerd-cli-edge-26.4.1/Cargo.lock 
new/linkerd-cli-edge-26.4.2/Cargo.lock
--- old/linkerd-cli-edge-26.4.1/Cargo.lock      2026-04-02 22:49:01.000000000 
+0200
+++ new/linkerd-cli-edge-26.4.2/Cargo.lock      2026-04-09 21:36:43.000000000 
+0200
@@ -219,9 +219,9 @@
 
 [[package]]
 name = "cc"
-version = "1.2.58"
+version = "1.2.59"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e1e928d4b69e3077709075a938a05ffbedfa53a84c8f766efbf8220bb1ff60e1"
+checksum = "b7a4d3ec6524d28a329fc53654bbadc9bdd7b0431f5d65f1a56ffb28a1ee5283"
 dependencies = [
  "find-msvc-tools",
  "jobserver",
@@ -535,7 +535,7 @@
 checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
 dependencies = [
  "libc",
- "windows-sys 0.52.0",
+ "windows-sys 0.61.0",
 ]
 
 [[package]]
@@ -561,9 +561,9 @@
 
 [[package]]
 name = "fastrand"
-version = "2.3.0"
+version = "2.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
+checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6"
 
 [[package]]
 name = "find-msvc-tools"
@@ -1035,9 +1035,9 @@
 
 [[package]]
 name = "indexmap"
-version = "2.13.0"
+version = "2.13.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017"
+checksum = "45a8a2b9cb3e0b0c1803dbb0758ffac5de2f425b23c28f518faabd9d805342ff"
 dependencies = [
  "equivalent",
  "hashbrown 0.16.1",
@@ -1343,9 +1343,9 @@
 
 [[package]]
 name = "libc"
-version = "0.2.183"
+version = "0.2.184"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d"
+checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af"
 
 [[package]]
 name = "linkerd-policy-controller"
@@ -2213,9 +2213,9 @@
 
 [[package]]
 name = "semver"
-version = "1.0.27"
+version = "1.0.28"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2"
+checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
 
 [[package]]
 name = "serde"
@@ -2443,9 +2443,9 @@
 
 [[package]]
 name = "tokio"
-version = "1.50.0"
+version = "1.51.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d"
+checksum = "f66bf9585cda4b724d3e78ab34b73fb2bbaba9011b9bfdf69dc836382ea13b8c"
 dependencies = [
  "bytes",
  "libc",
@@ -2460,9 +2460,9 @@
 
 [[package]]
 name = "tokio-macros"
-version = "2.6.1"
+version = "2.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c"
+checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496"
 dependencies = [
  "proc-macro2",
  "quote",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/linkerd-cli-edge-26.4.1/go.mod 
new/linkerd-cli-edge-26.4.2/go.mod
--- old/linkerd-cli-edge-26.4.1/go.mod  2026-04-02 22:49:01.000000000 +0200
+++ new/linkerd-cli-edge-26.4.2/go.mod  2026-04-09 21:36:43.000000000 +0200
@@ -8,7 +8,7 @@
        github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24
        github.com/bombsimon/logrusr/v4 v4.1.0
        github.com/briandowns/spinner v1.23.2
-       github.com/clarketm/json v1.15.7
+       github.com/clarketm/json v1.17.1
        github.com/emicklei/proto v1.14.3
        github.com/evanphx/json-patch v5.9.11+incompatible
        github.com/fatih/color v1.19.0
@@ -21,8 +21,8 @@
        github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
        github.com/julienschmidt/httprouter v1.3.0
        github.com/linkerd/linkerd2-proxy-api v0.18.0
-       github.com/mattn/go-isatty v0.0.20
-       github.com/mattn/go-runewidth v0.0.21
+       github.com/mattn/go-isatty v0.0.21
+       github.com/mattn/go-runewidth v0.0.23
        github.com/nsf/termbox-go v1.1.1
        github.com/patrickmn/go-cache v2.1.0+incompatible
        github.com/pkg/browser v0.0.0-20170505125900-c90ca0c84f15
@@ -36,7 +36,7 @@
        github.com/spf13/pflag v1.0.10
        go.opencensus.io v0.24.0
        golang.org/x/tools v0.43.0
-       google.golang.org/grpc v1.79.3
+       google.golang.org/grpc v1.80.0
        google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.1
        google.golang.org/protobuf v1.36.11
        gopkg.in/yaml.v2 v2.4.0
@@ -152,8 +152,8 @@
        golang.org/x/time v0.12.0 // indirect
        golang.org/x/tools/godoc v0.1.0-deprecated // indirect
        google.golang.org/api v0.143.0 // indirect
-       google.golang.org/genproto/googleapis/api 
v0.0.0-20251202230838-ff82c1b0f217 // indirect
-       google.golang.org/genproto/googleapis/rpc 
v0.0.0-20251202230838-ff82c1b0f217 // indirect
+       google.golang.org/genproto/googleapis/api 
v0.0.0-20260120221211-b8f7ae30c516 // indirect
+       google.golang.org/genproto/googleapis/rpc 
v0.0.0-20260120221211-b8f7ae30c516 // indirect
        gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect
        gopkg.in/inf.v0 v0.9.1 // indirect
        gopkg.in/yaml.v3 v3.0.1 // indirect
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/linkerd-cli-edge-26.4.1/go.sum 
new/linkerd-cli-edge-26.4.2/go.sum
--- old/linkerd-cli-edge-26.4.1/go.sum  2026-04-02 22:49:01.000000000 +0200
+++ new/linkerd-cli-edge-26.4.2/go.sum  2026-04-09 21:36:43.000000000 +0200
@@ -66,8 +66,8 @@
 github.com/chzyer/logex v1.1.10/go.mod 
h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod 
h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
 github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod 
h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
-github.com/clarketm/json v1.15.7 
h1:zWsOtfj736/nP76KiS0HpcyO6W50ojEodx7T4LW4NMc=
-github.com/clarketm/json v1.15.7/go.mod 
h1:ynr2LRfb0fQU34l07csRNBTcivjySLLiY1YzQqKVfdo=
+github.com/clarketm/json v1.17.1 
h1:U1IxjqJkJ7bRK4L6dyphmoO840P6bdhPdbbLySourqI=
+github.com/clarketm/json v1.17.1/go.mod 
h1:ynr2LRfb0fQU34l07csRNBTcivjySLLiY1YzQqKVfdo=
 github.com/client9/misspell v0.3.4/go.mod 
h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 github.com/clipperhouse/uax29/v2 v2.2.0 
h1:ChwIKnQN3kcZteTXMgb1wztSgaU+ZemkgWdohwgs8tY=
 github.com/clipperhouse/uax29/v2 v2.2.0/go.mod 
h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM=
@@ -293,11 +293,11 @@
 github.com/mailru/easyjson v0.7.7/go.mod 
h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
 github.com/mattn/go-colorable v0.1.14 
h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
 github.com/mattn/go-colorable v0.1.14/go.mod 
h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
-github.com/mattn/go-isatty v0.0.20 
h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
-github.com/mattn/go-isatty v0.0.20/go.mod 
h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/mattn/go-isatty v0.0.21 
h1:xYae+lCNBP7QuW4PUnNG61ffM4hVIfm+zUzDuSzYLGs=
+github.com/mattn/go-isatty v0.0.21/go.mod 
h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4=
 github.com/mattn/go-runewidth v0.0.9/go.mod 
h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
-github.com/mattn/go-runewidth v0.0.21 
h1:jJKAZiQH+2mIinzCJIaIG9Be1+0NR+5sz/lYEEjdM8w=
-github.com/mattn/go-runewidth v0.0.21/go.mod 
h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs=
+github.com/mattn/go-runewidth v0.0.23 
h1:7ykA0T0jkPpzSvMS5i9uoNn2Xy3R383f9HDx3RybWcw=
+github.com/mattn/go-runewidth v0.0.23/go.mod 
h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs=
 github.com/miekg/dns v1.1.57 h1:Jzi7ApEIzwEPLHWRcafCN9LZSBbqQpxjt/wpgvg7wcM=
 github.com/miekg/dns v1.1.57/go.mod 
h1:uqRjCRUuEAA6qsOiJvDd+CFo/vW+y5WR6SNmHE55hZk=
 github.com/mitchellh/copystructure v1.2.0 
h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
@@ -562,7 +562,6 @@
 golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo=
 golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
 golang.org/x/telemetry v0.0.0-20260311193753-579e4da9a98c 
h1:6a8FdnNk6bTXBjR4AGKFgUKuo+7GnR3FX5L7CbveeZc=
@@ -622,8 +621,8 @@
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
-gonum.org/v1/gonum v0.16.0/go.mod 
h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
+gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=
+gonum.org/v1/gonum v0.17.0/go.mod 
h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E=
 google.golang.org/api v0.4.0/go.mod 
h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
 google.golang.org/api v0.7.0/go.mod 
h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
 google.golang.org/api v0.8.0/go.mod 
h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
@@ -663,10 +662,10 @@
 google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod 
h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod 
h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
 google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod 
h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
-google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 
h1:fCvbg86sFXwdrl5LgVcTEvNC+2txB5mgROGmRL5mrls=
-google.golang.org/genproto/googleapis/api 
v0.0.0-20251202230838-ff82c1b0f217/go.mod 
h1:+rXWjjaukWZun3mLfjmVnQi18E1AsFbDN9QdJ5YXLto=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 
h1:gRkg/vSppuSQoDjxyiGfN4Upv/h/DQmIR10ZU8dh4Ww=
-google.golang.org/genproto/googleapis/rpc 
v0.0.0-20251202230838-ff82c1b0f217/go.mod 
h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk=
+google.golang.org/genproto/googleapis/api v0.0.0-20260120221211-b8f7ae30c516 
h1:vmC/ws+pLzWjj/gzApyoZuSVrDtF1aod4u/+bbj8hgM=
+google.golang.org/genproto/googleapis/api 
v0.0.0-20260120221211-b8f7ae30c516/go.mod 
h1:p3MLuOwURrGBRoEyFHBT3GjUwaCQVKeNqqWxlcISGdw=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20260120221211-b8f7ae30c516 
h1:sNrWoksmOyF5bvJUcnmbeAmQi8baNhqg5IWaI3llQqU=
+google.golang.org/genproto/googleapis/rpc 
v0.0.0-20260120221211-b8f7ae30c516/go.mod 
h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ=
 google.golang.org/grpc v1.19.0/go.mod 
h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.20.1/go.mod 
h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
 google.golang.org/grpc v1.21.1/go.mod 
h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
@@ -678,8 +677,8 @@
 google.golang.org/grpc v1.28.0/go.mod 
h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
 google.golang.org/grpc v1.29.1/go.mod 
h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
 google.golang.org/grpc v1.33.2/go.mod 
h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
-google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE=
-google.golang.org/grpc v1.79.3/go.mod 
h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ=
+google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM=
+google.golang.org/grpc v1.80.0/go.mod 
h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4=
 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.1 
h1:/WILD1UcXj/ujCxgoL/DvRgt2CP3txG8+FwkUbb9110=
 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.1/go.mod 
h1:YNKnb2OAApgYn2oYY47Rn7alMr1zWjb2U8Q0aoGWiNc=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod 
h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/linkerd-cli-edge-26.4.1/test/integration/deep/endpoints/destination_api_test.go
 
new/linkerd-cli-edge-26.4.2/test/integration/deep/endpoints/destination_api_test.go
--- 
old/linkerd-cli-edge-26.4.1/test/integration/deep/endpoints/destination_api_test.go
 1970-01-01 01:00:00.000000000 +0100
+++ 
new/linkerd-cli-edge-26.4.2/test/integration/deep/endpoints/destination_api_test.go
 2026-04-09 21:36:43.000000000 +0200
@@ -0,0 +1,654 @@
+package endpoints
+
+import (
+       "context"
+       "encoding/json"
+       "errors"
+       "fmt"
+       "io"
+       "maps"
+       "slices"
+       "sort"
+       "strings"
+       "sync"
+       "testing"
+       "time"
+
+       destinationpb "github.com/linkerd/linkerd2-proxy-api/go/destination"
+       "github.com/linkerd/linkerd2/controller/api/destination"
+       pkgaddr "github.com/linkerd/linkerd2/pkg/addr"
+       "github.com/linkerd/linkerd2/pkg/k8s"
+       "github.com/linkerd/linkerd2/testutil"
+)
+
+func TestDestinationAPIStreamTracksRolloutEndpoints(t *testing.T) {
+       ctx := context.Background()
+
+       TestHelper.WithDataPlaneNamespace(ctx, "destination-api-rollout", 
map[string]string{}, t, func(t *testing.T, ns string) {
+               const deployName = "rollout-echo"
+               const serviceName = "rollout-echo"
+
+               // Create a simple meshed workload and service, then wait for 
rollout so we
+               // don't race destination watches against Kubernetes scheduling.
+               applyDeploymentAndService(t, ns, deployName, serviceName, 1)
+               TestHelper.WaitRollout(t, map[string]testutil.DeploySpec{
+                       deployName: {
+                               Namespace: ns,
+                               Replicas:  1,
+                       },
+               })
+
+               authority := serviceAuthority(serviceName, ns)
+               client, conn := newDestinationClient(t, ctx)
+               defer conn.Close()
+
+               // Start a long-lived destination stream and verify it 
converges on the
+               // same initial endpoint set reported by Kubernetes Endpoints.
+               sub := newSubscriber(t, client, authority, "")
+
+               initialEndpoints := waitForServiceEndpoints(t, ns, serviceName, 
60*time.Second)
+               sub.WaitForExact(t, initialEndpoints, 60*time.Second)
+
+               // Trigger a rollout and assert the same stream eventually 
delivers the
+               // new endpoint set, including Add/Remove updates as pods 
change.
+               if _, err := TestHelper.Kubectl("", "-n", ns, "rollout", 
"restart", "deployment", deployName); err != nil {
+                       testutil.AnnotatedFatalf(t, "failed to restart 
deployment", "failed to restart deployment %s: %v", deployName, err)
+               }
+               TestHelper.WaitRollout(t, map[string]testutil.DeploySpec{
+                       deployName: {
+                               Namespace: ns,
+                               Replicas:  1,
+                       },
+               })
+
+               updatedEndpoints := waitForChangedServiceEndpoints(t, ns, 
serviceName, initialEndpoints, 60*time.Second)
+               sub.WaitForExact(t, updatedEndpoints, 60*time.Second)
+       })
+}
+
+func TestDestinationAPIConcurrentSubscribers(t *testing.T) {
+       ctx := context.Background()
+
+       TestHelper.WithDataPlaneNamespace(ctx, "destination-api-subscribers", 
map[string]string{}, t, func(t *testing.T, ns string) {
+               const (
+                       serviceA = "subscriber-a"
+                       serviceB = "subscriber-b"
+                       deployA  = "subscriber-a"
+                       deployB  = "subscriber-b"
+               )
+
+               applyDeploymentAndService(t, ns, deployA, serviceA, 2)
+               applyDeploymentAndService(t, ns, deployB, serviceB, 1)
+               TestHelper.WaitRollout(t, map[string]testutil.DeploySpec{
+                       deployA: {
+                               Namespace: ns,
+                               Replicas:  2,
+                       },
+                       deployB: {
+                               Namespace: ns,
+                               Replicas:  1,
+                       },
+               })
+
+               authorityA := serviceAuthority(serviceA, ns)
+               authorityB := serviceAuthority(serviceB, ns)
+
+               client, conn := newDestinationClient(t, ctx)
+               defer conn.Close()
+
+               // Create multiple concurrent subscribers to the same authority 
and one
+               // subscriber for a different authority.
+               subA1 := newSubscriber(t, client, authorityA, "")
+               subA2 := newSubscriber(t, client, authorityA, "")
+               subA3 := newSubscriber(t, client, authorityA, "")
+               subB := newSubscriber(t, client, authorityB, "")
+
+               expectedA := waitForServiceEndpoints(t, ns, serviceA, 
60*time.Second)
+               expectedB := waitForServiceEndpoints(t, ns, serviceB, 
60*time.Second)
+
+               subA1.WaitForExact(t, expectedA, 60*time.Second)
+               subA2.WaitForExact(t, expectedA, 60*time.Second)
+               subA3.WaitForExact(t, expectedA, 60*time.Second)
+               subB.WaitForExact(t, expectedB, 60*time.Second)
+
+               if _, err := TestHelper.Kubectl("", "-n", ns, "scale", 
"deployment", deployA, "--replicas=3"); err != nil {
+                       testutil.AnnotatedFatalf(t, "failed to scale 
deployment", "failed to scale deployment %s: %v", deployA, err)
+               }
+               TestHelper.WaitRollout(t, map[string]testutil.DeploySpec{
+                       deployA: {
+                               Namespace: ns,
+                               Replicas:  3,
+                       },
+               })
+
+               expectedAAfterScale := waitForChangedServiceEndpoints(t, ns, 
serviceA, expectedA, 60*time.Second)
+               subA1.WaitForExact(t, expectedAAfterScale, 60*time.Second)
+               subA2.WaitForExact(t, expectedAAfterScale, 60*time.Second)
+               subA3.WaitForExact(t, expectedAAfterScale, 60*time.Second)
+
+               // The unrelated authority should remain stable and not receive 
updates
+               // caused by changes to service A.
+               subB.WaitForExact(t, expectedB, 60*time.Second)
+       })
+}
+
+func TestDestinationAPIForZonesSourceNodeFiltering(t *testing.T) {
+       ctx := context.Background()
+
+       TestHelper.WithDataPlaneNamespace(ctx, "destination-api-zones", 
map[string]string{}, t, func(t *testing.T, ns string) {
+               const deployName = "zone-endpoints"
+               const appName = "zone-endpoints"
+               const serviceName = "zone-endpoints"
+               const port = 8080
+
+               applyDeploymentOnly(t, ns, deployName, appName, 2)
+               TestHelper.WaitRollout(t, map[string]testutil.DeploySpec{
+                       deployName: {
+                               Namespace: ns,
+                               Replicas:  2,
+                       },
+               })
+
+               pods := waitForPods(t, ns, "app="+appName, 2, 60*time.Second)
+               sort.Slice(pods, func(i, j int) bool {
+                       return pods[i].Name < pods[j].Name
+               })
+
+               // Use the first pod's node as the source node and ensure it 
has a zone
+               // label; if absent, add one for this test and clean it up 
afterwards.
+               nodeName := pods[0].NodeName
+               localZone, labelCleanup := ensureNodeZoneLabel(t, nodeName)
+               if labelCleanup != nil {
+                       t.Cleanup(labelCleanup)
+               }
+               remoteZone := localZone + "-remote"
+
+               applySelectorlessServiceAndEndpointSlice(t, ns, serviceName, 
port, []endpointSliceEntry{
+                       {Address: pods[0].IP, ZoneHint: localZone},
+                       {Address: pods[1].IP, ZoneHint: remoteZone},
+               })
+
+               authority := serviceAuthority(serviceName, ns)
+               client, conn := newDestinationClient(t, ctx)
+               defer conn.Close()
+
+               contextToken := fmt.Sprintf(`{"ns":"%s","nodeName":"%s"}`+"\n", 
ns, nodeName)
+               filteredSub := newSubscriber(t, client, authority, contextToken)
+               allSub := newSubscriber(t, client, authority, "")
+
+               expectedFiltered := map[string]struct{}{fmt.Sprintf("%s:%d", 
pods[0].IP, port): {}}
+               expectedAll := map[string]struct{}{
+                       fmt.Sprintf("%s:%d", pods[0].IP, port): {},
+                       fmt.Sprintf("%s:%d", pods[1].IP, port): {},
+               }
+
+               // Subscriber with a source-node context token should see only 
local-zone
+               // endpoints; subscriber without token should receive all 
endpoints.
+               filteredSub.WaitForExact(t, expectedFiltered, 60*time.Second)
+               allSub.WaitForExact(t, expectedAll, 60*time.Second)
+       })
+}
+
+type subscriber struct {
+       cancel    context.CancelFunc
+       events    chan struct{}
+       errCh     chan error
+       mu        sync.RWMutex
+       endpoints map[string]struct{}
+}
+
+func newSubscriber(t *testing.T, client destinationpb.DestinationClient, 
authority, contextToken string) *subscriber {
+       t.Helper()
+
+       ctx, cancel := context.WithCancel(context.Background())
+       stream, err := client.Get(ctx, &destinationpb.GetDestination{
+               Scheme:       "k8s",
+               Path:         authority,
+               ContextToken: contextToken,
+       })
+       if err != nil {
+               cancel()
+               testutil.AnnotatedFatalf(t, "failed to create destination 
stream", "failed to create destination stream for %s: %v", authority, err)
+       }
+
+       s := &subscriber{
+               cancel:    cancel,
+               events:    make(chan struct{}, 1),
+               errCh:     make(chan error, 1),
+               endpoints: map[string]struct{}{},
+       }
+       go s.readUpdates(stream)
+       t.Cleanup(s.cancel)
+       return s
+}
+
+func (s *subscriber) readUpdates(stream destinationpb.Destination_GetClient) {
+       for {
+               update, err := stream.Recv()
+               if err != nil {
+                       // A canceled stream context is expected during test 
cleanup.
+                       if errors.Is(stream.Context().Err(), context.Canceled) 
|| errors.Is(err, context.Canceled) {
+                               return
+                       }
+                       // EOF without cancellation means the server closed the 
stream
+                       // unexpectedly before the test reached a terminal 
assertion.
+                       if errors.Is(err, io.EOF) {
+                               err = fmt.Errorf("destination stream closed 
unexpectedly: %w", err)
+                       }
+                       select {
+                       case s.errCh <- err:
+                       default:
+                       }
+                       return
+               }
+
+               s.mu.Lock()
+               if add := update.GetAdd(); add != nil {
+                       for _, addr := range add.GetAddrs() {
+                               addrStr := 
pkgaddr.ProxyAddressToString(addr.Addr)
+                               s.endpoints[addrStr] = struct{}{}
+                       }
+               }
+               if remove := update.GetRemove(); remove != nil {
+                       for _, addr := range remove.GetAddrs() {
+                               addrStr := pkgaddr.ProxyAddressToString(addr)
+                               delete(s.endpoints, addrStr)
+                       }
+               }
+               s.mu.Unlock()
+
+               select {
+               case s.events <- struct{}{}:
+               default:
+               }
+       }
+}
+
+func (s *subscriber) WaitForExact(t *testing.T, expected map[string]struct{}, 
timeout time.Duration) {
+       t.Helper()
+
+       // Fast path for already-converged state.
+       if exactSetEqual(expected, s.snapshot()) {
+               return
+       }
+
+       timer := time.NewTimer(timeout)
+       defer timer.Stop()
+
+       for {
+               select {
+               case err := <-s.errCh:
+                       testutil.AnnotatedFatalf(t, "destination stream 
failed", "destination stream failed: %v", err)
+               case <-s.events:
+                       // The stream can emit multiple incremental updates; 
keep waiting until
+                       // the complete expected set is observed.
+                       if exactSetEqual(expected, s.snapshot()) {
+                               return
+                       }
+               case <-timer.C:
+                       actual := s.snapshot()
+                       testutil.AnnotatedFatalf(t,
+                               "timed out waiting for destination state",
+                               "timed out waiting for destination 
state\nexpected: %v\nactual:   %v",
+                               slices.Sorted(maps.Keys(expected)),
+                               slices.Sorted(maps.Keys(actual)),
+                       )
+               }
+       }
+}
+
+func (s *subscriber) snapshot() map[string]struct{} {
+       s.mu.RLock()
+       defer s.mu.RUnlock()
+
+       copy := make(map[string]struct{}, len(s.endpoints))
+       for endpoint := range s.endpoints {
+               copy[endpoint] = struct{}{}
+       }
+       return copy
+}
+
+func newDestinationClient(t *testing.T, ctx context.Context) 
(destinationpb.DestinationClient, io.Closer) {
+       t.Helper()
+
+       k8sAPI, err := k8s.NewAPI("", "", "", []string{}, 0)
+       if err != nil {
+               testutil.AnnotatedFatalf(t, "failed to create kubernetes api", 
"failed to create kubernetes api: %v", err)
+       }
+       client, conn, err := destination.NewExternalClient(ctx, 
TestHelper.GetLinkerdNamespace(), k8sAPI, "")
+       if err != nil {
+               testutil.AnnotatedFatalf(t, "failed to create destination 
client", "failed to create destination client: %v", err)
+       }
+       return client, conn
+}
+
+func serviceAuthority(serviceName, namespace string) string {
+       return fmt.Sprintf("%s.%s.svc.%s:8080", serviceName, namespace, 
TestHelper.GetClusterDomain())
+}
+
+func applyDeploymentAndService(t *testing.T, namespace, deploymentName, 
serviceName string, replicas int) {
+       t.Helper()
+
+       manifest := fmt.Sprintf(`
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: %s
+  labels:
+    app: %s
+spec:
+  replicas: %d
+  selector:
+    matchLabels:
+      app: %s
+  template:
+    metadata:
+      annotations:
+        linkerd.io/inject: enabled
+      labels:
+        app: %s
+    spec:
+      containers:
+      - name: app
+        image: nginx:alpine
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: %s
+spec:
+  ports:
+  - name: service
+    port: 8080
+  selector:
+    app: %s
+`, deploymentName, deploymentName, replicas, deploymentName, deploymentName, 
serviceName, deploymentName)
+
+       if _, err := TestHelper.KubectlApply(manifest, namespace); err != nil {
+               testutil.AnnotatedFatalf(t, "failed to apply 
deployment/service", "failed to apply deployment/service for %s: %v", 
deploymentName, err)
+       }
+}
+
+func applyDeploymentOnly(t *testing.T, namespace, deploymentName, app string, 
replicas int) {
+       t.Helper()
+
+       manifest := fmt.Sprintf(`
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: %s
+  labels:
+    app: %s
+spec:
+  replicas: %d
+  selector:
+    matchLabels:
+      app: %s
+  template:
+    metadata:
+      annotations:
+        linkerd.io/inject: enabled
+      labels:
+        app: %s
+    spec:
+      containers:
+      - name: app
+        image: nginx:alpine
+`, deploymentName, app, replicas, app, app)
+
+       if _, err := TestHelper.KubectlApply(manifest, namespace); err != nil {
+               testutil.AnnotatedFatalf(t, "failed to apply deployment", 
"failed to apply deployment for %s: %v", deploymentName, err)
+       }
+}
+
+type endpointSliceEntry struct {
+       Address  string
+       ZoneHint string
+}
+
+func applySelectorlessServiceAndEndpointSlice(t *testing.T, namespace, 
serviceName string, port int, entries []endpointSliceEntry) {
+       t.Helper()
+
+       endpointsYAML := make([]string, 0, len(entries))
+       for _, entry := range entries {
+               endpointsYAML = append(endpointsYAML, fmt.Sprintf(`
+  - addresses:
+    - %s
+    conditions:
+      ready: true
+    hints:
+      forZones:
+      - name: %s`, entry.Address, entry.ZoneHint))
+       }
+
+       manifest := fmt.Sprintf(`
+apiVersion: v1
+kind: Service
+metadata:
+  name: %s
+spec:
+  ports:
+  - name: service
+    port: %d
+---
+apiVersion: discovery.k8s.io/v1
+kind: EndpointSlice
+metadata:
+  name: %s-manual
+  labels:
+    kubernetes.io/service-name: %s
+    endpointslice.kubernetes.io/managed-by: destination-api-test
+addressType: IPv4
+ports:
+- name: service
+  protocol: TCP
+  port: %d
+endpoints:%s
+`, serviceName, port, serviceName, serviceName, port, 
strings.Join(endpointsYAML, ""))
+
+       if _, err := TestHelper.KubectlApply(manifest, namespace); err != nil {
+               testutil.AnnotatedFatalf(t, "failed to apply 
service/endpointslice", "failed to apply service/endpointslice for %s: %v", 
serviceName, err)
+       }
+}
+
+type podEntry struct {
+       Name     string `json:"name"`
+       IP       string `json:"ip"`
+       NodeName string `json:"nodeName"`
+}
+
+type podsResponse struct {
+       Items []struct {
+               Metadata struct {
+                       Name string `json:"name"`
+               } `json:"metadata"`
+               Spec struct {
+                       NodeName string `json:"nodeName"`
+               } `json:"spec"`
+               Status struct {
+                       PodIP string `json:"podIP"`
+               } `json:"status"`
+       } `json:"items"`
+}
+
+func waitForPods(t *testing.T, namespace, labelSelector string, minCount int, 
timeout time.Duration) []podEntry {
+       t.Helper()
+
+       var pods []podEntry
+       err := testutil.RetryFor(timeout, func() error {
+               out, err := TestHelper.Kubectl("", "-n", namespace, "get", 
"pods", "-l", labelSelector, "-o", "json")
+               if err != nil {
+                       return err
+               }
+
+               var response podsResponse
+               if err := json.Unmarshal([]byte(out), &response); err != nil {
+                       return err
+               }
+
+               pods = pods[:0]
+               for _, item := range response.Items {
+                       if item.Status.PodIP == "" || item.Spec.NodeName == "" {
+                               continue
+                       }
+                       pods = append(pods, podEntry{
+                               Name:     item.Metadata.Name,
+                               IP:       item.Status.PodIP,
+                               NodeName: item.Spec.NodeName,
+                       })
+               }
+
+               if len(pods) < minCount {
+                       return fmt.Errorf("expected at least %d ready pods, got 
%d", minCount, len(pods))
+               }
+               return nil
+       })
+       if err != nil {
+               testutil.AnnotatedFatalf(t, "failed waiting for pods", "failed 
waiting for pods with selector %s: %v", labelSelector, err)
+       }
+
+       return append([]podEntry(nil), pods...)
+}
+
+type nodeListResponse struct {
+       Items []struct {
+               Metadata struct {
+                       Name   string            `json:"name"`
+                       Labels map[string]string `json:"labels"`
+               } `json:"metadata"`
+       } `json:"items"`
+}
+
+func ensureNodeZoneLabel(t *testing.T, nodeName string) (string, func()) {
+       t.Helper()
+
+       out, err := TestHelper.Kubectl("", "get", "nodes", "-o", "json")
+       if err != nil {
+               testutil.AnnotatedFatalf(t, "failed to get nodes", "failed to 
get nodes: %v", err)
+       }
+
+       var nodes nodeListResponse
+       if err := json.Unmarshal([]byte(out), &nodes); err != nil {
+               testutil.AnnotatedFatalf(t, "failed to decode nodes", "failed 
to decode nodes: %v", err)
+       }
+
+       for _, item := range nodes.Items {
+               if item.Metadata.Name != nodeName {
+                       continue
+               }
+
+               if zone, ok := 
item.Metadata.Labels["topology.kubernetes.io/zone"]; ok && zone != "" {
+                       return zone, nil
+               }
+
+               zone := "destination-api-test-zone"
+               if _, err := TestHelper.Kubectl("", "label", "node", nodeName, 
fmt.Sprintf("topology.kubernetes.io/zone=%s", zone), "--overwrite"); err != nil 
{
+                       testutil.AnnotatedFatalf(t, "failed to label node 
zone", "failed to label node %s: %v", nodeName, err)
+               }
+               cleanup := func() {
+                       _, _ = TestHelper.Kubectl("", "label", "node", 
nodeName, "topology.kubernetes.io/zone-")
+               }
+               return zone, cleanup
+       }
+
+       testutil.AnnotatedFatalf(t, "node not found", "node %s not found in 
cluster", nodeName)
+       return "", nil
+}
+
+type endpointsResponse struct {
+       Subsets []struct {
+               Addresses []struct {
+                       IP string `json:"ip"`
+               } `json:"addresses"`
+               Ports []struct {
+                       Port int `json:"port"`
+               } `json:"ports"`
+       } `json:"subsets"`
+}
+
+func waitForServiceEndpoints(t *testing.T, namespace, service string, timeout 
time.Duration) map[string]struct{} {
+       t.Helper()
+
+       var endpoints map[string]struct{}
+       // Poll Endpoints until at least one address is present. This avoids 
races
+       // where the service exists but endpoint publication is still in flight.
+       err := testutil.RetryFor(timeout, func() error {
+               // in k8s 1.35+ this call returns a warning about Endpoints 
being deprecated, that we ignore here
+               out, _, err := TestHelper.KubectlRun("", "-n", namespace, 
"get", "endpoints", service, "-o", "json")
+               if err != nil {
+                       return err
+               }
+
+               set, err := parseEndpointSet(out)
+               if err != nil {
+                       return err
+               }
+               if len(set) == 0 {
+                       return fmt.Errorf("no endpoints available for service 
%s", service)
+               }
+               endpoints = set
+               return nil
+       })
+       if err != nil {
+               testutil.AnnotatedFatalf(t, "failed waiting for service 
endpoints", "failed waiting for endpoints for service %s: %v", service, err)
+       }
+
+       return endpoints
+}
+
+func waitForChangedServiceEndpoints(t *testing.T, namespace, service string, 
old map[string]struct{}, timeout time.Duration) map[string]struct{} {
+       t.Helper()
+
+       var updated map[string]struct{}
+       // Poll until the endpoint set differs from the old set, accounting for
+       // eventual consistency during rollouts.
+       err := testutil.RetryFor(timeout, func() error {
+               set := waitForServiceEndpoints(t, namespace, service, timeout)
+               if exactSetEqual(old, set) {
+                       return fmt.Errorf("service endpoints have not changed 
yet")
+               }
+               updated = set
+               return nil
+       })
+       if err != nil {
+               testutil.AnnotatedFatalf(t,
+                       "service endpoints did not change",
+                       "service %s endpoints did not change within timeout; 
old=%v new=%v err=%v",
+                       service,
+                       slices.Sorted(maps.Keys(old)),
+                       slices.Sorted(maps.Keys(updated)),
+                       err,
+               )
+       }
+
+       return updated
+}
+
+func parseEndpointSet(raw string) (map[string]struct{}, error) {
+       var response endpointsResponse
+       if err := json.Unmarshal([]byte(raw), &response); err != nil {
+               return nil, err
+       }
+
+       set := map[string]struct{}{}
+       for _, subset := range response.Subsets {
+               for _, addr := range subset.Addresses {
+                       for _, port := range subset.Ports {
+                               set[fmt.Sprintf("%s:%d", addr.IP, port.Port)] = 
struct{}{}
+                       }
+               }
+       }
+       return set, nil
+}
+
+func exactSetEqual(a, b map[string]struct{}) bool {
+       if len(a) != len(b) {
+               return false
+       }
+       for endpoint := range a {
+               if _, ok := b[endpoint]; !ok {
+                       return false
+               }
+       }
+       return true
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/linkerd-cli-edge-26.4.1/testutil/kubernetes_helper.go 
new/linkerd-cli-edge-26.4.2/testutil/kubernetes_helper.go
--- old/linkerd-cli-edge-26.4.1/testutil/kubernetes_helper.go   2026-04-02 
22:49:01.000000000 +0200
+++ new/linkerd-cli-edge-26.4.2/testutil/kubernetes_helper.go   2026-04-09 
21:36:43.000000000 +0200
@@ -162,6 +162,7 @@
 }
 
 // Kubectl executes an arbitrary Kubectl command
+// Deprecated: use KubectlRun instead
 func (h *KubernetesHelper) Kubectl(stdin string, arg ...string) (string, 
error) {
        withContext := append([]string{"--context=" + h.k8sContext}, arg...)
        cmd := exec.Command("kubectl", withContext...)
@@ -170,6 +171,12 @@
        return string(out), err
 }
 
+// KubectlRun executes an arbitrary kubectl command and returns stdout and 
stderr separately
+func (h *KubernetesHelper) KubectlRun(stdin string, arg ...string) (string, 
string, error) {
+       withContext := append([]string{"--context=" + h.k8sContext}, arg...)
+       return combinedOutput(stdin, "kubectl", withContext...)
+}
+
 // KubectlApplyWithContext applies a given configuration with the given flags
 func (h *KubernetesHelper) KubectlApplyWithContext(stdin string, context 
string, arg ...string) (string, error) {
        args := append([]string{"apply"}, arg...)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/linkerd-cli-edge-26.4.1/web/app/package.json 
new/linkerd-cli-edge-26.4.2/web/app/package.json
--- old/linkerd-cli-edge-26.4.1/web/app/package.json    2026-04-02 
22:49:01.000000000 +0200
+++ new/linkerd-cli-edge-26.4.2/web/app/package.json    2026-04-09 
21:36:43.000000000 +0200
@@ -25,7 +25,7 @@
     "date-fns": "4.1.0",
     "jest-progress-bar-reporter": "^1.0.25",
     "locales-detector": "3.0.2",
-    "lodash": "4.17.23",
+    "lodash": "4.18.1",
     "make-plural": "^7.4.0",
     "path": "0.12.7",
     "prop-types": "15.8.1",
@@ -71,15 +71,15 @@
     "history": "5.3.0",
     "html-webpack-plugin": "^5.6.6",
     "jest": "^30.3.0",
-    "jest-environment-jsdom": "^30.2.0",
+    "jest-environment-jsdom": "^30.3.0",
     "lodash-webpack-plugin": "^0.11.6",
     "react-test-renderer": "16.14.0",
-    "sinon": "21.0.2",
+    "sinon": "21.0.3",
     "sinon-stub-promise": "4.0.0",
     "style-loader": "^4.0.0",
     "url-loader": "^4.1.1",
-    "webpack": "^5.105.4",
-    "webpack-bundle-analyzer": "5.2.0",
+    "webpack": "^5.106.0",
+    "webpack-bundle-analyzer": "5.3.0",
     "webpack-cli": "7.0.2",
     "webpack-dev-server": "5.2.3"
   },
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/linkerd-cli-edge-26.4.1/web/app/yarn.lock 
new/linkerd-cli-edge-26.4.2/web/app/yarn.lock
--- old/linkerd-cli-edge-26.4.1/web/app/yarn.lock       2026-04-02 
22:49:01.000000000 +0200
+++ new/linkerd-cli-edge-26.4.2/web/app/yarn.lock       2026-04-09 
21:36:43.000000000 +0200
@@ -1147,10 +1147,10 @@
   resolved 
"https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz#333fedabc3fd1a8e5d0100013731cf19e6a8c5d3";
   integrity 
sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==
 
-"@discoveryjs/[email protected]":
-  version "0.5.7"
-  resolved 
"https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70";
-  integrity 
sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==
+"@discoveryjs/json-ext@^0.6.3":
+  version "0.6.3"
+  resolved 
"https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz#f13c7c205915eb91ae54c557f5e92bddd8be0e83";
+  integrity 
sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==
 
 "@discoveryjs/json-ext@^1.0.0":
   version "1.0.0"
@@ -1346,28 +1346,18 @@
   resolved 
"https://registry.yarnpkg.com/@jest/diff-sequences/-/diff-sequences-30.3.0.tgz#25b0818d3d83f00b9c7b04e069b8810f9014b143";
   integrity 
sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==
 
-"@jest/[email protected]":
-  version "30.2.0"
-  resolved 
"https://registry.yarnpkg.com/@jest/environment-jsdom-abstract/-/environment-jsdom-abstract-30.2.0.tgz#1313f9b3b509c31298c241203161b36622865181";
-  integrity 
sha512-kazxw2L9IPuZpQ0mEt9lu9Z98SqR74xcagANmMBU16X0lS23yPc0+S6hGLUz8kVRlomZEs/5S/Zlpqwf5yu6OQ==
+"@jest/[email protected]":
+  version "30.3.0"
+  resolved 
"https://registry.yarnpkg.com/@jest/environment-jsdom-abstract/-/environment-jsdom-abstract-30.3.0.tgz#c97b2bf3ec35336d543c174a758f3dc07478c172";
+  integrity 
sha512-0hNFs5N6We3DMCwobzI0ydhkY10sT1tZSC0AAiy+0g2Dt/qEWgrcV5BrMxPczhe41cxW4qm6X+jqZaUdpZIajA==
   dependencies:
-    "@jest/environment" "30.2.0"
-    "@jest/fake-timers" "30.2.0"
-    "@jest/types" "30.2.0"
+    "@jest/environment" "30.3.0"
+    "@jest/fake-timers" "30.3.0"
+    "@jest/types" "30.3.0"
     "@types/jsdom" "^21.1.7"
     "@types/node" "*"
-    jest-mock "30.2.0"
-    jest-util "30.2.0"
-
-"@jest/[email protected]":
-  version "30.2.0"
-  resolved 
"https://registry.yarnpkg.com/@jest/environment/-/environment-30.2.0.tgz#1e673cdb8b93ded707cf6631b8353011460831fa";
-  integrity 
sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==
-  dependencies:
-    "@jest/fake-timers" "30.2.0"
-    "@jest/types" "30.2.0"
-    "@types/node" "*"
-    jest-mock "30.2.0"
+    jest-mock "30.3.0"
+    jest-util "30.3.0"
 
 "@jest/[email protected]":
   version "30.3.0"
@@ -1394,18 +1384,6 @@
     expect "30.3.0"
     jest-snapshot "30.3.0"
 
-"@jest/[email protected]":
-  version "30.2.0"
-  resolved 
"https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-30.2.0.tgz#0941ddc28a339b9819542495b5408622dc9e94ec";
-  integrity 
sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==
-  dependencies:
-    "@jest/types" "30.2.0"
-    "@sinonjs/fake-timers" "^13.0.0"
-    "@types/node" "*"
-    jest-message-util "30.2.0"
-    jest-mock "30.2.0"
-    jest-util "30.2.0"
-
 "@jest/[email protected]":
   version "30.3.0"
   resolved 
"https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-30.3.0.tgz#2b2868130c1d28233a79566874c42cae1c5a70bc";
@@ -1543,19 +1521,6 @@
     slash "^3.0.0"
     write-file-atomic "^5.0.1"
 
-"@jest/[email protected]":
-  version "30.2.0"
-  resolved 
"https://registry.yarnpkg.com/@jest/types/-/types-30.2.0.tgz#1c678a7924b8f59eafd4c77d56b6d0ba976d62b8";
-  integrity 
sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==
-  dependencies:
-    "@jest/pattern" "30.0.1"
-    "@jest/schemas" "30.0.5"
-    "@types/istanbul-lib-coverage" "^2.0.6"
-    "@types/istanbul-reports" "^3.0.4"
-    "@types/node" "*"
-    "@types/yargs" "^17.0.33"
-    chalk "^4.1.2"
-
 "@jest/[email protected]":
   version "30.3.0"
   resolved 
"https://registry.yarnpkg.com/@jest/types/-/types-30.3.0.tgz#cada800d323cb74945c24ac74615fdb312a6c85f";
@@ -2078,13 +2043,6 @@
   dependencies:
     type-detect "4.0.8"
 
-"@sinonjs/fake-timers@^13.0.0":
-  version "13.0.5"
-  resolved 
"https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz#36b9dbc21ad5546486ea9173d6bea063eb1717d5";
-  integrity 
sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==
-  dependencies:
-    "@sinonjs/commons" "^3.0.1"
-
 "@sinonjs/fake-timers@^15.0.0", "@sinonjs/fake-timers@^15.1.1":
   version "15.1.1"
   resolved 
"https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-15.1.1.tgz#e1a6f7171941aadcc31d2cea1744264d58b8b34c";
@@ -2092,10 +2050,10 @@
   dependencies:
     "@sinonjs/commons" "^3.0.1"
 
-"@sinonjs/samsam@^9.0.2":
-  version "9.0.2"
-  resolved 
"https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-9.0.2.tgz#ff0ad0e50e41942891588989615fbc4df569b76b";
-  integrity 
sha512-H/JSxa4GNKZuuU41E3b8Y3tbSEx8y4uq4UH1C56ONQac16HblReJomIvv3Ud7ANQHQmkeSowY49Ij972e/pGxQ==
+"@sinonjs/samsam@^9.0.3":
+  version "9.0.3"
+  resolved 
"https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-9.0.3.tgz#da4cad6ee24ca0c9c205da16676f7d540df71f12";
+  integrity 
sha512-ZgYY7Dc2RW+OUdnZ1DEHg00lhRt+9BjymPKHog4PRFzr1U3MbK57+djmscWyKxzO1qfunHqs4N45WWyKIFKpiQ==
   dependencies:
     "@sinonjs/commons" "^3.0.1"
     type-detect "^4.1.0"
@@ -3269,7 +3227,7 @@
   dependencies:
     balanced-match "^1.0.0"
 
-braces@^3.0.1, braces@^3.0.2, braces@^3.0.3, braces@~3.0.2:
+braces@^3.0.1, braces@^3.0.2, braces@~3.0.2:
   version "3.0.3"
   resolved 
"https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789";
   integrity 
sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
@@ -3650,7 +3608,7 @@
   resolved 
"https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b";
   integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=
 
-commander@*, commander@^14.0.3:
+commander@*, commander@^14.0.2, commander@^14.0.3:
   version "14.0.3"
   resolved 
"https://registry.yarnpkg.com/commander/-/commander-14.0.3.tgz#425d79b48f9af82fcd9e4fc1ea8af6c5ec07bbc2";
   integrity 
sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==
@@ -3665,11 +3623,6 @@
   resolved 
"https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c";
   integrity 
sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==
 
-commander@^7.2.0:
-  version "7.2.0"
-  resolved 
"https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7";
-  integrity 
sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
-
 commander@^8.1.0:
   version "8.2.0"
   resolved 
"https://registry.yarnpkg.com/commander/-/commander-8.2.0.tgz#37fe2bde301d87d47a53adeff8b5915db1381ca8";
@@ -3988,11 +3941,6 @@
   dependencies:
     "@babel/runtime" "^7.21.0"
 
-debounce@^1.2.1:
-  version "1.2.1"
-  resolved 
"https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5";
-  integrity 
sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==
-
 [email protected]:
   version "2.6.9"
   resolved 
"https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f";
@@ -4833,6 +4781,11 @@
   resolved 
"https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34";
   integrity 
sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
 
+escape-string-regexp@^5.0.0:
+  version "5.0.0"
+  resolved 
"https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8";
+  integrity 
sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==
+
 eslint-config-airbnb-base@^15.0.0:
   version "15.0.0"
   resolved 
"https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz#6b09add90ac79c2f8d723a2580e07f3925afd236";
@@ -5813,11 +5766,16 @@
   dependencies:
     whatwg-encoding "^3.1.1"
 
-html-escaper@^2.0.0, html-escaper@^2.0.2:
+html-escaper@^2.0.0:
   version "2.0.2"
   resolved 
"https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453";
   integrity 
sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
 
+html-escaper@^3.0.3:
+  version "3.0.3"
+  resolved 
"https://registry.yarnpkg.com/html-escaper/-/html-escaper-3.0.3.tgz#4d336674652beb1dcbc29ef6b6ba7f6be6fdfed6";
+  integrity 
sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==
+
 html-minifier-terser@^6.0.2:
   version "6.0.2"
   resolved 
"https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.0.2.tgz#14059ad64b69bf9f8b8a33f25b53411d8321e75d";
@@ -6736,15 +6694,13 @@
     jest-util "30.3.0"
     pretty-format "30.3.0"
 
-jest-environment-jsdom@^30.2.0:
-  version "30.2.0"
-  resolved 
"https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-30.2.0.tgz#e95e0921ed22be974f1d8a324766d12b1844cb2c";
-  integrity 
sha512-zbBTiqr2Vl78pKp/laGBREYzbZx9ZtqPjOK4++lL4BNDhxRnahg51HtoDrk9/VjIy9IthNEWdKVd7H5bqBhiWQ==
+jest-environment-jsdom@^30.3.0:
+  version "30.3.0"
+  resolved 
"https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-30.3.0.tgz#6bf80519643333ae2faa07b5660d80451d328578";
+  integrity 
sha512-RLEOJy6ip1lpw0yqJ8tB3i88FC7VBz7i00Zvl2qF71IdxjS98gC9/0SPWYIBVXHm5hgCYK0PAlSlnHGGy9RoMg==
   dependencies:
-    "@jest/environment" "30.2.0"
-    "@jest/environment-jsdom-abstract" "30.2.0"
-    "@types/jsdom" "^21.1.7"
-    "@types/node" "*"
+    "@jest/environment" "30.3.0"
+    "@jest/environment-jsdom-abstract" "30.3.0"
     jsdom "^26.1.0"
 
 [email protected]:
@@ -6801,21 +6757,6 @@
     jest-diff "30.3.0"
     pretty-format "30.3.0"
 
[email protected]:
-  version "30.2.0"
-  resolved 
"https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-30.2.0.tgz#fc97bf90d11f118b31e6131e2b67fc4f39f92152";
-  integrity 
sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==
-  dependencies:
-    "@babel/code-frame" "^7.27.1"
-    "@jest/types" "30.2.0"
-    "@types/stack-utils" "^2.0.3"
-    chalk "^4.1.2"
-    graceful-fs "^4.2.11"
-    micromatch "^4.0.8"
-    pretty-format "30.2.0"
-    slash "^3.0.0"
-    stack-utils "^2.0.6"
-
 [email protected]:
   version "30.3.0"
   resolved 
"https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-30.3.0.tgz#4d723544d36890ba862ac3961db52db5b0d1ba39";
@@ -6831,15 +6772,6 @@
     slash "^3.0.0"
     stack-utils "^2.0.6"
 
[email protected]:
-  version "30.2.0"
-  resolved 
"https://registry.yarnpkg.com/jest-mock/-/jest-mock-30.2.0.tgz#69f991614eeb4060189459d3584f710845bff45e";
-  integrity 
sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==
-  dependencies:
-    "@jest/types" "30.2.0"
-    "@types/node" "*"
-    jest-util "30.2.0"
-
 [email protected]:
   version "30.3.0"
   resolved 
"https://registry.yarnpkg.com/jest-mock/-/jest-mock-30.3.0.tgz#e0fa4184a596a6c4fdec53d4f412158418923747";
@@ -6973,18 +6905,6 @@
     semver "^7.7.2"
     synckit "^0.11.8"
 
[email protected]:
-  version "30.2.0"
-  resolved 
"https://registry.yarnpkg.com/jest-util/-/jest-util-30.2.0.tgz#5142adbcad6f4e53c2776c067a4db3c14f913705";
-  integrity 
sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==
-  dependencies:
-    "@jest/types" "30.2.0"
-    "@types/node" "*"
-    chalk "^4.1.2"
-    ci-info "^4.2.0"
-    graceful-fs "^4.2.11"
-    picomatch "^4.0.2"
-
 [email protected]:
   version "30.3.0"
   resolved 
"https://registry.yarnpkg.com/jest-util/-/jest-util-30.3.0.tgz#95a4fbacf2dac20e768e2f1744b70519f2ba7980";
@@ -7400,10 +7320,10 @@
   resolved 
"https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a";
   integrity 
sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
 
[email protected], lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21:
-  version "4.17.23"
-  resolved 
"https://registry.yarnpkg.com/lodash/-/lodash-4.17.23.tgz#f113b0378386103be4f6893388c73d0bde7f2c5a";
-  integrity 
sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==
[email protected], lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21:
+  version "4.18.1"
+  resolved 
"https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c";
+  integrity 
sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==
 
 log-symbols@^4.1.0:
   version "4.1.0"
@@ -7518,14 +7438,6 @@
     braces "^3.0.2"
     picomatch "^2.3.1"
 
-micromatch@^4.0.8:
-  version "4.0.8"
-  resolved 
"https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202";
-  integrity 
sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
-  dependencies:
-    braces "^3.0.3"
-    picomatch "^2.3.1"
-
 [email protected]:
   version "1.52.0"
   resolved 
"https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70";
@@ -8131,11 +8043,6 @@
   resolved 
"https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42";
   integrity 
sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
 
-picomatch@^4.0.2:
-  version "4.0.2"
-  resolved 
"https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab";
-  integrity 
sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==
-
 picomatch@^4.0.3:
   version "4.0.3"
   resolved 
"https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042";
@@ -8277,15 +8184,6 @@
     lodash "^4.17.20"
     renderkid "^3.0.0"
 
[email protected]:
-  version "30.2.0"
-  resolved 
"https://registry.yarnpkg.com/pretty-format/-/pretty-format-30.2.0.tgz#2d44fe6134529aed18506f6d11509d8a62775ebe";
-  integrity 
sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==
-  dependencies:
-    "@jest/schemas" "30.0.5"
-    ansi-styles "^5.2.0"
-    react-is "^18.3.1"
-
 [email protected]:
   version "30.3.0"
   resolved 
"https://registry.yarnpkg.com/pretty-format/-/pretty-format-30.3.0.tgz#e977eed4bcd1b6195faed418af8eac68b9ea1f29";
@@ -9235,14 +9133,14 @@
   resolved 
"https://registry.yarnpkg.com/sinon-stub-promise/-/sinon-stub-promise-4.0.0.tgz#6d498ba1198557cd01e3466af92dc7df725192c2";
   integrity sha1-bUmLoRmFV80B40Zq+S3H33JRksI=
 
[email protected]:
-  version "21.0.2"
-  resolved 
"https://registry.yarnpkg.com/sinon/-/sinon-21.0.2.tgz#2dca6fc59eca5288d9f2284925e9ae586085f917";
-  integrity 
sha512-VHV4UaoxIe5jrMd89Y9duI76T5g3Lp+ET+ctLhLDaZtSznDPah1KKpRElbdBV4RwqWSw2vadFiVs9Del7MbVeQ==
[email protected]:
+  version "21.0.3"
+  resolved 
"https://registry.yarnpkg.com/sinon/-/sinon-21.0.3.tgz#fd3a2387ffe4fdbbfbbf3a0858f18d46c4acb34e";
+  integrity 
sha512-0x8TQFr8EjADhSME01u1ZK31yv2+bd6Z5NrBCHVM+n4qL1wFqbxftmeyi3bwlr49FbbzRfrqSFOpyHCOh/YmYA==
   dependencies:
     "@sinonjs/commons" "^3.0.1"
     "@sinonjs/fake-timers" "^15.1.1"
-    "@sinonjs/samsam" "^9.0.2"
+    "@sinonjs/samsam" "^9.0.3"
     diff "^8.0.3"
     supports-color "^7.2.0"
 
@@ -10175,18 +10073,17 @@
   resolved 
"https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a";
   integrity 
sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==
 
[email protected]:
-  version "5.2.0"
-  resolved 
"https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-5.2.0.tgz#9bcf0e7cc8c86632a96bf7092300287dc284c3d7";
-  integrity 
sha512-Etrauj1wYO/xjiz/Vfd6bW1lG9fEhrJpNmu10tv0X9kv+gyY3qiE09uYepqg1Xd0PxOvllRXwWYWjtQYoO/glQ==
[email protected]:
+  version "5.3.0"
+  resolved 
"https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-5.3.0.tgz#ca289e08f2f5e39964a9988c38ff3090559392bf";
+  integrity 
sha512-PEhAoqiJ+47d0uLMx/+zo5XOvaU+Vk6N2ZLht7H3n09QLy/fhyvqGNwjdRUHJDgMN8crBR2ZwVHkIswT3Xuawg==
   dependencies:
-    "@discoveryjs/json-ext" "0.5.7"
+    "@discoveryjs/json-ext" "^0.6.3"
     acorn "^8.0.4"
     acorn-walk "^8.0.0"
-    commander "^7.2.0"
-    debounce "^1.2.1"
-    escape-string-regexp "^4.0.0"
-    html-escaper "^2.0.2"
+    commander "^14.0.2"
+    escape-string-regexp "^5.0.0"
+    html-escaper "^3.0.3"
     opener "^1.5.2"
     picocolors "^1.0.0"
     sirv "^3.0.2"
@@ -10267,10 +10164,10 @@
   resolved 
"https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.3.4.tgz#a338b95eb484ecc75fbb196cbe8a2890618b4891";
   integrity 
sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==
 
-webpack@^5.105.4:
-  version "5.105.4"
-  resolved 
"https://registry.yarnpkg.com/webpack/-/webpack-5.105.4.tgz#1b77fcd55a985ac7ca9de80a746caffa38220169";
-  integrity 
sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw==
+webpack@^5.106.0:
+  version "5.106.0"
+  resolved 
"https://registry.yarnpkg.com/webpack/-/webpack-5.106.0.tgz#ee374da5573eef1e47b2650d6be8e40fb928d697";
+  integrity 
sha512-Pkx5joZ9RrdgO5LBkyX1L2ZAJeK/Taz3vqZ9CbcP0wS5LEMx5QkKsEwLl29QJfihZ+DKRBFldzy1O30pJ1MDpA==
   dependencies:
     "@types/eslint-scope" "^3.7.7"
     "@types/estree" "^1.0.8"

++++++ linkerd-cli-edge.obsinfo ++++++
--- /var/tmp/diff_new_pack.uPfifx/_old  2026-04-11 22:30:19.422082614 +0200
+++ /var/tmp/diff_new_pack.uPfifx/_new  2026-04-11 22:30:19.462084250 +0200
@@ -1,5 +1,5 @@
 name: linkerd-cli-edge
-version: 26.4.1
-mtime: 1775162941
-commit: 372abd361635ec27e4ba39b40776f93647e7fb13
+version: 26.4.2
+mtime: 1775763403
+commit: cda7b5cbafb58d3aeab313e3f5fc51c0e63e1a5b
 

++++++ vendor.tar.gz ++++++
/work/SRC/openSUSE:Factory/linkerd-cli-edge/vendor.tar.gz 
/work/SRC/openSUSE:Factory/.linkerd-cli-edge.new.21863/vendor.tar.gz differ: 
char 13, line 1

Reply via email to