From 667c6eb8190d052d8b7ba1ad54cd17dfeab3011a Mon Sep 17 00:00:00 2001 From: Jian Li Date: Mon, 7 Jan 2019 23:01:12 +0900 Subject: [PATCH] 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 --- .../api/DefaultTelemetryConfig.java | 22 ++--- .../api/TelemetryAdminService.java | 6 +- .../api/TelemetryConfigEvent.java | 6 +- .../api/config/TelemetryConfig.java | 34 +++++-- .../api/DefaultTelemetryConfigTest.java | 14 +-- .../cli/TelemetryConfigListCommand.java | 2 +- .../cli/TelemetryServiceDisableCommand.java | 24 ++++- .../cli/TelemetryServiceEnableCommand.java | 24 ++++- .../impl/DistributedTelemetryConfigStore.java | 14 ++- .../impl/GrpcTelemetryManager.java | 22 ++++- .../impl/InfluxDbTelemetryManager.java | 67 ++++++++------ .../impl/KafkaTelemetryManager.java | 24 +++-- .../impl/OpenstackTelemetryManager.java | 12 ++- .../impl/PrometheusTelemetryManager.java | 92 ++++++++++--------- .../impl/RestTelemetryManager.java | 31 +++++-- .../impl/TelemetryConfigManager.java | 1 + .../impl/XmlTelemetryConfigLoader.java | 28 ++++-- .../util/OpenstackTelemetryUtil.java | 27 ++++++ .../impl/influxdb-configs.xml | 4 +- .../openstacktelemetry/impl/kafka-configs.xml | 2 +- .../impl/prometheus-configs.xml | 2 +- .../openstacktelemetry/impl/rest-configs.xml | 2 +- .../DefaultGrpcTelemetryConfigTest.java | 3 +- .../DefaultInfluxDbTelemetryConfigTest.java | 3 +- .../DefaultKafkaTelemetryConfigTest.java | 3 +- .../DefaultPrometheusTelemetryConfigTest.java | 3 +- .../DefaultRestTelemetryConfigTest.java | 3 +- .../DistributedTelemetryConfigStoreTest.java | 10 +- .../codec/rest/TelemetryConfigJsonCodec.java | 25 +++-- .../OpenstackTelemetryConfigWebResource.java | 6 +- .../codec/rest/TelemetryConfigCodecTest.java | 8 +- .../rest/TelemetryConfigJsonMatcher.java | 12 +-- ...enstackTelemetryConfigWebResourceTest.java | 5 +- .../codec/rest/TelemetryConfig.json | 2 +- 34 files changed, 371 insertions(+), 172 deletions(-) diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/DefaultTelemetryConfig.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/DefaultTelemetryConfig.java index 02c1e84171..cbad8a0227 100644 --- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/DefaultTelemetryConfig.java +++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/DefaultTelemetryConfig.java @@ -41,7 +41,7 @@ public final class DefaultTelemetryConfig implements TelemetryConfig { private final String manufacturer; private final String swVersion; - private final boolean enabled; + private final Status status; private final Map properties; @@ -53,20 +53,20 @@ public final class DefaultTelemetryConfig implements TelemetryConfig { * @param parents optional parent configurations * @param manufacturer off-platform application manufacturer * @param swVersion off-platform application software version - * @param enabled service enable flag + * @param status service status * @param properties properties for telemetry configuration */ public DefaultTelemetryConfig(String name, ConfigType type, List parents, String manufacturer, String swVersion, - boolean enabled, Map properties) { + Status status, Map properties) { this.name = checkNotNull(name, "Name cannot be null"); this.type = checkNotNull(type, "type cannot be null"); this.parents = parents == null ? ImmutableList.of() : ImmutableList.copyOf(parents); this.manufacturer = checkNotNull(manufacturer, "Manufacturer cannot be null"); this.swVersion = checkNotNull(swVersion, "SW version cannot be null"); this.properties = copyOf(checkNotNull(properties, "Properties cannot be null")); - this.enabled = enabled; + this.status = checkNotNull(status, "status cannot be null"); } @Override @@ -99,8 +99,8 @@ public final class DefaultTelemetryConfig implements TelemetryConfig { } @Override - public boolean enabled() { - return enabled; + public Status status() { + return status; } @Override @@ -155,20 +155,20 @@ public final class DefaultTelemetryConfig implements TelemetryConfig { return new DefaultTelemetryConfig(name, type, !completeParents.isEmpty() ? completeParents : other.parents(), - manufacturer, swVersion, enabled, properties.build()); + manufacturer, swVersion, status, properties.build()); } @Override public TelemetryConfig updateProperties(Map properties) { return new DefaultTelemetryConfig(name, type, parents, manufacturer, - swVersion, enabled, properties); + swVersion, status, properties); } @Override - public TelemetryConfig updateEnabled(boolean enabled) { + public TelemetryConfig updateStatus(Status status) { return new DefaultTelemetryConfig(name, type, parents, manufacturer, - swVersion, enabled, properties); + swVersion, status, properties); } @Override @@ -189,7 +189,7 @@ public final class DefaultTelemetryConfig implements TelemetryConfig { .add("parents", parents) .add("manufacturer", manufacturer) .add("swVersion", swVersion) - .add("enabled", enabled) + .add("status", status) .add("properties", properties) .toString(); } 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 63e0c3fa3c..98b580d828 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 @@ -24,8 +24,9 @@ public interface TelemetryAdminService extends TelemetryService { * Prepares and launches the telemetry producer. * * @param name telemetry service name + * @return true if the service is successfully started, false otherwise */ - void start(String name); + boolean start(String name); /** * Terminates the telemetry producer. @@ -38,8 +39,9 @@ public interface TelemetryAdminService extends TelemetryService { * Restarts the telemetry producer. * * @param name telemetry service name + * @return true if the service is successfully restarted, false otherwise */ - void restart(String name); + boolean restart(String name); /** * Launches all telemetry services. 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 index 3f224379c5..f482026103 100644 --- 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 @@ -47,7 +47,11 @@ public class TelemetryConfigEvent /** * Signifies that a telemetry service is disabled. */ - SERVICE_DISABLED + SERVICE_DISABLED, + /** + * Signifies that a telemetry service in a pending status due to previous error. + */ + SERVICE_PENDING } /** 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 0e0b4b43b5..b76082009e 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 @@ -61,6 +61,28 @@ public interface TelemetryConfig extends Annotations { UNKNOWN } + enum Status { + /** + * Signifies that the service is in enable status. + */ + ENABLED, + + /** + * Signifies that the service is in disable status. + */ + DISABLED, + + /** + * Signifies that the service is in pending status. + */ + PENDING, + + /** + * Signifies that the service is in unknown status. + */ + UNKNOWN, + } + /** * Returns the telemetry configuration name. * @@ -98,11 +120,11 @@ public interface TelemetryConfig extends Annotations { String swVersion(); /** - * Returns the service enable flag. + * Returns the service status. * - * @return enable flag + * @return service status */ - boolean enabled(); + Status status(); /** * Returns the set of annotations as map of key/value properties. @@ -153,10 +175,10 @@ public interface TelemetryConfig extends Annotations { TelemetryConfig updateProperties(Map properties); /** - * Obtains the cloned instance with updated enabled value. + * Obtains the cloned instance with updated status. * - * @param enabled service flag + * @param status service status * @return a cloned instance */ - TelemetryConfig updateEnabled(boolean enabled); + TelemetryConfig updateStatus(Status status); } diff --git a/apps/openstacktelemetry/api/src/test/java/org/onosproject/openstacktelemetry/api/DefaultTelemetryConfigTest.java b/apps/openstacktelemetry/api/src/test/java/org/onosproject/openstacktelemetry/api/DefaultTelemetryConfigTest.java index 6734cfa785..8318edd299 100644 --- a/apps/openstacktelemetry/api/src/test/java/org/onosproject/openstacktelemetry/api/DefaultTelemetryConfigTest.java +++ b/apps/openstacktelemetry/api/src/test/java/org/onosproject/openstacktelemetry/api/DefaultTelemetryConfigTest.java @@ -26,6 +26,8 @@ import java.util.Map; import static org.junit.Assert.assertEquals; import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable; +import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.Status.DISABLED; +import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.Status.ENABLED; /** * Unit tests for DefaultTelemetryConfig class. @@ -56,8 +58,8 @@ public final class DefaultTelemetryConfigTest { private static final String PROP_2_VALUE_1 = "value21"; private static final String PROP_2_VALUE_2 = "value22"; - private static final boolean ENABLED_1 = true; - private static final boolean ENABLED_2 = false; + private static final TelemetryConfig.Status STATUS_1 = ENABLED; + private static final TelemetryConfig.Status STATUS_2 = DISABLED; private TelemetryConfig config1; private TelemetryConfig sameAsConfig1; @@ -74,11 +76,11 @@ public final class DefaultTelemetryConfigTest { PROP_2.put(PROP_2_KEY_2, PROP_2_VALUE_2); config1 = new DefaultTelemetryConfig(NAME_1, TYPE_1, null, - MANUFACTURER_1, SW_VERSION_1, ENABLED_1, PROP_1); + MANUFACTURER_1, SW_VERSION_1, STATUS_1, PROP_1); sameAsConfig1 = new DefaultTelemetryConfig(NAME_1, TYPE_1, null, - MANUFACTURER_1, SW_VERSION_1, ENABLED_1, PROP_1); + MANUFACTURER_1, SW_VERSION_1, STATUS_1, PROP_1); config2 = new DefaultTelemetryConfig(NAME_2, TYPE_2, null, - MANUFACTURER_2, SW_VERSION_2, ENABLED_2, PROP_2); + MANUFACTURER_2, SW_VERSION_2, STATUS_2, PROP_2); } /** @@ -111,6 +113,6 @@ public final class DefaultTelemetryConfigTest { assertEquals(config.manufacturer(), MANUFACTURER_1); assertEquals(config.swVersion(), SW_VERSION_1); assertEquals(config.properties(), PROP_1); - assertEquals(config.enabled(), ENABLED_1); + assertEquals(config.status(), STATUS_1); } } 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 992c93a22b..58da487c0b 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 @@ public class TelemetryConfigListCommand extends AbstractShellCommand { 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 13524d6d36..17ba3f387b 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.cli.AbstractShellCommand; 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 @@ public class TelemetryServiceDisableCommand extends AbstractShellCommand { @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 @@ public class TelemetryServiceDisableCommand extends AbstractShellCommand { 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 e484b488a3..7f5eb6be90 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.cli.AbstractShellCommand; 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 @@ public class TelemetryServiceEnableCommand extends AbstractShellCommand { @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 @@ public class TelemetryServiceEnableCommand extends AbstractShellCommand { 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 d066d859d0..c35cfdfb0f 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.C 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 @@ public class DistributedTelemetryConfigStore .register(DefaultTelemetryConfigProvider.class) .register(TelemetryConfig.class) .register(TelemetryConfig.ConfigType.class) + .register(TelemetryConfig.Status.class) .register(DefaultTelemetryConfig.class) .build(); @@ -210,15 +215,20 @@ public class DistributedTelemetryConfigStore 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 92e9aefd90..f5086494ad 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 java.util.Map; 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 @@ public class GrpcTelemetryManager implements GrpcTelemetryAdminService { } @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 @@ public class GrpcTelemetryManager implements GrpcTelemetryAdminService { } @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 38dd2b8af9..b7c3985a20 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 java.util.Set; 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 @@ public class InfluxDbTelemetryManager implements InfluxDbTelemetryAdminService { 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 @@ public class InfluxDbTelemetryManager implements InfluxDbTelemetryAdminService { 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 @@ public class InfluxDbTelemetryManager implements InfluxDbTelemetryAdminService { } @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 @@ public class InfluxDbTelemetryManager implements InfluxDbTelemetryAdminService { 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 06936cadac..bbd8527f7c 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 java.util.concurrent.Future; 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 @@ public class KafkaTelemetryManager implements KafkaTelemetryAdminService { } @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 @@ public class KafkaTelemetryManager implements KafkaTelemetryAdminService { 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 @@ public class KafkaTelemetryManager implements KafkaTelemetryAdminService { } @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 d49cdc0a03..3096eb976b 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.OpenstackTelemetryService; 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.List; 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 @@ public class OpenstackTelemetryManager implements OpenstackTelemetryService { private final Logger log = LoggerFactory.getLogger(getClass()); @Reference(cardinality = ReferenceCardinality.MANDATORY) - protected TelemetryConfigService telemetryConfigService; + protected TelemetryConfigAdminService telemetryConfigService; private List telemetryServices = Lists.newArrayList(); private InternalTelemetryConfigListener @@ -156,7 +157,12 @@ public class OpenstackTelemetryManager implements OpenstackTelemetryService { 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 3ccc02ea1f..9f63b1d387 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 java.util.Set; 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 @@ public class PrometheusTelemetryManager implements PrometheusTelemetryAdminServi } } - 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 @@ public class PrometheusTelemetryManager implements PrometheusTelemetryAdminServi 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 @@ public class PrometheusTelemetryManager implements PrometheusTelemetryAdminServi } @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 f5641bd3ac..e73a724357 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 java.util.Set; 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 @@ public class RestTelemetryManager implements RestTelemetryAdminService { } @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 @@ public class RestTelemetryManager implements RestTelemetryAdminService { 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 @@ public class RestTelemetryManager implements RestTelemetryAdminService { } @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 9832ad3801..bb8b305ed6 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 @@ public class TelemetryConfigManager .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 c9c6e9f90d..d382526b33 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.Conf 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 @@ public class XmlTelemetryConfigLoader { 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 configs = Maps.newHashMap(); @@ -148,9 +145,9 @@ public class XmlTelemetryConfigLoader { 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 @@ public class XmlTelemetryConfigLoader { } 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 @@ public class XmlTelemetryConfigLoader { return PROMETHEUS; case "UNKNOWN": default: - return UNKNOWN; + return TelemetryConfig.ConfigType.UNKNOWN; } } @@ -224,4 +221,17 @@ public class XmlTelemetryConfigLoader { 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 39b1fdbeb0..afb7365a82 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 com.google.common.base.Strings; 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 @@ public final class OpenstackTelemetryUtil { 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 @@ public final class OpenstackTelemetryUtil { 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; + } } diff --git a/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/influxdb-configs.xml b/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/influxdb-configs.xml index cf3729aa3f..75096ba6d1 100644 --- a/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/influxdb-configs.xml +++ b/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/influxdb-configs.xml @@ -22,13 +22,13 @@ onos + swVersion="1.0" extends="influxdb" status="disabled"> ost sonaflow true + swVersion="1.0" extends="influxdb" status="disabled"> ost2 sonaflow true diff --git a/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/kafka-configs.xml b/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/kafka-configs.xml index 48623b6621..e33b7f0b40 100644 --- a/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/kafka-configs.xml +++ b/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/kafka-configs.xml @@ -21,7 +21,7 @@ 0 + swVersion="1.0" extends="kafka" status="disabled"> 16384 1 33554432 diff --git a/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/prometheus-configs.xml b/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/prometheus-configs.xml index 0459f6a61c..af93d404f8 100644 --- a/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/prometheus-configs.xml +++ b/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/prometheus-configs.xml @@ -21,6 +21,6 @@ + swVersion="1.0" extends="prometheus" status="disabled"> \ No newline at end of file diff --git a/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/rest-configs.xml b/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/rest-configs.xml index ca1dc574be..6364049e92 100644 --- a/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/rest-configs.xml +++ b/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/rest-configs.xml @@ -21,7 +21,7 @@ application/json application/json - + telemetry POST diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultGrpcTelemetryConfigTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultGrpcTelemetryConfigTest.java index 89fc1d0533..e4dc795d08 100644 --- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultGrpcTelemetryConfigTest.java +++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultGrpcTelemetryConfigTest.java @@ -31,6 +31,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable; 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.ADDRESS; import static org.onosproject.openstacktelemetry.config.DefaultGrpcTelemetryConfig.MAX_INBOUND_MSG_SIZE; import static org.onosproject.openstacktelemetry.config.DefaultGrpcTelemetryConfig.PORT; @@ -146,7 +147,7 @@ public final class DefaultGrpcTelemetryConfigTest { props.put(MAX_INBOUND_MSG_SIZE, String.valueOf(MSG_SIZE_1)); props.put(USE_PLAINTEXT, String.valueOf(USE_PLAIN_TEXT_1)); TelemetryConfig config = new DefaultTelemetryConfig(DUMMY, GRPC, - ImmutableList.of(), DUMMY, DUMMY, false, props); + ImmutableList.of(), DUMMY, DUMMY, ENABLED, props); GrpcTelemetryConfig grpcConfig = fromTelemetryConfig(config); assertThat(grpcConfig.address(), is(IP_ADDRESS_1)); diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultInfluxDbTelemetryConfigTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultInfluxDbTelemetryConfigTest.java index 9f8401536c..699f410ce1 100644 --- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultInfluxDbTelemetryConfigTest.java +++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultInfluxDbTelemetryConfigTest.java @@ -31,6 +31,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable; import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.INFLUXDB; +import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.Status.DISABLED; import static org.onosproject.openstacktelemetry.config.DefaultInfluxDbTelemetryConfig.ADDRESS; import static org.onosproject.openstacktelemetry.config.DefaultInfluxDbTelemetryConfig.DATABASE; import static org.onosproject.openstacktelemetry.config.DefaultInfluxDbTelemetryConfig.ENABLE_BATCH; @@ -174,7 +175,7 @@ public final class DefaultInfluxDbTelemetryConfigTest { props.put(MEASUREMENT, MEASUREMENT_1); TelemetryConfig config = new DefaultTelemetryConfig(DUMMY, INFLUXDB, - ImmutableList.of(), DUMMY, DUMMY, false, props); + ImmutableList.of(), DUMMY, DUMMY, DISABLED, props); InfluxDbTelemetryConfig influxDbConfig = fromTelemetryConfig(config); assertThat(influxDbConfig.address(), is(IP_ADDRESS_1)); diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultKafkaTelemetryConfigTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultKafkaTelemetryConfigTest.java index 999bcf16db..d70626ccc0 100644 --- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultKafkaTelemetryConfigTest.java +++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultKafkaTelemetryConfigTest.java @@ -31,6 +31,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable; import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.KAFKA; +import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.Status.DISABLED; import static org.onosproject.openstacktelemetry.config.DefaultKafkaTelemetryConfig.ADDRESS; import static org.onosproject.openstacktelemetry.config.DefaultKafkaTelemetryConfig.BATCH_SIZE; import static org.onosproject.openstacktelemetry.config.DefaultKafkaTelemetryConfig.CODEC; @@ -215,7 +216,7 @@ public final class DefaultKafkaTelemetryConfigTest { props.put(CODEC, CODEC_1); TelemetryConfig config = new DefaultTelemetryConfig(DUMMY, KAFKA, - ImmutableList.of(), DUMMY, DUMMY, false, props); + ImmutableList.of(), DUMMY, DUMMY, DISABLED, props); KafkaTelemetryConfig kafkaConfig = fromTelemetryConfig(config); assertThat(kafkaConfig.address(), is(IP_ADDRESS_1)); diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultPrometheusTelemetryConfigTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultPrometheusTelemetryConfigTest.java index 4a89b74a74..1ebd53dc59 100644 --- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultPrometheusTelemetryConfigTest.java +++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultPrometheusTelemetryConfigTest.java @@ -31,6 +31,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable; import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.PROMETHEUS; +import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.Status.DISABLED; import static org.onosproject.openstacktelemetry.config.DefaultPrometheusTelemetryConfig.ADDRESS; import static org.onosproject.openstacktelemetry.config.DefaultPrometheusTelemetryConfig.PORT; import static org.onosproject.openstacktelemetry.config.DefaultPrometheusTelemetryConfig.fromTelemetryConfig; @@ -128,7 +129,7 @@ public class DefaultPrometheusTelemetryConfigTest { props.put(PORT, String.valueOf(PORT_1)); TelemetryConfig config = new DefaultTelemetryConfig(DUMMY, PROMETHEUS, - ImmutableList.of(), DUMMY, DUMMY, false, props); + ImmutableList.of(), DUMMY, DUMMY, DISABLED, props); PrometheusTelemetryConfig prometheusConfig = fromTelemetryConfig(config); assertThat(prometheusConfig.address(), is(IP_ADDRESS_1)); diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultRestTelemetryConfigTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultRestTelemetryConfigTest.java index 28b84650ec..0cac7aefe4 100644 --- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultRestTelemetryConfigTest.java +++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultRestTelemetryConfigTest.java @@ -31,6 +31,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable; import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.REST; +import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.Status.DISABLED; import static org.onosproject.openstacktelemetry.config.DefaultRestTelemetryConfig.ADDRESS; import static org.onosproject.openstacktelemetry.config.DefaultRestTelemetryConfig.ENDPOINT; import static org.onosproject.openstacktelemetry.config.DefaultRestTelemetryConfig.METHOD; @@ -161,7 +162,7 @@ public final class DefaultRestTelemetryConfigTest { props.put(RESPONSE_MEDIA_TYPE, RESPONSE_MEDIA_TYPE_1); TelemetryConfig config = new DefaultTelemetryConfig(DUMMY, REST, - ImmutableList.of(), DUMMY, DUMMY, false, props); + ImmutableList.of(), DUMMY, DUMMY, DISABLED, props); RestTelemetryConfig restConfig = DefaultRestTelemetryConfig.fromTelemetryConfig(config); assertThat(restConfig.address(), is(IP_ADDRESS_1)); assertThat(restConfig.port(), is(PORT_1)); diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DistributedTelemetryConfigStoreTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DistributedTelemetryConfigStoreTest.java index 85f6b413f9..4b03da8949 100644 --- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DistributedTelemetryConfigStoreTest.java +++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DistributedTelemetryConfigStoreTest.java @@ -32,6 +32,8 @@ import java.util.Map; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.Status.DISABLED; +import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.Status.ENABLED; /** * Distributed TelemetryConfig store test suite. @@ -62,8 +64,8 @@ public class DistributedTelemetryConfigStoreTest { private static final String PROP_2_VALUE_1 = "value21"; private static final String PROP_2_VALUE_2 = "value22"; - private static final boolean ENABLED_1 = true; - private static final boolean ENABLED_2 = false; + private static final TelemetryConfig.Status STATUS_1 = ENABLED; + private static final TelemetryConfig.Status STATUS_2 = DISABLED; private TelemetryConfig config1; private TelemetryConfig config2; @@ -132,8 +134,8 @@ public class DistributedTelemetryConfigStoreTest { PROP_2.put(PROP_2_KEY_2, PROP_2_VALUE_2); config1 = new DefaultTelemetryConfig(NAME_1, TYPE_1, null, - MANUFACTURER_1, SW_VERSION_1, ENABLED_1, PROP_1); + MANUFACTURER_1, SW_VERSION_1, STATUS_1, PROP_1); config2 = new DefaultTelemetryConfig(NAME_2, TYPE_2, null, - MANUFACTURER_2, SW_VERSION_2, ENABLED_2, PROP_2); + MANUFACTURER_2, SW_VERSION_2, STATUS_2, PROP_2); } } diff --git a/apps/openstacktelemetry/web/src/main/java/org/onosproject/openstacktelemetry/codec/rest/TelemetryConfigJsonCodec.java b/apps/openstacktelemetry/web/src/main/java/org/onosproject/openstacktelemetry/codec/rest/TelemetryConfigJsonCodec.java index 8c0a6e3e9e..d609552d43 100644 --- a/apps/openstacktelemetry/web/src/main/java/org/onosproject/openstacktelemetry/codec/rest/TelemetryConfigJsonCodec.java +++ b/apps/openstacktelemetry/web/src/main/java/org/onosproject/openstacktelemetry/codec/rest/TelemetryConfigJsonCodec.java @@ -40,7 +40,7 @@ public final class TelemetryConfigJsonCodec extends JsonCodec { private static final String TYPE = "type"; private static final String MANUFACTURER = "manufacturer"; private static final String SW_VERSION = "swVersion"; - private static final String ENABLED = "enabled"; + private static final String STATUS = "status"; private static final String PROPS = "props"; private static final String KEY = "key"; private static final String VALUE = "value"; @@ -56,7 +56,7 @@ public final class TelemetryConfigJsonCodec extends JsonCodec { .put(TYPE, config.type().name()) .put(MANUFACTURER, config.manufacturer()) .put(SW_VERSION, config.swVersion()) - .put(ENABLED, config.enabled()); + .put(STATUS, config.status().name()); Map props = config.properties(); ArrayNode propsJson = context.mapper().createArrayNode(); @@ -94,9 +94,9 @@ public final class TelemetryConfigJsonCodec extends JsonCodec { String swVersion = nullIsIllegal(json.get(SW_VERSION), SW_VERSION + MISSING_MESSAGE).asText(); - // parse enabled flag - boolean enabled = nullIsIllegal(json.get(ENABLED), - ENABLED + MISSING_MESSAGE).asBoolean(); + // parse status + TelemetryConfig.Status status = status(nullIsIllegal(json.get(STATUS), + STATUS + MISSING_MESSAGE).asText()); JsonNode propertiesJson = json.get(PROPS); Map properties = Maps.newConcurrentMap(); @@ -109,7 +109,20 @@ public final class TelemetryConfigJsonCodec extends JsonCodec { } return new DefaultTelemetryConfig(name, configType, - ImmutableList.of(), manufacturer, swVersion, enabled, properties); + ImmutableList.of(), manufacturer, swVersion, status, properties); + } + + 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; + } } private TelemetryConfig.ConfigType configType(String type) { diff --git a/apps/openstacktelemetry/web/src/main/java/org/onosproject/openstacktelemetry/web/OpenstackTelemetryConfigWebResource.java b/apps/openstacktelemetry/web/src/main/java/org/onosproject/openstacktelemetry/web/OpenstackTelemetryConfigWebResource.java index 7484d04f6c..1ae30e0975 100644 --- a/apps/openstacktelemetry/web/src/main/java/org/onosproject/openstacktelemetry/web/OpenstackTelemetryConfigWebResource.java +++ b/apps/openstacktelemetry/web/src/main/java/org/onosproject/openstacktelemetry/web/OpenstackTelemetryConfigWebResource.java @@ -38,6 +38,8 @@ import java.util.Map; import static org.onlab.util.Tools.nullIsIllegal; import static org.onlab.util.Tools.nullIsNotFound; +import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.Status.DISABLED; +import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.Status.ENABLED; /** * Handles REST API call of openstack telemetry configuration. @@ -175,7 +177,7 @@ public class OpenstackTelemetryConfigWebResource extends AbstractWebResource { log.warn("There is no config found to enable for {}", configName); return Response.notModified().build(); } else { - TelemetryConfig updatedConfig = config.updateEnabled(true); + TelemetryConfig updatedConfig = config.updateStatus(ENABLED); configService.updateTelemetryConfig(updatedConfig); return Response.ok().build(); } @@ -204,7 +206,7 @@ public class OpenstackTelemetryConfigWebResource extends AbstractWebResource { log.warn("There is no config found to disable for {}", configName); return Response.notModified().build(); } else { - TelemetryConfig updatedConfig = config.updateEnabled(false); + TelemetryConfig updatedConfig = config.updateStatus(DISABLED); configService.updateTelemetryConfig(updatedConfig); return Response.ok().build(); } diff --git a/apps/openstacktelemetry/web/src/test/java/org/onosproject/openstacktelemetry/codec/rest/TelemetryConfigCodecTest.java b/apps/openstacktelemetry/web/src/test/java/org/onosproject/openstacktelemetry/codec/rest/TelemetryConfigCodecTest.java index 626aa02cb0..70a1ea9450 100644 --- a/apps/openstacktelemetry/web/src/test/java/org/onosproject/openstacktelemetry/codec/rest/TelemetryConfigCodecTest.java +++ b/apps/openstacktelemetry/web/src/test/java/org/onosproject/openstacktelemetry/codec/rest/TelemetryConfigCodecTest.java @@ -36,13 +36,13 @@ import java.util.HashMap; import java.util.Map; import static junit.framework.TestCase.assertEquals; -import static junit.framework.TestCase.assertTrue; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.notNullValue; import static org.onosproject.net.NetTestTools.APP_ID; +import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.Status.ENABLED; import static org.onosproject.openstacktelemetry.codec.rest.TelemetryConfigJsonMatcher.matchesTelemetryConfig; /** @@ -80,14 +80,14 @@ public class TelemetryConfigCodecTest { TelemetryConfig.ConfigType type = TelemetryConfig.ConfigType.GRPC; String manufacturer = "grpc.io"; String swVersion = "1.0"; - boolean enabled = true; + TelemetryConfig.Status status = ENABLED; Map properties = Maps.newConcurrentMap(); properties.put("key1", "value1"); properties.put("key2", "value2"); TelemetryConfig config = new DefaultTelemetryConfig(name, type, - ImmutableList.of(), manufacturer, swVersion, enabled, properties); + ImmutableList.of(), manufacturer, swVersion, status, properties); ObjectNode configJson = telemetryConfigCodec.encode(config, context); assertThat(configJson, matchesTelemetryConfig(config)); @@ -104,7 +104,7 @@ public class TelemetryConfigCodecTest { assertEquals(config.type().name(), "GRPC"); assertEquals(config.manufacturer(), "grpc.io"); assertEquals(config.swVersion(), "1.0"); - assertTrue(config.enabled()); + assertEquals(config.status().name(), "ENABLED"); config.properties().forEach((k, v) -> { if (k.equals("address")) { diff --git a/apps/openstacktelemetry/web/src/test/java/org/onosproject/openstacktelemetry/codec/rest/TelemetryConfigJsonMatcher.java b/apps/openstacktelemetry/web/src/test/java/org/onosproject/openstacktelemetry/codec/rest/TelemetryConfigJsonMatcher.java index 9bc50a20aa..7f6ff95664 100644 --- a/apps/openstacktelemetry/web/src/test/java/org/onosproject/openstacktelemetry/codec/rest/TelemetryConfigJsonMatcher.java +++ b/apps/openstacktelemetry/web/src/test/java/org/onosproject/openstacktelemetry/codec/rest/TelemetryConfigJsonMatcher.java @@ -32,7 +32,7 @@ public final class TelemetryConfigJsonMatcher extends TypeSafeDiagnosingMatcher< private static final String TYPE = "type"; private static final String MANUFACTURER = "manufacturer"; private static final String SW_VERSION = "swVersion"; - private static final String ENABLED = "enabled"; + private static final String STATUS = "status"; private static final String PROPS = "props"; private static final String KEY = "key"; private static final String VALUE = "value"; @@ -76,11 +76,11 @@ public final class TelemetryConfigJsonMatcher extends TypeSafeDiagnosingMatcher< return false; } - // check enabled - JsonNode jsonEnabled = jsonNode.get(ENABLED); - boolean enabled = telemetryConfig.enabled(); - if (jsonEnabled == null || jsonEnabled.asBoolean() != enabled) { - description.appendText("Enabled was " + jsonEnabled); + // check status + JsonNode jsonStatus = jsonNode.get(STATUS); + TelemetryConfig.Status status = telemetryConfig.status(); + if (jsonStatus == null || !jsonStatus.asText().equals(status.name())) { + description.appendText("Enabled was " + jsonStatus); return false; } diff --git a/apps/openstacktelemetry/web/src/test/java/org/onosproject/openstacktelemetry/web/OpenstackTelemetryConfigWebResourceTest.java b/apps/openstacktelemetry/web/src/test/java/org/onosproject/openstacktelemetry/web/OpenstackTelemetryConfigWebResourceTest.java index ff027bc910..d36b6e62bf 100644 --- a/apps/openstacktelemetry/web/src/test/java/org/onosproject/openstacktelemetry/web/OpenstackTelemetryConfigWebResourceTest.java +++ b/apps/openstacktelemetry/web/src/test/java/org/onosproject/openstacktelemetry/web/OpenstackTelemetryConfigWebResourceTest.java @@ -39,6 +39,7 @@ import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.GRPC; +import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.Status.ENABLED; /** * Unit tests for openstack telemetry config REST API. @@ -60,7 +61,7 @@ public class OpenstackTelemetryConfigWebResourceTest extends ResourceTest { private static final String PROP_VALUE_1 = "value11"; private static final String PROP_VALUE_2 = "value12"; - private static final boolean ENABLED = true; + private static final TelemetryConfig.Status STATUS = ENABLED; private final TelemetryConfigAdminService mockConfigAdminService = createMock(TelemetryConfigAdminService.class); @@ -90,7 +91,7 @@ public class OpenstackTelemetryConfigWebResourceTest extends ResourceTest { PROP.put(PROP_KEY_2, PROP_VALUE_2); telemetryConfig = new DefaultTelemetryConfig(NAME, TYPE, null, - MANUFACTURER, SW_VERSION, ENABLED, PROP); + MANUFACTURER, SW_VERSION, STATUS, PROP); } /** diff --git a/apps/openstacktelemetry/web/src/test/resources/org/onosproject/openstacktelemetry/codec/rest/TelemetryConfig.json b/apps/openstacktelemetry/web/src/test/resources/org/onosproject/openstacktelemetry/codec/rest/TelemetryConfig.json index 681cad3592..314d0286fc 100644 --- a/apps/openstacktelemetry/web/src/test/resources/org/onosproject/openstacktelemetry/codec/rest/TelemetryConfig.json +++ b/apps/openstacktelemetry/web/src/test/resources/org/onosproject/openstacktelemetry/codec/rest/TelemetryConfig.json @@ -3,7 +3,7 @@ "type": "GRPC", "manufacturer": "grpc.io", "swVersion": "1.0", - "enabled": true, + "status": "enabled", "props": [ { "key": "address",