Search in sources :

Example 1 with P4RuntimeController

use of org.onosproject.p4runtime.api.P4RuntimeController in project onos by opennetworkinglab.

the class PortStatisticsDiscoveryImpl method discoverPortStatistics.

@Override
public Collection<PortStatistics> discoverPortStatistics() {
    DeviceService deviceService = this.handler().get(DeviceService.class);
    DeviceId deviceId = this.data().deviceId();
    PiPipeconfService piPipeconfService = handler().get(PiPipeconfService.class);
    if (!piPipeconfService.ofDevice(deviceId).isPresent() || !piPipeconfService.getPipeconf(piPipeconfService.ofDevice(deviceId).get()).isPresent()) {
        log.warn("Unable to get the pipeconf of {}, aborting operation", deviceId);
        return Collections.emptyList();
    }
    PiPipeconf pipeconf = piPipeconfService.getPipeconf(piPipeconfService.ofDevice(deviceId).get()).get();
    P4RuntimeController controller = handler().get(P4RuntimeController.class);
    P4RuntimeClient client = controller.get(deviceId);
    if (client == null) {
        log.warn("Unable to find client for {}, aborting operation", deviceId);
        return Collections.emptyList();
    }
    Map<Long, DefaultPortStatistics.Builder> portStatBuilders = Maps.newHashMap();
    deviceService.getPorts(deviceId).forEach(p -> portStatBuilders.put(p.number().toLong(), DefaultPortStatistics.builder().setPort(p.number()).setDeviceId(deviceId).setDurationSec(getDuration(p.number()))));
    Set<PiCounterCellId> counterCellIds = Sets.newHashSet();
    portStatBuilders.keySet().forEach(p -> {
        // Counter cell/index = port number.
        counterCellIds.add(PiCounterCellId.ofIndirect(ingressCounterId(), p));
        counterCellIds.add(PiCounterCellId.ofIndirect(egressCounterId(), p));
    });
    Set<PiCounterCellHandle> counterCellHandles = counterCellIds.stream().map(id -> PiCounterCellHandle.of(deviceId, id)).collect(Collectors.toSet());
    // Query the device.
    Collection<PiCounterCell> counterEntryResponse = client.read(DEFAULT_P4_DEVICE_ID, pipeconf).handles(counterCellHandles).submitSync().all(PiCounterCell.class);
    counterEntryResponse.forEach(counterCell -> {
        if (counterCell.cellId().counterType() != INDIRECT) {
            log.warn("Invalid counter data type {}, skipping", counterCell.cellId().counterType());
            return;
        }
        PiCounterCellId indCellId = counterCell.cellId();
        if (!portStatBuilders.containsKey(indCellId.index())) {
            log.warn("Unrecognized counter index {}, skipping", counterCell);
            return;
        }
        DefaultPortStatistics.Builder statsBuilder = portStatBuilders.get(indCellId.index());
        if (counterCell.cellId().counterId().equals(ingressCounterId())) {
            statsBuilder.setPacketsReceived(counterCell.data().packets());
            statsBuilder.setBytesReceived(counterCell.data().bytes());
        } else if (counterCell.cellId().counterId().equals(egressCounterId())) {
            statsBuilder.setPacketsSent(counterCell.data().packets());
            statsBuilder.setBytesSent(counterCell.data().bytes());
        } else {
            log.warn("Unrecognized counter ID {}, skipping", counterCell);
        }
    });
    return portStatBuilders.values().stream().map(DefaultPortStatistics.Builder::build).collect(Collectors.toList());
}
Also used : INGRESS_PORT_COUNTERS_INGRESS_INGRESS_PORT_COUNTER(org.onosproject.pipelines.basic.BasicConstants.INGRESS_PORT_COUNTERS_INGRESS_INGRESS_PORT_COUNTER) PiPipeconfService(org.onosproject.net.pi.service.PiPipeconfService) PortStatistics(org.onosproject.net.device.PortStatistics) PiCounterId(org.onosproject.net.pi.model.PiCounterId) PiPipeconf(org.onosproject.net.pi.model.PiPipeconf) PortNumber(org.onosproject.net.PortNumber) DeviceService(org.onosproject.net.device.DeviceService) LoggerFactory(org.slf4j.LoggerFactory) AbstractHandlerBehaviour(org.onosproject.net.driver.AbstractHandlerBehaviour) PiCounterCellHandle(org.onosproject.net.pi.runtime.PiCounterCellHandle) Pair(org.apache.commons.lang3.tuple.Pair) P4RuntimeController(org.onosproject.p4runtime.api.P4RuntimeController) Map(java.util.Map) DefaultPortStatistics(org.onosproject.net.device.DefaultPortStatistics) PortStatisticsDiscovery(org.onosproject.net.device.PortStatisticsDiscovery) PiCounterCellId(org.onosproject.net.pi.runtime.PiCounterCellId) Logger(org.slf4j.Logger) INDIRECT(org.onosproject.net.pi.model.PiCounterType.INDIRECT) P4RuntimeClient(org.onosproject.p4runtime.api.P4RuntimeClient) Collection(java.util.Collection) Set(java.util.Set) PiCounterCell(org.onosproject.net.pi.runtime.PiCounterCell) EGRESS_PORT_COUNTERS_EGRESS_EGRESS_PORT_COUNTER(org.onosproject.pipelines.basic.BasicConstants.EGRESS_PORT_COUNTERS_EGRESS_EGRESS_PORT_COUNTER) Maps(com.google.common.collect.Maps) Collectors(java.util.stream.Collectors) Sets(com.google.common.collect.Sets) DeviceId(org.onosproject.net.DeviceId) Collections(java.util.Collections) DefaultPortStatistics(org.onosproject.net.device.DefaultPortStatistics) PiCounterCellId(org.onosproject.net.pi.runtime.PiCounterCellId) PiCounterCellHandle(org.onosproject.net.pi.runtime.PiCounterCellHandle) DeviceId(org.onosproject.net.DeviceId) PiPipeconf(org.onosproject.net.pi.model.PiPipeconf) DeviceService(org.onosproject.net.device.DeviceService) PiPipeconfService(org.onosproject.net.pi.service.PiPipeconfService) P4RuntimeClient(org.onosproject.p4runtime.api.P4RuntimeClient) P4RuntimeController(org.onosproject.p4runtime.api.P4RuntimeController) PiCounterCell(org.onosproject.net.pi.runtime.PiCounterCell)

Example 2 with P4RuntimeController

use of org.onosproject.p4runtime.api.P4RuntimeController in project onos by opennetworkinglab.

the class PortStatisticsDiscoveryImpl method discoverPortStatistics.

@Override
public Collection<PortStatistics> discoverPortStatistics() {
    DeviceService deviceService = this.handler().get(DeviceService.class);
    DeviceId deviceId = this.data().deviceId();
    // Get a client for this device.
    P4RuntimeController controller = handler().get(P4RuntimeController.class);
    P4RuntimeClient client = controller.get(deviceId);
    if (client == null) {
        log.warn("Unable to find client for {}, aborting operation", deviceId);
        return Collections.emptyList();
    }
    // Get the pipeconf of this device.
    PiPipeconfService piPipeconfService = handler().get(PiPipeconfService.class);
    if (!piPipeconfService.ofDevice(deviceId).isPresent() || !piPipeconfService.getPipeconf(piPipeconfService.ofDevice(deviceId).get()).isPresent()) {
        log.warn("Unable to get the pipeconf of {}, aborting operation", deviceId);
        return Collections.emptyList();
    }
    PiPipeconf pipeconf = piPipeconfService.getPipeconf(piPipeconfService.ofDevice(deviceId).get()).get();
    // Prepare PortStatistics objects to return, one per port of this device.
    Map<Long, DefaultPortStatistics.Builder> portStatBuilders = Maps.newHashMap();
    deviceService.getPorts(deviceId).forEach(p -> portStatBuilders.put(p.number().toLong(), DefaultPortStatistics.builder().setPort(p.number()).setDeviceId(deviceId)));
    // Generate the counter cell IDs.
    Set<PiCounterCellId> counterCellIds = Sets.newHashSet();
    portStatBuilders.keySet().forEach(p -> {
        // Counter cell/index = port number.
        counterCellIds.add(PiCounterCellId.ofIndirect(INGRESS_COUNTER_ID, p));
        counterCellIds.add(PiCounterCellId.ofIndirect(EGRESS_COUNTER_ID, p));
    });
    Set<PiCounterCellHandle> counterCellHandles = counterCellIds.stream().map(id -> PiCounterCellHandle.of(deviceId, id)).collect(Collectors.toSet());
    // Query the device.
    Collection<PiCounterCell> counterEntryResponse = client.read(DEFAULT_P4_DEVICE_ID, pipeconf).handles(counterCellHandles).submitSync().all(PiCounterCell.class);
    // Process response.
    counterEntryResponse.forEach(counterCell -> {
        if (counterCell.cellId().counterType() != INDIRECT) {
            log.warn("Invalid counter data type {}, skipping", counterCell.cellId().counterType());
            return;
        }
        if (!portStatBuilders.containsKey(counterCell.cellId().index())) {
            log.warn("Unrecognized counter index {}, skipping", counterCell);
            return;
        }
        DefaultPortStatistics.Builder statsBuilder = portStatBuilders.get(counterCell.cellId().index());
        if (counterCell.cellId().counterId().equals(INGRESS_COUNTER_ID)) {
            statsBuilder.setPacketsReceived(counterCell.data().packets());
            statsBuilder.setBytesReceived(counterCell.data().bytes());
        } else if (counterCell.cellId().counterId().equals(EGRESS_COUNTER_ID)) {
            statsBuilder.setPacketsSent(counterCell.data().packets());
            statsBuilder.setBytesSent(counterCell.data().bytes());
        } else {
            log.warn("Unrecognized counter ID {}, skipping", counterCell);
        }
    });
    return portStatBuilders.values().stream().map(DefaultPortStatistics.Builder::build).collect(Collectors.toList());
}
Also used : PiCounterCellId(org.onosproject.net.pi.runtime.PiCounterCellId) PiPipeconfService(org.onosproject.net.pi.service.PiPipeconfService) Logger(org.slf4j.Logger) INDIRECT(org.onosproject.net.pi.model.PiCounterType.INDIRECT) P4RuntimeClient(org.onosproject.p4runtime.api.P4RuntimeClient) PortStatistics(org.onosproject.net.device.PortStatistics) PiCounterId(org.onosproject.net.pi.model.PiCounterId) PiPipeconf(org.onosproject.net.pi.model.PiPipeconf) Collection(java.util.Collection) DeviceService(org.onosproject.net.device.DeviceService) LoggerFactory(org.slf4j.LoggerFactory) Set(java.util.Set) PiCounterCell(org.onosproject.net.pi.runtime.PiCounterCell) Maps(com.google.common.collect.Maps) Collectors(java.util.stream.Collectors) Sets(com.google.common.collect.Sets) AbstractHandlerBehaviour(org.onosproject.net.driver.AbstractHandlerBehaviour) PiCounterCellHandle(org.onosproject.net.pi.runtime.PiCounterCellHandle) P4RuntimeController(org.onosproject.p4runtime.api.P4RuntimeController) Map(java.util.Map) DefaultPortStatistics(org.onosproject.net.device.DefaultPortStatistics) DeviceId(org.onosproject.net.DeviceId) Collections(java.util.Collections) PortStatisticsDiscovery(org.onosproject.net.device.PortStatisticsDiscovery) DefaultPortStatistics(org.onosproject.net.device.DefaultPortStatistics) PiCounterCellId(org.onosproject.net.pi.runtime.PiCounterCellId) PiCounterCellHandle(org.onosproject.net.pi.runtime.PiCounterCellHandle) DeviceId(org.onosproject.net.DeviceId) PiPipeconf(org.onosproject.net.pi.model.PiPipeconf) DeviceService(org.onosproject.net.device.DeviceService) PiPipeconfService(org.onosproject.net.pi.service.PiPipeconfService) P4RuntimeClient(org.onosproject.p4runtime.api.P4RuntimeClient) P4RuntimeController(org.onosproject.p4runtime.api.P4RuntimeController) PiCounterCell(org.onosproject.net.pi.runtime.PiCounterCell)

Aggregations

Maps (com.google.common.collect.Maps)2 Sets (com.google.common.collect.Sets)2 Collection (java.util.Collection)2 Collections (java.util.Collections)2 Map (java.util.Map)2 Set (java.util.Set)2 Collectors (java.util.stream.Collectors)2 DeviceId (org.onosproject.net.DeviceId)2 DefaultPortStatistics (org.onosproject.net.device.DefaultPortStatistics)2 DeviceService (org.onosproject.net.device.DeviceService)2 PortStatistics (org.onosproject.net.device.PortStatistics)2 PortStatisticsDiscovery (org.onosproject.net.device.PortStatisticsDiscovery)2 AbstractHandlerBehaviour (org.onosproject.net.driver.AbstractHandlerBehaviour)2 PiCounterId (org.onosproject.net.pi.model.PiCounterId)2 INDIRECT (org.onosproject.net.pi.model.PiCounterType.INDIRECT)2 PiPipeconf (org.onosproject.net.pi.model.PiPipeconf)2 PiCounterCell (org.onosproject.net.pi.runtime.PiCounterCell)2 PiCounterCellHandle (org.onosproject.net.pi.runtime.PiCounterCellHandle)2 PiCounterCellId (org.onosproject.net.pi.runtime.PiCounterCellId)2 PiPipeconfService (org.onosproject.net.pi.service.PiPipeconfService)2