use of org.openkilda.messaging.model.Flow 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.model.Flow in project open-kilda by telstra.
the class FlowCache method getFlowLinkedEndpoint.
/**
* Gets flow linked with specified switch id.
*
* @param flow flow
* @param switchId switch id
* @return second endpoint if specified switch id one of the flows endpoint, otherwise null
*/
private String getFlowLinkedEndpoint(ImmutablePair<Flow, Flow> flow, String switchId) {
Flow forward = flow.getLeft();
Flow reverse = flow.getRight();
String linkedSwitch = null;
if (forward.getSourceSwitch().equals(switchId) && reverse.getDestinationSwitch().equals(switchId)) {
linkedSwitch = forward.getDestinationSwitch();
} else if (forward.getDestinationSwitch().equals(switchId) && reverse.getSourceSwitch().equals(switchId)) {
linkedSwitch = forward.getSourceSwitch();
}
return linkedSwitch;
}
use of org.openkilda.messaging.model.Flow in project open-kilda by telstra.
the class FlowCacheTest method makeFlow.
private Flow makeFlow(String id, SwitchInfoData source, SwitchInfoData dest, int bandwidth) {
Flow flow = new Flow();
flow.setFlowId(id);
flow.setSourceSwitch(source.getSwitchId());
flow.setDestinationSwitch(dest.getSwitchId());
flow.setBandwidth(bandwidth);
return flow;
}
use of org.openkilda.messaging.model.Flow in project open-kilda by telstra.
the class FlowCrudSteps method eachFlowCanNotBeReadFromTopologyEngine.
@And("^each flow can not be read from TopologyEngine$")
public void eachFlowCanNotBeReadFromTopologyEngine() {
for (FlowPayload flow : flows) {
ImmutablePair<Flow, Flow> result = Failsafe.with(retryPolicy.abortIf(Objects::isNull)).get(() -> topologyEngineService.getFlow(flow.getId()));
assertNull(format("The flow '%s' exists.", flow.getId()), result);
}
}
use of org.openkilda.messaging.model.Flow in project open-kilda by telstra.
the class FlowCrudSteps method buildFlow.
private FlowPayload buildFlow(String flowId, Switch srcSwitch, Switch destSwitch) {
// Take the switch vlan ranges as the base
RangeSet<Integer> srcRangeSet = TreeRangeSet.create();
srcSwitch.getOutPorts().forEach(port -> srcRangeSet.addAll(port.getVlanRange()));
RangeSet<Integer> destRangeSet = TreeRangeSet.create();
destSwitch.getOutPorts().forEach(port -> destRangeSet.addAll(port.getVlanRange()));
// Exclude already allocated vlans
srcRangeSet.removeAll(allocatedVlans);
destRangeSet.removeAll(allocatedVlans);
if (srcRangeSet.isEmpty() || destRangeSet.isEmpty()) {
LOGGER.warn("Unable to define a flow between {} and {} as no vlan available.", srcSwitch, destSwitch);
return null;
}
// Calculate intersection of the ranges
RangeSet<Integer> interRangeSet = TreeRangeSet.create(srcRangeSet);
interRangeSet.removeAll(destRangeSet.complement());
// Same vlan for source and destination
final Optional<Integer> sameVlan = interRangeSet.asRanges().stream().flatMap(range -> ContiguousSet.create(range, DiscreteDomain.integers()).stream()).findFirst();
int srcVlan;
int destVlan;
if (sameVlan.isPresent()) {
srcVlan = sameVlan.get();
destVlan = sameVlan.get();
} else {
// Cross vlan flow
Optional<Integer> srcVlanOpt = srcRangeSet.asRanges().stream().flatMap(range -> ContiguousSet.create(range, DiscreteDomain.integers()).stream()).findFirst();
if (!srcVlanOpt.isPresent()) {
LOGGER.warn("Unable to allocate a vlan for the switch {}.", srcSwitch);
return null;
}
srcVlan = srcVlanOpt.get();
Optional<Integer> destVlanOpt = destRangeSet.asRanges().stream().flatMap(range -> ContiguousSet.create(range, DiscreteDomain.integers()).stream()).findFirst();
if (!destVlanOpt.isPresent()) {
LOGGER.warn("Unable to allocate a vlan for the switch {}.", destSwitch);
return null;
}
destVlan = destVlanOpt.get();
}
boolean sameSwitchFlow = srcSwitch.getDpId().equals(destSwitch.getDpId());
Optional<OutPort> srcPort = srcSwitch.getOutPorts().stream().filter(p -> p.getVlanRange().contains(srcVlan)).findFirst();
int srcPortId = srcPort.orElseThrow(() -> new IllegalStateException("Unable to allocate a port in found vlan.")).getPort();
Optional<OutPort> destPort = destSwitch.getOutPorts().stream().filter(p -> p.getVlanRange().contains(destVlan)).filter(p -> !sameSwitchFlow || p.getPort() != srcPortId).findFirst();
if (!destPort.isPresent()) {
if (sameSwitchFlow) {
LOGGER.warn("Unable to define a same switch flow for {} as no ports available.", srcSwitch);
return null;
} else {
throw new IllegalStateException("Unable to allocate a port in found vlan.");
}
}
// Record used vlan to archive uniqueness
allocatedVlans.add(Range.singleton(srcVlan));
allocatedVlans.add(Range.singleton(destVlan));
FlowEndpointPayload srcEndpoint = new FlowEndpointPayload(srcSwitch.getDpId(), srcPortId, srcVlan);
FlowEndpointPayload destEndpoint = new FlowEndpointPayload(destSwitch.getDpId(), destPort.get().getPort(), destVlan);
return new FlowPayload(flowId, srcEndpoint, destEndpoint, 1, false, flowId, null);
}
Aggregations