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/Constants.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/Constants.java
index bf0e013..3ebf105 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/Constants.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/Constants.java
@@ -32,6 +32,12 @@
     public static final String VLAN = "VLAN";
     public static final String FLAT = "FLAT";
 
+    public static final String GRPC_SCHEME = "grpc";
+    public static final String KAFKA_SCHEME = "kafka";
+    public static final String INFLUXDB_SCHEME = "influxdb";
+    public static final String PROMETHEUS_SCHEME = "prometheus";
+    public static final String REST_SCHEME = "rest";
+
     // default configuration variables for ONOS GUI
     public static final int DEFAULT_DATA_POINT_SIZE = 17280;
 }
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/GrpcTelemetryConfigService.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/GrpcTelemetryConfigService.java
deleted file mode 100644
index d95d752..0000000
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/GrpcTelemetryConfigService.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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;
-
-/**
- * Configuration service API for publishing openstack telemetry through gRPC producer.
- */
-public interface GrpcTelemetryConfigService extends TelemetryConfigService {
-}
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/GrpcTelemetryService.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/GrpcTelemetryService.java
index e885b7e..fd4e08b 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/GrpcTelemetryService.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/GrpcTelemetryService.java
@@ -27,4 +27,14 @@
      * @return a response from gRPC server
      */
     Object publish(Object record);
+
+    /**
+     * Returns GRPC telemetry service type.
+     *
+     * @return GRPC telemetry service type
+     */
+    @Override
+    default ServiceType type() {
+        return ServiceType.GRPC;
+    }
 }
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/InfluxDbTelemetryConfigService.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/InfluxDbTelemetryConfigService.java
deleted file mode 100644
index f525d01..0000000
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/InfluxDbTelemetryConfigService.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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;
-
-/**
- * Configuration service API for publishing openstack telemetry through InfluxDB producer.
- */
-public interface InfluxDbTelemetryConfigService extends TelemetryConfigService {
-}
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/InfluxDbTelemetryService.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/InfluxDbTelemetryService.java
index 4a1bd5c..868c3e4 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/InfluxDbTelemetryService.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/InfluxDbTelemetryService.java
@@ -28,4 +28,14 @@
      * @param record a network metric to be published
      */
     void publish(InfluxRecord<String, Set<FlowInfo>> record);
+
+    /**
+     * Returns influxDB telemetry service type.
+     *
+     * @return influxDB telemetry service type
+     */
+    @Override
+    default ServiceType type() {
+        return ServiceType.INFLUXDB;
+    }
 }
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/KafkaTelemetryConfigService.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/KafkaTelemetryConfigService.java
deleted file mode 100644
index 9b8e827..0000000
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/KafkaTelemetryConfigService.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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;
-
-/**
- * Configuration service API for publishing openstack telemetry through Kafka producer.
- */
-public interface KafkaTelemetryConfigService extends TelemetryConfigService {
-}
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/KafkaTelemetryService.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/KafkaTelemetryService.java
index caa1f28..8135221 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/KafkaTelemetryService.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/KafkaTelemetryService.java
@@ -15,9 +15,9 @@
  */
 package org.onosproject.openstacktelemetry.api;
 
-import org.apache.kafka.clients.producer.ProducerRecord;
 import org.apache.kafka.clients.producer.RecordMetadata;
 
+import java.util.Set;
 import java.util.concurrent.Future;
 
 /**
@@ -28,8 +28,18 @@
     /**
      * Publishes openstack telemetry to Kafka server.
      *
-     * @param record a network metric to be published
+     * @param flowInfos network metrics to be published
      * @return metadata for a record that has been acknowledged
      */
-    Future<RecordMetadata> publish(ProducerRecord<String, byte[]> record);
+    Set<Future<RecordMetadata>> publish(Set<FlowInfo> flowInfos);
+
+    /**
+     * Returns kafka telemetry service type.
+     *
+     * @return kafka telemetry service type
+     */
+    @Override
+    default ServiceType type() {
+        return ServiceType.KAFKA;
+    }
 }
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/OpenstackTelemetryService.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/OpenstackTelemetryService.java
index 8d5df0b..850e2e7 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/OpenstackTelemetryService.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/OpenstackTelemetryService.java
@@ -27,14 +27,14 @@
      *
      * @param telemetryService telemetry service
      */
-    void addTelemetryService(TelemetryService telemetryService);
+    void addTelemetryService(TelemetryAdminService telemetryService);
 
     /**
      * Unregisters an existing northbound telemetry service.
      *
      * @param telemetryService telemetry service
      */
-    void removeTelemetryService(TelemetryService telemetryService);
+    void removeTelemetryService(TelemetryAdminService telemetryService);
 
     /**
      * Publishes new flow information to off-platform application through
@@ -49,5 +49,13 @@
      *
      * @return telemetry services
      */
-    Set<TelemetryService> telemetryServices();
+    Set<TelemetryAdminService> telemetryServices();
+
+    /**
+     * Obtains a specific openstack telemetry service.
+     *
+     * @param type telemetry type
+     * @return telemetry service instance
+     */
+    TelemetryAdminService telemetryService(String type);
 }
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/PrometheusTelemetryService.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/PrometheusTelemetryService.java
index 2680ab1..23c2192 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/PrometheusTelemetryService.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/PrometheusTelemetryService.java
@@ -27,4 +27,14 @@
      * @param flowInfos a network metric to be published
      */
     void publish(Set<FlowInfo> flowInfos);
+
+    /**
+     * Returns prometheus telemetry service type.
+     *
+     * @return prometheus telemetry service type
+     */
+    @Override
+    default ServiceType type() {
+        return ServiceType.PROMETHEUS;
+    }
 }
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/RestTelemetryConfigService.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/RestTelemetryConfigService.java
deleted file mode 100644
index f3b60ee..0000000
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/RestTelemetryConfigService.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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;
-
-/**
- * Configuration service API for publishing openstack telemetry through REST producer.
- */
-public interface RestTelemetryConfigService extends TelemetryConfigService {
-}
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/RestTelemetryService.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/RestTelemetryService.java
index ab3755e..e0fca83 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/RestTelemetryService.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/RestTelemetryService.java
@@ -16,6 +16,7 @@
 package org.onosproject.openstacktelemetry.api;
 
 import javax.ws.rs.core.Response;
+import java.util.Set;
 
 /**
  * Service API for publishing openstack telemetry through REST producer.
@@ -24,30 +25,21 @@
 
     /**
      * Publishes openstack telemetry to REST server.
-     *
-     * @param endpoint  an endpoint URL
-     * @param method    HTTP method
-     * @param record    network metrics
-     * @return response from REST server
-     */
-    Response publish(String endpoint, String method, String record);
-
-    /**
-     * Publishes openstack telemetry to REST server.
-     *
-     * @param method    HTTP method
-     * @param record    network metrics
-     * @return response from REST server
-     */
-    Response publish(String method, String record);
-
-    /**
-     * Publishes openstack telemetry to REST server.
      * By default, the client sends record using the HTTP method configured in
      * RestTelemetryConfig.
      *
      * @param record network metrics
      * @return response from REST server
      */
-    Response publish(String record);
+    Set<Response> publish(String record);
+
+    /**
+     * Returns REST telemetry service type.
+     *
+     * @return REST telemetry service type
+     */
+    @Override
+    default ServiceType type() {
+        return ServiceType.REST;
+    }
 }
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryAdminService.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryAdminService.java
index d5ee6ad..62398db 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryAdminService.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryAdminService.java
@@ -15,8 +15,6 @@
  */
 package org.onosproject.openstacktelemetry.api;
 
-import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
-
 /**
  * Admin service API for publishing openstack telemetry.
  */
@@ -24,10 +22,8 @@
 
     /**
      * Prepares and launches the telemetry producer.
-     *
-     * @param config telemetry server config
      */
-    void start(TelemetryConfig config);
+    void start();
 
     /**
      * Terminates the telemetry producer.
@@ -36,8 +32,6 @@
 
     /**
      * Restarts the telemetry producer.
-     *
-     * @param config telemetry server config
      */
-    void restart(TelemetryConfig config);
+    void restart();
 }
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/PrometheusTelemetryConfigService.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryCodec.java
similarity index 67%
copy from apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/PrometheusTelemetryConfigService.java
copy to apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryCodec.java
index 4e115de..1f0f737 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/PrometheusTelemetryConfigService.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryCodec.java
@@ -15,8 +15,19 @@
  */
 package org.onosproject.openstacktelemetry.api;
 
+import java.nio.ByteBuffer;
+import java.util.Set;
+
 /**
- * Configuration service API for publishing openstack telemetry through Prometheus producer.
+ * Telemetry codec interface.
  */
-public interface PrometheusTelemetryConfigService extends TelemetryConfigService {
+public interface TelemetryCodec {
+
+    /**
+     * Encodes a collection flow infos into byte buffer.
+     *
+     * @param flowInfos a collection of flow info
+     * @return encoded byte buffer
+     */
+    ByteBuffer encode(Set<FlowInfo> flowInfos);
 }
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigAdminService.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigAdminService.java
new file mode 100644
index 0000000..18ee89b
--- /dev/null
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigAdminService.java
@@ -0,0 +1,54 @@
+/*
+ * 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;
+
+import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
+
+import java.util.Set;
+
+/**
+ * Service for mapping telemetry configurations implementations.
+ */
+public interface TelemetryConfigAdminService extends TelemetryConfigService {
+
+    /**
+     * Returns the set of telemetry configurations currently registered.
+     *
+     * @return registered telemetry configurations
+     */
+    Set<TelemetryConfigProvider> getProviders();
+
+    /**
+     * Registers the specified telemetry configuration provider.
+     *
+     * @param provider configuration provider to register
+     */
+    void registerProvider(TelemetryConfigProvider provider);
+
+    /**
+     * Unregisters the specified telemetry configuration provider.
+     *
+     * @param provider configuration provider to unregister
+     */
+    void unregisterProvider(TelemetryConfigProvider provider);
+
+    /**
+     * Updates an existing telemetry configuration.
+     *
+     * @param config telemetry configuration
+     */
+    void updateTelemetryConfig(TelemetryConfig config);
+}
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigEvent.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigEvent.java
new file mode 100644
index 0000000..a0c2714
--- /dev/null
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigEvent.java
@@ -0,0 +1,53 @@
+/*
+ * 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;
+
+import org.onosproject.event.AbstractEvent;
+import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
+
+/**
+ * Describes telemetry config event.
+ */
+public class TelemetryConfigEvent extends AbstractEvent<TelemetryConfigEvent.Type, TelemetryConfig> {
+
+    /**
+     * Telemetry config event type.
+     */
+    public enum Type {
+        /**
+         * Signifies that a new telemetry config is added.
+         */
+        CONFIG_ADDED,
+        /**
+         * Signifies that an existing telemetry config is updated.
+         */
+        CONFIG_UPDATED,
+        /**
+         * Signifies that an existing telemetry config is removed.
+         */
+        CONFIG_DELETED
+    }
+
+    /**
+     * Creates an event of a given type for the specified telemetry config.
+     *
+     * @param type     telemetry config type
+     * @param config   telemetry config
+     */
+    public TelemetryConfigEvent(Type type, TelemetryConfig config) {
+        super(type, config);
+    }
+}
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/PrometheusTelemetryConfigService.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigListener.java
similarity index 79%
rename from apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/PrometheusTelemetryConfigService.java
rename to apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigListener.java
index 4e115de..cef78af 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/PrometheusTelemetryConfigService.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigListener.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.openstacktelemetry.api;
 
+import org.onosproject.event.EventListener;
+
 /**
- * Configuration service API for publishing openstack telemetry through Prometheus producer.
+ * Listener for telemetry config event.
  */
-public interface PrometheusTelemetryConfigService extends TelemetryConfigService {
+public interface TelemetryConfigListener extends EventListener<TelemetryConfigEvent> {
 }
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/PrometheusTelemetryConfigService.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigProvider.java
similarity index 62%
copy from apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/PrometheusTelemetryConfigService.java
copy to apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigProvider.java
index 4e115de..57b148e 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/PrometheusTelemetryConfigService.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigProvider.java
@@ -15,8 +15,19 @@
  */
 package org.onosproject.openstacktelemetry.api;
 
+import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
+
+import java.util.Set;
+
 /**
- * Configuration service API for publishing openstack telemetry through Prometheus producer.
+ * Represents entity capable of providing telemetry configurations.
  */
-public interface PrometheusTelemetryConfigService extends TelemetryConfigService {
+public interface TelemetryConfigProvider {
+
+    /**
+     * Returns the set of telemetry configuration to be made available by this provider.
+     *
+     * @return set of telemetry configurations
+     */
+    Set<TelemetryConfig> getTelemetryConfigs();
 }
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigService.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigService.java
index 51e4cea..76076d2 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigService.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigService.java
@@ -15,17 +15,39 @@
  */
 package org.onosproject.openstacktelemetry.api;
 
+import org.onosproject.event.ListenerService;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
+import org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType;
+
+import java.util.Set;
 
 /**
  * Telemetry configuration service interface.
  */
-public interface TelemetryConfigService {
+public interface TelemetryConfigService
+        extends ListenerService<TelemetryConfigEvent, TelemetryConfigListener> {
 
     /**
-     * Obtains the telemetry configuration.
+     * Obtains the telemetry configuration with the given telemetry
+     * configuration name.
      *
-     * @return telemetry configuration
+     * @param name telemetry configuration name
+     * @return provided telemetry configuration
      */
-    TelemetryConfig getConfig();
+    TelemetryConfig getConfig(String name);
+
+    /**
+     * Obtains the telemetry configuration with the given telemetry config type.
+     *
+     * @param type telemetry configuration type
+     * @return provided telemetry configurations
+     */
+    Set<TelemetryConfig> getConfigsByType(ConfigType type);
+
+    /**
+     * Returns the overall set of telemetry configurations being provided.
+     *
+     * @return provided telemetry configurations
+     */
+    Set<TelemetryConfig> getConfigs();
 }
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigStore.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigStore.java
new file mode 100644
index 0000000..42148f6
--- /dev/null
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigStore.java
@@ -0,0 +1,79 @@
+/*
+ * 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;
+
+import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
+import org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType;
+import org.onosproject.store.Store;
+
+import java.util.Set;
+
+/**
+ * Manages inventory of telemetry config; not intended for direct use.
+ */
+public interface TelemetryConfigStore
+        extends Store<TelemetryConfigEvent, TelemetryConfigStoreDelegate> {
+
+    /**
+     * Creates a new telemetry config.
+     *
+     * @param config a telemetry config
+     */
+    void createTelemetryConfig(TelemetryConfig config);
+
+    /**
+     * Updates the existing telemetry config.
+     *
+     * @param config the existing telemetry config
+     */
+    void updateTelemetryConfig(TelemetryConfig config);
+
+    /**
+     * Removes the existing telemetry config.
+     *
+     * @param name telemetry config name
+     * @return the removed telemetry config
+     */
+    TelemetryConfig removeTelemetryConfig(String name);
+
+    /**
+     * Obtains the existing telemetry config.
+     *
+     * @param name telemetry config name
+     * @return queried telemetry config
+     */
+    TelemetryConfig telemetryConfig(String name);
+
+    /**
+     * Obtains a collection of all of telemetry configs.
+     *
+     * @return a collection of all of telemetry configs
+     */
+    Set<TelemetryConfig> telemetryConfigs();
+
+    /**
+     * Obtains a collection of telemetry configs by config type.
+     *
+     * @param type config type
+     * @return a collection of telemetry configs by config type
+     */
+    Set<TelemetryConfig> telemetryConfigsByType(ConfigType type);
+
+    /**
+     * Removes all telemetry configs.
+     */
+    void clear();
+}
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/PrometheusTelemetryConfigService.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigStoreDelegate.java
similarity index 78%
copy from apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/PrometheusTelemetryConfigService.java
copy to apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigStoreDelegate.java
index 4e115de..8fa7720 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/PrometheusTelemetryConfigService.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigStoreDelegate.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.openstacktelemetry.api;
 
+import org.onosproject.store.StoreDelegate;
+
 /**
- * Configuration service API for publishing openstack telemetry through Prometheus producer.
+ * Telemetry config store delegate abstraction.
  */
-public interface PrometheusTelemetryConfigService extends TelemetryConfigService {
+public interface TelemetryConfigStoreDelegate extends StoreDelegate<TelemetryConfigEvent> {
 }
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryService.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryService.java
index 86ebb65..7806ff7 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryService.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryService.java
@@ -21,9 +21,51 @@
 public interface TelemetryService {
 
     /**
+     * Telemetry service type.
+     */
+    enum ServiceType {
+        /**
+         * Indicates KAFKA telemetry service.
+         */
+        KAFKA,
+
+        /**
+         * Indicates GRPC telemetry service.
+         */
+        GRPC,
+
+        /**
+         * Indicates REST telemetry service.
+         */
+        REST,
+
+        /**
+         * Indicates InfluxDB telemetry service.
+         */
+        INFLUXDB,
+
+        /**
+         * Indicates prometheus telemetry service.
+         */
+        PROMETHEUS,
+
+        /**
+         * Indicates unknown telemetry service.
+         */
+        UNKNOWN
+    }
+
+    /**
      * Checks whether the telemetry service is running or not.
      *
      * @return telemetry service running status
      */
     boolean isRunning();
+
+    /**
+     * Obtains the service type.
+     *
+     * @return service type
+     */
+    ServiceType type();
 }
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/PrometheusTelemetryConfigService.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/TelemetryConfigProperties.java
similarity index 63%
copy from apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/PrometheusTelemetryConfigService.java
copy to apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/TelemetryConfigProperties.java
index 4e115de..d3ca479 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/PrometheusTelemetryConfigService.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/TelemetryConfigProperties.java
@@ -13,10 +13,23 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstacktelemetry.api;
+package org.onosproject.openstacktelemetry.api.config;
 
 /**
- * Configuration service API for publishing openstack telemetry through Prometheus producer.
+ * An interface for telemetry config properties.
  */
-public interface PrometheusTelemetryConfigService extends TelemetryConfigService {
+public interface TelemetryConfigProperties {
+
+    /**
+     * Creates a telemetry config properties builder.
+     *
+     * @return builder
+     */
+    Builder createBuilder();
+
+    /**
+     * Builder interface.
+     */
+    interface Builder {
+    }
 }