From a5529aaded9bacce8d2cdbcf6f14c7196f29ed1e Mon Sep 17 00:00:00 2001 From: Carlos Mendes Date: Mon, 17 Jun 2024 21:38:00 -0300 Subject: [PATCH] Adding destination to retry --- .../execution/istio/steps/IstioRetryStep.java | 34 +++++++++++++------ 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/resilience-bench/operator/src/main/java/io/resiliencebench/execution/istio/steps/IstioRetryStep.java b/resilience-bench/operator/src/main/java/io/resiliencebench/execution/istio/steps/IstioRetryStep.java index fd3f80e..c58fa58 100644 --- a/resilience-bench/operator/src/main/java/io/resiliencebench/execution/istio/steps/IstioRetryStep.java +++ b/resilience-bench/operator/src/main/java/io/resiliencebench/execution/istio/steps/IstioRetryStep.java @@ -1,16 +1,18 @@ package io.resiliencebench.execution.istio.steps; -import io.fabric8.istio.api.networking.v1beta1.HTTPRetry; +import io.fabric8.istio.api.networking.v1beta1.*; import io.fabric8.istio.client.IstioClient; import io.fabric8.kubernetes.client.KubernetesClient; import io.resiliencebench.resources.queue.ExecutionQueue; import io.resiliencebench.resources.scenario.Scenario; import io.resiliencebench.resources.scenario.Source; +import io.resiliencebench.resources.scenario.Target; import io.resiliencebench.resources.service.ResilientService; import io.resiliencebench.support.CustomResourceRepository; import org.slf4j.Logger; import org.springframework.stereotype.Service; +import java.util.Collections; import java.util.Map; import java.util.Optional; @@ -27,20 +29,32 @@ public IstioRetryStep(KubernetesClient kubernetesClient, IstioClient istioClient public Scenario execute(Scenario scenario, ExecutionQueue executionQueue) { for (var connector : scenario.getSpec().getConnectors()) { var source = connector.getSource(); - configureRetryOnSource(scenario.getMetadata().getNamespace(), source); + configureRetryOnSource(scenario.getMetadata().getNamespace(), source, connector.getTarget()); } return scenario; } - private void configureRetryOnSource(String namespace, Source source) { + private void configureRetryOnSource(String namespace, Source source, Target target) { var sourceVirtualService = findVirtualService(namespace, source.getServiceName()); - var retryPolicy = createRetryPolicy(source.getPatternConfig()); + var retryPolicy = createRetryPolicy(source.getPatternConfig(), target); if (retryPolicy.isPresent()) { + Destination destination = new DestinationBuilder() + .withHost(target.getServiceName()) + .withSubset("v1") + .build(); + + HTTPRoute httpRoute = new HTTPRouteBuilder() + .withRoute(Collections.singletonList(new HTTPRouteDestinationBuilder() + .withDestination(destination) + .build())) + .withRetries(retryPolicy.get()) + .build(); + var newVirtualService = sourceVirtualService .edit() .editSpec() .editFirstHttp() - .withRetries(retryPolicy.get()) + .withRoute(httpRoute.getRoute()) .endHttp() .endSpec() .build(); @@ -54,20 +68,20 @@ private void configureRetryOnSource(String namespace, Source source) { } } - public Optional createRetryPolicy(Map patternConfig) { - var builder = new HTTPRetry().toBuilder(); + public Optional createRetryPolicy(Map patternConfig, Target target) { + var httpRetry = new HTTPRetry(); var attempts = (Integer) patternConfig.get("attempts"); var perTryTimeout = (Integer) patternConfig.get("perTryTimeout"); if (attempts != null && attempts >= 0) { - builder.withAttempts(attempts); + httpRetry.setAttempts(attempts); if (perTryTimeout != null && perTryTimeout > 0) { - builder.withPerTryTimeout(perTryTimeout + "ms"); + httpRetry.setPerTryTimeout(perTryTimeout + "ms"); } else { log.warn("perTryTimeout must be greater than or equal to 0."); } - return Optional.of(builder.build()); + return Optional.of(httpRetry); } else { log.error("Retry not configured. Attempts and perTryTimeout are required for retry pattern configuration."); return Optional.empty();