ONOS-6950 Annotate device through network configuration

Change-Id: I39d5ca39667bb1478a090408ff3c1af33220a0b2
diff --git a/cli/src/main/java/org/onosproject/cli/net/AnnotateDeviceCommand.java b/cli/src/main/java/org/onosproject/cli/net/AnnotateDeviceCommand.java
index 76252b8..0680d59 100644
--- a/cli/src/main/java/org/onosproject/cli/net/AnnotateDeviceCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/AnnotateDeviceCommand.java
@@ -17,19 +17,11 @@
 
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.commands.Option;
 import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.net.DefaultAnnotations;
-import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
-import org.onosproject.net.MastershipRole;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.device.DefaultDeviceDescription;
-import org.onosproject.net.device.DeviceDescription;
-import org.onosproject.net.device.DeviceProvider;
-import org.onosproject.net.device.DeviceProviderRegistry;
-import org.onosproject.net.device.DeviceProviderService;
-import org.onosproject.net.device.DeviceService;
-import org.onosproject.net.provider.AbstractProvider;
+import org.onosproject.net.config.NetworkConfigService;
+import org.onosproject.net.config.basics.DeviceAnnotationConfig;
 import org.onosproject.net.provider.ProviderId;
 
 /**
@@ -54,57 +46,30 @@
             required = false, multiValued = false)
     String value = null;
 
+    @Option(name = "--remove-config",
+            description = "Remove annotation config")
+    private boolean removeCfg = false;
+
     @Override
     protected void execute() {
-        DeviceService service = get(DeviceService.class);
-        Device device = service.getDevice(DeviceId.deviceId(uri));
+        NetworkConfigService netcfgService = get(NetworkConfigService.class);
+        DeviceId deviceId = DeviceId.deviceId(uri);
 
-        DeviceProviderRegistry registry = get(DeviceProviderRegistry.class);
-        DeviceProvider provider = new AnnotationProvider();
-        try {
-            DeviceProviderService providerService = registry.register(provider);
-            providerService.deviceConnected(device.id(), description(device, key, value));
-        } finally {
-            registry.unregister(provider);
+        if (key == null) {
+            print("[ERROR] Annotation key not specified.");
+            return;
         }
-    }
-
-    private DeviceDescription description(Device device, String key, String value) {
-        DefaultAnnotations.Builder builder = DefaultAnnotations.builder();
-        if (value != null) {
-            builder.set(key, value);
+        DeviceAnnotationConfig cfg = netcfgService.getConfig(deviceId, DeviceAnnotationConfig.class);
+        if (cfg == null) {
+            cfg = new DeviceAnnotationConfig(deviceId);
+        }
+        if (removeCfg) {
+            // remove config about entry
+            cfg.annotation(key);
         } else {
-            builder.remove(key);
+            // add remove request config
+            cfg.annotation(key, value);
         }
-        return new DefaultDeviceDescription(device.id().uri(), device.type(),
-                                            device.manufacturer(), device.hwVersion(),
-                                            device.swVersion(), device.serialNumber(),
-                                            device.chassisId(), false, builder.build());
-    }
-
-    // Token provider entity
-    private static final class AnnotationProvider
-            extends AbstractProvider implements DeviceProvider {
-        private AnnotationProvider() {
-            super(PID);
-        }
-
-        @Override
-        public void triggerProbe(DeviceId deviceId) {
-        }
-
-        @Override
-        public void roleChanged(DeviceId deviceId, MastershipRole newRole) {
-        }
-
-        @Override
-        public boolean isReachable(DeviceId deviceId) {
-            return false;
-        }
-
-        @Override
-        public void changePortState(DeviceId deviceId, PortNumber portNumber,
-                                    boolean enable) {
-        }
+        netcfgService.applyConfig(deviceId, DeviceAnnotationConfig.class, cfg.node());
     }
 }