Skip to content

Commit 1ea29bd

Browse files
authored
Fix E2E update tests for OCP cluster (#1985)
- Add missing IstioCNI NS creation for control plane update sub tests. - Refactor proxy version retrieve for ztunnel mode. Signed-off-by: Maxim Babushkin <mbabushk@redhat.com>
1 parent d3fe70a commit 1ea29bd

3 files changed

Lines changed: 32 additions & 49 deletions

File tree

tests/e2e/controlplane/control_plane_update_test.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,10 @@ spec:
310310
BeforeAll(func(ctx SpecContext) {
311311
clr.Record(ctx)
312312
Expect(k.CreateNamespace(controlPlaneNamespace)).To(Succeed(), "Istio namespace failed to be created")
313+
Expect(k.CreateNamespace(istioCniNamespace)).To(Succeed(), "IstioCNI namespace failed to be created")
314+
315+
common.CreateIstioCNI(k, baseVersion.Name)
316+
common.AwaitCondition(ctx, v1.IstioCNIConditionReady, kube.Key(istioCniName), &v1.IstioCNI{}, k, cl)
313317
})
314318

315319
When(fmt.Sprintf("Istio CR is created with InPlace updateStrategy for version %s", baseVersion.Name), func() {
@@ -476,6 +480,10 @@ updateStrategy:
476480
BeforeAll(func(ctx SpecContext) {
477481
clr.Record(ctx)
478482
Expect(k.CreateNamespace(controlPlaneNamespace)).To(Succeed(), "Istio namespace failed to be created")
483+
Expect(k.CreateNamespace(istioCniNamespace)).To(Succeed(), "IstioCNI namespace failed to be created")
484+
485+
common.CreateIstioCNI(k, testVersion.Name)
486+
common.AwaitCondition(ctx, v1.IstioCNIConditionReady, kube.Key(istioCniName), &v1.IstioCNI{}, k, cl)
479487

480488
// Create Istio CR with test version
481489
common.CreateIstio(k, testVersion.Name, `

tests/e2e/util/common/e2e_utils.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,7 @@ func EnsureNamespace(ctx context.Context, ctrlclient client.Client, namespace st
537537
func GetProxyVersion(podName, namespace string) (*semver.Version, error) {
538538
proxyStatus, err := istioctl.GetProxyStatus("--namespace " + namespace)
539539
if err != nil {
540-
return nil, fmt.Errorf("error getting sidecar version: %w", err)
540+
return nil, fmt.Errorf("error getting proxy version: %w", err)
541541
}
542542

543543
lines := strings.Split(proxyStatus, "\n")
@@ -559,8 +559,10 @@ func GetProxyVersion(podName, namespace string) (*semver.Version, error) {
559559
for _, line := range lines[1:] {
560560
if strings.Contains(line, podName+"."+namespace) {
561561
values := colSplit.Split(strings.TrimSpace(line), -1)
562-
versionStr = values[versionIdx]
563-
break
562+
if versionIdx < len(values) {
563+
versionStr = values[versionIdx]
564+
break
565+
}
564566
}
565567
}
566568

@@ -569,7 +571,7 @@ func GetProxyVersion(podName, namespace string) (*semver.Version, error) {
569571
}
570572
version, err := semver.NewVersion(versionStr)
571573
if err != nil {
572-
return version, fmt.Errorf("error parsing sidecar version %q: %w", versionStr, err)
574+
return version, fmt.Errorf("error parsing proxy version %q: %w", versionStr, err)
573575
}
574576
return version, err
575577
}

tests/e2e/util/common/workload_validator.go

Lines changed: 18 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -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
131129
func (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

Comments
 (0)