use of org.openkilda.wfm.CommandContext in project open-kilda by telstra.
the class RerouteBolt method emitPathSwapCommand.
/**
* Emit swap command for consumer.
*
* @param correlationId correlation id to pass through
* @param flowId flow
* @param reason initial reason of path swap
*/
@Override
public void emitPathSwapCommand(String correlationId, String flowId, String reason) {
CommandContext context = new CommandContext(correlationId).fork(UUID.randomUUID().toString());
emit(STREAM_OPERATION_QUEUE_ID, getCurrentTuple(), new Values(flowId, new FlowPathSwapRequest(flowId, false), context));
log.warn("Flow {} swap path command message sent with correlationId {}, reason \"{}\"", flowId, context.getCorrelationId(), reason);
}
use of org.openkilda.wfm.CommandContext in project open-kilda by telstra.
the class DatapointParseBolt method handleLifeCycleEvent.
protected void handleLifeCycleEvent(Tuple tuple, LifecycleEvent event) {
if (Signal.START.equals(event.getSignal())) {
active = true;
collector.emit(ZkStreams.ZK.toString(), tuple, new Values(event, new CommandContext()));
} else if (Signal.SHUTDOWN.equals(event.getSignal())) {
active = false;
collector.emit(ZkStreams.ZK.toString(), tuple, new Values(event, new CommandContext()));
} else {
LOGGER.error("Unsupported signal received: {}", event.getSignal());
}
}
use of org.openkilda.wfm.CommandContext in project open-kilda by telstra.
the class FlowFetcher method handleOnDemandYFlowRequest.
private void handleOnDemandYFlowRequest(Tuple input) throws PipelineException {
log.debug("Handle on demand ping request");
YFlowPingRequest request = pullOnDemandYFlowRequest(input);
Optional<YFlow> optionalYFlow = yFlowRepository.findById(request.getYFlowId());
if (!optionalYFlow.isPresent()) {
emitOnDemandYFlowResponse(input, request, format("YFlow %s does not exist", request.getYFlowId()));
return;
}
YFlow yFlow = optionalYFlow.get();
Set<YSubFlow> subFlows = yFlow.getSubFlows();
if (subFlows.isEmpty()) {
emitOnDemandYFlowResponse(input, request, format("YFlow %s has no sub flows", request.getYFlowId()));
return;
}
GroupId groupId = new GroupId(subFlows.size() * DIRECTION_COUNT_PER_FLOW);
List<PingContext> subFlowPingRequests = new ArrayList<>();
for (YSubFlow subFlow : subFlows) {
Flow flow = subFlow.getFlow();
// Load paths to use in PingProducer
flow.getPaths();
flowRepository.detach(flow);
Optional<FlowTransitEncapsulation> transitEncapsulation = getTransitEncapsulation(flow);
if (transitEncapsulation.isPresent()) {
subFlowPingRequests.add(PingContext.builder().group(groupId).kind(Kinds.ON_DEMAND_Y_FLOW).flow(flow).yFlowId(yFlow.getYFlowId()).transitEncapsulation(transitEncapsulation.get()).timeout(request.getTimeout()).build());
} else {
emitOnDemandYFlowResponse(input, request, format("Encapsulation resource not found for sub flow %s of YFlow %s", subFlow.getSubFlowId(), yFlow.getYFlowId()));
return;
}
}
CommandContext commandContext = pullContext(input);
for (PingContext pingContext : subFlowPingRequests) {
emit(input, pingContext, commandContext);
}
}
use of org.openkilda.wfm.CommandContext in project open-kilda by telstra.
the class FlowFetcher method handlePeriodicRequest.
private void handlePeriodicRequest(Tuple input) throws PipelineException {
log.debug("Handle periodic ping request");
if (lastPeriodicPingCacheRefresh + periodicPingCacheExpiryInterval < System.currentTimeMillis()) {
refreshHeap(input, true);
}
final CommandContext commandContext = pullContext(input);
for (FlowWithTransitEncapsulation flow : flowsSet) {
PingContext pingContext = PingContext.builder().group(new GroupId(DIRECTION_COUNT_PER_FLOW)).kind(Kinds.PERIODIC).flow(flow.getFlow()).yFlowId(flow.yFlowId).transitEncapsulation(flow.getTransitEncapsulation()).build();
emit(input, pingContext, commandContext);
}
}
use of org.openkilda.wfm.CommandContext in project open-kilda by telstra.
the class FlowFetcher method refreshHeap.
private void refreshHeap(Tuple input, boolean emitCacheExpiry) throws PipelineException {
log.debug("Handle periodic ping request");
Set<FlowWithTransitEncapsulation> flowsWithTransitEncapsulation = flowRepository.findWithPeriodicPingsEnabled().stream().peek(flowRepository::detach).map(this::getFlowWithTransitEncapsulation).flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty()).collect(Collectors.toSet());
if (emitCacheExpiry) {
final CommandContext commandContext = pullContext(input);
emitCacheExpire(input, commandContext, flowsWithTransitEncapsulation);
}
flowsSet = flowsWithTransitEncapsulation;
lastPeriodicPingCacheRefresh = System.currentTimeMillis();
}
Aggregations