diff options
Diffstat (limited to 'prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/service/HttpClientExecutorService.java')
-rw-r--r-- | prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/service/HttpClientExecutorService.java | 99 |
1 files changed, 94 insertions, 5 deletions
diff --git a/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/service/HttpClientExecutorService.java b/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/service/HttpClientExecutorService.java index 01081f4d..1b69f5fd 100644 --- a/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/service/HttpClientExecutorService.java +++ b/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/service/HttpClientExecutorService.java @@ -20,9 +20,19 @@ package org.onap.dcaegen2.services.prh.service; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; import org.onap.dcaegen2.services.prh.model.EnvProperties; import org.reactivestreams.Publisher; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.ExchangeFilterFunction; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; /** * @author <a href="mailto:przemyslaw.wasala@nokia.com">Przemysław Wąsala</a> on 8/10/18 @@ -31,17 +41,96 @@ import org.springframework.stereotype.Service; @Service public class HttpClientExecutorService { - public String callConsulForConfigBindingServiceEndpoint(EnvProperties envProperties) { - return null; + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + public Mono<String> callConsulForConfigBindingServiceEndpoint(EnvProperties envProperties) { + + return HttpGetClient.callHttpGet( + envProperties.consulHost() + ":" + envProperties.consulPort() + "/v1/catalog/service/" + envProperties + .cbsName()) + .flatMap(this::getJsonArrayFromRequest) + .flatMap(jsonArray -> Mono.just(jsonArray.get(0))) + .flatMap(this::createConfigBindingServiceURL); + + } + + public Publisher<JsonObject> callConfigBindingServiceForPrhConfiguration(EnvProperties envProperties, + Mono<String> configBindingServiceUri) { + return HttpGetClient.callHttpGet(configBindingServiceUri + "/service_component/" + envProperties.appName()) + .flatMap(this::getJsonConfiguration); + } + + private Mono<? extends JsonObject> getJsonConfiguration(String body) { + JsonElement jsonElement = new Gson().toJsonTree(body); + try { + return Mono.just(jsonElement.getAsJsonObject()); + } catch (IllegalStateException e) { + return Mono.error(e); + } + } + + private Mono<String> createConfigBindingServiceURL(JsonElement jsonElement) { + JsonObject jsonObject; + try { + jsonObject = jsonElement.getAsJsonObject(); + } catch (IllegalStateException e) { + return Mono.error(e); + } + return Mono.just(jsonObject.get("ServiceAddress").toString() + ":" + jsonObject.get("ServicePort").toString()); } - public Publisher<String> callConfigBindingServiceForPrhConfiguration(EnvProperties envProperties, - String configBindingServiceUri) { - return null; + private Mono<? extends JsonArray> getJsonArrayFromRequest(String body) { + JsonElement jsonElement = new Gson().toJsonTree(body); + try { + return Mono.just(jsonElement.getAsJsonArray()); + } catch (IllegalStateException e) { + logger.warn("Converting string to jsonArray threw error: " + e); + return Mono.error(e); + } } private static class HttpGetClient { + private static final Logger logger = LoggerFactory.getLogger(HttpGetClient.class); + + private static WebClient webClient; + + private HttpGetClient() { + } + + private static Mono<String> callHttpGet(String url) { + return webClient + .get() + .uri(url) + .retrieve() + .onStatus(HttpStatus::is4xxClientError, response -> + Mono.error(new Exception("Request for cloud config failed: HTTP 400"))) + .onStatus(HttpStatus::is5xxServerError, response -> + Mono.error(new Exception("Request for cloud config failed: HTTP 500"))) + .bodyToMono(String.class); + } + + private static ExchangeFilterFunction logResponse() { + return ExchangeFilterFunction.ofResponseProcessor(clientResponse -> { + logger.info("Response status {}", clientResponse.statusCode()); + return Mono.just(clientResponse); + }); + } + + private static ExchangeFilterFunction logRequest() { + return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> { + logger.info("Request: {} {}", clientRequest.method(), clientRequest.url()); + clientRequest.headers() + .forEach((name, values) -> values.forEach(value -> logger.info("{}={}", name, value))); + return Mono.just(clientRequest); + }); + } + + static { + webClient = WebClient.builder().filter(logRequest()).filter(logResponse()).build(); + } + + } } |