Fix: check the remote server connectivity before adding to map

1. replace boolean typed enable flag into enumeration status type
2. put the service in pending state, if the activation was failed

Change-Id: I15110f3d837d9a3ecf048c2777ec6fae9bf264ff
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/cli/TelemetryConfigListCommand.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/cli/TelemetryConfigListCommand.java
index 992c93a..58da487 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/cli/TelemetryConfigListCommand.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/cli/TelemetryConfigListCommand.java
@@ -48,7 +48,7 @@
         for (TelemetryConfig config : configs) {
             print(FORMAT, config.name(),
                     config.type(),
-                    config.enabled() ? "ENABLED" : "DISABLED",
+                    config.status().name(),
                     config.manufacturer(),
                     config.swVersion());
         }
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/cli/TelemetryServiceDisableCommand.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/cli/TelemetryServiceDisableCommand.java
index 13524d6..17ba3f3 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/cli/TelemetryServiceDisableCommand.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/cli/TelemetryServiceDisableCommand.java
@@ -23,6 +23,9 @@
 import org.onosproject.openstacktelemetry.api.TelemetryConfigAdminService;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
 
+import static java.lang.Thread.sleep;
+import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.Status.DISABLED;
+
 /**
  * Disables a telemetry service.
  */
@@ -36,7 +39,9 @@
     @Completion(TelemetryConfigNameCompleter.class)
     private String configName = null;
 
-    private static final String FORMAT = "Successfully disabled telemetry service %s!";
+    private static final long SLEEP_MS = 2000; // wait 2s for checking status
+    private static final String SUCCESS_FORMAT = "Successfully disabled telemetry service %s!";
+    private static final String FAIL_FORMAT = "Failed to disable telemetry service %s!";
     private static final String NO_ELEMENT =
             "No telemetry config is found with the given name";
 
@@ -50,9 +55,22 @@
             return;
         }
 
-        TelemetryConfig updatedConfig = config.updateEnabled(false);
+        TelemetryConfig updatedConfig = config.updateStatus(DISABLED);
 
         service.updateTelemetryConfig(updatedConfig);
-        print(FORMAT, config.name());
+
+        try {
+            sleep(SLEEP_MS);
+        } catch (InterruptedException e) {
+            error("Exception caused during status checking...");
+        }
+
+        TelemetryConfig finalConfig = service.getConfig(configName);
+
+        if (finalConfig.status() == DISABLED) {
+            print(SUCCESS_FORMAT, config.name());
+        } else {
+            print(FAIL_FORMAT, config.name());
+        }
     }
 }
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/cli/TelemetryServiceEnableCommand.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/cli/TelemetryServiceEnableCommand.java
index e484b48..7f5eb6b 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/cli/TelemetryServiceEnableCommand.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/cli/TelemetryServiceEnableCommand.java
@@ -23,6 +23,9 @@
 import org.onosproject.openstacktelemetry.api.TelemetryConfigAdminService;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
 
+import static java.lang.Thread.sleep;
+import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.Status.ENABLED;
+
 /**
  * Enables a telemetry service.
  */
@@ -36,7 +39,9 @@
     @Completion(TelemetryConfigNameCompleter.class)
     private String configName = null;
 
-    private static final String FORMAT = "Successfully enabled telemetry service %s!";
+    private static final long SLEEP_MS = 2000; // wait 2s for checking status
+    private static final String SUCCESS_FORMAT = "Successfully enabled telemetry service %s!";
+    private static final String FAIL_FORMAT = "Failed to enable telemetry service %s!";
     private static final String NO_ELEMENT =
             "No telemetry config is found with the given name";
 
@@ -50,9 +55,22 @@
             return;
         }
 
-        TelemetryConfig updatedConfig = config.updateEnabled(true);
+        TelemetryConfig updatedConfig = config.updateStatus(ENABLED);
 
         service.updateTelemetryConfig(updatedConfig);
-        print(FORMAT, config.name());
+
+        try {
+            sleep(SLEEP_MS);
+        } catch (InterruptedException e) {
+            error("Exception caused during status checking...");
+        }
+
+        TelemetryConfig finalConfig = service.getConfig(configName);
+
+        if (finalConfig.status() == ENABLED) {
+            print(SUCCESS_FORMAT, config.name());
+        } else {
+            print(FAIL_FORMAT, config.name());
+        }
     }
 }
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DistributedTelemetryConfigStore.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DistributedTelemetryConfigStore.java
index d066d85..c35cfdf 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DistributedTelemetryConfigStore.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DistributedTelemetryConfigStore.java
@@ -54,6 +54,10 @@
 import static org.onosproject.openstacktelemetry.api.TelemetryConfigEvent.Type.CONFIG_UPDATED;
 import static org.onosproject.openstacktelemetry.api.TelemetryConfigEvent.Type.SERVICE_DISABLED;
 import static org.onosproject.openstacktelemetry.api.TelemetryConfigEvent.Type.SERVICE_ENABLED;
+import static org.onosproject.openstacktelemetry.api.TelemetryConfigEvent.Type.SERVICE_PENDING;
+import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.Status.DISABLED;
+import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.Status.ENABLED;
+import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.Status.PENDING;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -76,6 +80,7 @@
                     .register(DefaultTelemetryConfigProvider.class)
                     .register(TelemetryConfig.class)
                     .register(TelemetryConfig.ConfigType.class)
+                    .register(TelemetryConfig.Status.class)
                     .register(DefaultTelemetryConfig.class)
                     .build();
 
@@ -210,15 +215,20 @@
             TelemetryConfig oldValue = event.oldValue().value();
             TelemetryConfig newValue = event.newValue().value();
 
-            if (oldValue.enabled() && !newValue.enabled()) {
+            if (oldValue.status() != DISABLED && newValue.status() == DISABLED) {
                 log.debug("Telemetry service {} has been disabled!", newValue.name());
                 notifyDelegate(new TelemetryConfigEvent(SERVICE_DISABLED, newValue));
             }
 
-            if (!oldValue.enabled() && newValue.enabled()) {
+            if (oldValue.status() != ENABLED && newValue.status() == ENABLED) {
                 log.debug("Telemetry service {} has been enabled!", newValue.name());
                 notifyDelegate(new TelemetryConfigEvent(SERVICE_ENABLED, newValue));
             }
+
+            if (oldValue.status() != PENDING && newValue.status() == PENDING) {
+                log.debug("Telemetry service {} was pended!", newValue.name());
+                notifyDelegate(new TelemetryConfigEvent(SERVICE_PENDING, newValue));
+            }
         }
     }
 }
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryManager.java
index 92e9aef..f508649 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryManager.java
@@ -35,7 +35,9 @@
 
 import static org.onosproject.openstacktelemetry.api.Constants.GRPC_SCHEME;
 import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.GRPC;
+import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.Status.ENABLED;
 import static org.onosproject.openstacktelemetry.config.DefaultGrpcTelemetryConfig.fromTelemetryConfig;
+import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.testConnectivity;
 
 /**
  * gRPC telemetry manager.
@@ -71,19 +73,29 @@
     }
 
     @Override
-    public void start(String name) {
+    public boolean start(String name) {
+        boolean success = false;
         TelemetryConfig config = telemetryConfigService.getConfig(name);
         GrpcTelemetryConfig grpcConfig = fromTelemetryConfig(config);
 
-        if (grpcConfig != null && !config.name().equals(GRPC_SCHEME) && config.enabled()) {
+        if (grpcConfig != null && !config.name().equals(GRPC_SCHEME) &&
+                config.status() == ENABLED) {
             ManagedChannel channel = ManagedChannelBuilder
                     .forAddress(grpcConfig.address(), grpcConfig.port())
                     .maxInboundMessageSize(grpcConfig.maxInboundMsgSize())
                     .usePlaintext(grpcConfig.usePlaintext())
                     .build();
 
-            channels.put(name, channel);
+            if (testConnectivity(grpcConfig.address(), grpcConfig.port())) {
+                channels.put(name, channel);
+                success = true;
+            } else {
+                log.warn("Unable to connect to {}:{}, " +
+                                "please check the connectivity manually",
+                                grpcConfig.address(), grpcConfig.port());
+            }
         }
+        return success;
     }
 
     @Override
@@ -97,9 +109,9 @@
     }
 
     @Override
-    public void restart(String name) {
+    public boolean restart(String name) {
         stop(name);
-        start(name);
+        return start(name);
     }
 
     @Override
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryManager.java
index 38dd2b8..b7c3985 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryManager.java
@@ -41,7 +41,9 @@
 
 import static org.onosproject.openstacktelemetry.api.Constants.INFLUXDB_SCHEME;
 import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.INFLUXDB;
+import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.Status.ENABLED;
 import static org.onosproject.openstacktelemetry.config.DefaultInfluxDbTelemetryConfig.fromTelemetryConfig;
+import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.testConnectivity;
 
 /**
  * InfluxDB telemetry manager.
@@ -168,29 +170,14 @@
         return !producers.isEmpty();
     }
 
-    private void createDB(InfluxDB producer, String database) {
-        if (producer.databaseExists(database)) {
-            log.debug("Database {} is already created", database);
-        } else {
-            producer.createDatabase(database);
-            log.debug("Database {} is created", database);
-        }
-    }
-
-    private String getTpPort(TpPort tpPort) {
-        if (tpPort == null) {
-            return "";
-        }
-        return tpPort.toString();
-    }
-
     @Override
-    public void start(String name) {
+    public boolean start(String name) {
+        boolean success = false;
         TelemetryConfig config = telemetryConfigService.getConfig(name);
         InfluxDbTelemetryConfig influxDbConfig = fromTelemetryConfig(config);
 
-        if (influxDbConfig != null &&
-                !config.name().equals(INFLUXDB_SCHEME) && config.enabled()) {
+        if (influxDbConfig != null && !config.name().equals(INFLUXDB_SCHEME) &&
+                config.status() == ENABLED) {
             StringBuilder influxDbServerBuilder = new StringBuilder();
             influxDbServerBuilder.append(INFLUX_PROTOCOL);
             influxDbServerBuilder.append(":");
@@ -199,12 +186,20 @@
             influxDbServerBuilder.append(":");
             influxDbServerBuilder.append(influxDbConfig.port());
 
-            InfluxDB producer = InfluxDBFactory.connect(influxDbServerBuilder.toString(),
-                    influxDbConfig.username(), influxDbConfig.password());
-            producers.put(name, producer);
-
-            createDB(producer, influxDbConfig.database());
+            if (testConnectivity(influxDbConfig.address(), influxDbConfig.port())) {
+                InfluxDB producer = InfluxDBFactory.connect(influxDbServerBuilder.toString(),
+                        influxDbConfig.username(), influxDbConfig.password());
+                producers.put(name, producer);
+                createDB(producer, influxDbConfig.database());
+                success = true;
+            } else {
+                log.warn("Unable to connect to {}:{}, " +
+                                "please check the connectivity manually",
+                                influxDbConfig.address(), influxDbConfig.port());
+            }
         }
+
+        return success;
     }
 
     @Override
@@ -218,15 +213,16 @@
     }
 
     @Override
-    public void restart(String name) {
+    public boolean restart(String name) {
         stop(name);
-        start(name);
+        return start(name);
     }
 
     @Override
     public void startAll() {
         telemetryConfigService.getConfigsByType(INFLUXDB).forEach(c -> start(c.name()));
-        log.info("InfluxDB producer has Started");    }
+        log.info("InfluxDB producer has Started");
+    }
 
     @Override
     public void stopAll() {
@@ -242,4 +238,21 @@
         stopAll();
         startAll();
     }
+
+
+    private void createDB(InfluxDB producer, String database) {
+        if (producer.databaseExists(database)) {
+            log.debug("Database {} is already created", database);
+        } else {
+            producer.createDatabase(database);
+            log.debug("Database {} is created", database);
+        }
+    }
+
+    private String getTpPort(TpPort tpPort) {
+        if (tpPort == null) {
+            return "";
+        }
+        return tpPort.toString();
+    }
 }
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryManager.java
index 06936ca..bbd8527 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryManager.java
@@ -44,7 +44,9 @@
 
 import static org.onosproject.openstacktelemetry.api.Constants.KAFKA_SCHEME;
 import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.KAFKA;
+import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.Status.ENABLED;
 import static org.onosproject.openstacktelemetry.config.DefaultKafkaTelemetryConfig.fromTelemetryConfig;
+import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.testConnectivity;
 
 /**
  * Kafka telemetry manager.
@@ -123,12 +125,13 @@
     }
 
     @Override
-    public void start(String name) {
+    public boolean start(String name) {
+        boolean success = false;
         TelemetryConfig config = telemetryConfigService.getConfig(name);
         KafkaTelemetryConfig kafkaConfig = fromTelemetryConfig(config);
 
-        if (kafkaConfig != null &&
-                !config.name().equals(KAFKA_SCHEME) && config.enabled()) {
+        if (kafkaConfig != null && !config.name().equals(KAFKA_SCHEME) &&
+                config.status() == ENABLED) {
             StringBuilder kafkaServerBuilder = new StringBuilder();
             kafkaServerBuilder.append(kafkaConfig.address());
             kafkaServerBuilder.append(":");
@@ -145,8 +148,17 @@
             prop.put(KEY_SERIALIZER, kafkaConfig.keySerializer());
             prop.put(VALUE_SERIALIZER, kafkaConfig.valueSerializer());
 
-            producers.put(name, new KafkaProducer<>(prop));
+            if (testConnectivity(kafkaConfig.address(), kafkaConfig.port())) {
+                producers.put(name, new KafkaProducer<>(prop));
+                success = true;
+            } else {
+                log.warn("Unable to connect to {}:{}, " +
+                            "please check the connectivity manually",
+                            kafkaConfig.address(), kafkaConfig.port());
+            }
         }
+
+        return success;
     }
 
     @Override
@@ -160,9 +172,9 @@
     }
 
     @Override
-    public void restart(String name) {
+    public boolean restart(String name) {
         stop(name);
-        start(name);
+        return start(name);
     }
 
     @Override
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryManager.java
index d49cdc0..3096eb9 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryManager.java
@@ -25,9 +25,9 @@
 import org.onosproject.openstacktelemetry.api.PrometheusTelemetryService;
 import org.onosproject.openstacktelemetry.api.RestTelemetryService;
 import org.onosproject.openstacktelemetry.api.TelemetryAdminService;
+import org.onosproject.openstacktelemetry.api.TelemetryConfigAdminService;
 import org.onosproject.openstacktelemetry.api.TelemetryConfigEvent;
 import org.onosproject.openstacktelemetry.api.TelemetryConfigListener;
-import org.onosproject.openstacktelemetry.api.TelemetryConfigService;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Deactivate;
@@ -40,6 +40,7 @@
 import java.util.Set;
 
 import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_INFLUXDB_MEASUREMENT;
+import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.Status.PENDING;
 
 /**
  * Openstack telemetry manager.
@@ -50,7 +51,7 @@
     private final Logger log = LoggerFactory.getLogger(getClass());
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected TelemetryConfigService telemetryConfigService;
+    protected TelemetryConfigAdminService telemetryConfigService;
 
     private List<TelemetryAdminService> telemetryServices = Lists.newArrayList();
     private InternalTelemetryConfigListener
@@ -156,7 +157,12 @@
 
             switch (event.type()) {
                 case SERVICE_ENABLED:
-                    service.start(event.subject().name());
+                    if (!service.start(event.subject().name())) {
+                        // we enforce to make the service in PENDING status,
+                        // if we encountered a failure during service start
+                        telemetryConfigService.updateTelemetryConfig(
+                                event.subject().updateStatus(PENDING));
+                    }
                     break;
                 case SERVICE_DISABLED:
                     service.stop(event.subject().name());
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusTelemetryManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusTelemetryManager.java
index 3ccc02e..9f63b1d 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusTelemetryManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusTelemetryManager.java
@@ -43,6 +43,7 @@
 
 import static org.onosproject.openstacktelemetry.api.Constants.PROMETHEUS_SCHEME;
 import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.PROMETHEUS;
+import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.Status.ENABLED;
 import static org.onosproject.openstacktelemetry.config.DefaultPrometheusTelemetryConfig.fromTelemetryConfig;
 
 /**
@@ -207,55 +208,19 @@
         }
     }
 
-    private String[] getLabelValues(FlowInfo flowInfo) {
-        String[] labelValues = new String[LABEL_TAGS.length];
-
-        labelValues[Arrays.asList(LABEL_TAGS).indexOf(FLOW_TYPE)]
-                    = String.valueOf(flowInfo.flowType());
-        labelValues[Arrays.asList(LABEL_TAGS).indexOf(DEVICE_ID)]
-                    = flowInfo.deviceId().toString();
-        labelValues[Arrays.asList(LABEL_TAGS).indexOf(INPUT_INTERFACE_ID)]
-                    = String.valueOf(flowInfo.inputInterfaceId());
-        labelValues[Arrays.asList(LABEL_TAGS).indexOf(OUTPUT_INTERFACE_ID)]
-                    = String.valueOf(flowInfo.outputInterfaceId());
-        labelValues[Arrays.asList(LABEL_TAGS).indexOf(VXLAN_ID)]
-                    = String.valueOf(flowInfo.vxlanId());
-        labelValues[Arrays.asList(LABEL_TAGS).indexOf(SRC_IP)]
-                    = flowInfo.srcIp().toString();
-        labelValues[Arrays.asList(LABEL_TAGS).indexOf(DST_IP)]
-                    = flowInfo.dstIp().toString();
-        labelValues[Arrays.asList(LABEL_TAGS).indexOf(SRC_PORT)]
-                    = getTpPort(flowInfo.srcPort());
-        labelValues[Arrays.asList(LABEL_TAGS).indexOf(DST_PORT)]
-                    = getTpPort(flowInfo.dstPort());
-        labelValues[Arrays.asList(LABEL_TAGS).indexOf(PROTOCOL)]
-                    = String.valueOf(flowInfo.protocol());
-        if (flowInfo.vlanId() != null) {
-            labelValues[Arrays.asList(LABEL_TAGS).indexOf(VLAN_ID)]
-                    = flowInfo.vlanId().toString();
-        }
-        return labelValues;
-    }
-
-    private String getTpPort(TpPort tpPort) {
-        if (tpPort == null) {
-            return "";
-        }
-        return tpPort.toString();
-    }
-
     @Override
     public boolean isRunning() {
         return !prometheusExporters.isEmpty();
     }
 
     @Override
-    public void start(String name) {
+    public boolean start(String name) {
+        boolean success = false;
         TelemetryConfig config = telemetryConfigService.getConfig(name);
         PrometheusTelemetryConfig prometheusConfig = fromTelemetryConfig(config);
 
-        if (prometheusConfig != null &&
-                !config.name().equals(PROMETHEUS_SCHEME) && config.enabled()) {
+        if (prometheusConfig != null && !config.name().equals(PROMETHEUS_SCHEME) &&
+                config.status() == ENABLED) {
             try {
                 // TODO  Offer a 'Authentication'
                 Server prometheusExporter = new Server(prometheusConfig.port());
@@ -270,10 +235,14 @@
 
                 prometheusExporters.put(name, prometheusExporter);
 
+                success = true;
+
             } catch (Exception ex) {
-                log.warn("Exception: {}", ex);
+                log.warn("Failed to start prometheus server due to {}", ex);
             }
         }
+
+        return success;
     }
 
     @Override
@@ -290,8 +259,45 @@
     }
 
     @Override
-    public void restart(String name) {
+    public boolean restart(String name) {
         stop(name);
-        start(name);
+        return start(name);
+    }
+
+    private String[] getLabelValues(FlowInfo flowInfo) {
+        String[] labelValues = new String[LABEL_TAGS.length];
+
+        labelValues[Arrays.asList(LABEL_TAGS).indexOf(FLOW_TYPE)]
+                = String.valueOf(flowInfo.flowType());
+        labelValues[Arrays.asList(LABEL_TAGS).indexOf(DEVICE_ID)]
+                = flowInfo.deviceId().toString();
+        labelValues[Arrays.asList(LABEL_TAGS).indexOf(INPUT_INTERFACE_ID)]
+                = String.valueOf(flowInfo.inputInterfaceId());
+        labelValues[Arrays.asList(LABEL_TAGS).indexOf(OUTPUT_INTERFACE_ID)]
+                = String.valueOf(flowInfo.outputInterfaceId());
+        labelValues[Arrays.asList(LABEL_TAGS).indexOf(VXLAN_ID)]
+                = String.valueOf(flowInfo.vxlanId());
+        labelValues[Arrays.asList(LABEL_TAGS).indexOf(SRC_IP)]
+                = flowInfo.srcIp().toString();
+        labelValues[Arrays.asList(LABEL_TAGS).indexOf(DST_IP)]
+                = flowInfo.dstIp().toString();
+        labelValues[Arrays.asList(LABEL_TAGS).indexOf(SRC_PORT)]
+                = getTpPort(flowInfo.srcPort());
+        labelValues[Arrays.asList(LABEL_TAGS).indexOf(DST_PORT)]
+                = getTpPort(flowInfo.dstPort());
+        labelValues[Arrays.asList(LABEL_TAGS).indexOf(PROTOCOL)]
+                = String.valueOf(flowInfo.protocol());
+        if (flowInfo.vlanId() != null) {
+            labelValues[Arrays.asList(LABEL_TAGS).indexOf(VLAN_ID)]
+                    = flowInfo.vlanId().toString();
+        }
+        return labelValues;
+    }
+
+    private String getTpPort(TpPort tpPort) {
+        if (tpPort == null) {
+            return "";
+        }
+        return tpPort.toString();
     }
 }
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/RestTelemetryManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/RestTelemetryManager.java
index f5641bd..e73a724 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/RestTelemetryManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/RestTelemetryManager.java
@@ -40,7 +40,9 @@
 
 import static org.onosproject.openstacktelemetry.api.Constants.REST_SCHEME;
 import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.REST;
+import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.Status.ENABLED;
 import static org.onosproject.openstacktelemetry.config.DefaultRestTelemetryConfig.fromTelemetryConfig;
+import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.testConnectivity;
 
 /**
  * REST telemetry manager.
@@ -130,12 +132,13 @@
     }
 
     @Override
-    public void start(String name) {
+    public boolean start(String name) {
+        boolean success = false;
         TelemetryConfig config = telemetryConfigService.getConfig(name);
         RestTelemetryConfig restConfig = fromTelemetryConfig(config);
 
-        if (restConfig != null &&
-                !config.name().equals(REST_SCHEME) && config.enabled()) {
+        if (restConfig != null && !config.name().equals(REST_SCHEME) &&
+                config.status() == ENABLED) {
             StringBuilder restServerBuilder = new StringBuilder();
             restServerBuilder.append(PROTOCOL);
             restServerBuilder.append(":");
@@ -145,13 +148,23 @@
             restServerBuilder.append(restConfig.port());
             restServerBuilder.append("/");
 
-            Client client = ClientBuilder.newBuilder().build();
+            if (testConnectivity(restConfig.address(), restConfig.port())) {
+                Client client = ClientBuilder.newBuilder().build();
 
-            WebTarget target = client.target(
-                    restServerBuilder.toString()).path(restConfig.endpoint());
+                WebTarget target = client.target(
+                        restServerBuilder.toString()).path(restConfig.endpoint());
 
-            targets.put(config.name(), target);
+                targets.put(config.name(), target);
+
+                success = true;
+            } else {
+                log.warn("Unable to connect to {}:{}, " +
+                                "please check the connectivity manually",
+                                restConfig.address(), restConfig.port());
+            }
         }
+
+        return success;
     }
 
     @Override
@@ -165,8 +178,8 @@
     }
 
     @Override
-    public void restart(String name) {
+    public boolean restart(String name) {
         stop(name);
-        start(name);
+        return start(name);
     }
 }
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/TelemetryConfigManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/TelemetryConfigManager.java
index 9832ad3..bb8b305 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/TelemetryConfigManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/TelemetryConfigManager.java
@@ -84,6 +84,7 @@
                     .register(DefaultTelemetryConfigProvider.class)
                     .register(TelemetryConfig.class)
                     .register(TelemetryConfig.ConfigType.class)
+                    .register(TelemetryConfig.Status.class)
                     .register(DefaultTelemetryConfig.class)
                     .build();
 
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/XmlTelemetryConfigLoader.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/XmlTelemetryConfigLoader.java
index c9c6e9f..d382526 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/XmlTelemetryConfigLoader.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/XmlTelemetryConfigLoader.java
@@ -36,7 +36,6 @@
 import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.KAFKA;
 import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.PROMETHEUS;
 import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.REST;
-import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.UNKNOWN;
 
 /**
  * Utility capable of reading telemetry configuration XML resources and producing
@@ -61,14 +60,12 @@
 
     private static final String PROPERTY = "property";
 
-    private static final String TRUE = "true";
-
     private static final String NAME = "[@name]";
     private static final String TYPE = "[@type]";
     private static final String EXTENDS = "[@extends]";
     private static final String MFG = "[@manufacturer]";
     private static final String SW = "[@swVersion]";
-    private static final String ENABLED = "[@enabled]";
+    private static final String STATUS = "[@status]";
 
     private Map<String, TelemetryConfig> configs = Maps.newHashMap();
 
@@ -148,9 +145,9 @@
         String swVersion = telemetryCfg.getString(SW, getParentAttribute(parents, SW));
 
         // note that we do not inherits enabled property from parent
-        String enabledStr = telemetryCfg.getString(ENABLED);
-
-        boolean enabled = enabledStr != null && enabledStr.equalsIgnoreCase(TRUE);
+        String statusStr = telemetryCfg.getString(STATUS);
+        TelemetryConfig.Status status =
+                statusStr == null ? TelemetryConfig.Status.UNKNOWN : status(statusStr);
 
         TelemetryConfig.ConfigType type = type(typeStr);
 
@@ -159,7 +156,7 @@
         }
 
         return new DefaultTelemetryConfig(name, type, parents, manufacturer,
-                swVersion, enabled, parseProperties(parents, telemetryCfg));
+                swVersion, status, parseProperties(parents, telemetryCfg));
     }
 
     private TelemetryConfig.ConfigType type(String typeStr) {
@@ -176,7 +173,7 @@
                 return PROMETHEUS;
             case "UNKNOWN":
             default:
-                return UNKNOWN;
+                return TelemetryConfig.ConfigType.UNKNOWN;
         }
     }
 
@@ -224,4 +221,17 @@
 
         return properties.build();
     }
+
+    private TelemetryConfig.Status status(String status) {
+        switch (status.toUpperCase()) {
+            case "ENABLED" :
+                return TelemetryConfig.Status.ENABLED;
+            case "DISABLED" :
+                return TelemetryConfig.Status.DISABLED;
+            case "PENDING" :
+                return TelemetryConfig.Status.PENDING;
+            default:
+                return TelemetryConfig.Status.UNKNOWN;
+        }
+    }
 }
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/util/OpenstackTelemetryUtil.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/util/OpenstackTelemetryUtil.java
index 39b1fdb..afb7365 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/util/OpenstackTelemetryUtil.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/util/OpenstackTelemetryUtil.java
@@ -19,6 +19,10 @@
 import org.onlab.packet.IPv4;
 import org.onosproject.cfg.ConfigProperty;
 
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+import java.net.SocketAddress;
 import java.util.Dictionary;
 import java.util.Optional;
 import java.util.Set;
@@ -34,6 +38,7 @@
     private static final String PROTOCOL_NAME_UDP = "udp";
     private static final String PROTOCOL_NAME_ANY = "any";
     private static final int ARBITRARY_PROTOCOL = 0x0;
+    private static final int TIMEOUT = 2000;
 
     /**
      * Prevents object instantiation from external.
@@ -110,4 +115,26 @@
                 return PROTOCOL_NAME_ANY;
         }
     }
+
+    /**
+     * Tests the connectivity with the given address and port.
+     *
+     * @param address address
+     * @param port port number
+     * @return true if the given address and port is accessible, false otherwise
+     */
+    public static boolean testConnectivity(String address, int port) {
+
+        boolean isConnected = false;
+        SocketAddress socketAddress = new InetSocketAddress(address, port);
+        Socket socket = new Socket();
+        try {
+            socket.connect(socketAddress, TIMEOUT);
+            socket.close();
+            isConnected = true;
+        } catch (IOException ignored) {
+        }
+
+        return isConnected;
+    }
 }