use of org.openkilda.wfm.CommandContext in project open-kilda by telstra.
the class FlowCreateServiceTest method testSpeakerCommandRetry.
private void testSpeakerCommandRetry(Class<?> failRequest, ErrorCode error, boolean mustRetry) throws Exception {
String key = "retries_non_ingress_installation";
FlowRequest flowRequest = makeRequest().flowId("dummy_flow_id").build();
int retriesLimit = 10;
FlowCreateService service = makeService(retriesLimit);
preparePathComputation(flowRequest.getFlowId(), make2SwitchesPathPair());
service.handleRequest(key, new CommandContext(), flowRequest);
Flow inProgress = verifyFlowStatus(flowRequest.getFlowId(), FlowStatus.IN_PROGRESS);
verifyFlowPathStatus(inProgress.getForwardPath(), FlowPathStatus.IN_PROGRESS, "forward");
verifyFlowPathStatus(inProgress.getReversePath(), FlowPathStatus.IN_PROGRESS, "reverse");
verifyNorthboundSuccessResponse(carrier);
Set<UUID> producedErrors = new HashSet<>();
Map<UUID, Integer> remainingRetries = new HashMap<>();
Map<UUID, Integer> seenCounter = new HashMap<>();
FlowSegmentRequest request;
while ((request = requests.poll()) != null) {
UUID commandId = request.getCommandId();
seenCounter.put(commandId, seenCounter.getOrDefault(commandId, 0) + 1);
Integer remaining = remainingRetries.getOrDefault(commandId, retriesLimit);
try {
if (failRequest.isInstance(request) && remaining > 0) {
producedErrors.add(commandId);
remainingRetries.put(commandId, remaining - 1);
handleErrorResponse(service, key, request, error);
} else if (request.isVerifyRequest()) {
service.handleAsyncResponse(key, buildResponseOnVerifyRequest(request));
} else {
handleResponse(service, key, request);
}
} catch (UnknownKeyException ex) {
// skip
}
}
Assert.assertFalse(producedErrors.isEmpty());
for (Map.Entry<UUID, Integer> entry : seenCounter.entrySet()) {
if (!producedErrors.contains(entry.getKey())) {
continue;
}
Integer counter = entry.getValue();
if (mustRetry) {
Assert.assertEquals(retriesLimit + 1, (int) counter);
} else {
Assert.assertEquals(1, (int) counter);
}
}
if (mustRetry) {
Flow result = verifyFlowStatus(flowRequest.getFlowId(), FlowStatus.UP);
verifyFlowPathStatus(result.getForwardPath(), FlowPathStatus.ACTIVE, "forward");
verifyFlowPathStatus(result.getReversePath(), FlowPathStatus.ACTIVE, "reverse");
} else {
verifyFlowStatus(flowRequest.getFlowId(), FlowStatus.DOWN);
}
}
use of org.openkilda.wfm.CommandContext in project open-kilda by telstra.
the class FlowCreateServiceTest method shouldRollbackIfIngressRuleNotInstalled.
@Test
public void shouldRollbackIfIngressRuleNotInstalled() throws Exception {
when(pathComputer.getPath(any(Flow.class))).thenReturn(make3SwitchesPathPair());
String key = "failed_flow_create";
FlowRequest flowRequest = makeRequest().flowId("failed_flow_id").build();
FlowCreateService service = makeService();
service.handleRequest(key, new CommandContext(), flowRequest);
Flow inProgress = verifyFlowStatus(flowRequest.getFlowId(), FlowStatus.IN_PROGRESS);
verifyFlowPathStatus(inProgress.getForwardPath(), FlowPathStatus.IN_PROGRESS, "forward");
verifyFlowPathStatus(inProgress.getReversePath(), FlowPathStatus.IN_PROGRESS, "reverse");
verifyNorthboundSuccessResponse(carrier);
FlowSegmentRequest request;
int installCommands = 0;
int deleteCommands = 0;
while ((request = requests.poll()) != null) {
try {
if (request.isVerifyRequest()) {
service.handleAsyncResponse(key, buildResponseOnVerifyRequest(request));
} else if (request.isInstallRequest()) {
installCommands++;
if (requests.size() > 1 || request instanceof EgressFlowSegmentInstallRequest) {
handleResponse(service, key, request);
} else {
handleErrorResponse(service, key, request, ErrorCode.UNKNOWN);
}
} else if (request.isRemoveRequest()) {
deleteCommands++;
handleResponse(service, key, request);
}
} catch (UnknownKeyException ex) {
// skip
}
}
assertEquals("All installed rules should be deleted", installCommands, deleteCommands);
Flow result = verifyFlowStatus(flowRequest.getFlowId(), FlowStatus.DOWN);
Assert.assertNull(result.getForwardPath());
Assert.assertNull(result.getReversePath());
}
use of org.openkilda.wfm.CommandContext in project open-kilda by telstra.
the class FlowCreateServiceTest method shouldNotRetryForever.
@Test
public void shouldNotRetryForever() throws Exception {
String key = "retries_non_ingress_installation";
FlowRequest flowRequest = makeRequest().flowId("dummy_flow_id").build();
int retriesLimit = 10;
FlowCreateService service = makeService(retriesLimit);
preparePathComputation(flowRequest.getFlowId(), make2SwitchesPathPair());
service.handleRequest(key, new CommandContext(), flowRequest);
Flow inProgress = verifyFlowStatus(flowRequest.getFlowId(), FlowStatus.IN_PROGRESS);
verifyFlowPathStatus(inProgress.getForwardPath(), FlowPathStatus.IN_PROGRESS, "forward");
verifyFlowPathStatus(inProgress.getReversePath(), FlowPathStatus.IN_PROGRESS, "reverse");
verifyNorthboundSuccessResponse(carrier);
FlowSegmentRequest request;
Map<UUID, Integer> remainingRetries = new HashMap<>();
while ((request = requests.poll()) != null) {
UUID commandId = request.getCommandId();
Integer remaining = remainingRetries.getOrDefault(commandId, retriesLimit + 1);
Assert.assertTrue(0 < remaining);
try {
if (request instanceof EgressFlowSegmentInstallRequest) {
remainingRetries.put(commandId, remaining - 1);
handleErrorResponse(service, key, request, ErrorCode.SWITCH_UNAVAILABLE);
} else if (request.isVerifyRequest()) {
service.handleAsyncResponse(key, buildResponseOnVerifyRequest(request));
} else {
handleResponse(service, key, request);
}
} catch (UnknownKeyException ex) {
// skip
}
}
verifyFlowStatus(flowRequest.getFlowId(), FlowStatus.DOWN);
}
use of org.openkilda.wfm.CommandContext in project open-kilda by telstra.
the class WorkerBoltTest method timeoutClearPendingTasks.
@Test
public void timeoutClearPendingTasks() throws Exception {
String key = "key";
String payload = "payload";
Tuple request = new TupleImpl(topologyContext, new Values(key, payload, new CommandContext()), HUB_TASK_ID, Utils.DEFAULT_STREAM_ID);
worker.execute(request);
Tuple timeout = new TupleImpl(topologyContext, new Values(key, payload, new CommandContext()), COORDINATOR_TASK_ID, Utils.DEFAULT_STREAM_ID);
worker.execute(timeout);
reset(output);
Tuple response = new TupleImpl(topologyContext, new Values(key, payload, new CommandContext()), SPOUT_TASK_ID, Utils.DEFAULT_STREAM_ID);
worker.execute(response);
// if timeout have not cleaned pending request, our dummy will try to pass response to the HUB.
verify(output).ack(response);
verifyNoMoreInteractions(output);
}
use of org.openkilda.wfm.CommandContext in project open-kilda by telstra.
the class WorkerBoltTest method cancelledTimeout.
@Test
public void cancelledTimeout() throws Exception {
String key = "key";
String payload = "payload";
Tuple request = new TupleImpl(topologyContext, new Values(key, payload, new CommandContext()), HUB_TASK_ID, Utils.DEFAULT_STREAM_ID);
worker.execute(request);
Tuple response = new TupleImpl(topologyContext, new Values(key, payload, new CommandContext()), SPOUT_TASK_ID, Utils.DEFAULT_STREAM_ID);
worker.execute(response);
Tuple timeout = new TupleImpl(topologyContext, new Values(key, payload, new CommandContext()), COORDINATOR_TASK_ID, Utils.DEFAULT_STREAM_ID);
worker.execute(timeout);
Assert.assertNull("Must not produce unhandled input errors", worker.lastError);
}
Aggregations