Search in sources :

Example 6 with PiCounterCell

use of org.onosproject.net.pi.runtime.PiCounterCell in project up4 by omec-project.

the class Up4NorthComponentTest method readPartialWildcardCounterTest.

private void readPartialWildcardCounterTest(PiCounterId counterId) {
    // A counter read request with a counterID but no cellId
    // Encode a dummy cell just so we can get the p4runtime counter integer ID from the encoder
    PiCounterCell dummyCell = new PiCounterCell(PiCounterCellId.ofIndirect(counterId, 1), 0, 0);
    P4RuntimeOuterClass.Entity dummyEntity;
    try {
        dummyEntity = Codecs.CODECS.entity().encode(dummyCell, null, pipeconf);
    } catch (CodecException e) {
        fail("Unable to encode counter cell to p4runtime entity.");
        return;
    }
    int intCounterId = dummyEntity.getCounterEntry().getCounterId();
    // Now build the actual request
    MockStreamObserver<P4RuntimeOuterClass.ReadResponse> responseObserver = new MockStreamObserver<>();
    P4RuntimeOuterClass.ReadRequest request = P4RuntimeOuterClass.ReadRequest.newBuilder().addEntities(P4RuntimeOuterClass.Entity.newBuilder().setCounterEntry(P4RuntimeOuterClass.CounterEntry.newBuilder().setCounterId(intCounterId).build()).build()).build();
    up4NorthService.read(request, responseObserver);
    var response = responseObserver.lastResponse();
    assertThat(response.getEntitiesList().size(), equalTo(TestImplConstants.PHYSICAL_COUNTER_SIZE));
    for (P4RuntimeOuterClass.Entity entity : response.getEntitiesList()) {
        PiCounterCell responseCell = entityToCounterCell(entity);
        assertThat(responseCell.cellId().counterId(), equalTo(counterId));
    }
}
Also used : P4RuntimeOuterClass(p4.v1.P4RuntimeOuterClass) PiCounterCell(org.onosproject.net.pi.runtime.PiCounterCell) CodecException(org.onosproject.p4runtime.ctl.codec.CodecException)

Example 7 with PiCounterCell

use of org.onosproject.net.pi.runtime.PiCounterCell 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

PiCounterCell (org.onosproject.net.pi.runtime.PiCounterCell)7 CodecException (org.onosproject.p4runtime.ctl.codec.CodecException)4 PiCounterId (org.onosproject.net.pi.model.PiCounterId)3 PiCounterCellHandle (org.onosproject.net.pi.runtime.PiCounterCellHandle)3 PiEntity (org.onosproject.net.pi.runtime.PiEntity)3 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 INDIRECT (org.onosproject.net.pi.model.PiCounterType.INDIRECT)2 PiPipeconf (org.onosproject.net.pi.model.PiPipeconf)2