Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introduce bulkhead anf circuitbreaker config on workflow task level #379

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,12 @@ jobs:
with:
report_paths: "**/build/test-results/test/TEST-*.xml"
- name: Upload build artifacts
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: build-artifacts
path: "**/build/reports"
- name: Store Buildscan URL
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: build-scan
path: "buildscan.log"
Expand Down Expand Up @@ -95,14 +95,14 @@ jobs:
component: true

- name: Archive test screenshots
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
if: failure()
with:
name: cypress-screenshots
path: ui/cypress/screenshots

- name: Archive test videos
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
if: always()
with:
name: cypress-videos
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,98 @@ public void setTasks(List<WorkflowTask> tasks) {
@ProtoField(id = 32)
private boolean permissive;

@ProtoField(id = 33)
private CircuitBreakerConfig circuitBreakerConfig;

@ProtoField(id = 34)
private BulkheadConfig bulkheadConfig;

@ProtoMessage
public static class CircuitBreakerConfig {
@ProtoField(id = 1)
private int failureRateThreshold;

@ProtoField(id = 2)
private int slidingWindowSize;

@ProtoField(id = 3)
private int minimumNumberOfCalls;

@ProtoField(id = 4)
private int waitDurationInOpenState;

@ProtoField(id = 5)
private int permittedNumberOfCallsInHalfOpenState;

// Getters and setters
public int getFailureRateThreshold() {
return failureRateThreshold;
}

public void setFailureRateThreshold(int failureRateThreshold) {
this.failureRateThreshold = failureRateThreshold;
}

public int getSlidingWindowSize() {
return slidingWindowSize;
}

public void setSlidingWindowSize(int slidingWindowSize) {
this.slidingWindowSize = slidingWindowSize;
}

public int getMinimumNumberOfCalls() {
return minimumNumberOfCalls;
}

public void setMinimumNumberOfCalls(int minimumNumberOfCalls) {
this.minimumNumberOfCalls = minimumNumberOfCalls;
}

public int getWaitDurationInOpenState() {
return waitDurationInOpenState;
}

public void setWaitDurationInOpenState(int waitDurationInOpenState) {
this.waitDurationInOpenState = waitDurationInOpenState;
}

public int getPermittedNumberOfCallsInHalfOpenState() {
return permittedNumberOfCallsInHalfOpenState;
}

public void setPermittedNumberOfCallsInHalfOpenState(
int permittedNumberOfCallsInHalfOpenState) {
this.permittedNumberOfCallsInHalfOpenState = permittedNumberOfCallsInHalfOpenState;
}
}

@ProtoMessage
public static class BulkheadConfig {
@ProtoField(id = 1)
private int maxConcurrentCalls;

@ProtoField(id = 2)
private int maxWaitDuration;

// Getters and setters
public int getMaxConcurrentCalls() {
return maxConcurrentCalls;
}

public void setMaxConcurrentCalls(int maxConcurrentCalls) {
this.maxConcurrentCalls = maxConcurrentCalls;
}

public int getMaxWaitDuration() {
return maxWaitDuration;
}

public void setMaxWaitDuration(int maxWaitDuration) {
this.maxWaitDuration = maxWaitDuration;
}
}

/**
* @return the name
*/
Expand Down Expand Up @@ -346,6 +438,22 @@ public void setDynamicTaskNameParam(String dynamicTaskNameParam) {
this.dynamicTaskNameParam = dynamicTaskNameParam;
}

public CircuitBreakerConfig getCircuitBreakerConfig() {
return circuitBreakerConfig;
}

public void setCircuitBreakerConfig(CircuitBreakerConfig circuitBreakerConfig) {
this.circuitBreakerConfig = circuitBreakerConfig;
}

public BulkheadConfig getBulkheadConfig() {
return bulkheadConfig;
}

public void setBulkheadConfig(BulkheadConfig bulkheadConfig) {
this.bulkheadConfig = bulkheadConfig;
}

/**
* @deprecated Use {@link WorkflowTask#getEvaluatorType()} and {@link
* WorkflowTask#getExpression()} combination.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

public class WorkflowTaskTest {
Expand Down Expand Up @@ -76,4 +77,75 @@ public void testWorkflowTaskName() {
validationErrors.contains(
"WorkflowTask taskReferenceName name cannot be empty or null"));
}

@Test
public void testCircuitBreakerConfig() {
WorkflowTask task = new WorkflowTask();
assertNull(task.getCircuitBreakerConfig());

WorkflowTask.CircuitBreakerConfig config = new WorkflowTask.CircuitBreakerConfig();
config.setFailureRateThreshold(50);
config.setSlidingWindowSize(100);
config.setMinimumNumberOfCalls(10);
config.setWaitDurationInOpenState(60);
config.setPermittedNumberOfCallsInHalfOpenState(5);

task.setCircuitBreakerConfig(config);

assertNotNull(task.getCircuitBreakerConfig());
assertEquals(50, task.getCircuitBreakerConfig().getFailureRateThreshold());
assertEquals(100, task.getCircuitBreakerConfig().getSlidingWindowSize());
assertEquals(10, task.getCircuitBreakerConfig().getMinimumNumberOfCalls());
assertEquals(60, task.getCircuitBreakerConfig().getWaitDurationInOpenState());
assertEquals(5, task.getCircuitBreakerConfig().getPermittedNumberOfCallsInHalfOpenState());
}

@Test
public void testBulkheadConfig() {
WorkflowTask task = new WorkflowTask();
assertNull(task.getBulkheadConfig());

WorkflowTask.BulkheadConfig config = new WorkflowTask.BulkheadConfig();
config.setMaxConcurrentCalls(20);
config.setMaxWaitDuration(1000);

task.setBulkheadConfig(config);

assertNotNull(task.getBulkheadConfig());
assertEquals(20, task.getBulkheadConfig().getMaxConcurrentCalls());
assertEquals(1000, task.getBulkheadConfig().getMaxWaitDuration());
}

@Test
public void testCircuitBreakerConfigBuilder() {
WorkflowTask.CircuitBreakerConfig config = new WorkflowTask.CircuitBreakerConfig();

// Test individual setters
config.setFailureRateThreshold(75);
assertEquals(75, config.getFailureRateThreshold());

config.setSlidingWindowSize(200);
assertEquals(200, config.getSlidingWindowSize());

config.setMinimumNumberOfCalls(20);
assertEquals(20, config.getMinimumNumberOfCalls());

config.setWaitDurationInOpenState(30);
assertEquals(30, config.getWaitDurationInOpenState());

config.setPermittedNumberOfCallsInHalfOpenState(3);
assertEquals(3, config.getPermittedNumberOfCallsInHalfOpenState());
}

@Test
public void testBulkheadConfigBuilder() {
WorkflowTask.BulkheadConfig config = new WorkflowTask.BulkheadConfig();

// Test individual setters
config.setMaxConcurrentCalls(50);
assertEquals(50, config.getMaxConcurrentCalls());

config.setMaxWaitDuration(2000);
assertEquals(2000, config.getMaxWaitDuration());
}
}
Loading