use of org.projectfloodlight.openflow.types.DatapathId in project open-kilda by telstra.
the class RecordHandler method doInstallSwitchRules.
private void doInstallSwitchRules(final CommandMessage message, String replyToTopic, Destination replyDestination) {
SwitchRulesInstallRequest request = (SwitchRulesInstallRequest) message.getData();
logger.debug("Installing rules on '{}' switch: action={}", request.getSwitchId(), request.getInstallRulesAction());
DatapathId dpid = DatapathId.of(request.getSwitchId());
ISwitchManager switchManager = context.getSwitchManager();
InstallRulesAction installAction = request.getInstallRulesAction();
List<Long> installedRules = new ArrayList<>();
try {
if (installAction == InstallRulesAction.INSTALL_DROP) {
switchManager.installDropFlow(dpid);
installedRules.add(ISwitchManager.DROP_RULE_COOKIE);
} else if (installAction == InstallRulesAction.INSTALL_BROADCAST) {
switchManager.installVerificationRule(dpid, true);
installedRules.add(ISwitchManager.VERIFICATION_BROADCAST_RULE_COOKIE);
} else if (installAction == InstallRulesAction.INSTALL_UNICAST) {
// TODO: this isn't always added (ie if OF1.2). Is there a better response?
switchManager.installVerificationRule(dpid, false);
installedRules.add(ISwitchManager.VERIFICATION_UNICAST_RULE_COOKIE);
} else {
switchManager.installDefaultRules(dpid);
installedRules.addAll(asList(ISwitchManager.DROP_RULE_COOKIE, ISwitchManager.VERIFICATION_BROADCAST_RULE_COOKIE, ISwitchManager.VERIFICATION_UNICAST_RULE_COOKIE));
}
SwitchRulesResponse response = new SwitchRulesResponse(installedRules);
InfoMessage infoMessage = new InfoMessage(response, System.currentTimeMillis(), message.getCorrelationId(), replyDestination);
context.getKafkaProducer().postMessage(replyToTopic, infoMessage);
} catch (SwitchOperationException e) {
ErrorData errorData = new ErrorData(ErrorType.CREATION_FAILURE, e.getMessage(), request.getSwitchId());
ErrorMessage error = new ErrorMessage(errorData, System.currentTimeMillis(), message.getCorrelationId(), replyDestination);
context.getKafkaProducer().postMessage(replyToTopic, error);
}
}
use of org.projectfloodlight.openflow.types.DatapathId in project open-kilda by telstra.
the class RecordHandler method doDeleteSwitchRules.
private void doDeleteSwitchRules(final CommandMessage message, String replyToTopic, Destination replyDestination) {
SwitchRulesDeleteRequest request = (SwitchRulesDeleteRequest) message.getData();
logger.debug("Deleting rules from '{}' switch: action={}", request.getSwitchId(), request.getDeleteRulesAction());
DatapathId dpid = DatapathId.of(request.getSwitchId());
ISwitchManager switchManager = context.getSwitchManager();
DeleteRulesAction deleteAction = request.getDeleteRulesAction();
List<Long> removedRules = new ArrayList<>();
try {
/*
* This first part .. we are either deleting one rule, or all non-default rules (the else)
*/
List<Long> toRemove = new ArrayList<>();
if (deleteAction == DeleteRulesAction.ONE) {
toRemove.add(request.getOneCookie());
} else if (deleteAction == DeleteRulesAction.REMOVE_DROP) {
toRemove.add(ISwitchManager.DROP_RULE_COOKIE);
} else if (deleteAction == DeleteRulesAction.REMOVE_BROADCAST) {
toRemove.add(ISwitchManager.VERIFICATION_BROADCAST_RULE_COOKIE);
} else if (deleteAction == DeleteRulesAction.REMOVE_UNICAST) {
toRemove.add(ISwitchManager.VERIFICATION_UNICAST_RULE_COOKIE);
} else if (deleteAction == DeleteRulesAction.REMOVE_DEFAULTS || deleteAction == DeleteRulesAction.REMOVE_ADD) {
toRemove.add(ISwitchManager.DROP_RULE_COOKIE);
toRemove.add(ISwitchManager.VERIFICATION_BROADCAST_RULE_COOKIE);
toRemove.add(ISwitchManager.VERIFICATION_UNICAST_RULE_COOKIE);
}
// toRemove is > 0 only if we are trying to delete base rule(s).
if (toRemove.size() > 0) {
removedRules.addAll(switchManager.deleteRuleWithCookie(dpid, toRemove));
if (deleteAction == DeleteRulesAction.REMOVE_ADD) {
switchManager.installDefaultRules(dpid);
}
} else {
removedRules.addAll(switchManager.deleteAllNonDefaultRules(dpid));
/*
* The Second part - only for a subset of actions.
*/
if (deleteAction == DeleteRulesAction.DROP) {
List<Long> removedDefaultRules = switchManager.deleteDefaultRules(dpid);
// Return removedDefaultRules as a part of the result list.
removedRules.addAll(removedDefaultRules);
} else if (deleteAction == DeleteRulesAction.DROP_ADD) {
switchManager.deleteDefaultRules(dpid);
switchManager.installDefaultRules(dpid);
} else if (deleteAction == DeleteRulesAction.OVERWRITE) {
switchManager.installDefaultRules(dpid);
}
}
SwitchRulesResponse response = new SwitchRulesResponse(removedRules);
InfoMessage infoMessage = new InfoMessage(response, System.currentTimeMillis(), message.getCorrelationId(), replyDestination);
context.getKafkaProducer().postMessage(replyToTopic, infoMessage);
} catch (SwitchOperationException e) {
ErrorData errorData = new ErrorData(ErrorType.DELETION_FAILURE, e.getMessage(), request.getSwitchId());
ErrorMessage error = new ErrorMessage(errorData, System.currentTimeMillis(), message.getCorrelationId(), replyDestination);
context.getKafkaProducer().postMessage(replyToTopic, error);
}
}
use of org.projectfloodlight.openflow.types.DatapathId 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);
}
use of org.projectfloodlight.openflow.types.DatapathId 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
}
use of org.projectfloodlight.openflow.types.DatapathId in project open-kilda by telstra.
the class ISwitchImplTest method testSetDpid.
@Test
public void testSetDpid() throws Exception {
DatapathId dpid = sw.getDpid();
String newDpid = "01:02:03:04:05:06";
sw.setDpid(newDpid);
assertEquals("00:00:" + newDpid, sw.getDpidAsString());
assertEquals(DatapathId.of(newDpid), sw.getDpid());
sw.setDpid(dpid);
assertEquals(dpid, sw.getDpid());
}
Aggregations