use of org.openkilda.messaging.Message in project open-kilda by telstra.
the class FlowServiceImpl method syncFlowCache.
/**
* {@inheritDoc}
*/
@Override
public FlowCacheSyncResults syncFlowCache(final String correlationId) {
LOGGER.debug("Flow cache sync: {}={}", CORRELATION_ID, correlationId);
FlowCacheSyncRequest data = new FlowCacheSyncRequest();
CommandMessage request = new CommandMessage(data, System.currentTimeMillis(), correlationId, Destination.WFM);
messageConsumer.clear();
messageProducer.send(topic, request);
Message message = (Message) messageConsumer.poll(correlationId);
FlowCacheSyncResponse response = (FlowCacheSyncResponse) validateInfoMessage(request, message, correlationId);
return response.getPayload();
}
use of org.openkilda.messaging.Message in project open-kilda by telstra.
the class FlowServiceImpl method flowPushUnpush.
/**
* There are only minor differences between push and unpush .. this utility function helps
*/
private BatchResults flowPushUnpush(List<FlowInfoData> externalFlows, String correlationId, FlowOperation op) {
LOGGER.debug("Flow {}: {}={}", op, CORRELATION_ID, correlationId);
LOGGER.debug("Size of list: {}", externalFlows.size());
// First, send them all, then wait for all the responses.
// Send the command to both Flow Topology and to TE
messageConsumer.clear();
// used for error reporting, if needed
ArrayList<InfoMessage> flowRequests = new ArrayList<>();
// used for error reporting, if needed
ArrayList<InfoMessage> teRequests = new ArrayList<>();
for (int i = 0; i < externalFlows.size(); i++) {
FlowInfoData data = externalFlows.get(i);
// <-- this is what determines PUSH / UNPUSH
data.setOperation(op);
String flowCorrelation = correlationId + "-FLOW-" + i;
InfoMessage flowRequest = new InfoMessage(data, System.currentTimeMillis(), flowCorrelation, Destination.WFM);
flowRequests.add(flowRequest);
messageProducer.send(topic, flowRequest);
String teCorrelation = correlationId + "-TE-" + i;
InfoMessage teRequest = new InfoMessage(data, System.currentTimeMillis(), teCorrelation, Destination.TOPOLOGY_ENGINE);
teRequests.add(teRequest);
messageProducer.send(topoEngTopic, teRequest);
}
int flow_success = 0;
int flow_failure = 0;
int te_success = 0;
int te_failure = 0;
List<String> msgs = new ArrayList<>();
msgs.add("Total Flows Received: " + externalFlows.size());
for (int i = 0; i < externalFlows.size(); i++) {
String flowCorrelation = correlationId + "-FLOW-" + i;
String teCorrelation = correlationId + "-TE-" + i;
FlowState expectedState = (op == FlowOperation.PUSH) ? FlowState.UP : FlowState.DOWN;
try {
Message flowMessage = (Message) messageConsumer.poll(flowCorrelation);
FlowStatusResponse response = (FlowStatusResponse) validateInfoMessage(flowRequests.get(i), flowMessage, correlationId);
FlowIdStatusPayload status = response.getPayload();
if (status.getStatus() == expectedState) {
flow_success++;
} else {
msgs.add("FAILURE (FlowTopo): Flow " + status.getId() + " NOT in " + expectedState + " state: state = " + status.getStatus());
flow_failure++;
}
} catch (Exception e) {
msgs.add("EXCEPTION in Flow Topology Response: " + e.getMessage());
flow_failure++;
}
try {
// TODO: this code block is mostly the same as the previous: consolidate.
Message teMessage = (Message) messageConsumer.poll(teCorrelation);
FlowStatusResponse response = (FlowStatusResponse) validateInfoMessage(flowRequests.get(i), teMessage, correlationId);
FlowIdStatusPayload status = response.getPayload();
if (status.getStatus() == expectedState) {
te_success++;
} else {
msgs.add("FAILURE (TE): Flow " + status.getId() + " NOT in " + expectedState + " state: state = " + status.getStatus());
te_failure++;
}
} catch (Exception e) {
msgs.add("EXCEPTION in Topology Engine Response: " + e.getMessage());
te_failure++;
}
}
BatchResults result = new BatchResults(flow_failure + te_failure, flow_success + te_success, msgs.stream().toArray(String[]::new));
LOGGER.debug("Returned: ", result);
return result;
}
use of org.openkilda.messaging.Message in project open-kilda by telstra.
the class FlowServiceImpl method rerouteFlow.
/**
* {@inheritDoc}
*/
@Override
public FlowPathPayload rerouteFlow(String flowId, String correlationId) {
Flow flow = new Flow();
flow.setFlowId(flowId);
FlowRerouteRequest data = new FlowRerouteRequest(flow, FlowOperation.UPDATE);
CommandMessage command = new CommandMessage(data, System.currentTimeMillis(), correlationId, Destination.WFM);
messageConsumer.clear();
messageProducer.send(topic, command);
Message message = (Message) messageConsumer.poll(correlationId);
logger.debug("Got response {}", message);
FlowPathResponse response = (FlowPathResponse) validateInfoMessage(command, message, correlationId);
return Converter.buildFlowPathPayloadByFlowPath(flowId, response.getPayload());
}
use of org.openkilda.messaging.Message in project open-kilda by telstra.
the class SwitchServiceImpl method deleteRules.
@Override
public List<Long> deleteRules(String switchId, DeleteRulesAction deleteAction, Long cookie, String correlationId) {
LOGGER.debug("Delete switch rules request received");
// TODO: remove messageConsumer.clear() as a part of NB cleanup (clear isn't required)
messageConsumer.clear();
SwitchRulesDeleteRequest data = new SwitchRulesDeleteRequest(switchId, deleteAction, cookie);
CommandMessage request = new CommandWithReplyToMessage(data, System.currentTimeMillis(), correlationId, Destination.CONTROLLER, northboundTopic);
messageProducer.send(floodlightTopic, request);
Message message = messageConsumer.poll(correlationId);
SwitchRulesResponse response = (SwitchRulesResponse) validateInfoMessage(request, message, correlationId);
return response.getRuleIds();
}
use of org.openkilda.messaging.Message in project open-kilda by telstra.
the class SwitchServiceImpl method connectMode.
@Override
public ConnectModeRequest.Mode connectMode(ConnectModeRequest.Mode mode, String correlationId) {
LOGGER.debug("Set/Get switch connect mode request received: mode = {}", mode);
ConnectModeRequest data = new ConnectModeRequest(mode);
CommandMessage request = new CommandWithReplyToMessage(data, System.currentTimeMillis(), correlationId, Destination.CONTROLLER, northboundTopic);
messageProducer.send(floodlightTopic, request);
Message message = messageConsumer.poll(correlationId);
ConnectModeResponse response = (ConnectModeResponse) validateInfoMessage(request, message, correlationId);
return response.getMode();
}
Aggregations