Revert web server to prh, fix configuration 43/63243/5
authorJakub Zieba <jakub.zieba@nokia.com>
Tue, 28 Aug 2018 12:07:56 +0000 (14:07 +0200)
committerJakub Zieba <jakub.zieba@nokia.com>
Wed, 29 Aug 2018 11:09:46 +0000 (13:09 +0200)
Revert web server to prh, becaue it is used by health check

Fix cloud configuration fetching

Additional code refactoring

Change-Id: Ic3d6f4c266064436e2701ec3ef3a7534b2d5b8b4
Issue-ID: DCAEGEN2-696
Signed-off-by: Jakub Zieba <jakub.zieba@nokia.com>
13 files changed:
prh-app-server/config/application.yaml
prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/MainApp.java
prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/configuration/CloudConfiguration.java
prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/configuration/SchedulerConfig.java
prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/service/HttpClientExecutorService.java [deleted file]
prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/service/HttpGetClient.java [new file with mode: 0644]
prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/service/PrhConfigurationProvider.java [new file with mode: 0644]
prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/tasks/AaiProducerTaskImpl.java
prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/tasks/DmaapConsumerTaskImpl.java
prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/tasks/DmaapPublisherTaskImpl.java
prh-app-server/src/main/resources/application.properties
prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/service/HttpGetClientTest.java [new file with mode: 0644]
prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/service/PrhConfigurationProviderTest.java [new file with mode: 0644]

index 706532d..ff53a06 100644 (file)
@@ -1,8 +1,6 @@
 spring:
   profiles:
     active: prod
-  main:
-    web-application-type: none
 server:
   port: 8433
   ssl:
index 2357e1d..fc485e1 100644 (file)
@@ -34,10 +34,8 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
 /**
  * @author <a href="mailto:przemyslaw.wasala@nokia.com">Przemysław Wąsala</a> on 3/23/18
  */
-@SpringBootApplication
+@SpringBootApplication(exclude = {JacksonAutoConfiguration.class})
 @Configuration
-@ComponentScan
-@EnableAutoConfiguration(exclude = {JacksonAutoConfiguration.class})
 @EnableScheduling
 public class MainApp {
 
index 82017a9..b774f54 100644 (file)
@@ -27,45 +27,42 @@ import org.onap.dcaegen2.services.prh.config.AaiClientConfiguration;
 import org.onap.dcaegen2.services.prh.config.DmaapConsumerConfiguration;
 import org.onap.dcaegen2.services.prh.config.DmaapPublisherConfiguration;
 import org.onap.dcaegen2.services.prh.model.EnvProperties;
-import org.onap.dcaegen2.services.prh.service.HttpClientExecutorService;
+import org.onap.dcaegen2.services.prh.service.PrhConfigurationProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.scheduling.TaskScheduler;
+import org.springframework.context.annotation.Primary;
 import org.springframework.scheduling.annotation.EnableScheduling;
-import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
 import reactor.core.publisher.Flux;
 import reactor.core.scheduler.Schedulers;
 
+
 /**
  * @author <a href="mailto:przemyslaw.wasala@nokia.com">Przemysław Wąsala</a> on 8/9/18
  */
 @Configuration
 @EnableConfigurationProperties
 @EnableScheduling
+@Primary
 public class CloudConfiguration extends AppConfig {
 
     private Logger logger = LoggerFactory.getLogger(this.getClass());
-    private HttpClientExecutorService httpClientExecutorService;
+    private PrhConfigurationProvider prhConfigurationProvider;
 
     private AaiClientConfiguration aaiClientCloudConfiguration;
     private DmaapPublisherConfiguration dmaapPublisherCloudConfiguration;
     private DmaapConsumerConfiguration dmaapConsumerCloudConfiguration;
 
-    TaskScheduler cloudTaskScheduler;
-
     @Value("#{systemEnvironment}")
     private Properties systemEnvironment;
 
 
     @Autowired
-    public void setThreadPoolTaskScheduler(ThreadPoolTaskScheduler threadPoolTaskScheduler,
-        HttpClientExecutorService httpClientExecutorService) {
-        this.cloudTaskScheduler = threadPoolTaskScheduler;
-        this.httpClientExecutorService = httpClientExecutorService;
+    public void setThreadPoolTaskScheduler(PrhConfigurationProvider prhConfigurationProvider) {
+        this.prhConfigurationProvider = prhConfigurationProvider;
     }
 
     protected void runTask() {
@@ -84,10 +81,8 @@ public class CloudConfiguration extends AppConfig {
 
     private void parsingConfigSuccess(EnvProperties envProperties) {
         logger.info("Fetching PRH configuration from ConfigBindingService/Consul");
-        Flux.just(httpClientExecutorService.callConsulForConfigBindingServiceEndpoint(envProperties))
-            .flatMap(configBindingServiceUri -> httpClientExecutorService
-                .callConfigBindingServiceForPrhConfiguration(envProperties,
-                    configBindingServiceUri)).subscribe(this::parseCloudConfig, this::cloudConfigError);
+        prhConfigurationProvider.callForPrhConfiguration(envProperties)
+            .subscribe(this::parseCloudConfig, this::cloudConfigError);
     }
 
     private void parseCloudConfig(JsonObject jsonObject) {
index c53d333..a27feef 100644 (file)
@@ -33,8 +33,10 @@ import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
+import org.springframework.scheduling.TaskScheduler;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.concurrent.ConcurrentTaskScheduler;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
 import reactor.core.publisher.Mono;
 
 /**
@@ -42,7 +44,7 @@ import reactor.core.publisher.Mono;
  */
 @Configuration
 @EnableScheduling
-public class SchedulerConfig extends CloudConfiguration {
+public class SchedulerConfig {
 
     private static final int SCHEDULING_DELAY_FOR_PRH_TASKS = 5;
     private static final int SCHEDULING_REQUEST_FOR_CONFIGURATION_DELAY = 5;
@@ -50,12 +52,17 @@ public class SchedulerConfig extends CloudConfiguration {
 
     private final ConcurrentTaskScheduler taskScheduler;
     private final ScheduledTasks scheduledTask;
+    private final TaskScheduler cloudTaskScheduler;
+    private final CloudConfiguration cloudConfiguration;
 
     @Autowired
     public SchedulerConfig(@Qualifier("concurrentTaskScheduler") ConcurrentTaskScheduler concurrentTaskScheduler,
-        ScheduledTasks scheduledTask) {
+        ScheduledTasks scheduledTask, ThreadPoolTaskScheduler cloudTaskScheduler,
+        CloudConfiguration cloudConfiguration) {
         this.taskScheduler = concurrentTaskScheduler;
         this.scheduledTask = scheduledTask;
+        this.cloudTaskScheduler = cloudTaskScheduler;
+        this.cloudConfiguration = cloudConfiguration;
     }
 
     /**
@@ -83,7 +90,7 @@ public class SchedulerConfig extends CloudConfiguration {
     public synchronized boolean tryToStartTask() {
         if (scheduledPrhTaskFutureList.isEmpty()) {
             scheduledPrhTaskFutureList.add(cloudTaskScheduler
-                .scheduleAtFixedRate(super::runTask, Instant.now(),
+                .scheduleAtFixedRate(cloudConfiguration::runTask, Instant.now(),
                     Duration.ofMinutes(SCHEDULING_REQUEST_FOR_CONFIGURATION_DELAY)));
             scheduledPrhTaskFutureList.add(taskScheduler
                 .scheduleWithFixedDelay(scheduledTask::scheduleMainPrhEventTask,
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
deleted file mode 100644 (file)
index 1b69f5f..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * ============LICENSE_START=======================================================
- * PNF-REGISTRATION-HANDLER
- * ================================================================================
- * Copyright (C) 2018 NOKIA Intellectual Property. All rights reserved.
- * ================================================================================
- * 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.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
- */
-
-@Service
-public class HttpClientExecutorService {
-
-    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());
-    }
-
-
-    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();
-        }
-
-
-    }
-}
diff --git a/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/service/HttpGetClient.java b/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/service/HttpGetClient.java
new file mode 100644 (file)
index 0000000..56ab484
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * ============LICENSE_START=======================================================
+ * PNF-REGISTRATION-HANDLER
+ * ================================================================================
+ * Copyright (C) 2018 NOKIA Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.dcaegen2.services.prh.service;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonSyntaxException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.reactive.function.client.ClientResponse;
+import org.springframework.web.reactive.function.client.ExchangeFilterFunction;
+import org.springframework.web.reactive.function.client.WebClient;
+import reactor.core.publisher.Mono;
+
+public class HttpGetClient {
+
+    private static final Logger logger = LoggerFactory.getLogger(HttpGetClient.class);
+
+    private final WebClient webClient;
+    private final Gson gson;
+
+    HttpGetClient() {
+        this(WebClient.builder().filter(logRequest()).filter(logResponse()).build());
+    }
+
+    HttpGetClient(WebClient webClient){
+        this.webClient = webClient;
+        this.gson = new Gson();
+    }
+
+    public <T> Mono<T> callHttpGet(String url, Class<T> tClass) {
+        return webClient
+            .get()
+            .uri(url)
+            .retrieve()
+            .onStatus(HttpStatus::is4xxClientError, response -> Mono.error(getException(response)))
+            .onStatus(HttpStatus::is5xxServerError, response -> Mono.error(getException(response)))
+            .bodyToMono(String.class)
+            .flatMap(body->getJsonFromRequest(body,tClass));
+    }
+
+    private RuntimeException getException(ClientResponse response) {
+        return new RuntimeException(String.format("Request for cloud config failed: HTTP %d",
+            response.statusCode().value()));
+    }
+
+    private <T> Mono<T> getJsonFromRequest(String body, Class<T> tClass) {
+        try {
+            return Mono.just(parseJson(body, tClass));
+        } catch (JsonSyntaxException | IllegalStateException e) {
+            logger.warn("Converting string to json threw error ", e);
+            return Mono.error(e);
+        }
+    }
+
+    private <T> T  parseJson(String body, Class<T> tClass){
+        return gson.fromJson(body, tClass);
+    }
+
+    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);
+        });
+    }
+}
diff --git a/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/service/PrhConfigurationProvider.java b/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/service/PrhConfigurationProvider.java
new file mode 100644 (file)
index 0000000..7af4a7c
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ * ============LICENSE_START=======================================================
+ * PNF-REGISTRATION-HANDLER
+ * ================================================================================
+ * Copyright (C) 2018 NOKIA Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.dcaegen2.services.prh.service;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import org.apache.http.client.utils.URIBuilder;
+import org.onap.dcaegen2.services.prh.model.EnvProperties;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import reactor.core.publisher.Mono;
+
+import java.net.URISyntaxException;
+
+/**
+ * @author <a href="mailto:przemyslaw.wasala@nokia.com">Przemysław Wąsala</a> on 8/10/18
+ */
+
+@Service
+public class PrhConfigurationProvider {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final HttpGetClient httpGetClient;
+
+    PrhConfigurationProvider() {
+        this(new HttpGetClient());
+    }
+
+    PrhConfigurationProvider(HttpGetClient httpGetClient) {
+        this.httpGetClient = httpGetClient;
+    }
+
+    public Mono<JsonObject> callForPrhConfiguration(EnvProperties envProperties) {
+        return callConsulForConfigBindingServiceEndpoint(envProperties)
+            .flatMap(this::callConfigBindingServiceForPrhConfiguration);
+    }
+
+    private Mono<String> callConsulForConfigBindingServiceEndpoint(EnvProperties envProperties) {
+        logger.info("Retrieving Config Binding Service endpoint from Consul");
+        try {
+            return httpGetClient.callHttpGet(getConsulUrl(envProperties), JsonArray.class)
+                .flatMap(jsonArray -> this.createConfigBindingServiceURL(jsonArray, envProperties.appName()));
+        } catch (URISyntaxException e) {
+            logger.warn("Malformed Consul uri", e);
+            return Mono.error(e);
+        }
+    }
+
+    private String getConsulUrl(EnvProperties envProperties) throws URISyntaxException {
+        return getUri(envProperties.consulHost(), envProperties.consulPort(), "/v1/catalog/service",
+            envProperties.cbsName());
+    }
+
+    private Mono<JsonObject> callConfigBindingServiceForPrhConfiguration(String configBindingServiceUri) {
+        logger.info("Retrieving PRH configuration");
+        return httpGetClient.callHttpGet(configBindingServiceUri, JsonObject.class);
+    }
+
+
+    private Mono<String> createConfigBindingServiceURL(JsonArray jsonArray, String appName) {
+        return getConfigBindingObject(jsonArray).flatMap(jsonObject -> buildConfigBindingServiceURL(jsonObject, appName));
+    }
+
+    private Mono<String> buildConfigBindingServiceURL(JsonObject jsonObject, String appName) {
+        try {
+            return Mono.just(getUri(jsonObject.get("ServiceAddress").getAsString(),
+                jsonObject.get("ServicePort").getAsInt(), "/service_component", appName));
+        } catch (URISyntaxException e) {
+            logger.warn("Malformed Config Binding Service uri", e);
+            return Mono.error(e);
+        }
+    }
+
+    private Mono<JsonObject> getConfigBindingObject(JsonArray jsonArray) {
+        try {
+            if (jsonArray.size() > 0) {
+                return Mono.just(jsonArray.get(0).getAsJsonObject());
+            } else {
+                throw new IllegalStateException("JSON Array was empty");
+            }
+        } catch (IllegalStateException e) {
+            logger.warn("Failed to retrieve JSON Object from array", e);
+            return Mono.error(e);
+        }
+    }
+
+    private String getUri(String host, Integer port, String... paths) throws URISyntaxException {
+        return new URIBuilder()
+            .setScheme("http")
+            .setHost(host)
+            .setPort(port)
+            .setPath(String.join("/", paths))
+            .build().toString();
+    }
+}
index 976547e..379d10c 100644 (file)
@@ -31,7 +31,6 @@ import org.onap.dcaegen2.services.prh.service.producer.AaiProducerReactiveHttpCl
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Component;
 import reactor.core.publisher.Mono;
 
@@ -48,7 +47,7 @@ public class AaiProducerTaskImpl extends
     private AaiProducerReactiveHttpClient aaiProducerReactiveHttpClient;
 
     @Autowired
-    public AaiProducerTaskImpl(@Qualifier("cloudConfiguration") Config config) {
+    public AaiProducerTaskImpl(Config config) {
         this.config = config;
     }
 
@@ -67,8 +66,7 @@ public class AaiProducerTaskImpl extends
 
     @Override
     AaiProducerReactiveHttpClient resolveClient() {
-        return aaiProducerReactiveHttpClient == null ? new AaiProducerReactiveHttpClient(resolveConfiguration())
-            .createAaiWebClient(buildWebClient()) : aaiProducerReactiveHttpClient;
+        return new AaiProducerReactiveHttpClient(resolveConfiguration());
     }
 
     @Override
index f8eccf1..bf3accc 100644 (file)
@@ -29,7 +29,6 @@ import org.onap.dcaegen2.services.prh.service.consumer.DMaaPConsumerReactiveHttp
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Component;
 import reactor.core.publisher.Mono;
 
@@ -45,7 +44,7 @@ public class DmaapConsumerTaskImpl extends DmaapConsumerTask {
     private DMaaPConsumerReactiveHttpClient dmaaPConsumerReactiveHttpClient;
 
     @Autowired
-    public DmaapConsumerTaskImpl(@Qualifier("cloudConfiguration") Config config) {
+    public DmaapConsumerTaskImpl(Config config) {
         this.config = config;
         this.dmaapConsumerJsonParser = new DmaapConsumerJsonParser();
     }
@@ -79,8 +78,6 @@ public class DmaapConsumerTaskImpl extends DmaapConsumerTask {
 
     @Override
     DMaaPConsumerReactiveHttpClient resolveClient() {
-        return dmaaPConsumerReactiveHttpClient == null
-            ? new DMaaPConsumerReactiveHttpClient(resolveConfiguration()).createDMaaPWebClient(buildWebClient())
-            : dmaaPConsumerReactiveHttpClient;
+        return new DMaaPConsumerReactiveHttpClient(resolveConfiguration()).createDMaaPWebClient(buildWebClient());
     }
 }
index 13f1b16..d4e1c1e 100644 (file)
@@ -28,7 +28,6 @@ import org.onap.dcaegen2.services.prh.service.producer.DMaaPProducerReactiveHttp
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Component;
 import reactor.core.publisher.Mono;
 
@@ -43,7 +42,7 @@ public class DmaapPublisherTaskImpl extends DmaapPublisherTask {
     private DMaaPProducerReactiveHttpClient dmaapProducerReactiveHttpClient;
 
     @Autowired
-    public DmaapPublisherTaskImpl(@Qualifier("cloudConfiguration") Config config) {
+    public DmaapPublisherTaskImpl(Config config) {
         this.config = config;
     }
 
@@ -73,8 +72,6 @@ public class DmaapPublisherTaskImpl extends DmaapPublisherTask {
 
     @Override
     DMaaPProducerReactiveHttpClient resolveClient() {
-        return dmaapProducerReactiveHttpClient == null
-            ? new DMaaPProducerReactiveHttpClient(resolveConfiguration()).createDMaaPWebClient(buildWebClient())
-            : dmaapProducerReactiveHttpClient;
+        return new DMaaPProducerReactiveHttpClient(resolveConfiguration()).createDMaaPWebClient(buildWebClient());
     }
 }
\ No newline at end of file
index 7c6d988..fa38d18 100644 (file)
@@ -1,5 +1,4 @@
 spring.profiles.active=prod
-spring.main.web-application-type=none
 server.port=8433
 server.ssl.key-store-type=PKCS12
 server.ssl.key-store-password=nokiapnf
diff --git a/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/service/HttpGetClientTest.java b/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/service/HttpGetClientTest.java
new file mode 100644 (file)
index 0000000..5caed79
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * ============LICENSE_START=======================================================
+ * PROJECT
+ * ================================================================================
+ * Copyright (C) 2018 NOKIA Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.dcaegen2.services.prh.service;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonSyntaxException;
+import org.junit.jupiter.api.Test;
+import org.springframework.web.reactive.function.client.WebClient;
+import reactor.core.publisher.Mono;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.*;
+
+class HttpGetClientTest {
+    private static final String SOMEURL = "http://someurl";
+    private static final String DATA = "{}";
+    private Gson gson = new Gson();
+    private WebClient webClient = mock(WebClient.class);
+    private WebClient.RequestHeadersUriSpec requestBodyUriSpec = mock(WebClient.RequestBodyUriSpec.class);
+    private WebClient.ResponseSpec responseSpec = mock(WebClient.ResponseSpec.class);
+
+    @Test
+    void shouldReturnJsonObjectOnGetCall() {
+        //given
+        mockWebClientDependantObject();
+        HttpGetClient httpGetClient = new HttpGetClient(webClient);
+        when(responseSpec.bodyToMono(String.class)).thenReturn(Mono.just(DATA));
+
+        //when
+        Mono<JsonObject> jsonObjectMono = httpGetClient.callHttpGet(SOMEURL, JsonObject.class);
+
+        //then
+        assertThat(jsonObjectMono).isNotNull();
+        assertThat(jsonObjectMono.block()).isEqualTo(gson.fromJson(DATA, JsonObject.class));
+    }
+
+    @Test
+    void shouldReturnMonoErrorOnGetCall() {
+        //given
+        mockWebClientDependantObject();
+        HttpGetClient httpGetClient = new HttpGetClient(webClient);
+        when(responseSpec.bodyToMono(String.class)).thenReturn(Mono.just("some wrong data"));
+
+        //when
+        Mono<JsonObject> jsonObjectMono = httpGetClient.callHttpGet(SOMEURL, JsonObject.class);
+
+        //then
+        assertThat(jsonObjectMono).isNotNull();
+        assertThrows(JsonSyntaxException.class, jsonObjectMono::block);
+    }
+
+
+
+    private void mockWebClientDependantObject() {
+        doReturn(requestBodyUriSpec).when(webClient).get();
+        when(requestBodyUriSpec.uri(SOMEURL)).thenReturn(requestBodyUriSpec);
+        doReturn(responseSpec).when(requestBodyUriSpec).retrieve();
+        doReturn(responseSpec).when(responseSpec).onStatus(any(), any());
+        doReturn(responseSpec).when(responseSpec).onStatus(any(), any());
+    }
+
+}
\ No newline at end of file
diff --git a/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/service/PrhConfigurationProviderTest.java b/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/service/PrhConfigurationProviderTest.java
new file mode 100644 (file)
index 0000000..8b7ea3d
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * ============LICENSE_START=======================================================
+ * PNF-REGISTRATION-HANDLER
+ * ================================================================================
+ * Copyright (C) 2018 NOKIA Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.dcaegen2.services.prh.service;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.onap.dcaegen2.services.prh.model.EnvProperties;
+import org.onap.dcaegen2.services.prh.model.ImmutableEnvProperties;
+import reactor.core.publisher.Mono;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+class PrhConfigurationProviderTest {
+
+    private static final Gson gson = new Gson();
+    private static final String configBindingService = "[{\"ID\":\"9c8dd674-34ce-7049-d318-e98d93a64303\",\"Node\""
+        + ":\"dcae-bootstrap\",\"Address\":\"10.42.52.82\",\"Datacenter\":\"dc1\",\"TaggedAddresses\":"
+        + "{\"lan\":\"10.42.52.82\",\"wan\":\"10.42.52.82\"},\"NodeMeta\":{\"consul-network-segment\":\"\"},"
+        + "\"ServiceID\":\"dcae-cbs1\",\"ServiceName\":\"config-binding-service\",\"ServiceTags\":[],"
+        + "\"ServiceAddress\":\"config-binding-service\",\"ServicePort\":10000,\"ServiceEnableTagOverride\":false,"
+        + "\"CreateIndex\":14352,\"ModifyIndex\":14352},{\"ID\":\"35c6f540-a29c-1a92-23b0-1305bd8c81f5\",\"Node\":"
+        + "\"dev-consul-server-1\",\"Address\":\"10.42.165.51\",\"Datacenter\":\"dc1\",\"TaggedAddresses\":"
+        + "{\"lan\":\"10.42.165.51\",\"wan\":\"10.42.165.51\"},\"NodeMeta\":{\"consul-network-segment\":\"\"},"
+        + "\"ServiceID\":\"dcae-cbs1\",\"ServiceName\":\"config-binding-service\",\"ServiceTags\":[],"
+        + "\"ServiceAddress\":\"config-binding-service\",\"ServicePort\":10000,\"ServiceEnableTagOverride\":false,"
+        + "\"CreateIndex\":803,\"ModifyIndex\":803}]";
+    private static final JsonArray configBindingServiceJson = gson.fromJson(configBindingService, JsonArray.class);
+    private static final JsonArray emptyConfigBindingServiceJson = gson.fromJson("[]", JsonArray.class);
+    private static final String prhMockConfiguration = "{\"test\":1}";
+    private static final JsonObject prhMockConfigurationJson = gson.fromJson(prhMockConfiguration, JsonObject.class);
+
+    private EnvProperties envProperties = ImmutableEnvProperties.builder()
+        .appName("dcae-prh")
+        .cbsName("config-binding-service")
+        .consulHost("consul")
+        .consulPort(8500)
+        .build();
+
+    @Test
+    void shouldReturnPrhConfiguration() {
+        // given
+        HttpGetClient webClient = mock(HttpGetClient.class);
+        when(
+            webClient.callHttpGet("http://consul:8500/v1/catalog/service/config-binding-service", JsonArray.class))
+            .thenReturn(Mono.just(configBindingServiceJson));
+        when(webClient.callHttpGet("http://config-binding-service:10000/service_component/dcae-prh", JsonObject.class))
+            .thenReturn(Mono.just(prhMockConfigurationJson));
+
+        PrhConfigurationProvider provider = new PrhConfigurationProvider(webClient);
+
+        // when
+        Mono<JsonObject> jsonObjectMono = provider.callForPrhConfiguration(envProperties);
+
+        // then
+        assertThat(jsonObjectMono).isNotNull();
+        assertThat(jsonObjectMono.block()).isEqualTo(prhMockConfigurationJson);
+    }
+
+    @Test
+    void shouldReturnMonoErrorWhenConsuleDoesntHaveConfigBindingServiceEntry() {
+        // given
+        HttpGetClient webClient = mock(HttpGetClient.class);
+        when(
+            webClient.callHttpGet("http://consul:8500/v1/catalog/service/config-binding-service", JsonArray.class))
+            .thenReturn(Mono.just(emptyConfigBindingServiceJson));
+
+        PrhConfigurationProvider provider = new PrhConfigurationProvider(webClient);
+
+        // when
+        Mono<JsonObject> jsonObjectMono = provider.callForPrhConfiguration(envProperties);
+
+        // then
+        assertThat(jsonObjectMono).isNotNull();
+        Assertions.assertThrows(IllegalStateException.class, jsonObjectMono::block);
+    }
+}
\ No newline at end of file