use of org.openkilda.wfm.topology.flowhs.exception.UnknownKeyException 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.topology.flowhs.exception.UnknownKeyException in project open-kilda by telstra.
the class YFlowDeleteService method handleTimeout.
/**
* Handles timeout case.
*
* @param key command identifier.
*/
public void handleTimeout(@NonNull String key) throws UnknownKeyException {
log.debug("Handling timeout for {}", key);
YFlowDeleteFsm fsm = fsmRegister.getFsmByKey(key).orElseThrow(() -> new UnknownKeyException(key));
// Propagate timeout event to all sub-flow processing FSMs.
fsm.getDeletingSubFlows().forEach(flowId -> {
try {
flowDeleteService.handleTimeoutByFlowId(flowId);
} catch (UnknownKeyException e) {
log.error("Failed to handle a timeout event by FlowDeleteService for {}.", flowId);
}
});
fsmExecutor.fire(fsm, Event.TIMEOUT);
removeIfFinished(fsm, key);
}
use of org.openkilda.wfm.topology.flowhs.exception.UnknownKeyException in project open-kilda by telstra.
the class YFlowUpdateService method handleTimeout.
/**
* Handles timeout case.
*
* @param key command identifier.
*/
public void handleTimeout(@NonNull String key) throws UnknownKeyException {
log.debug("Handling timeout for {}", key);
YFlowUpdateFsm fsm = fsmRegister.getFsmByKey(key).orElseThrow(() -> new UnknownKeyException(key));
// Propagate timeout event to all sub-flow processing FSMs.
fsm.getUpdatingSubFlows().forEach(flowId -> {
try {
flowUpdateService.handleTimeoutByFlowId(flowId);
} catch (UnknownKeyException e) {
log.error("Failed to handle a timeout event by FlowUpdateService for {}.", flowId);
}
});
fsmExecutor.fire(fsm, Event.TIMEOUT);
removeIfFinished(fsm, key);
}
use of org.openkilda.wfm.topology.flowhs.exception.UnknownKeyException in project open-kilda by telstra.
the class YFlowValidationHubService method handleTimeout.
/**
* Handles timeout case.
*
* @param key command identifier.
*/
public void handleTimeout(@NonNull String key) throws UnknownKeyException {
log.debug("Handling timeout for {}", key);
YFlowValidationFsm fsm = fsmRegister.getFsmByKey(key).orElseThrow(() -> new UnknownKeyException(key));
// Propagate timeout event to all sub-flow processing FSMs.
fsm.getValidatingSubFlows().forEach(flowId -> {
try {
flowValidationService.handleTimeoutByFlowId(flowId);
} catch (UnknownKeyException e) {
log.error("Failed to handle a timeout event by FlowUpdateService for {}.", flowId);
}
});
fsmExecutor.fire(fsm, Event.TIMEOUT);
removeIfFinished(fsm, key);
}
use of org.openkilda.wfm.topology.flowhs.exception.UnknownKeyException in project open-kilda by telstra.
the class YFlowCreateService method handleAsyncResponse.
/**
* Handles async response from worker.
*
* @param key command identifier.
*/
public void handleAsyncResponse(@NonNull String key, @NonNull SpeakerResponse speakerResponse) throws UnknownKeyException {
log.debug("Received flow command response: {}", speakerResponse);
YFlowCreateFsm fsm = fsmRegister.getFsmByKey(key).orElseThrow(() -> new UnknownKeyException(key));
if (speakerResponse instanceof SpeakerFlowSegmentResponse) {
SpeakerFlowSegmentResponse response = (SpeakerFlowSegmentResponse) speakerResponse;
String flowId = response.getMetadata().getFlowId();
if (fsm.getCreatingSubFlows().contains(flowId)) {
flowCreateService.handleAsyncResponseByFlowId(flowId, response);
} else if (fsm.getDeletingSubFlows().contains(flowId)) {
flowDeleteService.handleAsyncResponseByFlowId(flowId, response);
}
} else if (speakerResponse instanceof SpeakerCommandResponse) {
SpeakerCommandResponse response = (SpeakerCommandResponse) speakerResponse;
YFlowCreateContext context = YFlowCreateContext.builder().speakerResponse(response).build();
fsmExecutor.fire(fsm, Event.RESPONSE_RECEIVED, context);
} else {
log.debug("Received unexpected speaker response: {}", speakerResponse);
}
// After handling an event by FlowCreate or FlowDelete services, we should propagate execution to the FSM.
if (!fsm.isTerminated()) {
fsmExecutor.fire(fsm, Event.NEXT);
}
removeIfFinished(fsm, key);
}
Aggregations