Refactor: move telemetry config from componentCfg to configs.xml

1. Support to export the metrics to multiple targets
2. Add a set of properties to kafka config (key, topic, etc.)
3. Add distributedStore to manage telemetry configs
4. Add CLI to query stored telemetry configs
5. Add a set of telemetry loaders to import xml definitions
6. Add unit tests for telemetry cfg, xml cfg loader and dist store
7. Add missing javadoc for a set of implementation classes

Change-Id: I39480c9a6ac07357184d2e1094b9c9f4d36fd8b1
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/GrpcTelemetryConfig.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/GrpcTelemetryConfig.java
index d7c8f62..7b4589d 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/GrpcTelemetryConfig.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/GrpcTelemetryConfig.java
@@ -20,7 +20,7 @@
 /**
  * Configuration API of gRPC for publishing openstack telemetry.
  */
-public interface GrpcTelemetryConfig extends TelemetryConfig {
+public interface GrpcTelemetryConfig extends TelemetryConfigProperties {
 
     /**
      * Obtains gRPC server IP address.
@@ -60,7 +60,7 @@
     /**
      * Builder class of GrpcTelemetryConfig.
      */
-    interface Builder extends TelemetryConfig.Builder {
+    interface Builder extends TelemetryConfigProperties.Builder {
 
         /**
          * Sets gRPC server IP address.
@@ -109,4 +109,4 @@
          */
         GrpcTelemetryConfig build();
     }
-}
+}
\ No newline at end of file
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/InfluxDbTelemetryConfig.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/InfluxDbTelemetryConfig.java
index 32c150f..38017d3 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/InfluxDbTelemetryConfig.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/InfluxDbTelemetryConfig.java
@@ -20,7 +20,7 @@
 /**
  * Configuration API of InfluxDB for publishing openstack telemetry.
  */
-public interface InfluxDbTelemetryConfig extends TelemetryConfig {
+public interface InfluxDbTelemetryConfig extends TelemetryConfigProperties {
 
     /**
      * Obtains InfluxDB server IP address.
@@ -81,7 +81,7 @@
     /**
      * Builder class of InfluxDbTelemetryConfig.
      */
-    interface Builder extends TelemetryConfig.Builder {
+    interface Builder extends TelemetryConfigProperties.Builder {
 
         /**
          * Sets InfluxDB server IP address.
@@ -115,7 +115,7 @@
          */
         Builder withPassword(String password);
 
-         /**
+        /**
          * Sets InfluxDB measurement.
          *
          * @param measurement InfluxDB measurement
@@ -154,4 +154,4 @@
          */
         InfluxDbTelemetryConfig build();
     }
-}
+}
\ No newline at end of file
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/KafkaTelemetryConfig.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/KafkaTelemetryConfig.java
index 078433f..80c7737 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/KafkaTelemetryConfig.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/KafkaTelemetryConfig.java
@@ -20,7 +20,7 @@
 /**
  * Configuration API of Kafka for publishing openstack telemetry.
  */
-public interface KafkaTelemetryConfig extends TelemetryConfig {
+public interface KafkaTelemetryConfig extends TelemetryConfigProperties {
 
     /**
      * Obtains kafka IP address.
@@ -86,6 +86,27 @@
     String valueSerializer();
 
     /**
+     * Obtains kafka key.
+     *
+     * @return kafka key
+     */
+    String key();
+
+    /**
+     * Obtains kafka topic.
+     *
+     * @return kafka topic
+     */
+    String topic();
+
+    /**
+     * Obtains kafka message codec.
+     *
+     * @return kafka message codec
+     */
+    String codec();
+
+    /**
      * Obtains kafka config maps.
      *
      * @return kafka config map
@@ -95,7 +116,7 @@
     /**
      * Builder class of KafkaTelemetryConfig.
      */
-    interface Builder extends TelemetryConfig.Builder {
+    interface Builder extends TelemetryConfigProperties.Builder {
 
         /**
          * Sets kafka IP address.
@@ -170,6 +191,30 @@
         Builder withValueSerializer(String valueSerializer);
 
         /**
+         * Sets kafka key.
+         *
+         * @param key kafka key
+         * @return builder instance
+         */
+        Builder withKey(String key);
+
+        /**
+         * Sets kafka topic.
+         *
+         * @param topic kafka topic
+         * @return builder instance
+         */
+        Builder withTopic(String topic);
+
+        /**
+         * Sets kafka message codec.
+         *
+         * @param codec kafka message codec
+         * @return builder instance
+         */
+        Builder withCodec(String codec);
+
+        /**
          * Sets other kafka configuration map.
          *
          * @param configMap kafka configuration map
@@ -184,4 +229,4 @@
          */
         KafkaTelemetryConfig build();
     }
-}
+}
\ No newline at end of file
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/PrometheusTelemetryConfig.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/PrometheusTelemetryConfig.java
index 8a74929..de47a7e 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/PrometheusTelemetryConfig.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/PrometheusTelemetryConfig.java
@@ -17,7 +17,7 @@
 
 import java.util.Map;
 
-public interface PrometheusTelemetryConfig extends TelemetryConfig {
+public interface PrometheusTelemetryConfig extends TelemetryConfigProperties {
 
     /**
      * Obtains prometheus exporter IP address.
@@ -44,7 +44,7 @@
     /**
      * Builder class of PrometheusTelemetryConfig.
      */
-    interface Builder extends TelemetryConfig.Builder {
+    interface Builder extends TelemetryConfigProperties.Builder {
 
         /**
          * Sets prometheus exporter IP address.
@@ -77,4 +77,4 @@
          */
         PrometheusTelemetryConfig build();
     }
-}
+}
\ No newline at end of file
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/RestTelemetryConfig.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/RestTelemetryConfig.java
index 0e9add5..781b0c9 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/RestTelemetryConfig.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/RestTelemetryConfig.java
@@ -20,7 +20,7 @@
 /**
  * Configuration API of REST for publishing openstack telemetry.
  */
-public interface RestTelemetryConfig extends TelemetryConfig {
+public interface RestTelemetryConfig extends TelemetryConfigProperties {
 
     /**
      * Obtains REST IP address.
@@ -74,7 +74,7 @@
     /**
      * Builder class for RestTelemetryConfig.
      */
-    interface Builder extends TelemetryConfig.Builder {
+    interface Builder extends TelemetryConfigProperties.Builder {
 
         /**
          * Sets REST server IP address.
@@ -139,4 +139,4 @@
          */
         RestTelemetryConfig build();
     }
-}
+}
\ No newline at end of file
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/TelemetryConfig.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/TelemetryConfig.java
index 1d31c86..a5d20cb 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/TelemetryConfig.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/TelemetryConfig.java
@@ -15,13 +15,132 @@
  */
 package org.onosproject.openstacktelemetry.api.config;
 
+import org.onosproject.net.Annotations;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
 /**
- * An interface for telemetryconfig.
+ * An interface for telemetry config.
  */
-public interface TelemetryConfig {
+public interface TelemetryConfig extends Annotations {
 
-    Builder createBuilder();
+    /**
+     * Telemetry configuration type.
+     */
+    enum ConfigType {
+        /**
+         * Indicates KAFKA telemetry config.
+         */
+        KAFKA,
 
-    interface Builder {
+        /**
+         * Indicates GRPC telemetry config.
+         */
+        GRPC,
+
+        /**
+         * Indicates REST telemetry config.
+         */
+        REST,
+
+        /**
+         * Indicates InfluxDB telemetry config.
+         */
+        INFLUXDB,
+
+        /**
+         * Indicates prometheus telemetry config.
+         */
+        PROMETHEUS,
+
+        /**
+         * Indicates unknown telemetry config.
+         */
+        UNKNOWN
     }
+
+    /**
+     * Returns the telemetry configuration name.
+     *
+     * @return configuration name
+     */
+    String name();
+
+    /**
+     * Returns the telemetry configuration type.
+     *
+     * @return configuration type
+     */
+    ConfigType type();
+
+    /**
+     * Returns all the parent configurations from which this configuration inherits
+     * properties.
+     *
+     * @return list of parent configurations
+     */
+    List<TelemetryConfig> parents();
+
+    /**
+     * Returns the off-platform application manufacturer name.
+     *
+     * @return manufacturer name
+     */
+    String manufacturer();
+
+    /**
+     * Returns the off-platform application software version.
+     *
+     * @return software version
+     */
+    String swVersion();
+
+    /**
+     * Returns the service enable flag.
+     *
+     * @return enable flag
+     */
+    boolean enabled();
+
+    /**
+     * Returns the set of annotations as map of key/value properties.
+     *
+     * @return map of properties
+     */
+    Map<String, String> properties();
+
+    /**
+     * Gets the value of the given property name.
+     *
+     * @param name property name
+     * @return the value of the property,
+     *         or null if the property is not defined in this configuration nor
+     *         in any of its ancestors
+     */
+    String getProperty(String name);
+
+    /**
+     * Get the value of the given property name.
+     *
+     * @param name property name
+     * @param defaultValue to use if the property is not defined in this configuration
+     *                     nor in any of its ancestors
+     * @return the value of the property,
+     *         or null if the property is not defined in this configuration nor
+     *         in any of its ancestors
+     */
+    default String getProperty(String name, String defaultValue) {
+        return Optional.ofNullable(getProperty(name)).orElse(defaultValue);
+    }
+
+    /**
+     * Merges the specified config properties into this one, giving preference to
+     * the other config when dealing with conflicts.
+     *
+     * @param other other configuration
+     * @return merged configuration
+     */
+    TelemetryConfig merge(TelemetryConfig other);
 }
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/TelemetryConfigProperties.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/TelemetryConfigProperties.java
new file mode 100644
index 0000000..d3ca479
--- /dev/null
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/TelemetryConfigProperties.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.openstacktelemetry.api.config;
+
+/**
+ * An interface for telemetry config properties.
+ */
+public interface TelemetryConfigProperties {
+
+    /**
+     * Creates a telemetry config properties builder.
+     *
+     * @return builder
+     */
+    Builder createBuilder();
+
+    /**
+     * Builder interface.
+     */
+    interface Builder {
+    }
+}