Search in sources :

Example 1 with NetworkCommandData

use of org.openkilda.messaging.command.discovery.NetworkCommandData in project open-kilda by telstra.

the class CacheBolt method getNetworkRequest.

private Values getNetworkRequest() {
    Values values = null;
    try {
        CommandMessage command = new CommandMessage(new NetworkCommandData(), System.currentTimeMillis(), Utils.SYSTEM_CORRELATION_ID, Destination.TOPOLOGY_ENGINE);
        values = new Values(Utils.MAPPER.writeValueAsString(command));
    } catch (IOException exception) {
        logger.error("Could not serialize network cache request", exception);
    }
    return values;
}
Also used : Values(org.apache.storm.tuple.Values) IOException(java.io.IOException) NetworkCommandData(org.openkilda.messaging.command.discovery.NetworkCommandData) CommandMessage(org.openkilda.messaging.command.CommandMessage)

Example 2 with NetworkCommandData

use of org.openkilda.messaging.command.discovery.NetworkCommandData in project open-kilda by telstra.

the class OFELinkBolt method sendNetworkRequest.

/**
 * Send network dump request to FL
 */
private void sendNetworkRequest(Tuple tuple) {
    try {
        logger.debug("Send network dump request");
        CommandMessage command = new CommandMessage(new NetworkCommandData(), System.currentTimeMillis(), Utils.SYSTEM_CORRELATION_ID, Destination.CONTROLLER);
        String json = Utils.MAPPER.writeValueAsString(command);
        collector.emit(islDiscoveryTopic, tuple, new Values(PAYLOAD, json));
    } catch (JsonProcessingException exception) {
        logger.error("Could not serialize network cache request", exception);
    }
}
Also used : Values(org.apache.storm.tuple.Values) NetworkCommandData(org.openkilda.messaging.command.discovery.NetworkCommandData) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) CommandMessage(org.openkilda.messaging.command.CommandMessage)

Example 3 with NetworkCommandData

use of org.openkilda.messaging.command.discovery.NetworkCommandData in project open-kilda by telstra.

the class OFELinkBoltTest method cacheRequestCheck.

/**
 * Part of warm mechanism checks. That test verifies doTick sends init message to FL and
 * second tick does nothing.
 */
@Test
public void cacheRequestCheck() throws IOException {
    // do Tick and verify that bolt send message with cache request to right topic
    Tuple tuple = new TupleImpl(context, new Values(""), TASK_ID_BOLT, STREAM_ID_INPUT);
    bolt.doTick(tuple);
    bolt.doTick(tuple);
    ArgumentCaptor<String> captorStreamId = ArgumentCaptor.forClass(String.class);
    ArgumentCaptor<List<Tuple>> captorAnchor = ArgumentCaptor.forClass((Class) List.class);
    ArgumentCaptor<Values> captorTuple = ArgumentCaptor.forClass(Values.class);
    Mockito.verify(outputDelegate, only()).emit(captorStreamId.capture(), captorAnchor.capture(), captorTuple.capture());
    assertEquals(config.getKafkaSpeakerTopic(), captorStreamId.getValue());
    Values values = captorTuple.getValue();
    String payload = (String) values.get(1);
    CommandMessage commandMessage = objectMapper.readValue(payload, CommandMessage.class);
    assertTrue(commandMessage.getData() instanceof NetworkCommandData);
}
Also used : Values(org.apache.storm.tuple.Values) List(java.util.List) NetworkCommandData(org.openkilda.messaging.command.discovery.NetworkCommandData) TupleImpl(org.apache.storm.tuple.TupleImpl) Tuple(org.apache.storm.tuple.Tuple) CommandMessage(org.openkilda.messaging.command.CommandMessage) AbstractStormTest(org.openkilda.wfm.AbstractStormTest) Test(org.junit.Test)

Example 4 with NetworkCommandData

use of org.openkilda.messaging.command.discovery.NetworkCommandData in project open-kilda by telstra.

the class RecordHandler method doNetworkDump.

/**
 * Create network dump for OFELinkBolt
 *
 * @param message NetworkCommandData
 */
private void doNetworkDump(final CommandMessage message) {
    logger.info("Create network dump");
    NetworkCommandData command = (NetworkCommandData) message.getData();
    Map<DatapathId, IOFSwitch> allSwitchMap = context.getSwitchManager().getAllSwitchMap();
    Set<SwitchInfoData> switchesInfoData = allSwitchMap.values().stream().map(this::buildSwitchInfoData).collect(Collectors.toSet());
    Set<PortInfoData> portsInfoData = allSwitchMap.values().stream().flatMap(sw -> sw.getEnabledPorts().stream().map(port -> new PortInfoData(sw.getId().toString(), port.getPortNo().getPortNumber(), null, PortChangeType.UP)).collect(Collectors.toSet()).stream()).collect(Collectors.toSet());
    NetworkInfoData dump = new NetworkInfoData(command.getRequester(), switchesInfoData, portsInfoData, Collections.emptySet(), Collections.emptySet());
    InfoMessage infoMessage = new InfoMessage(dump, System.currentTimeMillis(), message.getCorrelationId());
    context.getKafkaProducer().postMessage(OUTPUT_DISCO_TOPIC, infoMessage);
}
Also used : InfoMessage(org.openkilda.messaging.info.InfoMessage) OFFlowStatsConverter(org.openkilda.floodlight.converter.OFFlowStatsConverter) LoggerFactory(org.slf4j.LoggerFactory) InstallTransitFlow(org.openkilda.messaging.command.flow.InstallTransitFlow) SwitchRulesInstallRequest(org.openkilda.messaging.command.switches.SwitchRulesInstallRequest) SwitchRulesDeleteRequest(org.openkilda.messaging.command.switches.SwitchRulesDeleteRequest) IOFSwitch(net.floodlightcontroller.core.IOFSwitch) SwitchOperationException(org.openkilda.floodlight.switchmanager.SwitchOperationException) CommandMessage(org.openkilda.messaging.command.CommandMessage) PortChangeType(org.openkilda.messaging.info.event.PortChangeType) Arrays.asList(java.util.Arrays.asList) DeleteRulesAction(org.openkilda.messaging.command.switches.DeleteRulesAction) ConnectModeRequest(org.openkilda.messaging.command.switches.ConnectModeRequest) SwitchFlowEntries(org.openkilda.messaging.info.rule.SwitchFlowEntries) OutputVlanType(org.openkilda.messaging.payload.flow.OutputVlanType) RemoveFlow(org.openkilda.messaging.command.flow.RemoveFlow) DiscoverIslCommandData(org.openkilda.messaging.command.discovery.DiscoverIslCommandData) SwitchInfoData(org.openkilda.messaging.info.event.SwitchInfoData) InstallMissedFlowsRequest(org.openkilda.messaging.command.switches.InstallMissedFlowsRequest) IOFSwitchConverter(org.openkilda.floodlight.converter.IOFSwitchConverter) ISwitchManager(org.openkilda.floodlight.switchmanager.ISwitchManager) Collectors(java.util.stream.Collectors) InstallEgressFlow(org.openkilda.messaging.command.flow.InstallEgressFlow) OFPort(org.projectfloodlight.openflow.types.OFPort) DumpRulesRequest(org.openkilda.messaging.command.switches.DumpRulesRequest) Topic(org.openkilda.messaging.Topic) ConsumerRecord(org.apache.kafka.clients.consumer.ConsumerRecord) MeterPool(org.openkilda.floodlight.switchmanager.MeterPool) InstallIngressFlow(org.openkilda.messaging.command.flow.InstallIngressFlow) CommandData(org.openkilda.messaging.command.CommandData) java.util(java.util) SwitchState(org.openkilda.messaging.info.event.SwitchState) NetworkInfoData(org.openkilda.messaging.info.discovery.NetworkInfoData) BaseInstallFlow(org.openkilda.messaging.command.flow.BaseInstallFlow) OFFlowStatsReply(org.projectfloodlight.openflow.protocol.OFFlowStatsReply) MAPPER(org.openkilda.messaging.Utils.MAPPER) ConnectModeResponse(org.openkilda.messaging.info.switches.ConnectModeResponse) Logger(org.slf4j.Logger) DiscoverPathCommandData(org.openkilda.messaging.command.discovery.DiscoverPathCommandData) NetworkCommandData(org.openkilda.messaging.command.discovery.NetworkCommandData) ErrorType(org.openkilda.messaging.error.ErrorType) FlowEntry(org.openkilda.messaging.info.rule.FlowEntry) CommandWithReplyToMessage(org.openkilda.messaging.command.CommandWithReplyToMessage) PortInfoData(org.openkilda.messaging.info.event.PortInfoData) InstallOneSwitchFlow(org.openkilda.messaging.command.flow.InstallOneSwitchFlow) InstallRulesAction(org.openkilda.messaging.command.switches.InstallRulesAction) SwitchRulesResponse(org.openkilda.messaging.info.switches.SwitchRulesResponse) Destination(org.openkilda.messaging.Destination) DatapathId(org.projectfloodlight.openflow.types.DatapathId) ErrorData(org.openkilda.messaging.error.ErrorData) ErrorMessage(org.openkilda.messaging.error.ErrorMessage) IOFSwitch(net.floodlightcontroller.core.IOFSwitch) NetworkInfoData(org.openkilda.messaging.info.discovery.NetworkInfoData) InfoMessage(org.openkilda.messaging.info.InfoMessage) DatapathId(org.projectfloodlight.openflow.types.DatapathId) PortInfoData(org.openkilda.messaging.info.event.PortInfoData) NetworkCommandData(org.openkilda.messaging.command.discovery.NetworkCommandData) SwitchInfoData(org.openkilda.messaging.info.event.SwitchInfoData)

Example 5 with NetworkCommandData

use of org.openkilda.messaging.command.discovery.NetworkCommandData in project open-kilda by telstra.

the class RecordHandlerTest method networkDumpTest.

/**
 * Simple TDD test that was used to develop warming mechanism for OFELinkBolt. We create
 * command and put it to KafkaMessageCollector then mock ISwitchManager::getAllSwitchMap and
 * verify that output message comes to producer.
 */
@Test
public void networkDumpTest() {
    // Cook mock data for ISwitchManager::getAllSwitchMap
    // Two switches with two ports on each
    // switches for ISwitchManager::getAllSwitchMap
    OFSwitch iofSwitch1 = mock(OFSwitch.class);
    OFSwitch iofSwitch2 = mock(OFSwitch.class);
    Map<DatapathId, IOFSwitch> switches = ImmutableMap.of(DatapathId.of(1), iofSwitch1, DatapathId.of(2), iofSwitch2);
    for (DatapathId swId : switches.keySet()) {
        IOFSwitch sw = switches.get(swId);
        expect(sw.isActive()).andReturn(true).anyTimes();
        expect(sw.getId()).andReturn(swId).anyTimes();
    }
    expect(switchManager.getAllSwitchMap()).andReturn(switches);
    // ports for OFSwitch::getEnabledPorts
    OFPortDesc ofPortDesc1 = mock(OFPortDesc.class);
    OFPortDesc ofPortDesc2 = mock(OFPortDesc.class);
    OFPortDesc ofPortDesc3 = mock(OFPortDesc.class);
    OFPortDesc ofPortDesc4 = mock(OFPortDesc.class);
    expect(ofPortDesc1.getPortNo()).andReturn(OFPort.ofInt(1));
    expect(ofPortDesc2.getPortNo()).andReturn(OFPort.ofInt(2));
    expect(ofPortDesc3.getPortNo()).andReturn(OFPort.ofInt(3));
    expect(ofPortDesc4.getPortNo()).andReturn(OFPort.ofInt(4));
    expect(iofSwitch1.getEnabledPorts()).andReturn(ImmutableList.of(ofPortDesc1, ofPortDesc2));
    expect(iofSwitch2.getEnabledPorts()).andReturn(ImmutableList.of(ofPortDesc3, ofPortDesc4));
    // Logic in SwitchEventCollector.buildSwitchInfoData is too complicated and requires a lot
    // of mocking code so I replaced it with mock on kafkaMessageCollector.buildSwitchInfoData
    handler.overrideSwitchInfoData(DatapathId.of(1), new SwitchInfoData("sw1", SwitchState.ADDED, "127.0.0.1", "localhost", "test switch", "kilda"));
    handler.overrideSwitchInfoData(DatapathId.of(2), new SwitchInfoData("sw2", SwitchState.ADDED, "127.0.0.1", "localhost", "test switch", "kilda"));
    // setup hook for verify that we create new message for producer
    producer.postMessage(eq(OUTPUT_DISCO_TOPIC), anyObject(InfoMessage.class));
    replayAll();
    // Create CommandMessage with NetworkCommandData for trigger network dump
    CommandMessage command = new CommandMessage(new NetworkCommandData(), System.currentTimeMillis(), Utils.SYSTEM_CORRELATION_ID, Destination.CONTROLLER);
    // KafkaMessageCollector contains a complicated run logic with couple nested private
    // classes, threading and that is very painful for writing clear looking test code so I
    // created the simple method in KafkaMessageCollector for simplifying test logic.
    handler.handleMessage(command);
    verify(producer);
// TODO: verify content of InfoMessage in producer.postMessage
}
Also used : IOFSwitch(net.floodlightcontroller.core.IOFSwitch) OFPortDesc(org.projectfloodlight.openflow.protocol.OFPortDesc) InfoMessage(org.openkilda.messaging.info.InfoMessage) IOFSwitch(net.floodlightcontroller.core.IOFSwitch) OFSwitch(net.floodlightcontroller.core.internal.OFSwitch) DatapathId(org.projectfloodlight.openflow.types.DatapathId) SwitchInfoData(org.openkilda.messaging.info.event.SwitchInfoData) NetworkCommandData(org.openkilda.messaging.command.discovery.NetworkCommandData) CommandMessage(org.openkilda.messaging.command.CommandMessage) Test(org.junit.Test)

Aggregations

CommandMessage (org.openkilda.messaging.command.CommandMessage)5 NetworkCommandData (org.openkilda.messaging.command.discovery.NetworkCommandData)5 Values (org.apache.storm.tuple.Values)3 IOFSwitch (net.floodlightcontroller.core.IOFSwitch)2 Test (org.junit.Test)2 InfoMessage (org.openkilda.messaging.info.InfoMessage)2 SwitchInfoData (org.openkilda.messaging.info.event.SwitchInfoData)2 DatapathId (org.projectfloodlight.openflow.types.DatapathId)2 JsonProcessingException (com.fasterxml.jackson.core.JsonProcessingException)1 IOException (java.io.IOException)1 java.util (java.util)1 Arrays.asList (java.util.Arrays.asList)1 List (java.util.List)1 Collectors (java.util.stream.Collectors)1 OFSwitch (net.floodlightcontroller.core.internal.OFSwitch)1 ConsumerRecord (org.apache.kafka.clients.consumer.ConsumerRecord)1 Tuple (org.apache.storm.tuple.Tuple)1 TupleImpl (org.apache.storm.tuple.TupleImpl)1 IOFSwitchConverter (org.openkilda.floodlight.converter.IOFSwitchConverter)1 OFFlowStatsConverter (org.openkilda.floodlight.converter.OFFlowStatsConverter)1