diff options
14 files changed, 206 insertions, 16 deletions
@@ -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 Binary files differnew file mode 100644 index 00000000..26a16f75 --- /dev/null +++ b/prh-app-server/config/keystore 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 Binary files differnew file mode 100644 index 00000000..cd27cc01 --- /dev/null +++ b/prh-app-server/src/main/resources/keystore.jks diff --git a/prh-app-server/src/main/resources/keystore.jks.old b/prh-app-server/src/main/resources/keystore.jks.old Binary files differnew file mode 100644 index 00000000..8a2b4f99 --- /dev/null +++ b/prh-app-server/src/main/resources/keystore.jks.old 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; |