auto add DPNs
diff --git a/apps/fpcagent/BUCK b/apps/fpcagent/BUCK
index 5ab31d7..ac20966 100644
--- a/apps/fpcagent/BUCK
+++ b/apps/fpcagent/BUCK
@@ -13,6 +13,7 @@
'//apps/restconf/api:onos-apps-restconf-api',
'//models/fpcagent:onos-models-fpcagent',
'//models/common:onos-models-common',
+ '//lib:javax.ws.rs-api',
':jetty-servlet-custom',
':jetty-server-custom',
':jetty-io-custom',
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcManager.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcManager.java
index f576930..ac82649 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcManager.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcManager.java
@@ -31,8 +31,8 @@
import org.onosproject.core.IdGenerator;
import org.onosproject.fpcagent.protocols.DpnNgicCommunicator;
import org.onosproject.fpcagent.protocols.DpnP4Communicator;
-import org.onosproject.fpcagent.providers.ZmqDpnDeviceListener;
-import org.onosproject.fpcagent.providers.ZmqDpnProviderService;
+import org.onosproject.fpcagent.providers.NgicDpnDeviceListener;
+import org.onosproject.fpcagent.providers.NgicDpnProviderService;
import org.onosproject.fpcagent.util.ConfigHelper;
import org.onosproject.fpcagent.util.eventstream.JettyServer;
import org.onosproject.fpcagent.util.eventstream.NbEventWorkerManager;
@@ -96,7 +96,7 @@
private CoreService coreService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
- private ZmqDpnProviderService zmqDpnProviderService;
+ private NgicDpnProviderService ngicDpnProviderService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
private RestconfService restconfService;
@@ -108,7 +108,7 @@
private IdGenerator notificationIds;
private FpcConfig fpcConfig;
private boolean started = false;
- private HashSet<ZmqDpnDeviceListener> listeners = Sets.newHashSet();
+ private HashSet<NgicDpnDeviceListener> listeners = Sets.newHashSet();
/* Config */
private ConfigFactory<ApplicationId, FpcConfig> fpcConfigConfigFactory =
@@ -131,7 +131,7 @@
JettyServer.createInstance().open();
ParseStream.createInstance().open();
- NbEventWorkerManager.createInstance(20, restconfService).open();
+ NbEventWorkerManager.createInstance(20).open();
DpnNgicCommunicator.createInstance();
DpnP4Communicator.createInstance(applicationId, flowRuleService);
@@ -168,7 +168,7 @@
helper.dpnSubscriberUri(),
helper.nodeId(),
helper.networkId(),
- zmqDpnProviderService.getListener(),
+ ngicDpnProviderService.getListener(),
notificationIds
);
@@ -184,12 +184,12 @@
}
@Override
- public void addListener(ZmqDpnDeviceListener listener) {
+ public void addListener(NgicDpnDeviceListener listener) {
listeners.add(listener);
}
@Override
- public void removeListener(ZmqDpnDeviceListener listener) {
+ public void removeListener(NgicDpnDeviceListener listener) {
listeners.remove(listener);
}
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcRpcManager.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcRpcManager.java
index f8b80fd..a8afa83 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcRpcManager.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcRpcManager.java
@@ -41,6 +41,7 @@
import org.onosproject.net.device.DeviceListener;
import org.onosproject.net.device.DeviceService;
import org.onosproject.net.device.DeviceStore;
+import org.onosproject.restconf.api.RestconfService;
import org.onosproject.yang.gen.v1.fpc.rev20150105.fpc.DefaultConnectionInfo;
import org.onosproject.yang.gen.v1.fpc.rev20150105.fpc.P4DpnControlProtocol;
import org.onosproject.yang.gen.v1.fpc.rev20150105.fpc.ZmqDpnControlProtocol;
@@ -154,6 +155,9 @@
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
private DeviceService deviceService;
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ private RestconfService restconfService;
+
private InternalDeviceListener listener = new InternalDeviceListener();
// FIXME configurable
@@ -181,6 +185,7 @@
FpcUtil.modelConverter = modelConverter;
FpcUtil.dynamicConfigService = dynamicConfigService;
FpcUtil.deviceStore = deviceStore;
+ FpcUtil.restconfService = restconfService;
getResourceId();
// Create the Default Tenant and added to the Tenants structure.
@@ -1064,7 +1069,7 @@
@Override
public void event(DeviceEvent event) {
- if (event.subject().manufacturer().equals("fpc")) {
+ if (event.subject().id().toString().contains("fpc")) {
TENANT_INFO.forEach(
(tenantId, clients) -> {
String nodeNetwork = event.subject().annotations().value("node/network");
@@ -1085,16 +1090,17 @@
availability.dpnName(dpn.dpnName());
switch (event.type()) {
- case DEVICE_UPDATED:
case DEVICE_ADDED: {
availability.dpnStatus(DpnStatusEnum.AVAILABLE);
break;
}
- case DEVICE_AVAILABILITY_CHANGED:
case DEVICE_REMOVED: {
availability.dpnStatus(DpnStatusEnum.UNAVAILABLE);
break;
}
+ case DEVICE_UPDATED:
+ case DEVICE_AVAILABILITY_CHANGED:
+ break;
default:
throw new RuntimeException("Unknown Device case.");
}
@@ -1108,6 +1114,24 @@
}
});
}
+ if (event.subject().id().toString().contains("bmv2") ||
+ event.subject().id().toString().contains("tofino")) {
+ switch (event.type()) {
+ case DEVICE_ADDED: {
+ addDpn(event.subject().id().toString().split(":")[2]);
+ break;
+ }
+ case DEVICE_REMOVED: {
+ deleteDpn(event.subject().id().toString().split(":")[2]);
+ break;
+ }
+ case DEVICE_UPDATED:
+ case DEVICE_AVAILABILITY_CHANGED:
+ break;
+ default:
+ throw new RuntimeException("Unknown Device case.");
+ }
+ }
// else if (event.subject().manufacturer().equals("cp")) {
// String clientId = event.subject().annotations().value("client-id");
// if (CLIENT_INFO.keySet().contains(ClientIdentifier.fromString(clientId))) {
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcService.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcService.java
index 7bb120d..d7b7c9d 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcService.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcService.java
@@ -16,16 +16,16 @@
package org.onosproject.fpcagent;
-import org.onosproject.fpcagent.providers.ZmqDpnDeviceListener;
+import org.onosproject.fpcagent.providers.NgicDpnDeviceListener;
import org.onosproject.fpcagent.util.ConfigHelper;
import java.util.Optional;
public interface FpcService {
- void addListener(ZmqDpnDeviceListener listener);
+ void addListener(NgicDpnDeviceListener listener);
- void removeListener(ZmqDpnDeviceListener listener);
+ void removeListener(NgicDpnDeviceListener listener);
Optional<ConfigHelper> getConfig();
}
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/ZmqDpnDeviceListener.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/NgicDpnDeviceListener.java
similarity index 94%
rename from apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/ZmqDpnDeviceListener.java
rename to apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/NgicDpnDeviceListener.java
index c13bf06..37607fc 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/ZmqDpnDeviceListener.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/NgicDpnDeviceListener.java
@@ -16,7 +16,7 @@
package org.onosproject.fpcagent.providers;
-public interface ZmqDpnDeviceListener {
+public interface NgicDpnDeviceListener {
void deviceAdded(String id, byte topic);
void deviceRemoved(String id);
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/ZmqDpnProvider.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/NgicDpnProvider.java
similarity index 85%
rename from apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/ZmqDpnProvider.java
rename to apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/NgicDpnProvider.java
index c7f2706..13175ab 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/ZmqDpnProvider.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/NgicDpnProvider.java
@@ -38,6 +38,8 @@
import org.onosproject.net.provider.ProviderId;
import org.slf4j.Logger;
+import static org.onosproject.fpcagent.util.FpcUtil.addDpn;
+import static org.onosproject.fpcagent.util.FpcUtil.deleteDpn;
import static org.onosproject.net.DeviceId.deviceId;
import static org.slf4j.LoggerFactory.getLogger;
@@ -46,17 +48,19 @@
*/
@Component(immediate = true)
@Service
-public class ZmqDpnProvider extends AbstractProvider implements ZmqDpnProviderService {
+public class NgicDpnProvider
+ extends AbstractProvider
+ implements NgicDpnProviderService {
- private static final Logger log = getLogger(ZmqDpnProvider.class);
- private final InternalDeviceListenerZmq listener = new InternalDeviceListenerZmq();
+ private static final Logger log = getLogger(NgicDpnProvider.class);
+ private final InternalDeviceListenerNgic listener = new InternalDeviceListenerNgic();
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected DeviceProviderRegistry providerRegistry;
private DeviceProviderService providerService;
- public ZmqDpnProvider() {
+ public NgicDpnProvider() {
super(new ProviderId("fpc", "org.onosproject.providers.dpn"));
}
@@ -73,7 +77,7 @@
log.info("FPC Device Provider Stopped");
}
- public InternalDeviceListenerZmq getListener() {
+ public InternalDeviceListenerNgic getListener() {
return listener;
}
@@ -97,7 +101,7 @@
}
- public class InternalDeviceListenerZmq implements ZmqDpnDeviceListener {
+ public class InternalDeviceListenerNgic implements NgicDpnDeviceListener {
@Override
public void deviceAdded(String id, byte topic) {
@@ -117,11 +121,13 @@
description = new DefaultDeviceDescription(descriptionBase, annotations);
providerService.deviceConnected(deviceId, description);
+ addDpn(id.split("/")[0].split("node")[1]);
}
@Override
public void deviceRemoved(String id) {
providerService.deviceDisconnected(deviceId("fpc:" + id));
+ deleteDpn(id.split("/")[0].split("node")[1]);
}
}
}
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/ZmqDpnProviderService.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/NgicDpnProviderService.java
similarity index 87%
rename from apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/ZmqDpnProviderService.java
rename to apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/NgicDpnProviderService.java
index cc78c6c..b621afa 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/ZmqDpnProviderService.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/NgicDpnProviderService.java
@@ -18,8 +18,8 @@
import org.onosproject.net.device.DeviceProvider;
-public interface ZmqDpnProviderService extends DeviceProvider {
+public interface NgicDpnProviderService extends DeviceProvider {
- ZmqDpnDeviceListener getListener();
+ NgicDpnDeviceListener getListener();
}
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/FpcUtil.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/FpcUtil.java
index 3180aa7..bccc8e8 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/FpcUtil.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/FpcUtil.java
@@ -26,6 +26,7 @@
import org.onosproject.fpcagent.util.eventstream.ConfigureService;
import org.onosproject.net.Device;
import org.onosproject.net.device.DeviceStore;
+import org.onosproject.restconf.api.RestconfService;
import org.onosproject.restconf.utils.RestconfUtils;
import org.onosproject.yang.gen.v1.fpc.rev20150105.fpc.registerclient.DefaultRegisterClientInput;
import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.ClientIdentifier;
@@ -56,6 +57,7 @@
import org.slf4j.LoggerFactory;
import java.math.BigInteger;
+import java.net.URI;
import java.util.AbstractMap;
import java.util.HashSet;
import java.util.List;
@@ -77,6 +79,7 @@
public static DynamicConfigService dynamicConfigService;
public static ModelConverter modelConverter;
public static DeviceStore deviceStore;
+ public static RestconfService restconfService;
// Resource IDs
public static ResourceId configureDpn;
public static ResourceId configure;
@@ -375,4 +378,47 @@
log.error(ExceptionUtils.getFullStackTrace(e));
}
}
+
+ public static void addDpn(String dpnId) {
+ String dpnAdd = "" +
+ " {\n" +
+ " \"dpns\": [\n" +
+ " {\n" +
+ " \"dpn-id\": \"{$dpnId}\",\n" +
+ " \"dpn-name\": \"site{$dpnId}-anchor{$dpnId}\",\n" +
+ " \"dpn-groups\": [\n" +
+ " \"foo\"\n" +
+ " ],\n" +
+ " \"node-id\": \"node{$dpnId}\",\n" +
+ " \"network-id\": \"network{$dpnId}\",\n" +
+ " \"control-protocol\": \"zmq-dpn-control-protocol\",\n" +
+ " \"abstract\": false\n" +
+ " }\n" +
+ " ]\n" +
+ " }";
+
+ try {
+ ObjectMapper mapper = new ObjectMapper();
+ ObjectNode node = (ObjectNode) mapper.readTree(dpnAdd.replace("{$dpnId}", dpnId));
+
+ restconfService.runPostOperationOnDataResource(
+ new URI("/onos/restconf/data/ietf-dmm-fpcagent:tenants/tenant=default/fpc-topology"),
+ node
+ );
+ } catch (Exception e) {
+ log.error(ExceptionUtils.getFullStackTrace(e));
+ }
+
+ }
+
+ public static void deleteDpn(String dpnId) {
+ String dpnDelete = "/onos/restconf/data/ietf-dmm-fpcagent:tenants/tenant=default/fpc-topology/dpns={$dpnId}";
+
+ try {
+ restconfService.runDeleteOperationOnDataResource(new URI(dpnDelete.replace("{$dpnId}", dpnId)));
+ } catch (Exception e) {
+ log.error(ExceptionUtils.getFullStackTrace(e));
+ }
+
+ }
}
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventstream/NbEventWorkerManager.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventstream/NbEventWorkerManager.java
index 2fbc782..d1762f4 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventstream/NbEventWorkerManager.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventstream/NbEventWorkerManager.java
@@ -22,7 +22,6 @@
import org.json.JSONException;
import org.json.JSONObject;
import org.onosproject.restconf.api.RestconfRpcOutput;
-import org.onosproject.restconf.api.RestconfService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -33,10 +32,11 @@
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
+import static org.onosproject.fpcagent.util.FpcUtil.restconfService;
+
/**
* Implements a Worker to process event-data pairs sent by the FPC Client.
*/
@@ -49,21 +49,19 @@
private final BlockingQueue<Entry<String, Entry<String, String>>> blockingQueue;
private final int poolSize;
private boolean run;
- private final RestconfService restconfService;
static {
CLIENT_ID_TO_URI = new ConcurrentHashMap<>();
}
- protected NbEventWorkerManager(int poolSize, RestconfService restconfService) {
+ protected NbEventWorkerManager(int poolSize) {
this.poolSize = poolSize;
- this.restconfService = restconfService;
this.blockingQueue = new LinkedBlockingQueue<>();
}
- public static NbEventWorkerManager createInstance(int poolSize, RestconfService restconfService) {
+ public static NbEventWorkerManager createInstance(int poolSize) {
if (_instance == null) {
- _instance = new NbEventWorkerManager(poolSize, restconfService);
+ _instance = new NbEventWorkerManager(poolSize);
}
return _instance;
}
@@ -81,8 +79,7 @@
}
public void open() {
- ExecutorService executorService = Executors.newFixedThreadPool(this.poolSize);
- executorService.submit(() -> {
+ Executors.newFixedThreadPool(this.poolSize).submit(() -> {
this.run = true;
Entry<String, Entry<String, String>> contents = null;
while (run) {
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/workers/ZmqSbSubscriberManager.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/workers/ZmqSbSubscriberManager.java
index 71ab3ed..4e3d67e 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/workers/ZmqSbSubscriberManager.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/workers/ZmqSbSubscriberManager.java
@@ -18,7 +18,7 @@
import org.apache.commons.lang.exception.ExceptionUtils;
import org.onosproject.core.IdGenerator;
-import org.onosproject.fpcagent.providers.ZmqDpnDeviceListener;
+import org.onosproject.fpcagent.providers.NgicDpnDeviceListener;
import org.onosproject.fpcagent.util.CacheManager;
import org.onosproject.fpcagent.util.FpcUtil;
import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.ClientIdentifier;
@@ -70,22 +70,22 @@
private Future<?> broadcastTopicWorker;
private Future<?> generalWorker;
- private ZmqDpnDeviceListener zmqDpnDeviceListener;
+ private NgicDpnDeviceListener ngicDpnDeviceListener;
protected ZmqSbSubscriberManager(String address, String nodeId, String networkId,
- ZmqDpnDeviceListener zmqDpnDeviceListener, IdGenerator notificationIds) {
+ NgicDpnDeviceListener ngicDpnDeviceListener, IdGenerator notificationIds) {
this.address = address;
this.run = true;
this.nodeId = nodeId;
this.networkId = networkId;
this.conflictingTopic = false;
this.controllerSourceId = (long) ThreadLocalRandom.current().nextInt(0, 65535);
- this.zmqDpnDeviceListener = zmqDpnDeviceListener;
+ this.ngicDpnDeviceListener = ngicDpnDeviceListener;
this.notificationIds = notificationIds;
}
public static ZmqSbSubscriberManager createInstance(String address, String nodeId, String networkId,
- ZmqDpnDeviceListener providerService,
+ NgicDpnDeviceListener providerService,
IdGenerator notificationIds) {
if (_instance == null) {
_instance = new ZmqSbSubscriberManager(address, nodeId, networkId, providerService, notificationIds);
@@ -234,10 +234,10 @@
fromIntToLong(buf, 4), deviceId);
if (status.equals(DpnStatusIndication.HELLO)) {
log.info("Hello {} on topic {}", deviceId, buf[2]);
- zmqDpnDeviceListener.deviceAdded(deviceId, buf[2]);
+ ngicDpnDeviceListener.deviceAdded(deviceId, buf[2]);
} else if (status.equals(DpnStatusIndication.GOODBYE)) {
log.info("Bye {}", deviceId);
- zmqDpnDeviceListener.deviceRemoved(deviceId);
+ ngicDpnDeviceListener.deviceRemoved(deviceId);
}
return new AbstractMap.SimpleEntry<>(status, deviceId);
} else if (type.equals(S11MsgType.DPN_RESPONSE)) {