use of org.openkilda.floodlight.api.request.FlowSegmentRequest 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.floodlight.api.request.FlowSegmentRequest 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.floodlight.api.request.FlowSegmentRequest in project open-kilda by telstra.
the class SpeakerRequestEmitter method emitBatch.
/**
* Emit series of speaker requests produced from proposed series of request factories.
*/
public void emitBatch(FlowGenericCarrier carrier, Collection<FlowSegmentRequestFactory> factories, Map<UUID, FlowSegmentRequestFactory> requestsStorage) {
for (FlowSegmentRequestFactory factory : factories) {
FlowSegmentRequest request = makeRequest(factory);
requestsStorage.put(request.getCommandId(), factory);
carrier.sendSpeakerRequest(request);
}
}
use of org.openkilda.floodlight.api.request.FlowSegmentRequest in project open-kilda by telstra.
the class RemoveOldRulesAction method perform.
@TimedExecution("fsm.remove_old_rules")
@Override
protected void perform(State from, State to, Event event, FlowRerouteContext context, FlowRerouteFsm stateMachine) {
FlowEncapsulationType encapsulationType = stateMachine.getOriginalEncapsulationType();
FlowCommandBuilder commandBuilder = commandBuilderFactory.getBuilder(encapsulationType);
Collection<FlowSegmentRequestFactory> factories = new ArrayList<>();
Flow originalFlow = getOriginalFlowWithPaths(stateMachine, stateMachine.getOriginalFlow());
SpeakerRequestBuildContext speakerContext = SpeakerRequestBuildContext.getEmpty();
MirrorContext mirrorContext = MirrorContext.builder().removeFlowOperation(true).build();
if (stateMachine.getOldPrimaryForwardPath() != null) {
FlowPath oldForward = getFlowPath(stateMachine.getOldPrimaryForwardPath());
speakerContext.setForward(buildPathContextForRemovalIngressOnly(oldForward.getSrcSwitchId()));
if (stateMachine.getOldPrimaryReversePath() != null) {
FlowPath oldReverse = getFlowPath(stateMachine.getOldPrimaryReversePath());
speakerContext.setReverse(buildPathContextForRemovalIngressOnly(oldReverse.getSrcSwitchId()));
factories.addAll(commandBuilder.buildAll(stateMachine.getCommandContext(), originalFlow, oldForward, oldReverse, speakerContext, mirrorContext));
} else {
factories.addAll(commandBuilder.buildAll(stateMachine.getCommandContext(), originalFlow, oldForward, speakerContext, mirrorContext));
}
} else if (stateMachine.getOldPrimaryReversePath() != null) {
FlowPath oldReverse = getFlowPath(stateMachine.getOldPrimaryReversePath());
speakerContext.setForward(buildPathContextForRemovalIngressOnly(oldReverse.getSrcSwitchId()));
factories.addAll(commandBuilder.buildAll(stateMachine.getCommandContext(), originalFlow, oldReverse, speakerContext, mirrorContext));
}
if (stateMachine.getOldProtectedForwardPath() != null) {
FlowPath oldForward = getFlowPath(stateMachine.getOldProtectedForwardPath());
if (stateMachine.getOldProtectedReversePath() != null) {
FlowPath oldReverse = getFlowPath(stateMachine.getOldProtectedReversePath());
factories.addAll(commandBuilder.buildAllExceptIngress(stateMachine.getCommandContext(), originalFlow, oldForward, oldReverse, mirrorContext));
} else {
factories.addAll(commandBuilder.buildAllExceptIngress(stateMachine.getCommandContext(), originalFlow, oldForward, mirrorContext));
}
} else if (stateMachine.getOldProtectedReversePath() != null) {
FlowPath oldReverse = getFlowPath(stateMachine.getOldProtectedReversePath());
factories.addAll(commandBuilder.buildAllExceptIngress(stateMachine.getCommandContext(), originalFlow, oldReverse, mirrorContext));
}
stateMachine.clearPendingAndRetriedAndFailedCommands();
if (factories.isEmpty()) {
stateMachine.saveActionToHistory("No need to remove old rules");
stateMachine.fire(Event.RULES_REMOVED);
} else {
Map<UUID, FlowSegmentRequestFactory> requestsStorage = stateMachine.getRemoveCommands();
for (FlowSegmentRequestFactory factory : factories) {
FlowSegmentRequest request = factory.makeRemoveRequest(commandIdGenerator.generate());
// TODO ensure no conflicts
requestsStorage.put(request.getCommandId(), factory);
stateMachine.getCarrier().sendSpeakerRequest(request);
}
requestsStorage.forEach((key, value) -> stateMachine.addPendingCommand(key, value.getSwitchId()));
stateMachine.saveActionToHistory("Remove commands for old rules have been sent");
}
}
use of org.openkilda.floodlight.api.request.FlowSegmentRequest in project open-kilda by telstra.
the class YFlowRerouteServiceTest method handleSpeakerCommandsAndTimeoutInstall.
private void handleSpeakerCommandsAndTimeoutInstall(YFlowRerouteService service, String yFlowFsmKey) {
handleSpeakerRequests(request -> {
SpeakerResponse commandResponse;
if (request instanceof FlowSegmentRequest) {
FlowSegmentRequest flowSegmentRequest = (FlowSegmentRequest) request;
commandResponse = buildSuccessfulSpeakerResponse(flowSegmentRequest);
handleAsyncResponse(service, yFlowFsmKey, commandResponse);
} else {
BaseSpeakerCommandsRequest speakerCommandsRequest = (BaseSpeakerCommandsRequest) request;
if (speakerCommandsRequest instanceof InstallSpeakerCommandsRequest) {
try {
service.handleTimeout(yFlowFsmKey);
} catch (UnknownKeyException ex) {
// skip
}
} else {
commandResponse = buildSuccessfulYFlowSpeakerResponse(speakerCommandsRequest);
handleAsyncResponse(service, yFlowFsmKey, commandResponse);
}
}
});
}
Aggregations