Enable setting log level from command line
[dcaegen2/collectors/hv-ves.git] / sources / hv-collector-main / src / main / kotlin / org / onap / dcae / collectors / veshv / main / ArgVesHvConfiguration.kt
index ae87f1c..2311b2b 100644 (file)
@@ -21,6 +21,7 @@ package org.onap.dcae.collectors.veshv.main
 
 import arrow.core.Option
 import arrow.core.fix
+import arrow.core.getOrElse
 import arrow.instances.option.monad.monad
 import arrow.typeclasses.binding
 import org.apache.commons.cli.CommandLine
@@ -30,7 +31,7 @@ import org.onap.dcae.collectors.veshv.model.ConfigurationProviderParams
 import org.onap.dcae.collectors.veshv.model.KafkaConfiguration
 import org.onap.dcae.collectors.veshv.model.ServerConfiguration
 import org.onap.dcae.collectors.veshv.ssl.boundary.createSecurityConfiguration
-import org.onap.dcae.collectors.veshv.utils.commandline.ArgBasedConfiguration
+import org.onap.dcae.collectors.veshv.utils.commandline.*
 import org.onap.dcae.collectors.veshv.utils.commandline.CommandLineOption.CONSUL_CONFIG_URL
 import org.onap.dcae.collectors.veshv.utils.commandline.CommandLineOption.KAFKA_SERVERS
 import org.onap.dcae.collectors.veshv.utils.commandline.CommandLineOption.CONSUL_FIRST_REQUEST_DELAY
@@ -45,73 +46,90 @@ import org.onap.dcae.collectors.veshv.utils.commandline.CommandLineOption.MAXIMU
 import org.onap.dcae.collectors.veshv.utils.commandline.CommandLineOption.SSL_DISABLE
 import org.onap.dcae.collectors.veshv.utils.commandline.CommandLineOption.TRUST_STORE_FILE
 import org.onap.dcae.collectors.veshv.utils.commandline.CommandLineOption.TRUST_STORE_PASSWORD
-import org.onap.dcae.collectors.veshv.utils.commandline.hasOption
-import org.onap.dcae.collectors.veshv.utils.commandline.intValue
-import org.onap.dcae.collectors.veshv.utils.commandline.longValue
-import org.onap.dcae.collectors.veshv.utils.commandline.stringValue
+import org.onap.dcae.collectors.veshv.utils.commandline.CommandLineOption.LOG_LEVEL
+import org.onap.dcae.collectors.veshv.utils.logging.LogLevel
+import org.onap.dcae.collectors.veshv.utils.logging.Logger
 import java.net.InetSocketAddress
 import java.time.Duration
 
+
 internal class ArgVesHvConfiguration : ArgBasedConfiguration<ServerConfiguration>(DefaultParser()) {
     override val cmdLineOptionsList = listOf(
-            KAFKA_SERVERS,
-            HEALTH_CHECK_API_PORT,
-            LISTEN_PORT,
-            CONSUL_CONFIG_URL,
-            CONSUL_FIRST_REQUEST_DELAY,
-            CONSUL_REQUEST_INTERVAL,
-            SSL_DISABLE,
-            KEY_STORE_FILE,
-            KEY_STORE_PASSWORD,
-            TRUST_STORE_FILE,
-            TRUST_STORE_PASSWORD,
-            IDLE_TIMEOUT_SEC,
-            MAXIMUM_PAYLOAD_SIZE_BYTES,
-            DUMMY_MODE
+        KAFKA_SERVERS,
+        HEALTH_CHECK_API_PORT,
+        LISTEN_PORT,
+        CONSUL_CONFIG_URL,
+        CONSUL_FIRST_REQUEST_DELAY,
+        CONSUL_REQUEST_INTERVAL,
+        SSL_DISABLE,
+        KEY_STORE_FILE,
+        KEY_STORE_PASSWORD,
+        TRUST_STORE_FILE,
+        TRUST_STORE_PASSWORD,
+        IDLE_TIMEOUT_SEC,
+        MAXIMUM_PAYLOAD_SIZE_BYTES,
+        DUMMY_MODE,
+        LOG_LEVEL
     )
 
     override fun getConfiguration(cmdLine: CommandLine): Option<ServerConfiguration> =
-            Option.monad().binding {
-                val healthCheckApiPort = cmdLine.intValue(
-                        HEALTH_CHECK_API_PORT,
-                        DefaultValues.HEALTH_CHECK_API_PORT
-                )
-                val kafkaServers = cmdLine.stringValue(KAFKA_SERVERS).bind()
-                val listenPort = cmdLine.intValue(LISTEN_PORT).bind()
-                val idleTimeoutSec = cmdLine.longValue(IDLE_TIMEOUT_SEC, DefaultValues.IDLE_TIMEOUT_SEC)
-                val maxPayloadSizeBytes = cmdLine.intValue(MAXIMUM_PAYLOAD_SIZE_BYTES,
-                        DefaultValues.MAX_PAYLOAD_SIZE_BYTES)
-                val dummyMode = cmdLine.hasOption(DUMMY_MODE)
-                val security = createSecurityConfiguration(cmdLine).bind()
-                val configurationProviderParams = createConfigurationProviderParams(cmdLine).bind()
-                ServerConfiguration(
-                        serverListenAddress = InetSocketAddress(listenPort),
-                        kafkaConfiguration = KafkaConfiguration(kafkaServers),
-                        healthCheckApiListenAddress = InetSocketAddress(healthCheckApiPort),
-                        configurationProviderParams = configurationProviderParams,
-                        securityConfiguration = security,
-                        idleTimeout = Duration.ofSeconds(idleTimeoutSec),
-                        maximumPayloadSizeBytes = maxPayloadSizeBytes,
-                        dummyMode = dummyMode)
-            }.fix()
+        Option.monad().binding {
+            val healthCheckApiPort = cmdLine.intValue(
+                HEALTH_CHECK_API_PORT,
+                DefaultValues.HEALTH_CHECK_API_PORT
+            )
+            val kafkaServers = cmdLine.stringValue(KAFKA_SERVERS).bind()
+            val listenPort = cmdLine.intValue(LISTEN_PORT).bind()
+            val idleTimeoutSec = cmdLine.longValue(IDLE_TIMEOUT_SEC, DefaultValues.IDLE_TIMEOUT_SEC)
+            val maxPayloadSizeBytes = cmdLine.intValue(
+                MAXIMUM_PAYLOAD_SIZE_BYTES,
+                DefaultValues.MAX_PAYLOAD_SIZE_BYTES
+            )
+            val dummyMode = cmdLine.hasOption(DUMMY_MODE)
+            val security = createSecurityConfiguration(cmdLine).bind()
+            val logLevel = cmdLine.stringValue(LOG_LEVEL, DefaultValues.LOG_LEVEL)
+            val configurationProviderParams = createConfigurationProviderParams(cmdLine).bind()
+            ServerConfiguration(
+                serverListenAddress = InetSocketAddress(listenPort),
+                kafkaConfiguration = KafkaConfiguration(kafkaServers),
+                healthCheckApiListenAddress = InetSocketAddress(healthCheckApiPort),
+                configurationProviderParams = configurationProviderParams,
+                securityConfiguration = security,
+                idleTimeout = Duration.ofSeconds(idleTimeoutSec),
+                maximumPayloadSizeBytes = maxPayloadSizeBytes,
+                dummyMode = dummyMode,
+                logLevel = determineLogLevel(logLevel)
+            )
+        }.fix()
+
 
     private fun createConfigurationProviderParams(cmdLine: CommandLine): Option<ConfigurationProviderParams> =
-            Option.monad().binding {
-                val configUrl = cmdLine.stringValue(CONSUL_CONFIG_URL).bind()
-                val firstRequestDelay = cmdLine.longValue(
-                        CONSUL_FIRST_REQUEST_DELAY,
-                        DefaultValues.CONSUL_FIRST_REQUEST_DELAY
-                )
-                val requestInterval = cmdLine.longValue(
-                        CONSUL_REQUEST_INTERVAL,
-                        DefaultValues.CONSUL_REQUEST_INTERVAL
-                )
-                ConfigurationProviderParams(
-                        configUrl,
-                        Duration.ofSeconds(firstRequestDelay),
-                        Duration.ofSeconds(requestInterval)
-                )
-            }.fix()
+        Option.monad().binding {
+            val configUrl = cmdLine.stringValue(CONSUL_CONFIG_URL).bind()
+            val firstRequestDelay = cmdLine.longValue(
+                CONSUL_FIRST_REQUEST_DELAY,
+                DefaultValues.CONSUL_FIRST_REQUEST_DELAY
+            )
+            val requestInterval = cmdLine.longValue(
+                CONSUL_REQUEST_INTERVAL,
+                DefaultValues.CONSUL_REQUEST_INTERVAL
+            )
+            ConfigurationProviderParams(
+                configUrl,
+                Duration.ofSeconds(firstRequestDelay),
+                Duration.ofSeconds(requestInterval)
+            )
+        }.fix()
+
+    private fun determineLogLevel(logLevel: String) = LogLevel.optionFromString(logLevel)
+        .getOrElse {
+            logger.warn {
+                "Failed to parse $logLevel as $LOG_LEVEL command line. " +
+                        "Using default log level (${DefaultValues.LOG_LEVEL})"
+            }
+            LogLevel.valueOf(DefaultValues.LOG_LEVEL)
+        }
+
 
     internal object DefaultValues {
         const val HEALTH_CHECK_API_PORT = 6060
@@ -119,5 +137,10 @@ internal class ArgVesHvConfiguration : ArgBasedConfiguration<ServerConfiguration
         const val CONSUL_REQUEST_INTERVAL = 5L
         const val IDLE_TIMEOUT_SEC = 60L
         const val MAX_PAYLOAD_SIZE_BYTES = WireFrameMessage.DEFAULT_MAX_PAYLOAD_SIZE_BYTES
+        val LOG_LEVEL = LogLevel.INFO.name
+    }
+
+    companion object {
+        private val logger = Logger(ArgVesHvConfiguration::class)
     }
 }