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-01-15 16:47:49
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/linkerd-cli-edge (Old)
and /work/SRC/openSUSE:Factory/.linkerd-cli-edge.new.1928 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "linkerd-cli-edge"
Thu Jan 15 16:47:49 2026 rev:63 rq:1327323 version:26.1.2
Changes:
--------
--- /work/SRC/openSUSE:Factory/linkerd-cli-edge/linkerd-cli-edge.changes
2026-01-12 10:34:44.922645997 +0100
+++
/work/SRC/openSUSE:Factory/.linkerd-cli-edge.new.1928/linkerd-cli-edge.changes
2026-01-15 16:49:19.019854427 +0100
@@ -1,0 +2,12 @@
+Thu Jan 15 05:57:07 UTC 2026 - Johannes Kastl
<[email protected]>
+
+- Update to version 26.1.2:
+ No CLI-related changes in the changelog
+ Dependencies
+ * build(deps-dev): bump webpack-bundle-analyzer in /web/app
+ (#14845)
+ * build(deps): bump golang.org/x/tools from 0.40.0 to 0.41.0
+ (#14847)
+ * build(deps): bump actions/setup-go from 6.1.0 to 6.2.0 (#14848)
+
+-------------------------------------------------------------------
@@ -4,0 +17,2 @@
+ No CLI-related changes in the changelog
+ Dependencies
Old:
----
linkerd-cli-edge-26.1.1.obscpio
New:
----
linkerd-cli-edge-26.1.2.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ linkerd-cli-edge.spec ++++++
--- /var/tmp/diff_new_pack.Cwouyy/_old 2026-01-15 16:49:20.819927420 +0100
+++ /var/tmp/diff_new_pack.Cwouyy/_new 2026-01-15 16:49:20.835928069 +0100
@@ -19,7 +19,7 @@
%define linkerd_executable_name linkerd
Name: linkerd-cli-edge
-Version: 26.1.1
+Version: 26.1.2
Release: 0
Summary: CLI for the linkerd service mesh for Kubernetes
License: Apache-2.0
++++++ _service ++++++
--- /var/tmp/diff_new_pack.Cwouyy/_old 2026-01-15 16:49:21.043936504 +0100
+++ /var/tmp/diff_new_pack.Cwouyy/_new 2026-01-15 16:49:21.067937477 +0100
@@ -3,8 +3,8 @@
<param name="url">https://github.com/linkerd/linkerd2</param>
<param name="scm">git</param>
<param name="exclude">.git</param>
- <param name="revision">edge-26.1.1</param>
- <param name="match-tag">edge-26.1.1</param>
+ <param name="revision">edge-26.1.2</param>
+ <param name="match-tag">edge-*.*.*</param>
<param name="versionformat">@PARENT_TAG@</param>
<param name="versionrewrite-pattern">edge-(.*)</param>
<param name="changesgenerate">enable</param>
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.Cwouyy/_old 2026-01-15 16:49:21.231944128 +0100
+++ /var/tmp/diff_new_pack.Cwouyy/_new 2026-01-15 16:49:21.247944777 +0100
@@ -1,6 +1,6 @@
<servicedata>
<service name="tar_scm">
<param name="url">https://github.com/linkerd/linkerd2</param>
- <param
name="changesrevision">d22fbc715226f3836a39bb20ba8b7ad5e112027c</param></service></servicedata>
+ <param
name="changesrevision">a2b1189358ba9ff413c8421506a93b400be91c48</param></service></servicedata>
(No newline at EOF)
++++++ linkerd-cli-edge-26.1.1.obscpio -> linkerd-cli-edge-26.1.2.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/linkerd-cli-edge-26.1.1/.proxy-version
new/linkerd-cli-edge-26.1.2/.proxy-version
--- old/linkerd-cli-edge-26.1.1/.proxy-version 2026-01-06 15:35:53.000000000
+0100
+++ new/linkerd-cli-edge-26.1.2/.proxy-version 2026-01-14 15:45:20.000000000
+0100
@@ -1 +1 @@
-v2.335.0
+v2.336.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/linkerd-cli-edge-26.1.1/go.mod
new/linkerd-cli-edge-26.1.2/go.mod
--- old/linkerd-cli-edge-26.1.1/go.mod 2026-01-06 15:35:53.000000000 +0100
+++ new/linkerd-cli-edge-26.1.2/go.mod 2026-01-14 15:45:20.000000000 +0100
@@ -35,7 +35,7 @@
github.com/spf13/cobra v1.10.2
github.com/spf13/pflag v1.0.10
go.opencensus.io v0.24.0
- golang.org/x/tools v0.40.0
+ golang.org/x/tools v0.41.0
google.golang.org/grpc v1.78.0
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.0
google.golang.org/protobuf v1.36.11
@@ -56,7 +56,7 @@
require (
github.com/golang-jwt/jwt/v5 v5.3.0 // indirect
- golang.org/x/net v0.48.0 // indirect
+ golang.org/x/net v0.49.0 // indirect
)
require (
@@ -141,14 +141,14 @@
go.opentelemetry.io/otel/trace v1.38.0 // indirect
go.yaml.in/yaml/v2 v2.4.3 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
- golang.org/x/crypto v0.46.0 // indirect
- golang.org/x/mod v0.31.0 // indirect
+ golang.org/x/crypto v0.47.0 // indirect
+ golang.org/x/mod v0.32.0 // indirect
golang.org/x/oauth2 v0.34.0 // indirect
golang.org/x/sync v0.19.0 // indirect
- golang.org/x/sys v0.39.0 // indirect
- golang.org/x/telemetry v0.0.0-20251203150158-8fff8a5912fc // indirect
- golang.org/x/term v0.38.0 // indirect
- golang.org/x/text v0.32.0 // indirect
+ golang.org/x/sys v0.40.0 // indirect
+ golang.org/x/telemetry v0.0.0-20260109210033-bd525da824e2 // indirect
+ golang.org/x/term v0.39.0 // indirect
+ golang.org/x/text v0.33.0 // indirect
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
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/linkerd-cli-edge-26.1.1/go.sum
new/linkerd-cli-edge-26.1.2/go.sum
--- old/linkerd-cli-edge-26.1.1/go.sum 2026-01-06 15:35:53.000000000 +0100
+++ new/linkerd-cli-edge-26.1.2/go.sum 2026-01-14 15:45:20.000000000 +0100
@@ -470,8 +470,8 @@
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod
h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod
h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod
h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU=
-golang.org/x/crypto v0.46.0/go.mod
h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0=
+golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8=
+golang.org/x/crypto v0.47.0/go.mod
h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod
h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod
h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod
h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -501,8 +501,8 @@
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod
h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod
h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI=
-golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg=
+golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c=
+golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -523,8 +523,8 @@
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod
h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod
h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod
h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU=
-golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY=
+golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o=
+golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod
h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod
h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod
h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -566,19 +566,19 @@
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
-golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
-golang.org/x/telemetry v0.0.0-20251203150158-8fff8a5912fc
h1:bH6xUXay0AIFMElXG2rQ4uiE+7ncwtiOdPfYK1NK2XA=
-golang.org/x/telemetry v0.0.0-20251203150158-8fff8a5912fc/go.mod
h1:hKdjCMrbv9skySur+Nek8Hd0uJ0GuxJIoIX2payrIdQ=
-golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q=
-golang.org/x/term v0.38.0/go.mod
h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg=
+golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ=
+golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
+golang.org/x/telemetry v0.0.0-20260109210033-bd525da824e2
h1:O1cMQHRfwNpDfDJerqRoE2oD+AFlyid87D40L/OkkJo=
+golang.org/x/telemetry v0.0.0-20260109210033-bd525da824e2/go.mod
h1:b7fPSJ0pKZ3ccUh8gnTONJxhn3c/PS6tyzQvyqw4iA8=
+golang.org/x/term v0.39.0 h1:RclSuaJf32jOqZz74CkPA9qFuVTX7vhLlpfj/IGWlqY=
+golang.org/x/term v0.39.0/go.mod
h1:yxzUCTP/U+FzoxfdKmLaA0RV1WgE0VY7hXBwKtY/4ww=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod
h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod
h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU=
-golang.org/x/text v0.32.0/go.mod
h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=
+golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE=
+golang.org/x/text v0.33.0/go.mod
h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod
h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod
h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod
h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -614,8 +614,8 @@
golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod
h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod
h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod
h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
-golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA=
-golang.org/x/tools v0.40.0/go.mod
h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc=
+golang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc=
+golang.org/x/tools v0.41.0/go.mod
h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg=
golang.org/x/tools/go/expect v0.1.1-deprecated
h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM=
golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod
h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY=
golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated
h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/linkerd-cli-edge-26.1.1/policy-controller/runtime/src/args.rs
new/linkerd-cli-edge-26.1.2/policy-controller/runtime/src/args.rs
--- old/linkerd-cli-edge-26.1.1/policy-controller/runtime/src/args.rs
2026-01-06 15:35:53.000000000 +0100
+++ new/linkerd-cli-edge-26.1.2/policy-controller/runtime/src/args.rs
2026-01-14 15:45:20.000000000 +0100
@@ -10,8 +10,10 @@
use anyhow::{bail, Result};
use clap::Parser;
use futures::prelude::*;
-use kube::runtime::watcher;
+use kube::{core::DeserializeGuard, runtime::watcher, ResourceExt};
use prometheus_client::registry::Registry;
+use serde::de::DeserializeOwned;
+use std::fmt::Debug;
use std::{net::SocketAddr, sync::Arc};
use tokio::{sync::mpsc, time::Duration};
use tonic::transport::Server;
@@ -200,21 +202,26 @@
// Spawn resource watches.
- let pods = runtime.watch_all::<k8s::Pod>(
+ let pods = guarded_watch::<k8s::Pod, _>(
+ &mut runtime,
watcher::Config::default().labels("linkerd.io/control-plane-ns"),
);
+
tokio::spawn(
kubert::index::namespaced(inbound_index.clone(),
pods).instrument(info_span!("pods")),
);
- let external_workloads = runtime
-
.watch_all::<k8s::external_workload::ExternalWorkload>(watcher::Config::default());
+ let external_workloads =
guarded_watch::<k8s::external_workload::ExternalWorkload, _>(
+ &mut runtime,
+ watcher::Config::default(),
+ );
tokio::spawn(
kubert::index::namespaced(inbound_index.clone(),
external_workloads)
.instrument(info_span!("external_workloads")),
);
- let servers =
runtime.watch_all::<k8s::policy::Server>(watcher::Config::default());
+ let servers =
+ guarded_watch::<k8s::policy::Server, _>(&mut runtime,
watcher::Config::default());
let servers_indexes = IndexList::new(inbound_index.clone())
.push(status_index.clone())
.shared();
@@ -222,36 +229,46 @@
kubert::index::namespaced(servers_indexes,
servers).instrument(info_span!("servers")),
);
- let server_authzs =
-
runtime.watch_all::<k8s::policy::ServerAuthorization>(watcher::Config::default());
+ let server_authzs = guarded_watch::<k8s::policy::ServerAuthorization,
_>(
+ &mut runtime,
+ watcher::Config::default(),
+ );
tokio::spawn(
kubert::index::namespaced(inbound_index.clone(), server_authzs)
.instrument(info_span!("serverauthorizations")),
);
- let authz_policies =
-
runtime.watch_all::<k8s::policy::AuthorizationPolicy>(watcher::Config::default());
+ let authz_policies = guarded_watch::<k8s::policy::AuthorizationPolicy,
_>(
+ &mut runtime,
+ watcher::Config::default(),
+ );
tokio::spawn(
kubert::index::namespaced(inbound_index.clone(), authz_policies)
.instrument(info_span!("authorizationpolicies")),
);
- let mtls_authns =
-
runtime.watch_all::<k8s::policy::MeshTLSAuthentication>(watcher::Config::default());
+ let mtls_authns = guarded_watch::<k8s::policy::MeshTLSAuthentication,
_>(
+ &mut runtime,
+ watcher::Config::default(),
+ );
tokio::spawn(
kubert::index::namespaced(inbound_index.clone(), mtls_authns)
.instrument(info_span!("meshtlsauthentications")),
);
- let network_authns =
-
runtime.watch_all::<k8s::policy::NetworkAuthentication>(watcher::Config::default());
+ let network_authns =
guarded_watch::<k8s::policy::NetworkAuthentication, _>(
+ &mut runtime,
+ watcher::Config::default(),
+ );
tokio::spawn(
kubert::index::namespaced(inbound_index.clone(), network_authns)
.instrument(info_span!("networkauthentications")),
);
- let ratelimit_policies =
-
runtime.watch_all::<k8s::policy::HttpLocalRateLimitPolicy>(watcher::Config::default());
+ let ratelimit_policies =
guarded_watch::<k8s::policy::HttpLocalRateLimitPolicy, _>(
+ &mut runtime,
+ watcher::Config::default(),
+ );
let ratelimit_policies_indexes = IndexList::new(inbound_index.clone())
.push(status_index.clone())
.shared();
@@ -266,8 +283,10 @@
.shared();
if
api_resource_exists::<k8s::policy::HttpRoute>(&runtime.client()).await {
- let http_routes =
-
runtime.watch_all::<k8s::policy::HttpRoute>(watcher::Config::default());
+ let http_routes = guarded_watch::<k8s::policy::HttpRoute, _>(
+ &mut runtime,
+ watcher::Config::default(),
+ );
tokio::spawn(
kubert::index::namespaced(http_routes_indexes.clone(),
http_routes)
@@ -281,7 +300,7 @@
if api_resource_exists::<gateway::HTTPRoute>(&runtime.client()).await {
let gateway_http_routes =
-
runtime.watch_all::<gateway::HTTPRoute>(watcher::Config::default());
+ guarded_watch::<gateway::HTTPRoute, _>(&mut runtime,
watcher::Config::default());
tokio::spawn(
kubert::index::namespaced(http_routes_indexes,
gateway_http_routes)
.instrument(info_span!("httproutes.gateway.networking.k8s.io")),
@@ -294,7 +313,7 @@
if api_resource_exists::<gateway::GRPCRoute>(&runtime.client()).await {
let gateway_grpc_routes =
-
runtime.watch_all::<gateway::GRPCRoute>(watcher::Config::default());
+ guarded_watch::<gateway::GRPCRoute, _>(&mut runtime,
watcher::Config::default());
let gateway_grpc_routes_indexes =
IndexList::new(outbound_index.clone())
.push(inbound_index.clone())
.push(status_index.clone())
@@ -310,7 +329,8 @@
}
if api_resource_exists::<gateway::TLSRoute>(&runtime.client()).await {
- let tls_routes =
runtime.watch_all::<gateway::TLSRoute>(watcher::Config::default());
+ let tls_routes =
+ guarded_watch::<gateway::TLSRoute, _>(&mut runtime,
watcher::Config::default());
let tls_routes_indexes = IndexList::new(status_index.clone())
.push(outbound_index.clone())
.shared();
@@ -325,7 +345,8 @@
}
if api_resource_exists::<gateway::TCPRoute>(&runtime.client()).await {
- let tcp_routes =
runtime.watch_all::<gateway::TCPRoute>(watcher::Config::default());
+ let tcp_routes =
+ guarded_watch::<gateway::TCPRoute, _>(&mut runtime,
watcher::Config::default());
let tcp_routes_indexes = IndexList::new(status_index.clone())
.push(outbound_index.clone())
.shared();
@@ -339,7 +360,7 @@
);
}
- let services =
runtime.watch_all::<k8s::Service>(watcher::Config::default());
+ let services = guarded_watch::<k8s::Service, _>(&mut runtime,
watcher::Config::default());
let services_indexes = IndexList::new(outbound_index.clone())
.push(status_index.clone())
.shared();
@@ -348,8 +369,10 @@
.instrument(info_span!("services")),
);
- let egress_networks =
-
runtime.watch_all::<k8s::policy::EgressNetwork>(watcher::Config::default());
+ let egress_networks = guarded_watch::<k8s::policy::EgressNetwork, _>(
+ &mut runtime,
+ watcher::Config::default(),
+ );
let egress_networks_indexes = IndexList::new(status_index.clone())
.push(outbound_index.clone())
.shared();
@@ -477,3 +500,46 @@
.flat_map(|r| r.resources.iter())
.any(|r| r.kind == T::kind(&dt))
}
+
+// A watch that uses DeserializeGuard to skip resources which fail to
deserialize.
+// Any deserialization errors are logged as warnings and the event is skipped.
+fn guarded_watch<R, T>(
+ runtime: &mut kubert::Runtime<T>,
+ watcher_config: watcher::Config,
+) -> impl Stream<Item = watcher::Event<R>>
+where
+ R: Resource + DeserializeOwned + Clone + Debug + Send + 'static,
+ R::DynamicType: Default,
+{
+ runtime
+ .watch_all::<DeserializeGuard<R>>(watcher_config)
+ .filter_map(async |item| {
+ let log_warning = |t: &DeserializeGuard<R>| {
+ if let Err(ref err) = t.0 {
+ tracing::warn!(
+ "skipping invalid {} resource {}/{}: {}",
+ R::kind(&Default::default()),
+ t.namespace().unwrap_or("<cluster>".to_string()),
+ t.name_any(),
+ err,
+ );
+ }
+ };
+ match item {
+ watcher::Event::Apply(t) => {
+ log_warning(&t);
+ t.0.ok().map(watcher::Event::Apply)
+ }
+ watcher::Event::Delete(t) => {
+ log_warning(&t);
+ t.0.ok().map(watcher::Event::Delete)
+ }
+ watcher::Event::Init => Some(watcher::Event::<R>::Init),
+ watcher::Event::InitApply(t) => {
+ log_warning(&t);
+ t.0.ok().map(watcher::Event::InitApply)
+ }
+ watcher::Event::InitDone =>
Some(watcher::Event::<R>::InitDone),
+ }
+ })
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/linkerd-cli-edge-26.1.1/policy-test/src/curl.rs
new/linkerd-cli-edge-26.1.2/policy-test/src/curl.rs
--- old/linkerd-cli-edge-26.1.1/policy-test/src/curl.rs 2026-01-06
15:35:53.000000000 +0100
+++ new/linkerd-cli-edge-26.1.2/policy-test/src/curl.rs 2026-01-14
15:45:20.000000000 +0100
@@ -338,12 +338,17 @@
|pod: Option<&k8s::Pod>| -> bool {
if let Some(pod) = pod {
if let Some(status) = pod.status.as_ref() {
- return
status.init_container_statuses.iter().flatten().all(|init| {
- init.state
- .as_ref()
- .map(|s| s.terminated.is_some())
- .unwrap_or(false)
- });
+ return status
+ .init_container_statuses
+ .iter()
+ .flatten()
+ .filter(|init| init.name != "linkerd-proxy")
+ .all(|init| {
+ init.state
+ .as_ref()
+ .map(|s| s.terminated.is_some())
+ .unwrap_or(false)
+ });
}
}
false
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/linkerd-cli-edge-26.1.1/test/integration/install/inject/inject_test.go
new/linkerd-cli-edge-26.1.2/test/integration/install/inject/inject_test.go
--- old/linkerd-cli-edge-26.1.1/test/integration/install/inject/inject_test.go
2026-01-06 15:35:53.000000000 +0100
+++ new/linkerd-cli-edge-26.1.2/test/integration/install/inject/inject_test.go
2026-01-14 15:45:20.000000000 +0100
@@ -55,7 +55,7 @@
func TestInjectManualParams(t *testing.T) {
reg := "cr.l5d.io/linkerd"
- if override := os.Getenv(flags.EnvOverrideDockerRegistry); reg != "" {
+ if override := os.Getenv(flags.EnvOverrideDockerRegistry); override !=
"" {
reg = override
}
@@ -78,28 +78,35 @@
LogLevel: "off",
EnableExternalProfiles: true,
}
- flags, _ := injectionValidator.GetFlagsAndAnnotations()
- // TODO: test config.linkerd.io/proxy-version
- cmd := append([]string{"inject",
- "--manual",
- }, flags...)
+ for _, nativeSidecar := range []bool{false, true} {
+ t.Run(fmt.Sprintf("Testing manual injection with
nativeSidecar=%v", nativeSidecar), func(t *testing.T) {
+ injectionValidator.NativeSidecar = nativeSidecar
- cmd = append(cmd, "testdata/inject_test.yaml")
+ flags, _ := injectionValidator.GetFlagsAndAnnotations()
- out, err := TestHelper.LinkerdRun(cmd...)
- if err != nil {
- testutil.AnnotatedFatal(t, "unexpected error", err)
- }
+ // TODO: test config.linkerd.io/proxy-version
+ cmd := append([]string{"inject",
+ "--manual",
+ }, flags...)
- deploy, err := parseDeployment(out)
- if err != nil {
- testutil.AnnotatedFatalf(t, "failed parsing deployment",
"failed parsing deployment\n%s", err.Error())
- }
+ cmd = append(cmd, "testdata/inject_test.yaml")
- err = injectionValidator.ValidatePod(&deploy.Spec.Template.Spec)
- if err != nil {
- testutil.AnnotatedFatalf(t, "received unexpected output",
"received unexpected output\n%s", err.Error())
+ out, err := TestHelper.LinkerdRun(cmd...)
+ if err != nil {
+ testutil.AnnotatedFatal(t, "unexpected error",
err)
+ }
+
+ deploy, err := parseDeployment(out)
+ if err != nil {
+ testutil.AnnotatedFatalf(t, "failed parsing
deployment", "failed parsing deployment\n%s", err.Error())
+ }
+
+ err =
injectionValidator.ValidatePod(&deploy.Spec.Template.Spec)
+ if err != nil {
+ testutil.AnnotatedFatalf(t, "received
unexpected output", "received unexpected output\n%s", err.Error())
+ }
+ })
}
}
@@ -114,78 +121,88 @@
ctx := context.Background()
- TestHelper.WithDataPlaneNamespace(ctx, injectNS, map[string]string{},
t, func(t *testing.T, ns string) {
- injectionValidator := testutil.InjectValidator{
- NoInitContainer: TestHelper.CNI() ||
TestHelper.Calico(),
- AutoInject: true,
- AdminPort: 8888,
- ControlPort: 8881,
- EnableExternalProfiles: true,
- EnableDebug: true,
- ImagePullPolicy: "Never",
- InboundPort: 8882,
- OutboundPort: 8883,
- CPULimit: "160m",
- CPURequest: "150m",
- MemoryLimit: "150Mi",
- MemoryRequest: "100Mi",
- EphemeralStorageLimit: "50Mi",
- EphemeralStorageRequest: "10Mi",
- Image: "proxy-image",
- LogLevel: "proxy-log-level",
- UID: 10,
- Version: "proxy-version",
- RequireIdentityOnPorts: "8884,8885",
- OpaquePorts: "8888,8889",
- OutboundConnectTimeout: "888ms",
- InboundConnectTimeout: "999ms",
- SkipOutboundPorts: "1111,2222,3333",
- SkipInboundPorts: "4444,5555,6666",
- WaitBeforeExitSeconds: 10,
- }
+ injectionValidator := testutil.InjectValidator{
+ NoInitContainer: TestHelper.CNI() ||
TestHelper.Calico(),
+ AutoInject: true,
+ AdminPort: 8888,
+ ControlPort: 8881,
+ EnableExternalProfiles: true,
+ EnableDebug: true,
+ ImagePullPolicy: "Never",
+ InboundPort: 8882,
+ OutboundPort: 8883,
+ CPULimit: "160m",
+ CPURequest: "150m",
+ MemoryLimit: "150Mi",
+ MemoryRequest: "100Mi",
+ EphemeralStorageLimit: "50Mi",
+ EphemeralStorageRequest: "10Mi",
+ Image: "proxy-image",
+ LogLevel: "proxy-log-level",
+ UID: 10,
+ Version: "proxy-version",
+ RequireIdentityOnPorts: "8884,8885",
+ OpaquePorts: "8888,8889",
+ OutboundConnectTimeout: "888ms",
+ InboundConnectTimeout: "999ms",
+ SkipOutboundPorts: "1111,2222,3333",
+ SkipInboundPorts: "4444,5555,6666",
+ WaitBeforeExitSeconds: 10,
+ }
+
+ for _, nativeSidecar := range []bool{false, true} {
+ TestHelper.WithDataPlaneNamespace(ctx, fmt.Sprintf("%s-%v",
injectNS, nativeSidecar), map[string]string{}, t, func(t *testing.T, ns string)
{
+ t.Run(fmt.Sprintf("Testing injection via webhook with
nativeSidecar=%v", nativeSidecar), func(t *testing.T) {
+ injectionValidator.NativeSidecar = nativeSidecar
+ // proxy.nativeSidecar and
waitBeforeExitSeconds cannot be used simultaneously
+ if nativeSidecar {
+
injectionValidator.WaitBeforeExitSeconds = 0
+ }
- _, annotations := injectionValidator.GetFlagsAndAnnotations()
+ _, annotations :=
injectionValidator.GetFlagsAndAnnotations()
- patchedYAML, err := testutil.PatchDeploy(injectYAML,
deployName, annotations)
- if err != nil {
- testutil.AnnotatedFatalf(t, "failed to patch inject
test YAML",
- "failed to patch inject test YAML in namespace
%s for deploy/%s: %s", ns, deployName, err)
- }
+ patchedYAML, err :=
testutil.PatchDeploy(injectYAML, deployName, annotations)
+ if err != nil {
+ testutil.AnnotatedFatalf(t, "failed to
patch inject test YAML",
+ "failed to patch inject test
YAML in namespace %s for deploy/%s: %s", ns, deployName, err)
+ }
- o, err := TestHelper.Kubectl(patchedYAML, "--namespace", ns,
"create", "-f", "-")
- if err != nil {
- testutil.AnnotatedFatalf(t, "failed to create
deployment", "failed to create deploy/%s in namespace %s for %s: %s",
deployName, ns, err, o)
- }
+ o, err := TestHelper.Kubectl(patchedYAML,
"--namespace", ns, "create", "-f", "-")
+ if err != nil {
+ testutil.AnnotatedFatalf(t, "failed to
create deployment", "failed to create deploy/%s in namespace %s for %s: %s",
deployName, ns, err, o)
+ }
- var pod *v1.Pod
- err = testutil.RetryFor(30*time.Second, func() error {
- pods, err := TestHelper.GetPodsForDeployment(ctx, ns,
deployName)
- if err != nil {
- return fmt.Errorf("failed to get pods for
namespace %s", ns)
- }
+ var pod *v1.Pod
+ err = testutil.RetryFor(30*time.Second, func()
error {
+ pods, err :=
TestHelper.GetPodsForDeployment(ctx, ns, deployName)
+ if err != nil {
+ return fmt.Errorf("failed to
get pods for namespace %s", ns)
+ }
- for _, p := range pods {
- p := p // pin
- creator, ok :=
p.Annotations[k8s.CreatedByAnnotation]
- if ok && strings.Contains(creator,
"proxy-injector") {
- pod = &p
- break
- }
- }
- if pod == nil {
- return fmt.Errorf("failed to find auto injected
pod for deployment %s", deployName)
- }
- return nil
- })
+ for _, p := range pods {
+ p := p // pin
+ creator, ok :=
p.Annotations[k8s.CreatedByAnnotation]
+ if ok &&
strings.Contains(creator, "proxy-injector") {
+ pod = &p
+ break
+ }
+ }
+ if pod == nil {
+ return fmt.Errorf("failed to
find auto injected pod for deployment %s", deployName)
+ }
+ return nil
+ })
- if err != nil {
- testutil.AnnotatedFatal(t, "failed to find autoinjected
pod: ", err.Error())
- }
+ if err != nil {
+ testutil.AnnotatedFatal(t, "failed to
find autoinjected pod: ", err.Error())
+ }
- if err := injectionValidator.ValidatePod(&pod.Spec); err != nil
{
- testutil.AnnotatedFatal(t, "failed to validate auto
injection", err.Error())
- }
- })
+ if err :=
injectionValidator.ValidatePod(&pod.Spec); err != nil {
+ testutil.AnnotatedFatal(t, "failed to
validate auto injection", err.Error())
+ }
+ })
+ })
+ }
}
func TestInjectAutoNamespaceOverrideAnnotations(t *testing.T) {
@@ -239,8 +256,7 @@
"failed to get pods for namespace %s: %s", ns,
err)
}
- containers := pods[0].Spec.Containers
- proxyContainer := testutil.GetProxyContainer(containers)
+ proxyContainer := testutil.GetProxyContainer(pods[0].Spec)
// Match the pod configuration with the namespace level
overrides
if proxyContainer.Resources.Requests["memory"] !=
resource.MustParse(nsProxyMemReq) {
@@ -254,117 +270,6 @@
})
}
-func TestInjectAutoAnnotationPermutations(t *testing.T) {
- injectYAML, err := testutil.ReadFile("testdata/inject_test.yaml")
- if err != nil {
- testutil.AnnotatedFatalf(t, "failed to read inject test file",
"failed to read inject test file: %s", err)
- }
-
- injectNS := "inject-test"
- deployName := "inject-test-terminus"
- containerName := "bb-terminus"
- injectAnnotations := []string{"", k8s.ProxyInjectDisabled,
k8s.ProxyInjectEnabled}
-
- // deploy
- ctx := context.Background()
- for _, nsAnnotation := range injectAnnotations {
- nsAnnotation := nsAnnotation // pin
- nsPrefix := injectNS
- nsAnnotations := map[string]string{}
- if nsAnnotation != "" {
- nsAnnotations[k8s.ProxyInjectAnnotation] = nsAnnotation
- nsPrefix = fmt.Sprintf("%s-%s", nsPrefix, nsAnnotation)
- }
-
- TestHelper.WithDataPlaneNamespace(ctx, nsPrefix, nsAnnotations,
t, func(t *testing.T, ns string) {
- for _, podAnnotation := range injectAnnotations {
- // patch injectYAML with unique name and pod
annotations
- name := deployName
- podAnnotations := map[string]string{}
- if podAnnotation != "" {
-
podAnnotations[k8s.ProxyInjectAnnotation] = podAnnotation
- name = fmt.Sprintf("%s-%s", name,
podAnnotation)
- }
-
- patchedYAML, err :=
testutil.PatchDeploy(injectYAML, name, podAnnotations)
- if err != nil {
- testutil.AnnotatedFatalf(t,
fmt.Sprintf("failed to patch inject test YAML in namespace %s for deploy/%s",
ns, name),
- "failed to patch inject test
YAML in namespace %s for deploy/%s: %s", ns, name, err)
- }
-
- o, err := TestHelper.Kubectl(patchedYAML,
"--namespace", ns, "create", "-f", "-")
- if err != nil {
- testutil.AnnotatedFatalf(t,
fmt.Sprintf("failed to create deploy/%s in namespace %s", name, ns),
- "failed to create deploy/%s in
namespace %s for %s: %s", name, ns, err, o)
- }
-
- // check for successful deploy
- o, err = TestHelper.Kubectl("", "--namespace",
ns, "wait", "--for=condition=available", "--timeout=120s", "deploy/"+name)
- if err != nil {
- testutil.AnnotatedFatalf(t,
fmt.Sprintf("failed to wait for condition=available for deploy/%s in namespace
%s", name, ns),
- "failed to wait for
condition=available for deploy/%s in namespace %s: %s: %s", name, ns, err, o)
- }
-
- pods, err :=
TestHelper.GetPodsForDeployment(ctx, ns, name)
- if err != nil {
- testutil.AnnotatedFatalf(t,
fmt.Sprintf("failed to get pods for namespace %s", ns),
- "failed to get pods for
namespace %s: %s", ns, err)
- }
-
- if len(pods) != 1 {
- testutil.Fatalf(t, "expected 1 pod for
namespace %s, got %d", ns, len(pods))
- }
-
- shouldBeInjected := false
- switch nsAnnotation {
- case "", k8s.ProxyInjectDisabled:
- switch podAnnotation {
- case k8s.ProxyInjectEnabled:
- shouldBeInjected = true
- }
- case k8s.ProxyInjectEnabled:
- switch podAnnotation {
- case "", k8s.ProxyInjectEnabled:
- shouldBeInjected = true
- }
- }
-
- containers := pods[0].Spec.Containers
- initContainers := pods[0].Spec.InitContainers
-
- if shouldBeInjected {
- if len(containers) != 2 {
- testutil.Fatalf(t, "expected 2
containers for pod %s/%s, got %d", ns, pods[0].GetName(), len(containers))
- }
- if containers[0].Name != containerName
&& containers[1].Name != containerName {
- testutil.Fatalf(t, "expected
bb-terminus container in pod %s/%s, got %+v", ns, pods[0].GetName(),
containers[0])
- }
- if containers[0].Name !=
k8s.ProxyContainerName && containers[1].Name != k8s.ProxyContainerName {
- testutil.Fatalf(t, "expected %s
container in pod %s/%s, got %+v", ns, pods[0].GetName(),
k8s.ProxyContainerName, containers[0])
- }
- if !TestHelper.CNI() &&
len(initContainers) != 1 {
- testutil.Fatalf(t, "expected 1
init container for pod %s/%s, got %d", ns, pods[0].GetName(),
len(initContainers))
- }
- if !TestHelper.CNI() &&
initContainers[0].Name != k8s.InitContainerName {
- testutil.Fatalf(t, "expected %s
init container in pod %s/%s, got %+v", ns, pods[0].GetName(),
k8s.InitContainerName, initContainers[0])
- }
- } else {
- if len(containers) != 1 {
- testutil.Fatalf(t, "expected 1
container for pod %s/%s, got %d", ns, pods[0].GetName(), len(containers))
- }
- if containers[0].Name != containerName {
- testutil.Fatalf(t, "expected
bb-terminus container in pod %s/%s, got %s", ns, pods[0].GetName(),
containers[0].Name)
- }
- if len(initContainers) != 0 {
- testutil.Fatalf(t, "expected 0
init containers for pod %s/%s, got %d", ns, pods[0].GetName(),
len(initContainers))
- }
- }
- }
- })
-
- }
-}
-
func TestInjectAutoPod(t *testing.T) {
podsYAML, err := testutil.ReadFile("testdata/pods.yaml")
if err != nil {
@@ -472,8 +377,7 @@
testutil.Fatalf(t, "expected pod in namespace %s to
have %s opaque ports, but it had %s", ns, manualOpaquePorts, annotation)
}
- containers := pods[0].Spec.Containers
- if proxyContainer := testutil.GetProxyContainer(containers);
proxyContainer == nil {
+ if proxyContainer := testutil.GetProxyContainer(pods[0].Spec);
proxyContainer == nil {
testutil.Fatalf(t, "pod in namespace %s wasn't injected
with the proxy container", ns)
}
@@ -489,7 +393,7 @@
// Removed token volume name from comparison because it
contains a random string
initContainer.VolumeMounts[1].Name = ""
// Expect the init container image to use the proxy
container image
- expectedInitContainer.Image =
testutil.GetProxyContainer(pods[0].Spec.Containers).Image
+ expectedInitContainer.Image =
testutil.GetProxyContainer(pods[0].Spec).Image
if diff := deep.Equal(expectedInitContainer,
initContainer); diff != nil {
testutil.AnnotatedFatalf(t, "malformed init
container", "malformed init container:\n%v", diff)
}
@@ -555,8 +459,7 @@
testutil.Fatalf(t, "expected pod in namespace %s to
have %s opaque ports, but it had %s", ns, manualOpaquePorts, annotation)
}
- containers := pods[0].Spec.Containers
- if proxyContainer := testutil.GetProxyContainer(containers);
proxyContainer != nil {
+ if proxyContainer := testutil.GetProxyContainer(pods[0].Spec);
proxyContainer != nil {
testutil.Fatalf(t, "pod in namespace %s should not have
been injected", ns)
}
})
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/linkerd-cli-edge-26.1.1/testutil/inject.go
new/linkerd-cli-edge-26.1.2/testutil/inject.go
--- old/linkerd-cli-edge-26.1.1/testutil/inject.go 2026-01-06
15:35:53.000000000 +0100
+++ new/linkerd-cli-edge-26.1.2/testutil/inject.go 2026-01-14
15:45:20.000000000 +0100
@@ -49,8 +49,8 @@
}
// GetProxyContainer get the proxy containers
-func GetProxyContainer(containers []v1.Container) *v1.Container {
- for _, c := range containers {
+func GetProxyContainer(spec v1.PodSpec) *v1.Container {
+ for _, c := range append(spec.InitContainers, spec.Containers...) {
container := c
if container.Name == k8s.ProxyContainerName {
return &container
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/linkerd-cli-edge-26.1.1/testutil/inject_validator.go
new/linkerd-cli-edge-26.1.2/testutil/inject_validator.go
--- old/linkerd-cli-edge-26.1.1/testutil/inject_validator.go 2026-01-06
15:35:53.000000000 +0100
+++ new/linkerd-cli-edge-26.1.2/testutil/inject_validator.go 2026-01-14
15:45:20.000000000 +0100
@@ -18,6 +18,7 @@
// injected pods
type InjectValidator struct {
NoInitContainer bool
+ NativeSidecar bool
AutoInject bool
AdminPort int
ControlPort int
@@ -62,6 +63,21 @@
return nil
}
+func (iv *InjectValidator) getPodContainer(pod *v1.PodSpec) *v1.Container {
+ var containers []v1.Container
+ if iv.NativeSidecar {
+ containers = pod.InitContainers
+ } else {
+ containers = pod.Containers
+ }
+ for _, container := range containers {
+ if container.Name == k8s.ProxyContainerName {
+ return &container
+ }
+ }
+ return nil
+}
+
func (iv *InjectValidator) validateEnvVar(container *v1.Container, envName,
expectedValue string) error {
for _, env := range container.Env {
if env.Name == envName {
@@ -99,9 +115,9 @@
}
func (iv *InjectValidator) validateProxyContainer(pod *v1.PodSpec) error {
- proxyContainer := iv.getContainer(pod, k8s.ProxyContainerName, false)
+ proxyContainer := iv.getPodContainer(pod)
if proxyContainer == nil {
- return fmt.Errorf("container %s missing",
k8s.ProxyContainerName)
+ return fmt.Errorf("proxy container %s missing",
k8s.ProxyContainerName)
}
if iv.AdminPort != 0 {
@@ -413,6 +429,15 @@
annotations := make(map[string]string)
var flags []string
+ // native sidecar annotation and flag are set explicitly to avoid
relying on defaults that might change
+ if iv.NativeSidecar {
+ annotations[k8s.ProxyEnableNativeSidecarAnnotationBeta] =
enabled
+ flags = append(flags, "--native-sidecar")
+ } else {
+ annotations[k8s.ProxyEnableNativeSidecarAnnotationBeta] =
"false"
+ flags = append(flags, "--native-sidecar=false")
+ }
+
if iv.AutoInject {
annotations[k8s.ProxyInjectAnnotation] = k8s.ProxyInjectEnabled
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/linkerd-cli-edge-26.1.1/web/app/package.json
new/linkerd-cli-edge-26.1.2/web/app/package.json
--- old/linkerd-cli-edge-26.1.1/web/app/package.json 2026-01-06
15:35:53.000000000 +0100
+++ new/linkerd-cli-edge-26.1.2/web/app/package.json 2026-01-14
15:45:20.000000000 +0100
@@ -79,7 +79,7 @@
"style-loader": "^4.0.0",
"url-loader": "^4.1.1",
"webpack": "^5.104.1",
- "webpack-bundle-analyzer": "5.1.0",
+ "webpack-bundle-analyzer": "5.1.1",
"webpack-cli": "6.0.1",
"webpack-dev-server": "5.2.2"
},
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/linkerd-cli-edge-26.1.1/web/app/yarn.lock
new/linkerd-cli-edge-26.1.2/web/app/yarn.lock
--- old/linkerd-cli-edge-26.1.1/web/app/yarn.lock 2026-01-06
15:35:53.000000000 +0100
+++ new/linkerd-cli-edge-26.1.2/web/app/yarn.lock 2026-01-14
15:45:20.000000000 +0100
@@ -9992,10 +9992,10 @@
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.1.0"
- resolved
"https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-5.1.0.tgz#f5f2af23eeb4558c506eec27ea6dc3a3d3d70115"
- integrity
sha512-WAWwIoIUx4yC2AEBqXbDkcmh/LzAaenv0+nISBflP5l+XIXO9/x6poWarGA3RTrfavk9H3oWQ64Wm0z26/UGKA==
[email protected]:
+ version "5.1.1"
+ resolved
"https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-5.1.1.tgz#39273f584a234960158fd9a56ca79e739ae06062"
+ integrity
sha512-UzoaIA0Aigo5lUvoUkIkSoHtUK5rBJh9e2vW3Eqct0jc/L8hcruBCz/jsXEvB1hDU1G3V94jo2EJqPcFKeSSeQ==
dependencies:
"@discoveryjs/json-ext" "0.5.7"
acorn "^8.0.4"
++++++ linkerd-cli-edge.obsinfo ++++++
--- /var/tmp/diff_new_pack.Cwouyy/_old 2026-01-15 16:49:23.320028801 +0100
+++ /var/tmp/diff_new_pack.Cwouyy/_new 2026-01-15 16:49:23.328029126 +0100
@@ -1,5 +1,5 @@
name: linkerd-cli-edge
-version: 26.1.1
-mtime: 1767710153
-commit: d22fbc715226f3836a39bb20ba8b7ad5e112027c
+version: 26.1.2
+mtime: 1768401920
+commit: a2b1189358ba9ff413c8421506a93b400be91c48
++++++ vendor.tar.gz ++++++
/work/SRC/openSUSE:Factory/linkerd-cli-edge/vendor.tar.gz
/work/SRC/openSUSE:Factory/.linkerd-cli-edge.new.1928/vendor.tar.gz differ:
char 14, line 1