use of org.openkilda.messaging.info.event.PathNode 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.PathNode in project open-kilda by telstra.
the class IslServiceImplTest method discoverBidirectionalIsl.
@Test
public void discoverBidirectionalIsl() throws Exception {
PathNode srcNode = new PathNode(srcSwitchId, 1, 0);
PathNode dstNode = new PathNode(dstSwitchId, 1, 1);
List<PathNode> list = new ArrayList<>();
list.add(srcNode);
list.add(dstNode);
IslInfoData forwardIsl = new IslInfoData(10L, list, 10000000L);
IslInfoData reverseIsl = new IslInfoData(20L, Lists.reverse(list), 10000000L);
islService.discoverLink(forwardIsl);
islService.discoverLink(reverseIsl);
Isl isl = islService.getLink(forwardIsl);
assertNotNull(isl);
assertEquals(10L, isl.getLatency());
isl = islService.getLink(reverseIsl);
assertNotNull(isl);
assertEquals(20L, isl.getLatency());
}
use of org.openkilda.messaging.info.event.PathNode in project open-kilda by telstra.
the class OFEventWfmTest method basicLinkDiscoveryTest.
/**
* BasicLinkDiscoveryTest will exercise the basics of Link Discovery test.
* The key results should show up in a kafka topic, which are dumped to file.
*/
@Test
@Ignore
public void basicLinkDiscoveryTest() throws IOException, ConfigurationException, CmdLineException {
System.out.println("==> Starting BasicLinkDiscoveryTest");
OFEventWFMTopology manager = new OFEventWFMTopology(makeLaunchEnvironment());
TopologyConfig config = manager.getConfig();
String topo_input_topic = config.getKafkaTopoDiscoTopic();
Tuple tuple;
KeyValueState<String, Object> state = new InMemoryKeyValueState<>();
initMocks(topo_input_topic);
List<PathNode> nodes = Arrays.asList(new PathNode("sw1", 1, 0, 10L), new PathNode("sw2", 2, 1, 10L));
InfoData data = new IslInfoData(10L, nodes, 10000L, IslChangeType.DISCOVERED, 9000L);
String isl_discovered = MAPPER.writeValueAsString(data);
OFELinkBolt linkBolt = new OFELinkBolt(config);
linkBolt.prepare(stormConfig(), topologyContext, outputCollector);
linkBolt.initState(state);
ArrayList<DiscoveryFilterEntity> skipNodes = new ArrayList<>(1);
skipNodes.add(new DiscoveryFilterEntity("sw1", "1"));
CommandMessage islFilterSetup = new CommandMessage(new DiscoveryFilterPopulateData(skipNodes), 1, "discovery-test", Destination.WFM_OF_DISCOVERY);
String json = MAPPER.writeValueAsString(islFilterSetup);
tuple = new TupleImpl(topologyContext, Collections.singletonList(json), 4, "message");
linkBolt.execute(tuple);
tuple = new TupleImpl(topologyContext, Arrays.asList("sw1", OFEMessageUtils.SWITCH_UP), 0, topo_input_topic);
linkBolt.execute(tuple);
tuple = new TupleImpl(topologyContext, Arrays.asList("sw2", OFEMessageUtils.SWITCH_UP), 0, topo_input_topic);
linkBolt.execute(tuple);
tuple = new TupleImpl(topologyContext, Arrays.asList("sw1", "1", OFEMessageUtils.PORT_UP), 1, topo_input_topic);
linkBolt.execute(tuple);
tuple = new TupleImpl(topologyContext, Arrays.asList("sw1", "2", OFEMessageUtils.PORT_UP), 1, topo_input_topic);
linkBolt.execute(tuple);
Tuple tickTuple = new TupleImpl(topologyContext, Collections.emptyList(), 2, Constants.SYSTEM_TICK_STREAM_ID);
linkBolt.execute(tickTuple);
tuple = new TupleImpl(topologyContext, Collections.singletonList(isl_discovered), 3, topo_input_topic);
linkBolt.execute(tuple);
linkBolt.execute(tickTuple);
linkBolt.execute(tickTuple);
// 1 isls, 3 seconds interval, 9 seconds test duration == 3 discovery commands
// there is only 1 isl each cycle because of isl filter
// messagesExpected = 3 ;
// TODO: (crimi) validate is 7 due to merged topics
messagesExpected = 7;
messagesReceived = outputCollectorMock.getMessagesCount(config.getKafkaTopoDiscoTopic());
Assert.assertEquals(messagesExpected, messagesReceived);
// "isl discovered" x1
// messagesExpected = 1;
// TODO: (crimi) validate is 7 due to merged topics
messagesExpected = 7;
messagesReceived = outputCollectorMock.getMessagesCount(config.getKafkaTopoDiscoTopic());
Assert.assertEquals(messagesExpected, messagesReceived);
linkBolt.execute(tickTuple);
// no new discovery commands
// messagesExpected = 3;
// TODO .. increased from 3 to 7 due to topic changes .. confirm it
messagesExpected = 7;
messagesReceived = outputCollectorMock.getMessagesCount(config.getKafkaTopoDiscoTopic());
Assert.assertEquals(messagesExpected, messagesReceived);
// +1 discovery fails
// messagesExpected = 2;
// TODO .. there should be more or we aren't looking in right place
messagesExpected = 7;
messagesReceived = outputCollectorMock.getMessagesCount(config.getKafkaTopoDiscoTopic());
Assert.assertEquals(messagesExpected, messagesReceived);
}
use of org.openkilda.messaging.info.event.PathNode 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.PathNode 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));
}
Aggregations