use of org.openkilda.messaging.info.event.SwitchInfoData in project open-kilda by telstra.
the class TestUtils method createTopology.
public static Set<CommandMessage> createTopology(final SwitchService switchService, final IslService islService) {
Set<CommandMessage> commands = new HashSet<>();
switchService.add(new SwitchInfoData(srcSwitchId, SwitchEventType.ADDED, address, name, "OVS 1"));
switchService.add(new SwitchInfoData(firstTransitSwitchId, SwitchEventType.ADDED, address, name, "OVS 2"));
switchService.add(new SwitchInfoData(secondTransitSwitchId, SwitchEventType.ADDED, address, name, "OVS 1"));
switchService.add(new SwitchInfoData(dstSwitchId, SwitchEventType.ADDED, address, name, "OVS 2"));
switchService.activate(new SwitchInfoData(srcSwitchId, SwitchEventType.ACTIVATED, address, name, "OVS 1"));
switchService.activate(new SwitchInfoData(firstTransitSwitchId, SwitchEventType.ACTIVATED, address, name, "OVS 2"));
switchService.activate(new SwitchInfoData(secondTransitSwitchId, SwitchEventType.ACTIVATED, address, name, "OVS 1"));
switchService.activate(new SwitchInfoData(dstSwitchId, SwitchEventType.ACTIVATED, address, name, "OVS 2"));
PathNode srcNode;
PathNode dstNode;
List<PathNode> list;
srcNode = new PathNode(srcSwitchId, 1, 0);
dstNode = new PathNode(firstTransitSwitchId, 2, 1);
list = asList(srcNode, dstNode);
islService.discoverLink(new IslInfoData(10L, list, portSpeed));
islService.discoverLink(new IslInfoData(10L, Lists.reverse(list), portSpeed));
srcNode = new PathNode(firstTransitSwitchId, 1, 0);
dstNode = new PathNode(secondTransitSwitchId, 2, 1);
list = asList(srcNode, dstNode);
islService.discoverLink(new IslInfoData(10L, list, portSpeed));
islService.discoverLink(new IslInfoData(10L, Lists.reverse(list), portSpeed));
srcNode = new PathNode(secondTransitSwitchId, 1, 0);
dstNode = new PathNode(dstSwitchId, 2, 1);
list = asList(srcNode, dstNode);
islService.discoverLink(new IslInfoData(10L, list, portSpeed));
islService.discoverLink(new IslInfoData(10L, Lists.reverse(list), portSpeed));
commands.add(new CommandMessage(new InstallIngressFlow(0L, flowId, COOKIE, srcSwitchId, DIRECT_INCOMING_PORT, DIRECT_OUTGOING_PORT, INPUT_VLAN_ID, TRANSIT_VLAN_ID, OutputVlanType.REPLACE, 10000L, 0L), METER_ID, DEFAULT_CORRELATION_ID, Destination.WFM));
commands.add(new CommandMessage(new InstallTransitFlow(0L, flowId, COOKIE, firstTransitSwitchId, DIRECT_INCOMING_PORT, DIRECT_OUTGOING_PORT, TRANSIT_VLAN_ID), 0L, DEFAULT_CORRELATION_ID, Destination.WFM));
commands.add(new CommandMessage(new InstallTransitFlow(0L, flowId, COOKIE, secondTransitSwitchId, DIRECT_INCOMING_PORT, DIRECT_OUTGOING_PORT, TRANSIT_VLAN_ID), 0L, DEFAULT_CORRELATION_ID, Destination.WFM));
commands.add(new CommandMessage(new InstallEgressFlow(0L, flowId, COOKIE, dstSwitchId, DIRECT_INCOMING_PORT, DIRECT_OUTGOING_PORT, TRANSIT_VLAN_ID, OUTPUT_VLAN_ID, OutputVlanType.REPLACE), 0L, DEFAULT_CORRELATION_ID, Destination.WFM));
commands.add(new CommandMessage(new InstallIngressFlow(0L, flowId, COOKIE, srcSwitchId, REVERSE_INGOING_PORT, REVERSE_OUTGOING_PORT, OUTPUT_VLAN_ID, TRANSIT_VLAN_ID, OutputVlanType.REPLACE, 10000L, 0L), METER_ID, DEFAULT_CORRELATION_ID, Destination.WFM));
commands.add(new CommandMessage(new InstallTransitFlow(0L, flowId, COOKIE, srcSwitchId, REVERSE_INGOING_PORT, REVERSE_OUTGOING_PORT, TRANSIT_VLAN_ID), 0L, DEFAULT_CORRELATION_ID, Destination.WFM));
commands.add(new CommandMessage(new InstallTransitFlow(0L, flowId, COOKIE, srcSwitchId, REVERSE_INGOING_PORT, REVERSE_OUTGOING_PORT, TRANSIT_VLAN_ID), 0L, DEFAULT_CORRELATION_ID, Destination.WFM));
commands.add(new CommandMessage(new InstallEgressFlow(0L, flowId, COOKIE, srcSwitchId, REVERSE_INGOING_PORT, REVERSE_OUTGOING_PORT, 2, INPUT_VLAN_ID, OutputVlanType.REPLACE), 0L, DEFAULT_CORRELATION_ID, Destination.WFM));
return commands;
}
use of org.openkilda.messaging.info.event.SwitchInfoData in project open-kilda by telstra.
the class CacheBolt method doWork.
/**
* {@inheritDoc}
*/
@Override
public void doWork(Tuple tuple) {
if (CtrlAction.boltHandlerEntrance(this, tuple))
return;
logger.trace("State before: {}", state);
String json = tuple.getString(0);
String source = tuple.getSourceComponent();
// TODO: Eliminate the inefficiency introduced through the hack
try {
logger.info("Received cache data={}", tuple);
BaseMessage bm = MAPPER.readValue(json, BaseMessage.class);
if (bm instanceof InfoMessage) {
InfoMessage message = (InfoMessage) bm;
InfoData data = message.getData();
if (data instanceof NetworkInfoData) {
logger.debug("Storage content message {}", json);
handleNetworkDump(data, tuple);
isReceivedCacheInfo = true;
} else if (!isReceivedCacheInfo) {
logger.debug("Cache message fail due bolt not initialized: " + "component={}, stream={}, tuple={}", tuple.getSourceComponent(), tuple.getSourceStreamId(), tuple);
} else if (data instanceof SwitchInfoData) {
logger.info("Cache update switch info data: {}", data);
handleSwitchEvent((SwitchInfoData) data, tuple);
} else if (data instanceof IslInfoData) {
logger.info("Cache update isl info data: {}", data);
handleIslEvent((IslInfoData) data, tuple);
} else if (data instanceof PortInfoData) {
logger.info("Cache update port info data: {}", data);
handlePortEvent((PortInfoData) data, tuple);
} else if (data instanceof FlowInfoData) {
logger.info("Cache update flow data: {}", data);
FlowInfoData flowData = (FlowInfoData) data;
handleFlowEvent(flowData, tuple);
} else if (data instanceof NetworkTopologyChange) {
logger.info("Switch flows reroute request");
NetworkTopologyChange topologyChange = (NetworkTopologyChange) data;
handleNetworkTopologyChangeEvent(topologyChange, tuple);
} else {
logger.error("Skip undefined info data type {}", json);
}
} else {
logger.error("Skip undefined message type {}", json);
}
} catch (CacheException exception) {
logger.error("Could not process message {}", tuple, exception);
} catch (IOException exception) {
logger.error("Could not deserialize message {}", tuple, exception);
} finally {
if (isReceivedCacheInfo) {
outputCollector.ack(tuple);
} else {
outputCollector.fail(tuple);
}
}
logger.trace("State after: {}", state);
}
use of org.openkilda.messaging.info.event.SwitchInfoData in project open-kilda by telstra.
the class CacheTopologyTest method flowShouldBeReroutedWhenIslDies.
@Ignore
@Test
public void flowShouldBeReroutedWhenIslDies() throws Exception {
final String destSwitchId = "destSwitch";
final String flowId = "flowId";
sendData(sw);
SwitchInfoData destSwitch = new SwitchInfoData(destSwitchId, SwitchState.ACTIVATED, StringUtils.EMPTY, StringUtils.EMPTY, StringUtils.EMPTY, StringUtils.EMPTY);
sendData(destSwitch);
List<PathNode> path = ImmutableList.of(new PathNode(sw.getSwitchId(), 0, 0), new PathNode(destSwitch.getSwitchId(), 0, 1));
IslInfoData isl = new IslInfoData(0L, path, 0L, IslChangeType.DISCOVERED, 0L);
sendData(isl);
FlowInfoData flowData = buildFlowInfoData(flowId, sw.getSwitchId(), destSwitchId, path);
sendData(flowData);
// mark isl as failed
flowConsumer.clear();
isl.setState(IslChangeType.FAILED);
sendData(isl);
// we are expecting that flow should be rerouted
ConsumerRecord<String, String> record = flowConsumer.pollMessage();
assertNotNull(record);
CommandMessage message = objectMapper.readValue(record.value(), CommandMessage.class);
assertNotNull(message);
FlowRerouteRequest command = (FlowRerouteRequest) message.getData();
assertTrue(command.getPayload().getFlowId().equals(flowId));
}
use of org.openkilda.messaging.info.event.SwitchInfoData in project open-kilda by telstra.
the class CacheTopologyTest method flowShouldBeReroutedWhenSwitchGoesDown.
@Test
public void flowShouldBeReroutedWhenSwitchGoesDown() throws Exception {
sendData(sw);
SwitchInfoData dstSwitch = new SwitchInfoData();
dstSwitch.setState(SwitchState.ACTIVATED);
dstSwitch.setSwitchId("dstSwitch");
List<PathNode> path = ImmutableList.of(new PathNode(sw.getSwitchId(), 0, 0), new PathNode(dstSwitch.getSwitchId(), 0, 1));
// create inactive flow
firstFlow.getLeft().setFlowPath(new PathInfoData(0L, path));
firstFlow.getRight().setFlowPath(new PathInfoData(0L, Collections.emptyList()));
firstFlow.getLeft().setState(FlowState.DOWN);
sendFlowUpdate(firstFlow);
// create active flow
secondFlow.getLeft().setFlowPath(new PathInfoData(0L, path));
secondFlow.getRight().setFlowPath(new PathInfoData(0L, Collections.emptyList()));
secondFlow.getLeft().setState(FlowState.UP);
sendFlowUpdate(secondFlow);
flowConsumer.clear();
sw.setState(SwitchState.REMOVED);
sendData(sw);
// active flow should be rerouted
ConsumerRecord<String, String> record = flowConsumer.pollMessage();
assertNotNull(record);
CommandMessage message = objectMapper.readValue(record.value(), CommandMessage.class);
assertNotNull(message);
FlowRerouteRequest command = (FlowRerouteRequest) message.getData();
assertTrue(command.getPayload().getFlowId().equals(secondFlowId));
}
use of org.openkilda.messaging.info.event.SwitchInfoData in project open-kilda by telstra.
the class IOFSwitchConverter method buildSwitchInfoData.
/**
* Transforms {@link IOFSwitch} to object that is used throughout kilda in all components.
* @param sw switch data.
* @param eventType switch state.
* @return converted switch.
*/
public static SwitchInfoData buildSwitchInfoData(IOFSwitch sw, SwitchState eventType) {
String switchId = sw.getId().toString();
InetSocketAddress address = (InetSocketAddress) sw.getInetAddress();
InetSocketAddress controller = (InetSocketAddress) sw.getConnectionByCategory(LogicalOFMessageCategory.MAIN).getRemoteInetAddress();
return new SwitchInfoData(switchId, eventType, String.format("%s:%d", address.getHostString(), address.getPort()), address.getHostName(), String.format("%s %s %s", sw.getSwitchDescription().getManufacturerDescription(), sw.getOFFactory().getVersion().toString(), sw.getSwitchDescription().getSoftwareDescription()), controller.getHostString());
}
Aggregations