@@ -22,9 +22,7 @@ import (
2222 "strings"
2323
2424 "github.com/Masterminds/semver/v3"
25- "github.com/istio-ecosystem/sail-operator/pkg/kube"
2625 "github.com/istio-ecosystem/sail-operator/tests/e2e/util/kubectl"
27- appsv1 "k8s.io/api/apps/v1"
2826 corev1 "k8s.io/api/core/v1"
2927 "sigs.k8s.io/controller-runtime/pkg/client"
3028)
@@ -129,29 +127,36 @@ func (w *WorkloadValidator) ValidateConnectivity(ctx context.Context) error {
129127
130128// ValidateProxyVersion validates proxy version based on dataplane mode
131129func (w * WorkloadValidator ) ValidateProxyVersion (ctx context.Context , expectedVersion * semver.Version ) error {
130+ var namespace string
131+ var checkAllPods bool // true = check all pods, false = check first pod only
132+
132133 switch w .DataplaneMode {
133134 case DataplaneModeSidecar :
134- return w .validateSidecarProxyVersion (ctx , expectedVersion )
135+ namespace = w .Namespace
136+ checkAllPods = true // check all workload pods
135137 case DataplaneModeAmbient :
136- return w .validateZTunnelVersion (ctx , expectedVersion )
138+ namespace = ZtunnelNamespace
139+ checkAllPods = false // All ZTunnel pods share same version, check first only
137140 default :
138141 return fmt .Errorf ("unsupported dataplane mode: %s" , w .DataplaneMode )
139142 }
140- }
141143
142- // validateSidecarProxyVersion checks proxy container version in workload pods
143- func (w * WorkloadValidator ) validateSidecarProxyVersion (ctx context.Context , expectedVersion * semver.Version ) error {
144144 pods := & corev1.PodList {}
145- if err := w .Cl .List (ctx , pods , client .InNamespace (w . Namespace )); err != nil {
146- return fmt .Errorf ("failed to list pods in %s: %w" , w . Namespace , err )
145+ if err := w .Cl .List (ctx , pods , client .InNamespace (namespace )); err != nil {
146+ return fmt .Errorf ("failed to list pods in %s: %w" , namespace , err )
147147 }
148148
149149 if len (pods .Items ) == 0 {
150- return fmt .Errorf ("no pods found in %s namespace" , w . Namespace )
150+ return fmt .Errorf ("no pods found in %s namespace" , namespace )
151151 }
152152
153- for _ , pod := range pods .Items {
154- proxyVersion , err := GetProxyVersion (pod .Name , w .Namespace )
153+ podsToValidate := pods .Items
154+ if ! checkAllPods {
155+ podsToValidate = pods .Items [:1 ]
156+ }
157+
158+ for _ , pod := range podsToValidate {
159+ proxyVersion , err := GetProxyVersion (pod .Name , namespace )
155160 if err != nil {
156161 return fmt .Errorf ("failed to get proxy version for pod %s: %w" , pod .Name , err )
157162 }
@@ -160,40 +165,8 @@ func (w *WorkloadValidator) validateSidecarProxyVersion(ctx context.Context, exp
160165 pod .Name , proxyVersion , expectedVersion )
161166 }
162167 }
163- return nil
164- }
165-
166- // validateZTunnelVersion checks ZTunnel DaemonSet version by reading image tag
167- func (w * WorkloadValidator ) validateZTunnelVersion (ctx context.Context , expectedVersion * semver.Version ) error {
168- daemonset := & appsv1.DaemonSet {}
169- if err := w .Cl .Get (ctx , kube .Key ("ztunnel" , ZtunnelNamespace ), daemonset ); err != nil {
170- return fmt .Errorf ("failed to get ZTunnel DaemonSet: %w" , err )
171- }
172-
173- // Extract version from ZTunnel container image tag
174- // Image format: gcr.io/istio-release/ztunnel:1.29.2
175- for _ , container := range daemonset .Spec .Template .Spec .Containers {
176- if container .Name == "istio-proxy" {
177- parts := strings .Split (container .Image , ":" )
178- if len (parts ) != 2 {
179- return fmt .Errorf ("unexpected ZTunnel image format: %s" , container .Image )
180- }
181- tag := parts [1 ]
182-
183- // Parse version from tag
184- version , err := semver .NewVersion (tag )
185- if err != nil {
186- return fmt .Errorf ("failed to parse ZTunnel version from tag %s: %w" , tag , err )
187- }
188-
189- if ! version .Equal (expectedVersion ) {
190- return fmt .Errorf ("ZTunnel has version %s, expected %s" , version , expectedVersion )
191- }
192- return nil
193- }
194- }
195168
196- return fmt . Errorf ( "istio-proxy container not found in ZTunnel DaemonSet" )
169+ return nil
197170}
198171
199172// Cleanup removes workload and httpbin namespaces
0 commit comments