From c0218ada67784a7d5c3a488303bcbab2b3dce5b5 Mon Sep 17 00:00:00 2001
From: PatrikBuhr The O-RAN Non-RT RIC Policy Management Service provides a REST API for management of A1 policies. This is an API for management of A1 Policies.<\/p> API for updating and retrieval of the component configuration. Note that there other ways to maintain the configuration.<\/p> These are endpoints that are invoked by this service. The callbacks are registered in this service at service registration.<\/p> This is an API that provides support for looking up a NearRT-RIC. Each A1 policy is targeted for one Near-RT RIC.<\/p> API used for supervision of the PMS component.<\/p> API used for registering services that uses PMS. Each A1 policy is optionally owned by a service. PMS can supervise each registered service by a heart-beat supervision and will automatically remove policies for unavailable services. Note that a service does not need to be registered in order to create A1 Policies. This is a feature that is optional to use.<\/p>",
+ "description": " The O-RAN Non-RT RIC Policy Management Service provides a REST API for management of A1 policies. This is an API for management of A1 Policies.<\/p> API for updating and retrieval of the component configuration. Note that there other ways to maintain the configuration.<\/p> These are endpoints that are invoked by this service. The callbacks are registered in this service at service registration.<\/p> This is an API that provides support for looking up a NearRT-RIC. Each A1 policy is targeted for one Near-RT RIC.<\/p> API used for supervision of the PMS component.<\/p> API used for registering services that uses PMS. Each A1 policy is optionally owned by a service. PMS can supervise each registered service by a heart-beat supervision and will automatically remove policies for unavailable services. Note that a service does not need to be registered in order to create A1 Policies. This is a feature that is optional to use.<\/p> Provides generic functions used to monitor and manage the Spring web application.<\/p>",
"title": "A1 Policy Management Service",
"version": "1.1.0"
},
diff --git a/a1-policy-management/api/pms-api.yaml b/a1-policy-management/api/pms-api.yaml
index 6d620c23..2c692de2 100644
--- a/a1-policy-management/api/pms-api.yaml
+++ b/a1-policy-management/api/pms-api.yaml
@@ -21,9 +21,11 @@ info:
Each A1 policy is optionally owned by a service. PMS can supervise each registered
service by a heart-beat supervision and will automatically remove policies for
unavailable services. Note that a service does not need to be registered in order
- to create A1 Policies. This is a feature that is optional to use.General<\/h2>
The main tasks of the service are:<\/p>APIs provided by the service<\/h2>
A1 Policy Management<\/h3>
Management of configuration<\/h3>
Callbacks<\/h3>
NearRT-RIC Repository<\/h3>
Health Check<\/h3>
Service Registry and Supervision<\/h3>
General<\/h2>
The main tasks of the service are:<\/p>APIs provided by the service<\/h2>
A1 Policy Management<\/h3>
Management of configuration<\/h3>
Callbacks<\/h3>
NearRT-RIC Repository<\/h3>
Health Check<\/h3>
Service Registry and Supervision<\/h3>
Spring Boot Actuator<\/h3>
Provides generic functions used to monitor and manage the + Spring web application.
license: - name: Copyright (C) 2020-2022 Nordix Foundation. Licensed under the Apache License. + name: Copyright (C) 2020-2023 Nordix Foundation. Licensed under the Apache License. url: http://www.apache.org/licenses/LICENSE-2.0 version: 1.1.0 servers: @@ -189,6 +191,19 @@ paths: application/json: schema: $ref: '#/components/schemas/error_information' + /actuator/shutdown: + post: + tags: + - Actuator + summary: Actuator web endpoint 'shutdown' + operationId: shutdown + responses: + 200: + description: OK + content: + '*/*': + schema: + type: object /a1-policy/v2/policy-types: get: tags: diff --git a/a1-policy-management/config/application.yaml b/a1-policy-management/config/application.yaml index 2bd8d83d..8f37aaa5 100644 --- a/a1-policy-management/config/application.yaml +++ b/a1-policy-management/config/application.yaml @@ -31,7 +31,12 @@ management: web: exposure: # Enabling of springboot actuator features. See springboot documentation. - include: "loggers,logfile,health,info,metrics,threaddump,heapdump" + include: "loggers,logfile,health,info,metrics,threaddump,heapdump,shutdown" + endpoint: + shutdown: + enabled: true +lifecycle: + timeout-per-shutdown-phase: "20s" springdoc: show-actuator: true logging: @@ -53,6 +58,7 @@ server: # See springboot documentation. port : 8433 http-port: 8081 + shutdown: "graceful" ssl: key-store-type: JKS key-store-password: policy_agent diff --git a/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/Application.java b/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/Application.java index ae114f67..259a5ba9 100644 --- a/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/Application.java +++ b/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/Application.java @@ -20,13 +20,18 @@ package org.onap.ccsdk.oran.a1policymanagementservice; +import java.lang.invoke.MethodHandles; + import org.onap.ccsdk.oran.a1policymanagementservice.dmaap.DmaapMessageConsumer; import org.onap.ccsdk.oran.a1policymanagementservice.tasks.RefreshConfigTask; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; +import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; @SpringBootApplication @@ -38,8 +43,18 @@ public class Application { @Autowired private DmaapMessageConsumer dmaapMessageConsumer; + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + public static void main(String[] args) { - SpringApplication.run(Application.class); + ConfigurableApplicationContext context = SpringApplication.run(Application.class); + + Runtime.getRuntime().addShutdownHook(new Thread() { + @Override + public void run() { + logger.warn("Shutting down, received signal SIGTERM"); + SpringApplication.exit(context); + } + }); } /** diff --git a/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/SwaggerConfig.java b/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/SwaggerConfig.java index 4c3a0c79..b6d3a076 100644 --- a/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/SwaggerConfig.java +++ b/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/SwaggerConfig.java @@ -43,7 +43,7 @@ import org.onap.ccsdk.oran.a1policymanagementservice.controllers.v2.StatusContro version = SwaggerConfig.VERSION, // description = SwaggerConfig.DESCRIPTION, // license = @License( - name = "Copyright (C) 2020-2022 Nordix Foundation. Licensed under the Apache License.", // + name = "Copyright (C) 2020-2023 Nordix Foundation. Licensed under the Apache License.", // url = "http://www.apache.org/licenses/LICENSE-2.0")) // ) public class SwaggerConfig { @@ -83,10 +83,15 @@ public class SwaggerConfig { + H3 + StatusController.API_NAME + H3_END + // "API used for supervision of the PMS component.
" + // H3 + ServiceController.API_NAME + H3_END + // - "" + "API used for registering services that uses PMS." + "
" // + + "API used for registering services that uses PMS." + " Each A1 policy is optionally owned by a service. PMS can supervise each registered service by a heart-beat supervision and will automatically remove policies for unavailable services." + " Note that a service does not need to be registered in order to create A1 Policies. This is a feature that is optional to use." - + "
"; + + "" + // + H3 + "Spring Boot Actuator" + H3_END + // + "" // + + "Provides generic functions used to monitor and manage the Spring web application." + // + "
"; public static final String VERSION = "1.1.0"; } diff --git a/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/aspect/LogAspect.java b/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/aspect/LogAspect.java index 16f4a7f8..1c40f04f 100644 --- a/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/aspect/LogAspect.java +++ b/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/aspect/LogAspect.java @@ -20,6 +20,8 @@ package org.onap.ccsdk.oran.a1policymanagementservice.aspect; +import java.lang.invoke.MethodHandles; + import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.After; @@ -36,7 +38,7 @@ import org.springframework.util.StopWatch; @Component public class LogAspect { - private static final Logger logger = LoggerFactory.getLogger(LogAspect.class); + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); @Around("execution(* org.onap.ccsdk.oran.a1policymanagementservice..*(..)))") public void executimeTime(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { diff --git a/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/clients/A1ClientFactory.java b/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/clients/A1ClientFactory.java index 45c0bc42..0956aa13 100644 --- a/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/clients/A1ClientFactory.java +++ b/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/clients/A1ClientFactory.java @@ -20,6 +20,7 @@ package org.onap.ccsdk.oran.a1policymanagementservice.clients; +import java.lang.invoke.MethodHandles; import java.lang.reflect.Constructor; import org.onap.ccsdk.oran.a1policymanagementservice.clients.A1Client.A1ProtocolType; @@ -38,7 +39,7 @@ import reactor.core.publisher.Mono; */ public class A1ClientFactory { - private static final Logger logger = LoggerFactory.getLogger(A1ClientFactory.class); + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); private final ApplicationConfig appConfig; diff --git a/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/configuration/ConfigurationFile.java b/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/configuration/ConfigurationFile.java index 4af39c92..9db66202 100644 --- a/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/configuration/ConfigurationFile.java +++ b/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/configuration/ConfigurationFile.java @@ -30,6 +30,7 @@ import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.lang.invoke.MethodHandles; import java.util.Optional; import javax.validation.constraints.NotNull; @@ -41,7 +42,7 @@ import org.springframework.stereotype.Component; @Component public class ConfigurationFile { - private static final Logger logger = LoggerFactory.getLogger(ConfigurationFile.class); + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); final ApplicationConfig appConfig; final Gson gson = new Gson(); diff --git a/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/datastore/S3ObjectStore.java b/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/datastore/S3ObjectStore.java index 4c7c3c3e..5b81f756 100644 --- a/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/datastore/S3ObjectStore.java +++ b/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/datastore/S3ObjectStore.java @@ -20,6 +20,7 @@ package org.onap.ccsdk.oran.a1policymanagementservice.datastore; +import java.lang.invoke.MethodHandles; import java.net.URI; import java.util.concurrent.CompletableFuture; @@ -53,7 +54,7 @@ import software.amazon.awssdk.services.s3.model.PutObjectResponse; import software.amazon.awssdk.services.s3.model.S3Object; class S3ObjectStore implements DataStore { - private static final Logger logger = LoggerFactory.getLogger(S3ObjectStore.class); + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); private final ApplicationConfig applicationConfig; private static S3AsyncClient s3AsynchClient; diff --git a/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/dmaap/DmaapMessageConsumer.java b/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/dmaap/DmaapMessageConsumer.java index 47c73506..94888c38 100644 --- a/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/dmaap/DmaapMessageConsumer.java +++ b/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/dmaap/DmaapMessageConsumer.java @@ -26,6 +26,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonParser; +import java.lang.invoke.MethodHandles; import java.time.Duration; import java.util.ArrayList; import java.util.List; @@ -63,7 +64,7 @@ public class DmaapMessageConsumer { protected static final Duration TIME_BETWEEN_DMAAP_RETRIES = Duration.ofSeconds(10); - private static final Logger logger = LoggerFactory.getLogger(DmaapMessageConsumer.class); + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); private final ApplicationConfig applicationConfig; diff --git a/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/dmaap/DmaapMessageHandler.java b/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/dmaap/DmaapMessageHandler.java index d0354174..022dec05 100644 --- a/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/dmaap/DmaapMessageHandler.java +++ b/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/dmaap/DmaapMessageHandler.java @@ -24,6 +24,8 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; +import java.lang.invoke.MethodHandles; + import org.onap.ccsdk.oran.a1policymanagementservice.clients.AsyncRestClient; import org.onap.ccsdk.oran.a1policymanagementservice.dmaap.DmaapRequestMessage.Operation; import org.onap.ccsdk.oran.a1policymanagementservice.exceptions.ServiceException; @@ -42,7 +44,7 @@ import reactor.core.publisher.Mono; * response though DMAAP */ public class DmaapMessageHandler { - private static final Logger logger = LoggerFactory.getLogger(DmaapMessageHandler.class); + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); private static Gson gson = new GsonBuilder().create(); private final AsyncRestClient dmaapClient; private final AsyncRestClient pmsClient; diff --git a/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/exceptions/GlobalExceptionHandler.java b/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/exceptions/GlobalExceptionHandler.java index 547cd6b0..77d01969 100644 --- a/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/exceptions/GlobalExceptionHandler.java +++ b/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/exceptions/GlobalExceptionHandler.java @@ -20,6 +20,8 @@ package org.onap.ccsdk.oran.a1policymanagementservice.exceptions; +import java.lang.invoke.MethodHandles; + import org.onap.ccsdk.oran.a1policymanagementservice.controllers.v2.ErrorResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,7 +35,7 @@ import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExcep @ControllerAdvice(annotations = RestController.class) public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { - private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); @ExceptionHandler(ServiceException.class) public final ResponseEntity