[ONOS-7051] Support for P4Runtime meters
Change-Id: Id71374af65aeb84b71636b4ec230dc6001a77a8b
diff --git a/core/net/src/main/java/org/onosproject/net/meter/impl/MeterManager.java b/core/net/src/main/java/org/onosproject/net/meter/impl/MeterManager.java
index 5d7965b..04e3e56 100644
--- a/core/net/src/main/java/org/onosproject/net/meter/impl/MeterManager.java
+++ b/core/net/src/main/java/org/onosproject/net/meter/impl/MeterManager.java
@@ -30,6 +30,7 @@
import org.onosproject.net.device.DeviceService;
import org.onosproject.net.driver.DriverService;
import org.onosproject.net.meter.DefaultMeter;
+import org.onosproject.net.meter.MeterCellId.MeterCellType;
import org.onosproject.net.meter.Meter;
import org.onosproject.net.meter.MeterEvent;
import org.onosproject.net.meter.MeterFailReason;
@@ -132,10 +133,10 @@
}
});
- };
+ };
executorService = newFixedThreadPool(numThreads,
- groupedThreads(GROUP_THREAD_NAME, WORKER_PATTERN, log));
+ groupedThreads(GROUP_THREAD_NAME, WORKER_PATTERN, log));
modified(context);
log.info("Started");
}
@@ -146,7 +147,7 @@
readComponentConfiguration(context);
}
defaultProvider.init(deviceService, createProviderService(defaultProvider),
- mastershipService, fallbackMeterPollFrequency);
+ mastershipService, fallbackMeterPollFrequency);
}
@Deactivate
@@ -289,7 +290,7 @@
// The meter is missing in the device. Reinstall!
log.debug("Adding meter missing in device {} {}", deviceId, m);
provider().performMeterOperation(deviceId,
- new MeterOperation(m, MeterOperation.Type.ADD));
+ new MeterOperation(m, MeterOperation.Type.ADD));
}
});
@@ -297,12 +298,19 @@
meterEntriesMap.entrySet().stream()
.filter(md -> !allMeters.stream().anyMatch(m -> m.id().equals(md.getKey())))
.forEach(mio -> {
- // The meter is missin in onos. Uninstall!
- log.debug("Remove meter in device not in onos {} {}", deviceId, mio.getKey());
Meter meter = mio.getValue();
- provider().performMeterOperation(deviceId,
- new MeterOperation(meter, MeterOperation.Type.REMOVE));
- });
+ // FIXME: Removing a meter is meaningfull for OpenFlow, but not for P4Runtime.
+ // In P4Runtime meter cells cannot be removed. For the
+ // moment, we make the distinction between OpenFlow and
+ // P4Runtime by looking at the MeterCellType (always
+ // INDEX for OpenFlow).
+ if (meter.meterCellId().type() == MeterCellType.INDEX) {
+ // The meter is missing in onos. Uninstall!
+ log.debug("Remove meter in device not in onos {} {}", deviceId, mio.getKey());
+ provider().performMeterOperation(deviceId,
+ new MeterOperation(meter, MeterOperation.Type.REMOVE));
+ }
+ });
meterEntries.stream()
.filter(m -> allMeters.stream()
@@ -339,11 +347,11 @@
switch (event.type()) {
case METER_ADD_REQ:
executorService.execute(new MeterInstaller(deviceId, event.subject(),
- MeterOperation.Type.ADD));
+ MeterOperation.Type.ADD));
break;
case METER_REM_REQ:
executorService.execute(new MeterInstaller(deviceId, event.subject(),
- MeterOperation.Type.REMOVE));
+ MeterOperation.Type.REMOVE));
break;
case METER_ADDED:
log.info("Meter added {}", event.subject());