use of org.onosproject.net.behaviour.inbandtelemetry.IntProgrammable in project onos by opennetworkinglab.
the class SimpleIntManager method configDevice.
protected boolean configDevice(DeviceId deviceId) {
// Returns true if config was successful, false if not and a clean up is
// needed.
final Device device = deviceService.getDevice(deviceId);
if (device == null || !device.is(IntProgrammable.class)) {
return true;
}
if (isNotIntConfigured()) {
log.warn("Missing INT config, aborting programming of INT device {}", deviceId);
return true;
}
final boolean isEdge = !hostService.getConnectedHosts(deviceId).isEmpty();
final IntDeviceRole intDeviceRole = isEdge ? IntDeviceRole.SOURCE_SINK : IntDeviceRole.TRANSIT;
log.info("Started programming of INT device {} with role {}...", deviceId, intDeviceRole);
final IntProgrammable intProg = device.as(IntProgrammable.class);
if (!isIntStarted()) {
// Leave device with no INT configuration.
return true;
}
if (!intProg.init()) {
log.warn("Unable to init INT pipeline on {}", deviceId);
return false;
}
boolean supportSource = intProg.supportsFunctionality(IntProgrammable.IntFunctionality.SOURCE);
boolean supportSink = intProg.supportsFunctionality(IntProgrammable.IntFunctionality.SINK);
boolean supportPostcard = intProg.supportsFunctionality(IntProgrammable.IntFunctionality.POSTCARD);
if (intDeviceRole != IntDeviceRole.SOURCE_SINK && !supportPostcard) {
// Stop here, no more configuration needed for transit devices unless it support postcard.
return true;
}
if (supportSink || supportPostcard) {
if (!intProg.setupIntConfig(intConfig.get())) {
log.warn("Unable to apply INT report config on {}", deviceId);
return false;
}
}
// Port configuration.
final Set<PortNumber> hostPorts = deviceService.getPorts(deviceId).stream().map(port -> new ConnectPoint(deviceId, port.number())).filter(cp -> !hostService.getConnectedHosts(cp).isEmpty()).map(ConnectPoint::port).collect(Collectors.toSet());
for (PortNumber port : hostPorts) {
if (supportSource) {
log.info("Setting port {}/{} as INT source port...", deviceId, port);
if (!intProg.setSourcePort(port)) {
log.warn("Unable to set INT source port {} on {}", port, deviceId);
return false;
}
}
if (supportSink) {
log.info("Setting port {}/{} as INT sink port...", deviceId, port);
if (!intProg.setSinkPort(port)) {
log.warn("Unable to set INT sink port {} on {}", port, deviceId);
return false;
}
}
}
if (!supportSource && !supportPostcard) {
// it supports postcard mode.
return true;
}
// Apply intents.
// This is a trivial implementation where we simply get the
// corresponding INT objective from an intent and we apply to all
// device which support reporting.
int appliedCount = 0;
for (Versioned<IntIntent> versionedIntent : intentMap.values()) {
IntIntent intent = versionedIntent.value();
IntObjective intObjective = getIntObjective(intent);
if (intent.telemetryMode() == IntIntent.TelemetryMode.INBAND_TELEMETRY && supportSource) {
intProg.addIntObjective(intObjective);
appliedCount++;
} else if (intent.telemetryMode() == IntIntent.TelemetryMode.POSTCARD && supportPostcard) {
intProg.addIntObjective(intObjective);
appliedCount++;
} else {
log.warn("Device {} does not support intent {}.", deviceId, intent);
}
}
log.info("Completed programming of {}, applied {} INT objectives of {} total", deviceId, appliedCount, intentMap.size());
return true;
}
use of org.onosproject.net.behaviour.inbandtelemetry.IntProgrammable in project onos by opennetworkinglab.
the class TestCodecService method testConfigTransitDevice.
@Test
public void testConfigTransitDevice() {
reset(deviceService, hostService);
Device device = getMockDevice(true, DEVICE_ID);
IntProgrammable intProg = getMockIntProgrammable(false, true, false, false);
setUpDeviceTest(device, intProg, false, false);
replay(deviceService, hostService, device, intProg);
installTestIntents();
assertTrue(manager.configDevice(DEVICE_ID));
verify(intProg);
}
use of org.onosproject.net.behaviour.inbandtelemetry.IntProgrammable in project onos by opennetworkinglab.
the class TestCodecService method testConfigSourceDevice.
@Test
public void testConfigSourceDevice() {
reset(deviceService, hostService);
Device device = getMockDevice(true, DEVICE_ID);
IntProgrammable intProg = getMockIntProgrammable(true, false, false, false);
setUpDeviceTest(device, intProg, true, false);
IntObjective intObj = IntObjective.builder().withSelector(FLOW_SELECTOR2).build();
expect(intProg.addIntObjective(eq(intObj))).andReturn(true).once();
expect(intProg.setSourcePort(PortNumber.portNumber(1))).andReturn(true).once();
expect(intProg.setSourcePort(PortNumber.portNumber(2))).andReturn(true).once();
replay(deviceService, hostService, device, intProg);
installTestIntents();
assertTrue(manager.configDevice(DEVICE_ID));
verify(intProg);
}
use of org.onosproject.net.behaviour.inbandtelemetry.IntProgrammable in project onos by opennetworkinglab.
the class TestCodecService method setUpDeviceTest.
private void setUpDeviceTest(Device device, IntProgrammable intProg, boolean hostConnected, boolean setupIntConfig) {
expect(device.as(IntProgrammable.class)).andReturn(intProg).anyTimes();
expect(deviceService.getDevice(eq(DEVICE_ID))).andReturn(device).anyTimes();
expect(deviceService.getDevices()).andReturn(ImmutableList.of(device)).anyTimes();
if (setupIntConfig) {
IntDeviceConfig expectedConfig = createIntDeviceConfig();
expect(intProg.setupIntConfig(eq(expectedConfig))).andReturn(true).atLeastOnce();
}
expect(deviceService.getPorts(DEVICE_ID)).andReturn(DEVICE_PORTS).anyTimes();
if (hostConnected) {
HOSTS.forEach((cp, host) -> {
expect(hostService.getConnectedHosts(eq(cp))).andReturn(ImmutableSet.of(host)).anyTimes();
});
expect(hostService.getConnectedHosts(eq(DEVICE_ID))).andReturn(Sets.newHashSet(HOSTS.values()));
} else {
expect(hostService.getConnectedHosts(eq(DEVICE_ID))).andReturn(ImmutableSet.of()).anyTimes();
}
}
use of org.onosproject.net.behaviour.inbandtelemetry.IntProgrammable in project onos by opennetworkinglab.
the class TestCodecService method getMockIntProgrammable.
private IntProgrammable getMockIntProgrammable(boolean supportSource, boolean supportTransit, boolean supportSink, boolean supportPostcard) {
IntProgrammable intProg = createNiceMock(IntProgrammable.class);
if (supportSource) {
expect(intProg.supportsFunctionality(SOURCE)).andReturn(true).anyTimes();
}
if (supportTransit) {
expect(intProg.supportsFunctionality(TRANSIT)).andReturn(true).anyTimes();
}
if (supportSink) {
expect(intProg.supportsFunctionality(SINK)).andReturn(true).anyTimes();
}
if (supportPostcard) {
expect(intProg.supportsFunctionality(POSTCARD)).andReturn(true).anyTimes();
}
expect(intProg.init()).andReturn(true).anyTimes();
return intProg;
}
Aggregations