Read HV-VES healthcheck api port from cmd line 77/83377/10
authorkjaniak <kornel.janiak@nokia.com>
Thu, 28 Mar 2019 09:43:59 +0000 (10:43 +0100)
committerKornel Janiak <kornel.janiak@nokia.com>
Fri, 29 Mar 2019 08:17:14 +0000 (08:17 +0000)
Change-Id: I6b4680a62512ef6ba15a0454e109b19619a997a6
Issue-ID: DCAEGEN2-1364
Signed-off-by: kjaniak <kornel.janiak@nokia.com>
sources/hv-collector-commandline/src/main/kotlin/org/onap/dcae/collectors/veshv/commandline/ArgBasedConfiguration.kt
sources/hv-collector-configuration/src/main/kotlin/org/onap/dcae/collectors/veshv/config/api/ConfigurationModule.kt
sources/hv-collector-configuration/src/main/kotlin/org/onap/dcae/collectors/veshv/config/impl/ArgHvVesConfiguration.kt [deleted file]
sources/hv-collector-configuration/src/main/kotlin/org/onap/dcae/collectors/veshv/config/impl/HvVesCommandLineParser.kt [new file with mode: 0644]
sources/hv-collector-configuration/src/test/kotlin/org/onap/dcae/collectors/veshv/config/impl/HvVesCommandLineParserTest.kt [moved from sources/hv-collector-configuration/src/test/kotlin/org/onap/dcae/collectors/veshv/config/impl/ArgHvVesConfigurationTest.kt with 56% similarity]
sources/hv-collector-main/src/main/kotlin/org/onap/dcae/collectors/veshv/main/main.kt
sources/hv-collector-main/src/main/kotlin/org/onap/dcae/collectors/veshv/main/servers/HealthCheckServer.kt

index 93d42f9..d8c83ea 100644 (file)
@@ -26,9 +26,6 @@ import arrow.core.flatMap
 import org.apache.commons.cli.CommandLine
 import org.apache.commons.cli.CommandLineParser
 import org.apache.commons.cli.Options
-import java.io.File
-import java.nio.file.Path
-import java.nio.file.Paths
 
 abstract class ArgBasedConfiguration<T>(private val parser: CommandLineParser) {
     abstract val cmdLineOptionsList: List<CommandLineOption>
index efe0aa8..dd1b171 100644 (file)
@@ -22,7 +22,7 @@ package org.onap.dcae.collectors.veshv.config.api
 import org.onap.dcae.collectors.veshv.config.api.model.HvVesConfiguration
 import org.onap.dcae.collectors.veshv.config.api.model.MissingArgumentException
 import org.onap.dcae.collectors.veshv.config.api.model.ValidationException
-import org.onap.dcae.collectors.veshv.config.impl.ArgHvVesConfiguration
+import org.onap.dcae.collectors.veshv.config.impl.HvVesCommandLineParser
 import org.onap.dcae.collectors.veshv.config.impl.ConfigurationValidator
 import org.onap.dcae.collectors.veshv.config.impl.FileConfigurationReader
 import org.onap.dcae.collectors.veshv.utils.arrow.throwOnLeft
@@ -30,14 +30,16 @@ import reactor.core.publisher.Flux
 
 class ConfigurationModule {
 
-    private val cmd = ArgHvVesConfiguration()
+    private val cmd = HvVesCommandLineParser()
     private val configReader = FileConfigurationReader()
     private val configValidator = ConfigurationValidator()
 
     private lateinit var initialConfig: HvVesConfiguration
 
+    fun healthCheckPort(args: Array<String>): Int = cmd.getHealthcheckPort(args)
+
     fun hvVesConfigurationUpdates(args: Array<String>): Flux<HvVesConfiguration> =
-            Flux.just(cmd.parse(args))
+            Flux.just(cmd.getConfigurationFile(args))
                     .throwOnLeft { MissingArgumentException(it.message, it.cause) }
                     .map { it.reader().use(configReader::loadConfig) }
                     .map { configValidator.validate(it) }
diff --git a/sources/hv-collector-configuration/src/main/kotlin/org/onap/dcae/collectors/veshv/config/impl/ArgHvVesConfiguration.kt b/sources/hv-collector-configuration/src/main/kotlin/org/onap/dcae/collectors/veshv/config/impl/ArgHvVesConfiguration.kt
deleted file mode 100644 (file)
index 9587d5b..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * ============LICENSE_START=======================================================
- * dcaegen2-collectors-veshv
- * ================================================================================
- * Copyright (C) 2019 NOKIA
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-package org.onap.dcae.collectors.veshv.config.impl
-
-import arrow.core.Option
-import org.apache.commons.cli.CommandLine
-import org.apache.commons.cli.DefaultParser
-import org.onap.dcae.collectors.veshv.commandline.ArgBasedConfiguration
-import org.onap.dcae.collectors.veshv.commandline.CommandLineOption.CONFIGURATION_FILE
-import org.onap.dcae.collectors.veshv.commandline.stringValue
-import java.io.File
-
-internal class ArgHvVesConfiguration : ArgBasedConfiguration<File>(DefaultParser()) {
-    override val cmdLineOptionsList = listOf(CONFIGURATION_FILE)
-
-    override fun getConfiguration(cmdLine: CommandLine): Option<File> =
-            cmdLine.stringValue(CONFIGURATION_FILE).map(::File)
-
-}
diff --git a/sources/hv-collector-configuration/src/main/kotlin/org/onap/dcae/collectors/veshv/config/impl/HvVesCommandLineParser.kt b/sources/hv-collector-configuration/src/main/kotlin/org/onap/dcae/collectors/veshv/config/impl/HvVesCommandLineParser.kt
new file mode 100644 (file)
index 0000000..3e93a40
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * ============LICENSE_START=======================================================
+ * dcaegen2-collectors-veshv
+ * ================================================================================
+ * Copyright (C) 2019 NOKIA
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcae.collectors.veshv.config.impl
+
+import arrow.core.*
+import org.apache.commons.cli.CommandLine
+import org.apache.commons.cli.CommandLineParser
+import org.apache.commons.cli.DefaultParser
+import org.apache.commons.cli.Options
+import org.onap.dcae.collectors.veshv.commandline.CommandLineOption.CONFIGURATION_FILE
+import org.onap.dcae.collectors.veshv.commandline.CommandLineOption.HEALTH_CHECK_API_PORT
+import org.onap.dcae.collectors.veshv.commandline.WrongArgumentError
+import org.onap.dcae.collectors.veshv.commandline.intValue
+import org.onap.dcae.collectors.veshv.commandline.stringValue
+import org.onap.dcae.collectors.veshv.utils.logging.Logger
+import java.io.File
+
+internal class HvVesCommandLineParser(private val parser: CommandLineParser = DefaultParser()) {
+    private val cmdLineOptionsList = listOf(CONFIGURATION_FILE, HEALTH_CHECK_API_PORT)
+
+    private lateinit var parsedCommandLine: CommandLine
+
+    fun getConfigurationFile(args: Array<out String>): Either<WrongArgumentError, File> =
+            parse(args) {
+                it.stringValue(CONFIGURATION_FILE).map(::File)
+            }.toEither {
+                WrongArgumentError(
+                        message = "Unexpected error when parsing command line arguments",
+                        cmdLineOptionsList = cmdLineOptionsList)
+            }
+
+    fun getHealthcheckPort(args: Array<out String>): Int =
+            parse(args) {
+                it.intValue(HEALTH_CHECK_API_PORT)
+            }.getOrElse {
+                logger.info { "Healthcheck port missing on command line," +
+                        " using default: $DEFAULT_HEALTHCHECK_PORT" }
+                DEFAULT_HEALTHCHECK_PORT
+            }
+
+    private fun <T> parse(args: Array<out String>, cmdLineMapper: (CommandLine) -> Option<T>) =
+            Try { parseIfNotInitialized(args) }
+                    .toOption()
+                    .flatMap(cmdLineMapper)
+
+    private fun parseIfNotInitialized(args: Array<out String>): CommandLine {
+        if (!this::parsedCommandLine.isInitialized) {
+            parsedCommandLine = parseArgumentsArray(args)
+        }
+        return parsedCommandLine
+    }
+
+    private fun parseArgumentsArray(args: Array<out String>) =
+            cmdLineOptionsList
+                    .map { it.option }
+                    .fold(Options(), Options::addOption)
+                    .let { parser.parse(it, args) }
+
+    companion object {
+        private const val DEFAULT_HEALTHCHECK_PORT: Int = 6060
+        private val logger = Logger(HvVesCommandLineParser::class)
+    }
+
+}
+
+
@@ -19,6 +19,7 @@
  */
 package org.onap.dcae.collectors.veshv.config.impl
 
+import arrow.core.identity
 import org.assertj.core.api.Assertions.assertThat
 import org.jetbrains.spek.api.Spek
 import org.jetbrains.spek.api.dsl.describe
@@ -27,20 +28,20 @@ import org.jetbrains.spek.api.dsl.it
 import org.jetbrains.spek.api.dsl.on
 import org.onap.dcae.collectors.veshv.commandline.WrongArgumentError
 import org.onap.dcae.collectors.veshv.tests.utils.absoluteResourcePath
-import org.onap.dcae.collectors.veshv.tests.utils.parseExpectingFailure
-import org.onap.dcae.collectors.veshv.tests.utils.parseExpectingSuccess
 import java.io.File
 
 /**
  * @author Piotr Jaszczyk <piotr.jaszczyk@nokia.com>
  * @since May 2018
  */
-object ArgVesHvConfigurationTest : Spek({
-    lateinit var cut: ArgHvVesConfiguration
+object HvVesCommandLineParserTest : Spek({
+    lateinit var cut: HvVesCommandLineParser
+    val DEFAULT_HEALTHCHECK_PORT = 6060
+    val emptyConfig = ""
     val configFilePath = javaClass.absoluteResourcePath("sampleConfig.json")
 
     beforeEachTest {
-        cut = ArgHvVesConfiguration()
+        cut = HvVesCommandLineParser()
     }
 
     describe("parsing arguments") {
@@ -48,7 +49,7 @@ object ArgVesHvConfigurationTest : Spek({
             lateinit var result: File
 
             beforeEachTest {
-                result = cut.parseExpectingSuccess(
+                result = cut.parseFileExpectingSuccess(
                         "--configuration-file", configFilePath
                 )
             }
@@ -58,16 +59,49 @@ object ArgVesHvConfigurationTest : Spek({
             }
         }
 
-        describe("required parameter is absent") {
+        given("required parameter is absent") {
             on("missing configuration file path") {
                 it("should throw exception") {
                     assertThat(
-                            cut.parseExpectingFailure(
-                                    "--non-existing-option", ""
+                            cut.parseFileExpectingFailure(
+                                    "--non-existing-option", emptyConfig
                             )
                     ).isInstanceOf(WrongArgumentError::class.java)
                 }
             }
         }
+
+        given("healthcheck port defined via cmd") {
+            val healthCheckPort = 888
+            val configWithHealthcheckPort = "--health-check-api-port $healthCheckPort"
+            on("parsing command") {
+                it("should assign proper port") {
+                    assertThat(
+                            cut.getHealthcheckPort(arrayOf(configWithHealthcheckPort))
+                    ).isEqualTo(healthCheckPort)
+                }
+            }
+        }
+
+        given("no healthcheck port defined via cmd") {
+            on("parsing command") {
+                it("should return default port") {
+                    assertThat(
+                            cut.getHealthcheckPort(arrayOf(emptyConfig))
+                    ).isEqualTo(DEFAULT_HEALTHCHECK_PORT)
+                }
+            }
+        }
     }
-})
\ No newline at end of file
+})
+
+private fun HvVesCommandLineParser.parseFileExpectingSuccess(vararg cmdLine: String): File =
+        getConfigurationFile(cmdLine).fold(
+                { throw AssertionError("Parsing result should be present") },
+                ::identity
+        )
+
+private fun HvVesCommandLineParser.parseFileExpectingFailure(vararg cmdLine: String): WrongArgumentError =
+        getConfigurationFile(cmdLine).fold(
+                ::identity
+        ) { throw AssertionError("parsing should have failed") }
\ No newline at end of file
index c8a3c01..059e802 100644 (file)
@@ -38,10 +38,11 @@ private const val VES_HV_PACKAGE = "org.onap.dcae.collectors.veshv"
 private val logger = Logger("$VES_HV_PACKAGE.main")
 
 private val hvVesServer = AtomicReference<ServerHandle>()
+private val configurationModule = ConfigurationModule()
 
 fun main(args: Array<String>) {
-    HealthCheckServer.start()
-    ConfigurationModule()
+    HealthCheckServer.start(configurationModule.healthCheckPort(args))
+    configurationModule
             .hvVesConfigurationUpdates(args)
             .publishOn(Schedulers.single(Schedulers.elastic()))
             .doOnNext(::startServer)
index bc284d0..9b58dcc 100644 (file)
@@ -34,10 +34,9 @@ import java.net.InetSocketAddress
  */
 object HealthCheckServer {
 
-    private const val DEFAULT_HEALTHCHECK_PORT = 6060
     private val logger = Logger(HealthCheckServer::class)
 
-    fun start(port: Int = DEFAULT_HEALTHCHECK_PORT) =
+    fun start(port: Int) =
             createHealthCheckServer(port)
                     .start()
                     .then(::logServerStarted)