<artifactId>javax.json</artifactId>
<version>1.1.2</version>
</dependency>
- <dependency>
- <!-- To override ratpack transitive dependency which creates security vulnerability
- This issue will be resolved with ratpack 1.6.0 release -->
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- <version>2.9.6</version>
- </dependency>
- <dependency>
- <groupId>io.ratpack</groupId>
- <artifactId>ratpack-core</artifactId>
- <version>1.5.4</version>
- <exclusions>
- <exclusion>
- <groupId>com.google.guava</groupId>
- <artifactId>guava</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
~ ============LICENSE_START=======================================================
~ dcaegen2-collectors-veshv
~ ================================================================================
- ~ Copyright (C) 2018 NOKIA
+ ~ Copyright (C) 2018-2019 NOKIA
~ ================================================================================
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
<groupId>org.jetbrains.kotlinx</groupId>
<artifactId>kotlinx-coroutines-core</artifactId>
</dependency>
- <dependency>
- <groupId>io.ratpack</groupId>
- <artifactId>ratpack-core</artifactId>
- <optional>true</optional>
- </dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
*/
package org.onap.dcae.collectors.veshv.utils.http
+import arrow.core.Either
import arrow.effects.IO
import org.onap.dcae.collectors.veshv.utils.logging.Logger
import reactor.core.publisher.Mono
}
)
+fun <A> HttpServerResponse.sendEitherErrorOrResponse(response: Either<A, Response>): NettyOutbound =
+ when (response) {
+ is Either.Left -> sendResponse(errorResponse(response.a.toString()))
+ is Either.Right -> sendAndHandleErrors(IO.just(response.b))
+ }
+
private fun HttpServerResponse.sendResponse(response: Response): NettyOutbound {
val respWithStatus = status(response.status.number)
val responseContent = response.content
+++ /dev/null
-/*
- * ============LICENSE_START=======================================================
- * dcaegen2-collectors-veshv
- * ================================================================================
- * Copyright (C) 2018-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.utils.http
-
-import arrow.core.Either
-import arrow.effects.IO
-import org.onap.dcae.collectors.veshv.utils.logging.Logger
-import javax.json.Json
-
-/**
- * @author Piotr Jaszczyk <piotr.jaszczyk@nokia.com>
- * @since August 2018
- */
-
-private val logger = Logger("org.onap.dcae.collectors.veshv.utils.arrow.ratpack")
-
-
-fun <A> ratpack.http.Response.sendEitherErrorOrResponse(response: Either<A, Response>) {
- when (response) {
- is Either.Left -> send(errorResponse(response.a.toString()))
- is Either.Right -> sendAndHandleErrors(IO.just(response.b))
- }
-}
-
-fun ratpack.http.Response.sendAndHandleErrors(response: IO<Response>) {
- response.attempt().unsafeRunSync().fold(
- { err ->
- logger.withWarn { log("Error occurred. Sending .", err) }
- val message = err.message
- send(errorResponse(message))
- },
- ::send
- )
-}
-
-private fun errorResponse(message: String?): Response {
- return Response(
- HttpStatus.INTERNAL_SERVER_ERROR,
- Content(
- ContentType.JSON,
- Json.createObjectBuilder().add("error", message).build()))
-}
-
-fun ratpack.http.Response.send(response: Response) {
- val respWithStatus = status(response.status.number)
- response.content.apply {
- respWithStatus.send(
- type.value,
- serializer.run { value.show() })
- }
-}
<groupId>org.glassfish</groupId>
<artifactId>javax.json</artifactId>
</dependency>
- <dependency>
- <groupId>io.ratpack</groupId>
- <artifactId>ratpack-core</artifactId>
- </dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
* ============LICENSE_START=======================================================
* dcaegen2-collectors-veshv
* ================================================================================
- * Copyright (C) 2018 NOKIA
+ * Copyright (C) 2018-2019 NOKIA
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
import arrow.effects.IO
import org.onap.dcae.collectors.veshv.simulators.xnf.impl.OngoingSimulations
import org.onap.dcae.collectors.veshv.simulators.xnf.impl.XnfSimulator
+import org.onap.dcae.collectors.veshv.utils.NettyServerHandle
+import org.onap.dcae.collectors.veshv.utils.ServerHandle
import org.onap.dcae.collectors.veshv.utils.http.Response
import org.onap.dcae.collectors.veshv.utils.http.Responses
import org.onap.dcae.collectors.veshv.utils.http.sendAndHandleErrors
import org.onap.dcae.collectors.veshv.utils.http.sendEitherErrorOrResponse
import org.onap.dcae.collectors.veshv.utils.logging.Logger
import org.onap.dcae.collectors.veshv.ves.message.generator.api.ParsingError
-import ratpack.handling.Chain
-import ratpack.handling.Context
-import ratpack.http.TypedData
-import ratpack.server.RatpackServer
-import ratpack.server.ServerConfig
+import reactor.core.publisher.Mono
+import reactor.netty.http.server.HttpServer
+import reactor.netty.http.server.HttpServerRequest
+import reactor.netty.http.server.HttpServerResponse
+import reactor.netty.http.server.HttpServerRoutes
+import java.io.InputStream
import java.net.InetSocketAddress
import java.util.*
private val xnfSimulator: XnfSimulator,
private val ongoingSimulations: OngoingSimulations) {
- fun start(socketAddress: InetSocketAddress): IO<RatpackServer> = IO {
- RatpackServer.start { server ->
- server.serverConfig(ServerConfig.embedded()
- .port(socketAddress.port))
- .handlers(this::configureHandlers)
- }
+ fun start(socketAddress: InetSocketAddress): IO<ServerHandle> = IO {
+ HttpServer.create()
+ .host(socketAddress.hostName)
+ .port(socketAddress.port)
+ .route(::setRoutes)
+ .let { NettyServerHandle(it.bindNow()) }
}
- private fun configureHandlers(chain: Chain) {
- chain
- .post("simulator", ::startSimulationHandler)
- .post("simulator/async", ::startSimulationHandler)
- .get("simulator/:id", ::simulatorStatusHandler)
+ private fun setRoutes(route: HttpServerRoutes) {
+ route
+ .post("/simulator", ::startSimulationHandler)
+ .post("/simulator/async", ::startSimulationHandler)
+ .get("/simulator/:id", ::simulatorStatusHandler)
}
- private fun startSimulationHandler(ctx: Context) {
+ private fun startSimulationHandler(req: HttpServerRequest, res: HttpServerResponse): Mono<Void> {
logger.info { "Attempting to start asynchronous scenario" }
- ctx.request.body.then { body ->
- val id = startSimulation(body)
- when (id) {
- is Either.Left -> logger.warn { "Failed to start scenario, ${id.a}" }
- is Either.Right -> logger.info { "Scenario started, details: ${id.b}" }
- }
- ctx.response.sendEitherErrorOrResponse(id)
- }
+ return req.receive().aggregate().asInputStream()
+ .flatMap { body ->
+ val id = startSimulation(body)
+ when (id) {
+ is Either.Left -> logger.warn { "Failed to start scenario, ${id.a}" }
+ is Either.Right -> logger.info { "Scenario started, details: ${id.b}" }
+ }
+ res.sendEitherErrorOrResponse(id).then()
+ }
}
- private fun startSimulation(body: TypedData): Either<ParsingError, Response> {
- return xnfSimulator.startSimulation(body.inputStream)
- .map(ongoingSimulations::startAsynchronousSimulation)
- .map(Responses::acceptedResponse)
- }
+
+ private fun startSimulation(body: InputStream): Either<ParsingError, Response> =
+ xnfSimulator.startSimulation(body)
+ .map(ongoingSimulations::startAsynchronousSimulation)
+ .map(Responses::acceptedResponse)
- private fun simulatorStatusHandler(ctx: Context) {
+ private fun simulatorStatusHandler(req: HttpServerRequest, res: HttpServerResponse): Mono<Void> {
logger.debug { "Checking task status" }
- val id = UUID.fromString(ctx.pathTokens["id"])
+ val id = UUID.fromString(req.param("id"))
logger.debug { "Checking status for id: $id" }
val status = ongoingSimulations.status(id)
val response = Responses.statusResponse(status.toString(), status.message)
logger.info { "Task $id status: $response" }
- ctx.response.sendAndHandleErrors(IO.just(response))
+ return res.sendAndHandleErrors(IO.just(response)).then()
}
companion object {
* ============LICENSE_START=======================================================
* dcaegen2-collectors-veshv
* ================================================================================
- * Copyright (C) 2018 NOKIA
+ * Copyright (C) 2018-2019 NOKIA
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
import org.onap.dcae.collectors.veshv.utils.arrow.unsafeRunEitherSync
import org.onap.dcae.collectors.veshv.utils.logging.Logger
import org.onap.dcae.collectors.veshv.ves.message.generator.factory.MessageGeneratorFactory
-import ratpack.server.RatpackServer
private const val PACKAGE_NAME = "org.onap.dcae.collectors.veshv.simulators.xnf"
private val logger = Logger(PACKAGE_NAME)
ExitFailure(1)
},
{
- logger.info { "Started xNF Simulator API server" }
- HealthState.INSTANCE.changeState(HealthDescription.IDLE)
+ logger.info { "Stopping xNF Simulator API server" }
}
)
-private fun startServers(config: SimulatorConfiguration): IO<RatpackServer> =
+private fun startServers(config: SimulatorConfiguration): IO<Unit> =
IO.monad().binding {
logger.info { "Using configuration: $config" }
+
XnfHealthCheckServer().startServer(config).bind()
+
val clientConfig = ClientConfiguration(HashSet.of(config.hvVesAddress), config.securityProvider)
val xnfSimulator = XnfSimulator(
ClientFactory(clientConfig),
MessageGeneratorFactory(config.maxPayloadSizeBytes)
)
- XnfApiServer(xnfSimulator, OngoingSimulations())
- .start(config.listenAddress)
- .bind()
+ val xnfApiServerHandler = XnfApiServer(xnfSimulator, OngoingSimulations())
+ .start(config.listenAddress).bind()
+
+ logger.info { "Started xNF Simulator API server" }
+ HealthState.INSTANCE.changeState(HealthDescription.IDLE)
+
+ xnfApiServerHandler.await().bind()
}.fix()
+