[ONOS-4166] Store device capapbilities using network config

Change-Id: Ib085c516bec0ecf9845e009eca090aad9302fbb0
diff --git a/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/PcepTopologyProvider.java b/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/PcepTopologyProvider.java
index 38239ed..eaebc57 100644
--- a/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/PcepTopologyProvider.java
+++ b/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/PcepTopologyProvider.java
@@ -29,6 +29,10 @@
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Link.Type;
+import org.onosproject.net.config.ConfigFactory;
+import org.onosproject.net.config.NetworkConfigRegistry;
+import org.onosproject.net.config.NetworkConfigService;
+import org.onosproject.net.config.basics.SubjectFactories;
 import org.onosproject.net.MastershipRole;
 import org.onosproject.net.OchPort;
 import org.onosproject.net.OduCltPort;
@@ -54,6 +58,7 @@
 import org.onosproject.net.link.LinkService;
 import org.onosproject.net.provider.AbstractProvider;
 import org.onosproject.net.provider.ProviderId;
+import org.onosproject.pcep.api.DeviceCapability;
 import org.onosproject.pcep.api.PcepController;
 import org.onosproject.pcep.api.PcepDpid;
 import org.onosproject.pcep.api.PcepLink;
@@ -122,29 +127,26 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected PcepClientController pcepClientController;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected NetworkConfigRegistry netConfigRegistry;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected NetworkConfigService netConfigService;
+
     private DeviceProviderService deviceProviderService;
     private LinkProviderService linkProviderService;
 
     private HashMap<Long, List<PortDescription>> portMap = new HashMap<>();
     private InternalLinkProvider listener = new InternalLinkProvider();
 
-    /*
-     * For the client supporting SR capability.
-     */
-    public static final String SR_CAPABILITY = "srCapability";
-
-    /*
-     * For the client supporting PCECC capability.
-     */
-    public static final String PCECC_CAPABILITY = "pceccCapability";
-
-    /*
-     * For the client supporting label stack capability.
-     */
-    public static final String LABEL_STACK_CAPABILITY = "labelStackCapability";
-
-    public static final String LSRID = "lsrId";
-    private static final String UNKNOWN = "unknown";
+    private final ConfigFactory<DeviceId, DeviceCapability> configFactory =
+            new ConfigFactory<DeviceId, DeviceCapability>(SubjectFactories.DEVICE_SUBJECT_FACTORY,
+                    DeviceCapability.class, "deviceCapability", true) {
+                @Override
+                public DeviceCapability createConfig() {
+                    return new DeviceCapability();
+                }
+            };
 
     @Activate
     public void activate() {
@@ -153,6 +155,7 @@
         controller.addListener(listener);
         controller.addLinkListener(listener);
         pcepClientController.addNodeListener(listener);
+        netConfigRegistry.registerConfigFactory(configFactory);
     }
 
     @Deactivate
@@ -162,6 +165,7 @@
         controller.removeListener(listener);
         controller.removeLinkListener(listener);
         pcepClientController.removeNodeListener(listener);
+        netConfigRegistry.unregisterConfigFactory(configFactory);
     }
 
     private List<PortDescription> buildPortDescriptions(PcepDpid dpid,
@@ -334,49 +338,27 @@
         }
 
         @Override
-        public void addNode(PcepClient pc) {
-            if (deviceProviderService == null) {
+        public void addDevicePcepConfig(PcepClient pc) {
+            if (netConfigRegistry == null) {
+                log.error("Cannot add PCEP device capability as network config service is not available.");
                 return;
             }
-
-            //Right now device URI for PCEP devices is their LSRID
-            DeviceId deviceId = deviceId(uri(new PcepDpid(pc.getPccId().id().getIp4Address().toInt())));
-            ChassisId cId = new ChassisId();
-
-            Device.Type deviceType = Device.Type.ROUTER;
-
-            DefaultAnnotations.Builder annotationBuilder = DefaultAnnotations.builder();
-            //PCC capabilities (SR, PCECC and PCECC-SR)
-            annotationBuilder.set(SR_CAPABILITY, String.valueOf(pc.capability().srCapability()));
-            annotationBuilder.set(PCECC_CAPABILITY, String.valueOf(pc.capability().pceccCapability()));
-            annotationBuilder.set(LABEL_STACK_CAPABILITY, String.valueOf(pc.capability().labelStackCapability()));
-            //PccId is the lsrId contained in openMsg, if not present it will be the socket address
-            annotationBuilder.set(LSRID, String.valueOf(pc.getPccId().id()));
-
-            DeviceDescription description = new DefaultDeviceDescription(
-                    deviceId.uri(),
-                    deviceType,
-                    UNKNOWN,
-                    UNKNOWN,
-                    UNKNOWN,
-                    UNKNOWN,
-                    cId,
-                    annotationBuilder.build());
-
-            deviceProviderService.deviceConnected(deviceId, description);
+            DeviceId pccDeviceId = DeviceId.deviceId(String.valueOf(pc.getPccId().ipAddress()));
+            DeviceCapability deviceCap = netConfigService.addConfig(pccDeviceId, DeviceCapability.class);
+            deviceCap.setLabelStackCap(pc.capability().labelStackCapability())
+                .setLocalLabelCap(pc.capability().pceccCapability())
+                .setSrCap(pc.capability().srCapability())
+                .apply();
         }
 
         @Override
-        public void deleteNode(PccId pccId) {
-            if (deviceProviderService == null || deviceService == null) {
+        public void deleteDevicePcepConfig(PccId pccId) {
+            if (netConfigRegistry == null) {
+                log.error("Cannot remove PCEP device capability as network config service is not available.");
                 return;
             }
-            //TODO: In device manager, in deviceDisconnected() method, get the device but null check is not validated
-            if (deviceService.getDevice(DeviceId.deviceId(uri(new PcepDpid(pccId.id()
-                    .getIp4Address().toInt())))) == null) {
-                return;
-            }
-            deviceProviderService.deviceDisconnected(deviceId(uri(new PcepDpid(pccId.id().getIp4Address().toInt()))));
+            DeviceId pccDeviceId = DeviceId.deviceId(String.valueOf(pccId.ipAddress()));
+            netConfigService.removeConfig(pccDeviceId, DeviceCapability.class);
         }
     }