Skip to content

Commit

Permalink
Adding destination to retry
Browse files Browse the repository at this point in the history
  • Loading branch information
cmendesce committed Jun 18, 2024
1 parent c960ea0 commit a5529aa
Showing 1 changed file with 24 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -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();
Expand All @@ -54,20 +68,20 @@ private void configureRetryOnSource(String namespace, Source source) {
}
}

public Optional<HTTPRetry> createRetryPolicy(Map<String, Object> patternConfig) {
var builder = new HTTPRetry().toBuilder();
public Optional<HTTPRetry> createRetryPolicy(Map<String, Object> 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();
Expand Down

0 comments on commit a5529aa

Please sign in to comment.