summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLusheng Ji <lji@research.att.com>2018-04-20 13:21:58 +0000
committerGerrit Code Review <gerrit@onap.org>2018-04-20 13:21:58 +0000
commit1fb9130cd488228574b49e078148e4bcf1a7a5a8 (patch)
tree13e4e251d068bb274b2cf6ccfe8f573a13084077
parent23f7acc707bf285df2da4a95b146d1a7f5132453 (diff)
parent5fbcb6344672167e7d1dbf28ecbea3b8f55732fb (diff)
Merge "Implementation for HTTP/HTTPS and endpoints"
-rw-r--r--pom.xml7
-rw-r--r--prh-app-server/config/application.yaml8
-rw-r--r--prh-app-server/config/keystorebin0 -> 2196 bytes
-rw-r--r--prh-app-server/pom.xml10
-rw-r--r--prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/MainApp.java2
-rw-r--r--prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/configuration/TomcatHttpConfig.java49
-rw-r--r--prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/controllers/HeartbeatController.java56
-rw-r--r--prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/controllers/ScheduleController.java70
-rw-r--r--prh-app-server/src/main/resources/application.properties13
-rw-r--r--prh-app-server/src/main/resources/keystore.jksbin0 -> 2643 bytes
-rw-r--r--prh-app-server/src/main/resources/keystore.jks.oldbin0 -> 2272 bytes
-rw-r--r--prh-app-server/src/main/resources/logback-spring.xml (renamed from prh-app-server/src/main/resources/logback.xml)0
-rw-r--r--prh-app-server/src/main/resources/scheduled-context.xml2
-rw-r--r--prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/IT/ScheduledXmlContextITest.java5
14 files changed, 206 insertions, 16 deletions
diff --git a/pom.xml b/pom.xml
index 4ba3d077..b3974cbb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -410,6 +410,13 @@
<version>${immutable.version}</version>
</dependency>
<dependency>
+ <groupId>io.projectreactor</groupId>
+ <artifactId>reactor-bom</artifactId>
+ <version>Bismuth-RELEASE</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ <dependency>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>${docker.maven.version}</version>
diff --git a/prh-app-server/config/application.yaml b/prh-app-server/config/application.yaml
index 0baa1f9d..306c94f7 100644
--- a/prh-app-server/config/application.yaml
+++ b/prh-app-server/config/application.yaml
@@ -2,7 +2,13 @@ spring:
profiles:
active: prod
server:
- port: 8100
+ port: 8433
+ ssl:
+ key-store-type: PKCS12
+ key-store-password: nokiapnf
+ key-store: classpath:keystore.jks
+ key-password: nokiapnf
+ keyAlias: tomcat-localhost
logging:
level:
ROOT: ERROR
diff --git a/prh-app-server/config/keystore b/prh-app-server/config/keystore
new file mode 100644
index 00000000..26a16f75
--- /dev/null
+++ b/prh-app-server/config/keystore
Binary files differ
diff --git a/prh-app-server/pom.xml b/prh-app-server/pom.xml
index f178d343..e804c3e6 100644
--- a/prh-app-server/pom.xml
+++ b/prh-app-server/pom.xml
@@ -79,6 +79,7 @@
</resources>
<exposes>
<expose>8100</expose>
+ <expose>8433</expose>
</exposes>
<imageTags>
<imageTag>${project.version}-SNAPSHOT-${maven.build.timestamp}Z</imageTag>
@@ -135,6 +136,10 @@
</exclusions>
</dependency>
<dependency>
+ <groupId>io.projectreactor</groupId>
+ <artifactId>reactor-core</artifactId>
+ </dependency>
+ <dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
</dependency>
@@ -175,6 +180,11 @@
<!--TESTS DEPENDENCIES -->
<dependency>
+ <groupId>io.projectreactor</groupId>
+ <artifactId>reactor-test</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
diff --git a/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/MainApp.java b/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/MainApp.java
index 3c631218..ff2f8bd5 100644
--- a/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/MainApp.java
+++ b/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/MainApp.java
@@ -27,7 +27,6 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
-import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.concurrent.ConcurrentTaskScheduler;
/**
@@ -36,7 +35,6 @@ import org.springframework.scheduling.concurrent.ConcurrentTaskScheduler;
@SpringBootApplication
@Configuration
@ComponentScan
-@EnableScheduling
@EnableAutoConfiguration(exclude = {JacksonAutoConfiguration.class})
public class MainApp {
diff --git a/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/configuration/TomcatHttpConfig.java b/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/configuration/TomcatHttpConfig.java
new file mode 100644
index 00000000..0e9d7fe6
--- /dev/null
+++ b/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/configuration/TomcatHttpConfig.java
@@ -0,0 +1,49 @@
+/*
+ * ============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.configuration;
+
+import org.apache.catalina.connector.Connector;
+import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author <a href="mailto:przemyslaw.wasala@nokia.com">Przemysław Wąsala</a> on 4/18/18
+ */
+@Configuration
+public class TomcatHttpConfig {
+
+ @Bean
+ public ServletWebServerFactory servletContainer() {
+ TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
+ tomcat.addAdditionalTomcatConnectors(getHttpConnector());
+ return tomcat;
+ }
+
+ private Connector getHttpConnector() {
+ Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
+ connector.setScheme("http");
+ connector.setPort(8100);
+ connector.setSecure(false);
+ return connector;
+ }
+
+}
diff --git a/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/controllers/HeartbeatController.java b/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/controllers/HeartbeatController.java
new file mode 100644
index 00000000..95b360e1
--- /dev/null
+++ b/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/controllers/HeartbeatController.java
@@ -0,0 +1,56 @@
+/*
+ * ============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.controllers;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import org.onap.dcaegen2.services.prh.configuration.PrhAppConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+import reactor.core.publisher.Mono;
+
+/**
+ * @author <a href="mailto:przemyslaw.wasala@nokia.com">Przemysław Wąsala</a> on 4/19/18
+ */
+@RestController
+public class HeartbeatController {
+
+ private static final Logger logger = LoggerFactory.getLogger(PrhAppConfig.class);
+ private static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
+
+ @RequestMapping(value = "heartbeat", method = RequestMethod.GET)
+ public Mono<ResponseEntity<String>> heartbeat() {
+ logger.debug("Receiving request on on thread={} , time={} ", Thread.currentThread().getName(),
+ dateTimeFormatter.format(
+ LocalDateTime.now()));
+
+ return Mono.defer(() -> {
+ logger.debug("Sending response on thread={} , time={} ", Thread.currentThread().getName(),
+ dateTimeFormatter.format(
+ LocalDateTime.now()));
+ return Mono.just(new ResponseEntity<>("I'm living", HttpStatus.OK));
+ });
+ }
+}
diff --git a/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/controllers/ScheduleController.java b/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/controllers/ScheduleController.java
index 99516c46..6f08dd8a 100644
--- a/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/controllers/ScheduleController.java
+++ b/prh-app-server/src/main/java/org/onap/dcaegen2/services/prh/controllers/ScheduleController.java
@@ -19,30 +19,40 @@
*/
package org.onap.dcaegen2.services.prh.controllers;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
import java.util.concurrent.ScheduledFuture;
+import org.onap.dcaegen2.services.prh.configuration.PrhAppConfig;
import org.onap.dcaegen2.services.prh.tasks.ScheduledTasks;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.stereotype.Component;
-import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+import reactor.core.publisher.Mono;
/**
* @author <a href="mailto:przemyslaw.wasala@nokia.com">Przemysław Wąsala</a> on 4/5/18
*/
-@Controller
+@RestController
@Component
public class ScheduleController {
+ private static final Logger logger = LoggerFactory.getLogger(PrhAppConfig.class);
+ private static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
private static final int SCHEDULING_DELAY = 20000;
+ private static volatile List<ScheduledFuture> scheduledFutureList = new ArrayList<>();
private final TaskScheduler taskScheduler;
private final ScheduledTasks scheduledTask;
- private ScheduledFuture<?> scheduledFuture;
@Autowired
public ScheduleController(TaskScheduler taskScheduler, ScheduledTasks scheduledTask) {
@@ -50,18 +60,54 @@ public class ScheduleController {
this.scheduledTask = scheduledTask;
}
+ @RequestMapping(value = "start", method = RequestMethod.GET)
+ public Mono<ResponseEntity<String>> startTasks() {
+ logDebug("Starting scheduling worker request on on thread={} , time={} ");
+ return Mono.fromSupplier(this::tryToStartTask).map(this::createStartTaskResponse);
+ }
+
+ @RequestMapping(value = "stopPrh", method = RequestMethod.GET)
+ public Mono<ResponseEntity<String>> stopTask() {
+ logDebug("Stopping scheduling worker request on on thread={} , time={} ");
+ return getResponseFromCancellationOfTasks();
+ }
- @RequestMapping(value = "preferences", method = RequestMethod.PUT)
- public ResponseEntity<Void> startTask() {
- scheduledFuture = taskScheduler
- .scheduleWithFixedDelay(scheduledTask::scheduleMainPrhEventTask, SCHEDULING_DELAY);
- return new ResponseEntity<>(HttpStatus.OK);
+ private synchronized Mono<ResponseEntity<String>> getResponseFromCancellationOfTasks() {
+ scheduledFutureList.forEach(x -> x.cancel(false));
+ scheduledFutureList.clear();
+ return Mono.defer(() -> {
+ logDebug("Sending success response on stopping task execution thread={} , time={} ");
+ return Mono.just(new ResponseEntity<>("PRH Service has already been stopped!", HttpStatus.CREATED));
+ });
}
- @RequestMapping("stopPrh")
- public ResponseEntity<Void> stopTask() {
- scheduledFuture.cancel(false);
- return new ResponseEntity<>(HttpStatus.OK);
+ private synchronized boolean tryToStartTask() {
+ if (scheduledFutureList.isEmpty()) {
+ scheduledFutureList.add(taskScheduler
+ .scheduleWithFixedDelay(scheduledTask::scheduleMainPrhEventTask, SCHEDULING_DELAY));
+ return true;
+ } else {
+ return false;
+ }
+
}
+ private ResponseEntity<String> createStartTaskResponse(boolean wasScheduled) {
+ if (wasScheduled) {
+ logDebug("Sending success response on starting task execution thread={} , time={} ");
+ return new ResponseEntity<>("PRH Service has been started!", HttpStatus.CREATED);
+ } else {
+ logDebug("Sending error response on starting task execution thread={} , time={} ");
+ return new ResponseEntity<>("PRH Service is still running!", HttpStatus.NOT_ACCEPTABLE);
+ }
+ }
+
+ private static void logDebug(String message) {
+ if (logger.isDebugEnabled()) {
+ logger.debug(message,
+ Thread.currentThread().getName(),
+ dateTimeFormatter.format(
+ LocalDateTime.now()));
+ }
+ }
}
diff --git a/prh-app-server/src/main/resources/application.properties b/prh-app-server/src/main/resources/application.properties
new file mode 100644
index 00000000..53fa9cde
--- /dev/null
+++ b/prh-app-server/src/main/resources/application.properties
@@ -0,0 +1,13 @@
+spring.profiles.active=prod
+server.port=8433
+server.ssl.key-store-type=PKCS12
+server.ssl.key-store-password=nokiapnf
+server.ssl.key-store=classpath:keystore.jks
+server.ssl.key-password=nokiapnf
+server.ssl.key-alias=tomcat-localhost
+logging.level.root=ERROR
+logging.level.org.springframework=ERROR
+logging.level.org.springframework.data=ERROR
+logging.level.org.onap.dcaegen2.services.prh=INFO
+logging.file=logs/log/application.log
+app.filepath=config/prh_endpoints.json
diff --git a/prh-app-server/src/main/resources/keystore.jks b/prh-app-server/src/main/resources/keystore.jks
new file mode 100644
index 00000000..cd27cc01
--- /dev/null
+++ b/prh-app-server/src/main/resources/keystore.jks
Binary files differ
diff --git a/prh-app-server/src/main/resources/keystore.jks.old b/prh-app-server/src/main/resources/keystore.jks.old
new file mode 100644
index 00000000..8a2b4f99
--- /dev/null
+++ b/prh-app-server/src/main/resources/keystore.jks.old
Binary files differ
diff --git a/prh-app-server/src/main/resources/logback.xml b/prh-app-server/src/main/resources/logback-spring.xml
index af4ab189..af4ab189 100644
--- a/prh-app-server/src/main/resources/logback.xml
+++ b/prh-app-server/src/main/resources/logback-spring.xml
diff --git a/prh-app-server/src/main/resources/scheduled-context.xml b/prh-app-server/src/main/resources/scheduled-context.xml
index d1c80caf..91919aa2 100644
--- a/prh-app-server/src/main/resources/scheduled-context.xml
+++ b/prh-app-server/src/main/resources/scheduled-context.xml
@@ -10,7 +10,7 @@
<context:component-scan
base-package="org.onap.dcaegen2.services.prh"/>
<task:scheduled-tasks>
- <task:scheduled ref="scheduleController" method="startTask"
+ <task:scheduled ref="scheduleController" method="startTasks"
fixed-rate="1000"/>
</task:scheduled-tasks>
</beans>
diff --git a/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/IT/ScheduledXmlContextITest.java b/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/IT/ScheduledXmlContextITest.java
index c8ed88da..faecec4d 100644
--- a/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/IT/ScheduledXmlContextITest.java
+++ b/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/IT/ScheduledXmlContextITest.java
@@ -23,13 +23,18 @@ import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.FutureTask;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.onap.dcaegen2.services.prh.IT.junit5.mockito.MockitoExtension;
import org.onap.dcaegen2.services.prh.configuration.PrhAppConfig;
+import org.onap.dcaegen2.services.prh.exceptions.PrhTaskException;
import org.onap.dcaegen2.services.prh.tasks.ScheduledTasks;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;