From 5f919673b13d8fd40a6a90b97f4e662ade068304 Mon Sep 17 00:00:00 2001 From: Rashmi Pujar Date: Fri, 4 Feb 2022 21:49:30 -0500 Subject: [PATCH] Migrate policy api startup & config, controller to springboot Issue-ID: POLICY-3753 Signed-off-by: Rashmi Pujar Change-Id: I4537ed49b7fc57683bfc487f0d212642b7e69f17 --- main/pom.xml | 101 ++-- .../onap/policy/api/main/PolicyApiApplication.java | 31 ++ .../policy/api/main/config/PolicyApiAafConfig.java | 37 ++ .../policy/api/main/config/PolicyApiConfig.java | 76 +++ .../api/main/config/PolicyPreloadConfig.java | 40 ++ .../policy/api/main/config/SecurityConfig.java | 36 ++ .../onap/policy/api/main/config/SwaggerConfig.java | 47 ++ .../org/onap/policy/api/main/config/WebConfig.java | 72 +++ .../config/converter/StringToEnumConverter.java | 39 ++ .../config/converter/YamlHttpMessageConverter.java | 109 +++++ .../main/exception/PolicyApiRuntimeException.java | 33 +- .../api/main/parameters/ApiParameterGroup.java | 65 --- .../api/main/parameters/ApiParameterHandler.java | 84 ---- .../policy/api/main/rest/ApiRestController.java | 539 ++++++++++----------- .../policy/api/main/rest/ApiStatisticsManager.java | 24 +- .../policy/api/main/rest/CommonRestController.java | 38 +- .../main/rest/provider/CommonModelProvider.java | 28 +- .../main/rest/provider/HealthCheckProvider.java | 28 +- .../api/main/rest/provider/PolicyProvider.java | 12 +- .../api/main/rest/provider/PolicyTypeProvider.java | 12 +- .../api/main/rest/provider/StatisticsProvider.java | 17 +- .../policy/api/main/startstop/ApiActivator.java | 125 ----- .../main/startstop/ApiCommandLineArguments.java | 55 --- .../api/main/startstop/ApiDatabaseInitializer.java | 55 ++- .../org/onap/policy/api/main/startstop/Main.java | 141 ------ main/src/main/resources/application.yaml | 65 +++ .../policy/api/main/parameters/CommonTestData.java | 119 ----- .../api/main/parameters/TestApiParameterGroup.java | 152 ------ .../main/parameters/TestApiParameterHandler.java | 175 ------- .../policy/api/main/rest/TestApiRestServer.java | 99 ++-- .../api/main/rest/TestApiStatisticsManager.java | 18 +- .../api/main/rest/TestCommonRestController.java | 13 +- .../api/main/rest/provider/TestPolicyProvider.java | 78 +-- .../main/rest/provider/TestPolicyTypeProvider.java | 72 +-- .../main/startstop/ApiDatabaseInitializerTest.java | 65 +-- .../api/main/startstop/TestApiActivator.java | 54 --- .../startstop/TestApiCommandLineArguments.java | 68 --- .../onap/policy/api/main/startstop/TestMain.java | 80 --- main/src/test/resources/application-test.yaml | 8 + main/src/test/resources/logback-test.xml | 53 -- .../parameters/ApiConfigParameters_Https.json | 56 --- .../ApiConfigParameters_InvalidName.json | 19 - ...nfigParameters_InvalidRestServerParameters.json | 20 - .../parameters/ApiConfigParameters_Postgres.json | 56 --- .../test/resources/parameters/BadParameters.json | 3 - .../test/resources/parameters/EmptyParameters.json | 0 .../resources/parameters/InvalidParameters.json | 3 - .../resources/parameters/MinimumParameters.json | 20 - .../test/resources/parameters/NoParameters.json | 19 - .../resources/parameters/RestServerParameters.json | 6 - .../parameters/RestServerParametersEmpty.json | 2 - packages/policy-api-docker/pom.xml | 10 +- .../policy-api-docker/src/main/docker/Dockerfile | 8 +- .../src/main/docker/policy-api.sh | 12 +- .../src/main/package/tarball/assembly.xml | 5 +- .../src/main/resources/etc/apiParameters.yaml | 65 +++ .../src/main/resources/etc/defaultConfig.json | 57 --- .../src/main/resources/etc/s3pConfig.json | 56 --- 58 files changed, 1245 insertions(+), 2135 deletions(-) create mode 100644 main/src/main/java/org/onap/policy/api/main/PolicyApiApplication.java create mode 100644 main/src/main/java/org/onap/policy/api/main/config/PolicyApiAafConfig.java create mode 100644 main/src/main/java/org/onap/policy/api/main/config/PolicyApiConfig.java create mode 100644 main/src/main/java/org/onap/policy/api/main/config/PolicyPreloadConfig.java create mode 100644 main/src/main/java/org/onap/policy/api/main/config/SecurityConfig.java create mode 100644 main/src/main/java/org/onap/policy/api/main/config/SwaggerConfig.java create mode 100644 main/src/main/java/org/onap/policy/api/main/config/WebConfig.java create mode 100644 main/src/main/java/org/onap/policy/api/main/config/converter/StringToEnumConverter.java create mode 100644 main/src/main/java/org/onap/policy/api/main/config/converter/YamlHttpMessageConverter.java delete mode 100644 main/src/main/java/org/onap/policy/api/main/parameters/ApiParameterGroup.java delete mode 100644 main/src/main/java/org/onap/policy/api/main/parameters/ApiParameterHandler.java delete mode 100644 main/src/main/java/org/onap/policy/api/main/startstop/ApiActivator.java delete mode 100644 main/src/main/java/org/onap/policy/api/main/startstop/ApiCommandLineArguments.java delete mode 100644 main/src/main/java/org/onap/policy/api/main/startstop/Main.java create mode 100644 main/src/main/resources/application.yaml delete mode 100644 main/src/test/java/org/onap/policy/api/main/parameters/CommonTestData.java delete mode 100644 main/src/test/java/org/onap/policy/api/main/parameters/TestApiParameterGroup.java delete mode 100644 main/src/test/java/org/onap/policy/api/main/parameters/TestApiParameterHandler.java delete mode 100644 main/src/test/java/org/onap/policy/api/main/startstop/TestApiActivator.java delete mode 100644 main/src/test/java/org/onap/policy/api/main/startstop/TestApiCommandLineArguments.java delete mode 100644 main/src/test/java/org/onap/policy/api/main/startstop/TestMain.java create mode 100644 main/src/test/resources/application-test.yaml delete mode 100644 main/src/test/resources/logback-test.xml delete mode 100644 main/src/test/resources/parameters/ApiConfigParameters_Https.json delete mode 100644 main/src/test/resources/parameters/ApiConfigParameters_InvalidName.json delete mode 100644 main/src/test/resources/parameters/ApiConfigParameters_InvalidRestServerParameters.json delete mode 100644 main/src/test/resources/parameters/ApiConfigParameters_Postgres.json delete mode 100644 main/src/test/resources/parameters/BadParameters.json delete mode 100644 main/src/test/resources/parameters/EmptyParameters.json delete mode 100644 main/src/test/resources/parameters/InvalidParameters.json delete mode 100644 main/src/test/resources/parameters/MinimumParameters.json delete mode 100644 main/src/test/resources/parameters/NoParameters.json delete mode 100644 main/src/test/resources/parameters/RestServerParameters.json delete mode 100644 main/src/test/resources/parameters/RestServerParametersEmpty.json create mode 100644 packages/policy-api-tarball/src/main/resources/etc/apiParameters.yaml delete mode 100644 packages/policy-api-tarball/src/main/resources/etc/defaultConfig.json delete mode 100644 packages/policy-api-tarball/src/main/resources/etc/s3pConfig.json diff --git a/main/pom.xml b/main/pom.xml index 5e54f2d9..c89eafd1 100644 --- a/main/pom.xml +++ b/main/pom.xml @@ -3,7 +3,7 @@ Copyright (C) 2018 Ericsson. All rights reserved. Modified Copyright (C) 2018 Samsung Electronics Co., Ltd. Copyright (C) 2019,2021 AT&T Intellectual Property. All rights reserved. - Modifications Copyright (C) 2020 Bell Canada. + Modifications Copyright (C) 2020-2022 Bell Canada. Modifications Copyright (C) 2022 Nordix Foundation. ================================================================================ Licensed under the Apache License, Version 2.0 (the "License"); @@ -37,71 +37,75 @@ - org.onap.policy.common - capabilities - ${policy.common.version} + org.onap.policy.models + policy-models-provider + ${policy.models.version} - commons-cli - commons-cli + com.h2database + h2 - com.google.code.gson - gson + org.assertj + assertj-core + test org.onap.policy.common - common-parameters + utils-test ${policy.common.version} + test - org.onap.policy.models - policy-models-tosca - ${policy.models.version} - - - org.onap.policy.models - policy-models-provider - ${policy.models.version} + org.junit.vintage + junit-vintage-engine + test - org.onap.policy.models - policy-models-examples - ${policy.models.version} + org.springframework.boot + spring-boot-starter-test + test - org.onap.policy.common - utils - ${policy.common.version} + com.google.code.gson + gson - org.projectlombok - lombok - provided + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-json + + - com.h2database - h2 - test + org.springframework.boot + spring-boot-starter-security - org.mariadb.jdbc - mariadb-java-client + org.springframework.boot + spring-boot-starter-actuator + ${version.springboot.actuator} - org.postgresql - postgresql + io.micrometer + micrometer-registry-prometheus + ${version.io.micrometer} + runtime - org.assertj - assertj-core - test + io.springfox + springfox-boot-starter + ${version.springfox} - org.onap.policy.common - utils-test - ${policy.common.version} - test + io.springfox + springfox-swagger-ui + ${version.springfox} + runtime @@ -123,6 +127,19 @@ + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + package + + + + - - + \ No newline at end of file diff --git a/main/src/main/java/org/onap/policy/api/main/PolicyApiApplication.java b/main/src/main/java/org/onap/policy/api/main/PolicyApiApplication.java new file mode 100644 index 00000000..25c4d937 --- /dev/null +++ b/main/src/main/java/org/onap/policy/api/main/PolicyApiApplication.java @@ -0,0 +1,31 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2022 Bell Canada. 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.api.main; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class PolicyApiApplication { + public static void main(String[] args) { + SpringApplication.run(PolicyApiApplication.class, args); + } +} \ No newline at end of file diff --git a/main/src/main/java/org/onap/policy/api/main/config/PolicyApiAafConfig.java b/main/src/main/java/org/onap/policy/api/main/config/PolicyApiAafConfig.java new file mode 100644 index 00000000..bd55344a --- /dev/null +++ b/main/src/main/java/org/onap/policy/api/main/config/PolicyApiAafConfig.java @@ -0,0 +1,37 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2022 Bell Canada. 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.api.main.config; + +import javax.servlet.Filter; +import org.onap.policy.api.main.rest.aaf.AafApiFilter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConditionalOnProperty(value = "policy-api.aaf", havingValue = "true") +public class PolicyApiAafConfig { + + @Bean + public Filter aafFilter() { + return new AafApiFilter(); + } +} \ No newline at end of file diff --git a/main/src/main/java/org/onap/policy/api/main/config/PolicyApiConfig.java b/main/src/main/java/org/onap/policy/api/main/config/PolicyApiConfig.java new file mode 100644 index 00000000..3e4f11ac --- /dev/null +++ b/main/src/main/java/org/onap/policy/api/main/config/PolicyApiConfig.java @@ -0,0 +1,76 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2022 Bell Canada. 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.api.main.config; + +import org.onap.policy.api.main.rest.StatisticsReport; +import org.onap.policy.models.base.PfModelException; +import org.onap.policy.models.provider.PolicyModelsProvider; +import org.onap.policy.models.provider.PolicyModelsProviderFactory; +import org.onap.policy.models.provider.PolicyModelsProviderParameters; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class PolicyApiConfig { + + @Value("${policy-api.name}") + private String groupName; + @Value("${database.name}") + private String databaseName; + @Value("${database.implementation}") + private String databaseImplementation; + @Value("${database.driver}") + private String databaseDriver; + @Value("${database.url}") + private String databaseUrl; + @Value("${database.user}") + private String databaseUser; + @Value("${database.password}") + private String databasePassword; + @Value("${database.persistenceUnit}") + private String databasePersistenceUnit; + + /** + * Initialize database configuration. + * + * @return PolicyModelsProvider + * @throws PfModelException Policy exception + */ + @Bean(destroyMethod = "close") + public PolicyModelsProvider policyModelsProvider() throws PfModelException { + PolicyModelsProviderParameters modelsProviderParameters = new PolicyModelsProviderParameters(); + modelsProviderParameters.setName(databaseName); + modelsProviderParameters.setImplementation(databaseImplementation); + modelsProviderParameters.setDatabaseDriver(databaseDriver); + modelsProviderParameters.setDatabaseUrl(databaseUrl); + modelsProviderParameters.setDatabaseUser(databaseUser); + modelsProviderParameters.setDatabasePassword(databasePassword); + modelsProviderParameters.setPersistenceUnit(databasePersistenceUnit); + modelsProviderParameters.setDatabaseDriver(databaseDriver); + return new PolicyModelsProviderFactory().createPolicyModelsProvider(modelsProviderParameters); + } + + @Bean + public StatisticsReport createStatisticsReport() { + return new StatisticsReport(); + } +} \ No newline at end of file diff --git a/main/src/main/java/org/onap/policy/api/main/config/PolicyPreloadConfig.java b/main/src/main/java/org/onap/policy/api/main/config/PolicyPreloadConfig.java new file mode 100644 index 00000000..c2c40ff2 --- /dev/null +++ b/main/src/main/java/org/onap/policy/api/main/config/PolicyPreloadConfig.java @@ -0,0 +1,40 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2022 Bell Canada. 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.api.main.config; + +import java.util.List; +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties("policy-preload") +public class PolicyPreloadConfig { + + @Getter + @Setter + List policyTypes; + + @Getter + @Setter + List policies; +} \ No newline at end of file diff --git a/main/src/main/java/org/onap/policy/api/main/config/SecurityConfig.java b/main/src/main/java/org/onap/policy/api/main/config/SecurityConfig.java new file mode 100644 index 00000000..367f92af --- /dev/null +++ b/main/src/main/java/org/onap/policy/api/main/config/SecurityConfig.java @@ -0,0 +1,36 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2022 Bell Canada. 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.api.main.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +@Configuration +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + public void configure(HttpSecurity http) throws Exception { + http.httpBasic().and() // use Basic authentication + .authorizeRequests().anyRequest().authenticated() // allow authenticated access to all rest endpoints + .and().csrf().disable(); // CSRF filter is relevant when serving browser clients, hence disable + } +} \ No newline at end of file diff --git a/main/src/main/java/org/onap/policy/api/main/config/SwaggerConfig.java b/main/src/main/java/org/onap/policy/api/main/config/SwaggerConfig.java new file mode 100644 index 00000000..052ae5c6 --- /dev/null +++ b/main/src/main/java/org/onap/policy/api/main/config/SwaggerConfig.java @@ -0,0 +1,47 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2022 Bell Canada. 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.api.main.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +@Configuration +@EnableSwagger2 +public class SwaggerConfig { + + /** + * Create a bean of type Docket to determine the swagger configuration. + * @return docket bean with swagger configuration. + */ + @Bean + public Docket api() { + return new Docket(DocumentationType.SWAGGER_2) + .select() + .apis(RequestHandlerSelectors.basePackage("org.onap.policy.api.main.rest")) + .paths(PathSelectors.any()) + .build(); + } +} \ No newline at end of file diff --git a/main/src/main/java/org/onap/policy/api/main/config/WebConfig.java b/main/src/main/java/org/onap/policy/api/main/config/WebConfig.java new file mode 100644 index 00000000..a50dd187 --- /dev/null +++ b/main/src/main/java/org/onap/policy/api/main/config/WebConfig.java @@ -0,0 +1,72 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2022 Bell Canada. 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.api.main.config; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonParser; +import com.google.gson.JsonSerializer; +import java.util.Arrays; +import java.util.List; +import org.onap.policy.api.main.config.converter.StringToEnumConverter; +import org.onap.policy.api.main.config.converter.YamlHttpMessageConverter; +import org.springframework.context.annotation.Configuration; +import org.springframework.format.FormatterRegistry; +import org.springframework.http.MediaType; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.json.GsonHttpMessageConverter; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import springfox.documentation.spring.web.json.Json; + +/** + * Register custom converters to Spring configuration. + */ +@Configuration +public class WebConfig implements WebMvcConfigurer { + @Override + public void addFormatters(FormatterRegistry registry) { + registry.addConverter(new StringToEnumConverter()); + } + + @Override + public void extendMessageConverters(List> converters) { + YamlHttpMessageConverter yamlConverter = new YamlHttpMessageConverter(); + yamlConverter.setSupportedMediaTypes(Arrays.asList(MediaType.parseMediaType("application/yaml"))); + converters.add(yamlConverter); + + GsonHttpMessageConverter converter = buildGsonConverter(); + converters.removeIf(c -> c instanceof GsonHttpMessageConverter); + converters.add(0, converter); + } + + /** + * Swagger uses {{@link springfox.documentation.spring.web.json.Json}} which leads to Gson serialization errors. + * Hence, we customize a typeAdapter on the Gson bean in the Gson http message converter. + * + * @return customised GSON HttpMessageConverter instance. + */ + private GsonHttpMessageConverter buildGsonConverter() { + JsonSerializer serializer = (json, type, jsonSerializationContext) -> + JsonParser.parseString(json.value()); + Gson gson = new GsonBuilder().registerTypeAdapter(Json.class, serializer).create(); + return new GsonHttpMessageConverter(gson); + } +} \ No newline at end of file diff --git a/main/src/main/java/org/onap/policy/api/main/config/converter/StringToEnumConverter.java b/main/src/main/java/org/onap/policy/api/main/config/converter/StringToEnumConverter.java new file mode 100644 index 00000000..a6e8c4a3 --- /dev/null +++ b/main/src/main/java/org/onap/policy/api/main/config/converter/StringToEnumConverter.java @@ -0,0 +1,39 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2022 Bell Canada. 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.api.main.config.converter; + +import org.onap.policy.api.main.rest.PolicyFetchMode; +import org.springframework.core.convert.converter.Converter; + +/** + * Custom converter to support lowercase request parameters for policy fetch mode enumeration. + */ +public class StringToEnumConverter implements Converter { + + @Override + public PolicyFetchMode convert(String source) { + try { + return PolicyFetchMode.valueOf(source.toUpperCase()); + } catch (IllegalArgumentException e) { + return null; + } + } +} \ No newline at end of file diff --git a/main/src/main/java/org/onap/policy/api/main/config/converter/YamlHttpMessageConverter.java b/main/src/main/java/org/onap/policy/api/main/config/converter/YamlHttpMessageConverter.java new file mode 100644 index 00000000..9fe9b031 --- /dev/null +++ b/main/src/main/java/org/onap/policy/api/main/config/converter/YamlHttpMessageConverter.java @@ -0,0 +1,109 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2022 Bell Canada. 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.api.main.config.converter; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.Reader; +import java.io.Writer; +import java.lang.reflect.Type; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import org.onap.policy.common.utils.coder.YamlJsonTranslator; +import org.springframework.core.GenericTypeResolver; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpInputMessage; +import org.springframework.http.HttpOutputMessage; +import org.springframework.http.MediaType; +import org.springframework.http.converter.AbstractGenericHttpMessageConverter; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.http.converter.HttpMessageNotWritableException; +import org.springframework.lang.Nullable; + +/** + * Custom converter to marshal/unmarshall data structured with YAML media type. + */ +public class YamlHttpMessageConverter extends AbstractGenericHttpMessageConverter { + + public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8; + + private static final YamlJsonTranslator TRANSLATOR = new YamlJsonTranslator(); + + public YamlHttpMessageConverter() { + super(new MediaType("application", "yaml")); + setDefaultCharset(DEFAULT_CHARSET); + } + + @Override + public final Object read(Type type, @Nullable Class contextClass, HttpInputMessage inputMessage) + throws IOException { + return readResolved(GenericTypeResolver.resolveType(type, contextClass), inputMessage); + } + + @Override + protected final Object readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException { + return readResolved(clazz, inputMessage); + } + + private Object readInternal(Type resolvedType, Reader reader) { + Class clazz = (Class) resolvedType; + return TRANSLATOR.fromYaml(reader, clazz); + } + + @Override + protected final void writeInternal(Object object, @Nullable Type type, HttpOutputMessage outputMessage) + throws IOException { + Writer writer = getWriter(outputMessage); + try { + writeInternal(object, type, writer); + } catch (Exception ex) { + throw new HttpMessageNotWritableException("Could not write YAML: " + ex.getMessage(), ex); + } + writer.flush(); + } + + private void writeInternal(Object object, @Nullable Type type, Writer writer) { + TRANSLATOR.toYaml(writer, object); + } + + private Object readResolved(Type resolvedType, HttpInputMessage inputMessage) throws IOException { + Reader reader = getReader(inputMessage); + try { + return readInternal(resolvedType, reader); + } catch (Exception ex) { + throw new HttpMessageNotReadableException("Could not read YAML: " + ex.getMessage(), ex, inputMessage); + } + } + + private static Reader getReader(HttpInputMessage inputMessage) throws IOException { + return new InputStreamReader(inputMessage.getBody(), getCharset(inputMessage.getHeaders())); + } + + private static Writer getWriter(HttpOutputMessage outputMessage) throws IOException { + return new OutputStreamWriter(outputMessage.getBody(), getCharset(outputMessage.getHeaders())); + } + + private static Charset getCharset(HttpHeaders headers) { + Charset charset = (headers.getContentType() == null ? null : headers.getContentType().getCharset()); + return (charset != null ? charset : DEFAULT_CHARSET); + } +} \ No newline at end of file diff --git a/main/src/main/java/org/onap/policy/api/main/exception/PolicyApiRuntimeException.java b/main/src/main/java/org/onap/policy/api/main/exception/PolicyApiRuntimeException.java index ea6b55f6..19bf5e12 100644 --- a/main/src/main/java/org/onap/policy/api/main/exception/PolicyApiRuntimeException.java +++ b/main/src/main/java/org/onap/policy/api/main/exception/PolicyApiRuntimeException.java @@ -1,6 +1,7 @@ /*- * ============LICENSE_START======================================================= * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * Modifications Copyright (C) 2022 Bell Canada. 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. @@ -20,12 +21,22 @@ package org.onap.policy.api.main.exception; +import java.util.UUID; +import lombok.Getter; +import org.onap.policy.models.errors.concepts.ErrorResponse; + /** * This runtime exception will be called if a runtime error occurs when using policy api. */ public class PolicyApiRuntimeException extends RuntimeException { + private static final long serialVersionUID = -8507246953751956974L; + @Getter + private final UUID requestId; + @Getter + private final ErrorResponse errorResponse; + /** * Instantiates a new policy api runtime exception with a message. * @@ -33,6 +44,8 @@ public class PolicyApiRuntimeException extends RuntimeException { */ public PolicyApiRuntimeException(final String message) { super(message); + this.requestId = null; + this.errorResponse = null; } /** @@ -43,5 +56,23 @@ public class PolicyApiRuntimeException extends RuntimeException { */ public PolicyApiRuntimeException(final String message, final Exception exp) { super(message, exp); + this.requestId = null; + this.errorResponse = null; + } + + /** + * Instantiates a new policy api runtime exception with requestId, errorResponse object + * along with message and a caused by exception. + * + * @param message the message + * @param cause the exception that caused this exception to be thrown + * @param requestId request identifier + * @param errorResponse error response object + */ + public PolicyApiRuntimeException(final String message, final Throwable cause, + final ErrorResponse errorResponse, final UUID requestId) { + super(message, cause); + this.requestId = requestId; + this.errorResponse = errorResponse; } -} +} \ No newline at end of file diff --git a/main/src/main/java/org/onap/policy/api/main/parameters/ApiParameterGroup.java b/main/src/main/java/org/onap/policy/api/main/parameters/ApiParameterGroup.java deleted file mode 100644 index c9b96e36..00000000 --- a/main/src/main/java/org/onap/policy/api/main/parameters/ApiParameterGroup.java +++ /dev/null @@ -1,65 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * Modifications Copyright (C) 2021 AT&T 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. - * - * SPDX-License-Identifier: Apache-2.0 - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.api.main.parameters; - -import java.util.List; -import lombok.Getter; -import org.onap.policy.common.endpoints.parameters.RestServerParameters; -import org.onap.policy.common.parameters.ParameterGroupImpl; -import org.onap.policy.common.parameters.annotations.NotBlank; -import org.onap.policy.common.parameters.annotations.NotNull; -import org.onap.policy.common.parameters.annotations.Valid; -import org.onap.policy.models.provider.PolicyModelsProviderParameters; - -/** - * Class to hold all parameters needed for Api component. - * - */ -@Getter -public class ApiParameterGroup extends ParameterGroupImpl { - - @NotNull @Valid - private final RestServerParameters restServerParameters; - @NotNull @Valid - private final PolicyModelsProviderParameters databaseProviderParameters; - private final List<@NotNull @NotBlank String> preloadPolicyTypes; - private final List<@NotNull @NotBlank String> preloadPolicies; - - /** - * Create the api parameter group. - * - * @param name the parameter group name - * @param restServerParameters the parameters for instantiating API rest server - * @param databaseProviderParameters the parameters for instantiating database provider - * @param preloadPolicyTypes the list of preloaded policy types - * @param preloadPolicies the list of preloaded policies - */ - public ApiParameterGroup(final String name, final RestServerParameters restServerParameters, - final PolicyModelsProviderParameters databaseProviderParameters, final List preloadPolicyTypes, - final List preloadPolicies) { - super(name); - this.restServerParameters = restServerParameters; - this.databaseProviderParameters = databaseProviderParameters; - this.preloadPolicyTypes = preloadPolicyTypes; - this.preloadPolicies = preloadPolicies; - } -} diff --git a/main/src/main/java/org/onap/policy/api/main/parameters/ApiParameterHandler.java b/main/src/main/java/org/onap/policy/api/main/parameters/ApiParameterHandler.java deleted file mode 100644 index 019a0125..00000000 --- a/main/src/main/java/org/onap/policy/api/main/parameters/ApiParameterHandler.java +++ /dev/null @@ -1,84 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP Policy API - * ================================================================================ - * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * Copyright (C) 2019, 2021 AT&T 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. - * - * SPDX-License-Identifier: Apache-2.0 - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.api.main.parameters; - -import com.google.gson.GsonBuilder; -import java.io.FileReader; -import org.onap.policy.api.main.exception.PolicyApiException; -import org.onap.policy.api.main.startstop.ApiCommandLineArguments; -import org.onap.policy.common.parameters.ValidationResult; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * This class handles reading, parsing and validating of policy api parameters from JSON files. - */ -public class ApiParameterHandler { - - private static final Logger LOGGER = LoggerFactory.getLogger(ApiParameterHandler.class); - - /** - * Read the parameters from the parameter file. - * - * @param arguments the arguments passed to policy api - * @return the parameters read from the configuration file - * @throws PolicyApiException on parameter exceptions - */ - public ApiParameterGroup getParameters(final ApiCommandLineArguments arguments) - throws PolicyApiException { - ApiParameterGroup apiParameterGroup = null; - - // Read the parameters - try { - // Read the parameters from JSON using Gson - final var gson = new GsonBuilder().create(); - apiParameterGroup = gson.fromJson(new FileReader(arguments.getFullConfigurationFilePath()), - ApiParameterGroup.class); - } catch (final Exception e) { - final String errorMessage = "error reading parameters from \"" + arguments.getConfigurationFilePath() - + "\"\n" + "(" + e.getClass().getSimpleName() + "):" + e.getMessage(); - throw new PolicyApiException(errorMessage, e); - } - - // The JSON processing returns null if there is an empty file - if (apiParameterGroup == null) { - final String errorMessage = "no parameters found in \"" + arguments.getConfigurationFilePath() + "\""; - LOGGER.error(errorMessage); - throw new PolicyApiException(errorMessage); - } - - // validate the parameters - final ValidationResult validationResult = apiParameterGroup.validate(); - if (!validationResult.isValid()) { - String returnMessage = - "validation error(s) on parameters from \"" + arguments.getConfigurationFilePath() + "\"\n"; - returnMessage += validationResult.getResult(); - - LOGGER.error(returnMessage); - throw new PolicyApiException(returnMessage); - } - - return apiParameterGroup; - } -} diff --git a/main/src/main/java/org/onap/policy/api/main/rest/ApiRestController.java b/main/src/main/java/org/onap/policy/api/main/rest/ApiRestController.java index eb60c5e5..263345a3 100644 --- a/main/src/main/java/org/onap/policy/api/main/rest/ApiRestController.java +++ b/main/src/main/java/org/onap/policy/api/main/rest/ApiRestController.java @@ -5,7 +5,7 @@ * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved. * Modifications Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved. * Modifications Copyright (C) 2020 Nordix Foundation. - * Modifications Copyright (C) 2020 Bell Canada. + * Modifications Copyright (C) 2020-2022 Bell Canada. 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. @@ -41,18 +41,8 @@ import io.swagger.annotations.SwaggerDefinition; import java.net.HttpURLConnection; import java.util.List; import java.util.UUID; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.GET; -import javax.ws.rs.HeaderParam; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; +import org.onap.policy.api.main.exception.PolicyApiRuntimeException; import org.onap.policy.api.main.rest.provider.HealthCheckProvider; import org.onap.policy.api.main.rest.provider.PolicyProvider; import org.onap.policy.api.main.rest.provider.PolicyTypeProvider; @@ -66,16 +56,29 @@ import org.onap.policy.models.base.PfModelRuntimeException; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; /** * Class to provide REST API services. * * @author Chenfei Gao (cgao@research.att.com) */ -@Path("/policy/api/v1") +@RestController +@RequestMapping(path = "/policy/api/v1", produces = { "application/json", "application/yaml" }) @Api(value = "Policy Design API") -@Produces({"application/json", "application/yaml"}) -@Consumes({"application/json", "application/yaml"}) @SwaggerDefinition( info = @Info( description = "Policy Design API is publicly exposed for clients to Create/Read/Update/Delete" @@ -129,14 +132,33 @@ public class ApiRestController extends CommonRestController { private static final String INVALID_PAYLOAD_MESSAGE = "Not Acceptable Payload"; private static final String HTTP_CONFLICT_MESSAGE = "Delete Conflict, Rule Violation"; + private enum Target { + POLICY, + POLICY_TYPE, + OTHER + } + + @Autowired + private PolicyProvider policyProvider; + + @Autowired + private HealthCheckProvider healthCheckProvider; + + @Autowired + private PolicyTypeProvider policyTypeProvider; + + @Autowired + private ApiStatisticsManager mgr; + + @Autowired + private StatisticsProvider statisticsProvider; /** * Retrieves the healthcheck status of the API component. * * @return the Response object containing the results of the API operation */ - @GET - @Path("/healthcheck") + @GetMapping("/healthcheck") @ApiOperation(value = "Perform a system healthcheck", notes = "Returns healthy status of the Policy API component", response = HealthCheckReport.class, responseHeaders = { @@ -159,11 +181,11 @@ public class ApiRestController extends CommonRestController { @ApiResponse(code = HttpURLConnection.HTTP_UNAUTHORIZED, message = AUTHENTICATION_ERROR_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_FORBIDDEN, message = AUTHORIZATION_ERROR_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = SERVER_ERROR_MESSAGE)}) - public Response - getHealthCheck(@HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId) { - - updateApiStatisticsCounter(Target.OTHER, Result.SUCCESS, HttpMethod.GET); - return makeOkResponse(requestId, new HealthCheckProvider().performHealthCheck()); + public ResponseEntity getHealthCheck( + @RequestHeader(name = REQUEST_ID_NAME, required = false) + @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId) { + updateApiStatisticsCounter(Target.OTHER, HttpStatus.OK, HttpMethod.GET); + return makeOkResponse(requestId, healthCheckProvider.performHealthCheck()); } /** @@ -171,8 +193,7 @@ public class ApiRestController extends CommonRestController { * * @return the Response object containing the results of the API operation */ - @GET - @Path("/statistics") + @GetMapping("/statistics") @ApiOperation(value = "Retrieve current statistics", notes = "Returns current statistics including the counters of API invocation", response = StatisticsReport.class, @@ -196,12 +217,11 @@ public class ApiRestController extends CommonRestController { @ApiResponse(code = HttpURLConnection.HTTP_UNAUTHORIZED, message = AUTHENTICATION_ERROR_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_FORBIDDEN, message = AUTHORIZATION_ERROR_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = SERVER_ERROR_MESSAGE)}) - public Response - getStatistics(@HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId) { - - updateApiStatisticsCounter(Target.OTHER, Result.SUCCESS, HttpMethod.GET); - - return makeOkResponse(requestId, new StatisticsProvider().fetchCurrentStatistics()); + public ResponseEntity getStatistics( + @RequestHeader(name = REQUEST_ID_NAME, required = false) + @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId) { + updateApiStatisticsCounter(Target.OTHER, HttpStatus.OK, HttpMethod.GET); + return makeOkResponse(requestId, statisticsProvider.fetchCurrentStatistics()); } /** @@ -209,8 +229,7 @@ public class ApiRestController extends CommonRestController { * * @return the Response object containing the results of the API operation */ - @GET - @Path("/policytypes") + @GetMapping("/policytypes") @ApiOperation(value = "Retrieve existing policy types", notes = "Returns a list of existing policy types stored in Policy Framework", response = ToscaServiceTemplate.class, @@ -234,17 +253,18 @@ public class ApiRestController extends CommonRestController { @ApiResponse(code = HttpURLConnection.HTTP_UNAUTHORIZED, message = AUTHENTICATION_ERROR_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_FORBIDDEN, message = AUTHORIZATION_ERROR_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = SERVER_ERROR_MESSAGE)}) - public Response - getAllPolicyTypes(@HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId) { - - try (var policyTypeProvider = new PolicyTypeProvider()) { + public ResponseEntity getAllPolicyTypes( + @RequestHeader(name = REQUEST_ID_NAME, required = false) + @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId) { + try { ToscaServiceTemplate serviceTemplate = policyTypeProvider.fetchPolicyTypes(null, null); - updateApiStatisticsCounter(Target.POLICY_TYPE, Result.SUCCESS, HttpMethod.GET); + updateApiStatisticsCounter(Target.POLICY_TYPE, HttpStatus.OK, HttpMethod.GET); return makeOkResponse(requestId, serviceTemplate); } catch (PfModelException | PfModelRuntimeException pfme) { - LOGGER.warn("GET /policytypes", pfme); - updateApiStatisticsCounter(Target.POLICY_TYPE, Result.FAILURE, HttpMethod.GET); - return makeErrorResponse(requestId, pfme); + final var msg = "GET /policytypes"; + updateApiStatisticsCounter(Target.POLICY_TYPE, HttpStatus.resolve(pfme.getErrorResponse().getResponseCode() + .getStatusCode()), HttpMethod.GET); + throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId); } } @@ -255,8 +275,7 @@ public class ApiRestController extends CommonRestController { * * @return the Response object containing the results of the API operation */ - @GET - @Path("/policytypes/{policyTypeId}") + @GetMapping("/policytypes/{policyTypeId}") @ApiOperation(value = "Retrieve all available versions of a policy type", notes = "Returns a list of all available versions for the specified policy type", response = ToscaServiceTemplate.class, @@ -281,18 +300,19 @@ public class ApiRestController extends CommonRestController { @ApiResponse(code = HttpURLConnection.HTTP_FORBIDDEN, message = AUTHORIZATION_ERROR_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = NOT_FOUND_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = SERVER_ERROR_MESSAGE)}) - public Response getAllVersionsOfPolicyType( - @PathParam("policyTypeId") @ApiParam(value = "ID of policy type", required = true) String policyTypeId, - @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId) { - - try (var policyTypeProvider = new PolicyTypeProvider()) { + public ResponseEntity getAllVersionsOfPolicyType( + @PathVariable("policyTypeId") @ApiParam(value = "ID of policy type", required = true) String policyTypeId, + @RequestHeader(name = REQUEST_ID_NAME, required = false) + @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId) { + try { ToscaServiceTemplate serviceTemplate = policyTypeProvider.fetchPolicyTypes(policyTypeId, null); - updateApiStatisticsCounter(Target.POLICY_TYPE, Result.SUCCESS, HttpMethod.GET); + updateApiStatisticsCounter(Target.POLICY_TYPE, HttpStatus.OK, HttpMethod.GET); return makeOkResponse(requestId, serviceTemplate); } catch (PfModelException | PfModelRuntimeException pfme) { - LOGGER.warn("GET /policytypes/{}", policyTypeId, pfme); - updateApiStatisticsCounter(Target.POLICY_TYPE, Result.FAILURE, HttpMethod.GET); - return makeErrorResponse(requestId, pfme); + var msg = String.format("GET /policytypes/%s", policyTypeId); + updateApiStatisticsCounter(Target.POLICY_TYPE, HttpStatus.resolve(pfme.getErrorResponse().getResponseCode() + .getStatusCode()), HttpMethod.GET); + throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId); } } @@ -304,8 +324,7 @@ public class ApiRestController extends CommonRestController { * * @return the Response object containing the results of the API operation */ - @GET - @Path("/policytypes/{policyTypeId}/versions/{versionId}") + @GetMapping("/policytypes/{policyTypeId}/versions/{versionId}") @ApiOperation(value = "Retrieve one particular version of a policy type", notes = "Returns a particular version for the specified policy type", response = ToscaServiceTemplate.class, responseHeaders = { @@ -329,19 +348,20 @@ public class ApiRestController extends CommonRestController { @ApiResponse(code = HttpURLConnection.HTTP_FORBIDDEN, message = AUTHORIZATION_ERROR_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = NOT_FOUND_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = SERVER_ERROR_MESSAGE)}) - public Response getSpecificVersionOfPolicyType( - @PathParam("policyTypeId") @ApiParam(value = "ID of policy type", required = true) String policyTypeId, - @PathParam("versionId") @ApiParam(value = "Version of policy type", required = true) String versionId, - @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId) { - - try (var policyTypeProvider = new PolicyTypeProvider()) { + public ResponseEntity getSpecificVersionOfPolicyType( + @PathVariable("policyTypeId") @ApiParam(value = "ID of policy type", required = true) String policyTypeId, + @PathVariable("versionId") @ApiParam(value = "Version of policy type", required = true) String versionId, + @RequestHeader(name = REQUEST_ID_NAME, required = false) + @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId) { + try { ToscaServiceTemplate serviceTemplate = policyTypeProvider.fetchPolicyTypes(policyTypeId, versionId); - updateApiStatisticsCounter(Target.POLICY_TYPE, Result.SUCCESS, HttpMethod.GET); + updateApiStatisticsCounter(Target.POLICY_TYPE, HttpStatus.OK, HttpMethod.GET); return makeOkResponse(requestId, serviceTemplate); } catch (PfModelException | PfModelRuntimeException pfme) { - LOGGER.warn("GET /policytypes/{}/versions/{}", policyTypeId, versionId, pfme); - updateApiStatisticsCounter(Target.POLICY_TYPE, Result.FAILURE, HttpMethod.GET); - return makeErrorResponse(requestId, pfme); + var msg = String.format("GET /policytypes/%s/versions/%s", policyTypeId, versionId); + updateApiStatisticsCounter(Target.POLICY_TYPE, HttpStatus.resolve(pfme.getErrorResponse().getResponseCode() + .getStatusCode()), HttpMethod.GET); + throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId); } } @@ -352,8 +372,7 @@ public class ApiRestController extends CommonRestController { * * @return the Response object containing the results of the API operation */ - @GET - @Path("/policytypes/{policyTypeId}/versions/latest") + @GetMapping("/policytypes/{policyTypeId}/versions/latest") @ApiOperation(value = "Retrieve latest version of a policy type", notes = "Returns latest version for the specified policy type", response = ToscaServiceTemplate.class, responseHeaders = { @@ -377,18 +396,19 @@ public class ApiRestController extends CommonRestController { @ApiResponse(code = HttpURLConnection.HTTP_FORBIDDEN, message = AUTHORIZATION_ERROR_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = NOT_FOUND_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = SERVER_ERROR_MESSAGE)}) - public Response getLatestVersionOfPolicyType( - @PathParam("policyTypeId") @ApiParam(value = "ID of policy type", required = true) String policyTypeId, - @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId) { - - try (var policyTypeProvider = new PolicyTypeProvider()) { + public ResponseEntity getLatestVersionOfPolicyType( + @PathVariable("policyTypeId") @ApiParam(value = "ID of policy type", required = true) String policyTypeId, + @RequestHeader(name = REQUEST_ID_NAME, required = false) + @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId) { + try { ToscaServiceTemplate serviceTemplate = policyTypeProvider.fetchLatestPolicyTypes(policyTypeId); - updateApiStatisticsCounter(Target.POLICY_TYPE, Result.SUCCESS, HttpMethod.GET); + updateApiStatisticsCounter(Target.POLICY_TYPE, HttpStatus.OK, HttpMethod.GET); return makeOkResponse(requestId, serviceTemplate); } catch (PfModelException | PfModelRuntimeException pfme) { - LOGGER.warn("GET /policytypes/{}/versions/latest", policyTypeId, pfme); - updateApiStatisticsCounter(Target.POLICY_TYPE, Result.FAILURE, HttpMethod.GET); - return makeErrorResponse(requestId, pfme); + var msg = String.format("GET /policytypes/%s/versions/latest", policyTypeId); + updateApiStatisticsCounter(Target.POLICY_TYPE, HttpStatus.resolve(pfme.getErrorResponse().getResponseCode() + .getStatusCode()), HttpMethod.GET); + throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId); } } @@ -399,8 +419,7 @@ public class ApiRestController extends CommonRestController { * * @return the Response object containing the results of the API operation */ - @POST - @Path("/policytypes") + @PostMapping("/policytypes") @ApiOperation(value = "Create a new policy type", notes = "Client should provide TOSCA body of the new policy type", authorizations = @Authorization(value = AUTHORIZATION_TYPE), tags = {"PolicyType", }, response = ToscaServiceTemplate.class, @@ -425,22 +444,22 @@ public class ApiRestController extends CommonRestController { @ApiResponse(code = HttpURLConnection.HTTP_FORBIDDEN, message = AUTHORIZATION_ERROR_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_NOT_ACCEPTABLE, message = INVALID_PAYLOAD_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = SERVER_ERROR_MESSAGE)}) - public Response createPolicyType( - @ApiParam(value = "Entity body of policy type", required = true) ToscaServiceTemplate body, - @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId) { - + public ResponseEntity createPolicyType( + @RequestBody @ApiParam(value = "Entity body of policy type", required = true) ToscaServiceTemplate body, + @RequestHeader(name = REQUEST_ID_NAME, required = false) + @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId) { if (NetLoggerUtil.getNetworkLogger().isInfoEnabled()) { NetLoggerUtil.log(EventType.IN, CommInfrastructure.REST, "/policytypes", toJson(body)); } - - try (var policyTypeProvider = new PolicyTypeProvider()) { + try { ToscaServiceTemplate serviceTemplate = policyTypeProvider.createPolicyType(body); - updateApiStatisticsCounter(Target.POLICY_TYPE, Result.SUCCESS, HttpMethod.POST); + updateApiStatisticsCounter(Target.POLICY_TYPE, HttpStatus.OK, HttpMethod.POST); return makeOkResponse(requestId, serviceTemplate); } catch (PfModelException | PfModelRuntimeException pfme) { - LOGGER.warn("POST /policytypes", pfme); - updateApiStatisticsCounter(Target.POLICY_TYPE, Result.FAILURE, HttpMethod.POST); - return makeErrorResponse(requestId, pfme); + final var msg = "POST /policytypes"; + updateApiStatisticsCounter(Target.POLICY_TYPE, HttpStatus.resolve(pfme.getErrorResponse().getResponseCode() + .getStatusCode()), HttpMethod.POST); + throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId); } } @@ -452,8 +471,7 @@ public class ApiRestController extends CommonRestController { * * @return the Response object containing the results of the API operation */ - @DELETE - @Path("/policytypes/{policyTypeId}/versions/{versionId}") + @DeleteMapping("/policytypes/{policyTypeId}/versions/{versionId}") @ApiOperation(value = "Delete one version of a policy type", notes = "Rule 1: pre-defined policy types cannot be deleted;" + "Rule 2: policy types that are in use (parameterized by a TOSCA policy) cannot be deleted." @@ -481,19 +499,20 @@ public class ApiRestController extends CommonRestController { @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = NOT_FOUND_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_CONFLICT, message = HTTP_CONFLICT_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = SERVER_ERROR_MESSAGE)}) - public Response deleteSpecificVersionOfPolicyType( - @PathParam("policyTypeId") @ApiParam(value = "ID of policy type", required = true) String policyTypeId, - @PathParam("versionId") @ApiParam(value = "Version of policy type", required = true) String versionId, - @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId) { - - try (var policyTypeProvider = new PolicyTypeProvider()) { + public ResponseEntity deleteSpecificVersionOfPolicyType( + @PathVariable("policyTypeId") @ApiParam(value = "ID of policy type", required = true) String policyTypeId, + @PathVariable("versionId") @ApiParam(value = "Version of policy type", required = true) String versionId, + @RequestHeader(name = REQUEST_ID_NAME, required = false) + @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId) { + try { ToscaServiceTemplate serviceTemplate = policyTypeProvider.deletePolicyType(policyTypeId, versionId); - updateApiStatisticsCounter(Target.POLICY_TYPE, Result.SUCCESS, HttpMethod.DELETE); + updateApiStatisticsCounter(Target.POLICY_TYPE, HttpStatus.OK, HttpMethod.DELETE); return makeOkResponse(requestId, serviceTemplate); } catch (PfModelException | PfModelRuntimeException pfme) { - LOGGER.warn("DELETE /policytypes/{}/versions/{}", policyTypeId, versionId, pfme); - updateApiStatisticsCounter(Target.POLICY_TYPE, Result.FAILURE, HttpMethod.DELETE); - return makeErrorResponse(requestId, pfme); + var msg = String.format("DELETE /policytypes/%s/versions/%s", policyTypeId, versionId); + updateApiStatisticsCounter(Target.POLICY_TYPE, HttpStatus.resolve(pfme.getErrorResponse().getResponseCode() + .getStatusCode()), HttpMethod.DELETE); + throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId); } } @@ -505,8 +524,7 @@ public class ApiRestController extends CommonRestController { * * @return the Response object containing the results of the API operation */ - @GET - @Path("/policytypes/{policyTypeId}/versions/{policyTypeVersion}/policies") + @GetMapping("/policytypes/{policyTypeId}/versions/{policyTypeVersion}/policies") @ApiOperation( value = "Retrieve all versions of a policy created for a particular policy type version", notes = "Returns a list of all versions of specified policy created for the specified policy type version", @@ -536,24 +554,24 @@ public class ApiRestController extends CommonRestController { @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = NOT_FOUND_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = SERVER_ERROR_MESSAGE) }) - public Response getAllPolicies( - @PathParam("policyTypeId") @ApiParam(value = "ID of policy type", required = true) String policyTypeId, - @PathParam("policyTypeVersion") @ApiParam(value = "Version of policy type", + public ResponseEntity getAllPolicies( + @PathVariable("policyTypeId") @ApiParam(value = "ID of policy type", required = true) String policyTypeId, + @PathVariable("policyTypeVersion") @ApiParam(value = "Version of policy type", required = true) String policyTypeVersion, - @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, - @QueryParam("mode") @DefaultValue("bare") @ApiParam("Fetch mode for policies, BARE for bare policies (default)," - + " REFERENCED for fully referenced policies") PolicyFetchMode mode - ) { - - try (var policyProvider = new PolicyProvider()) { + @RequestHeader(name = REQUEST_ID_NAME, required = false) + @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, + @RequestParam(name = "mode", defaultValue = "bare") @ApiParam("Fetch mode for policies, BARE for bare" + + " policies (default), REFERENCED for fully referenced policies") PolicyFetchMode mode) { + try { ToscaServiceTemplate serviceTemplate = policyProvider.fetchPolicies(policyTypeId, policyTypeVersion, null, null, mode); - updateApiStatisticsCounter(Target.POLICY, Result.SUCCESS, HttpMethod.GET); + updateApiStatisticsCounter(Target.POLICY, HttpStatus.OK, HttpMethod.GET); return makeOkResponse(requestId, serviceTemplate); } catch (PfModelException | PfModelRuntimeException pfme) { - LOGGER.warn("GET /policytypes/{}/versions/{}/policies", policyTypeId, policyTypeVersion, pfme); - updateApiStatisticsCounter(Target.POLICY, Result.FAILURE, HttpMethod.GET); - return makeErrorResponse(requestId, pfme); + var msg = String.format("GET /policytypes/%s/versions/%s/policies", policyTypeId, policyTypeVersion); + updateApiStatisticsCounter(Target.POLICY, HttpStatus.resolve(pfme.getErrorResponse().getResponseCode() + .getStatusCode()), HttpMethod.GET); + throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId); } } @@ -566,8 +584,7 @@ public class ApiRestController extends CommonRestController { * * @return the Response object containing the results of the API operation */ - @GET - @Path("/policytypes/{policyTypeId}/versions/{policyTypeVersion}/policies/{policyId}") + @GetMapping("/policytypes/{policyTypeId}/versions/{policyTypeVersion}/policies/{policyId}") @ApiOperation(value = "Retrieve all version details of a policy created for a particular policy type version", notes = "Returns a list of all version details of the specified policy", response = ToscaServiceTemplate.class, responseHeaders = { @@ -595,24 +612,26 @@ public class ApiRestController extends CommonRestController { @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = NOT_FOUND_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = SERVER_ERROR_MESSAGE) }) - public Response getAllVersionsOfPolicy( - @PathParam("policyTypeId") @ApiParam(value = "ID of policy type", required = true) String policyTypeId, - @PathParam("policyTypeVersion") @ApiParam(value = "Version of policy type", + public ResponseEntity getAllVersionsOfPolicy( + @PathVariable("policyTypeId") @ApiParam(value = "ID of policy type", required = true) String policyTypeId, + @PathVariable("policyTypeVersion") @ApiParam(value = "Version of policy type", required = true) String policyTypeVersion, - @PathParam("policyId") @ApiParam(value = "ID of policy", required = true) String policyId, - @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, - @QueryParam("mode") @DefaultValue("bare") @ApiParam("Fetch mode for policies, BARE for bare policies (default)," - + " REFERENCED for fully referenced policies") PolicyFetchMode mode - ) { - try (var policyProvider = new PolicyProvider()) { + @PathVariable("policyId") @ApiParam(value = "ID of policy", required = true) String policyId, + @RequestHeader(name = REQUEST_ID_NAME, required = false) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, + @RequestParam(name = "mode", defaultValue = "bare") + @ApiParam("Fetch mode for policies, BARE for bare policies (default)," + + " REFERENCED for fully referenced policies") PolicyFetchMode mode) { + try { ToscaServiceTemplate serviceTemplate = policyProvider.fetchPolicies(policyTypeId, policyTypeVersion, policyId, null, mode); - updateApiStatisticsCounter(Target.POLICY, Result.SUCCESS, HttpMethod.GET); + updateApiStatisticsCounter(Target.POLICY, HttpStatus.OK, HttpMethod.GET); return makeOkResponse(requestId, serviceTemplate); } catch (PfModelException | PfModelRuntimeException pfme) { - LOGGER.warn("/policytypes/{}/versions/{}/policies/{}", policyTypeId, policyTypeVersion, policyId, pfme); - updateApiStatisticsCounter(Target.POLICY, Result.FAILURE, HttpMethod.GET); - return makeErrorResponse(requestId, pfme); + var msg = String.format("/policytypes/%s/versions/$s/policies/%s", + policyTypeId, policyTypeVersion, policyId); + updateApiStatisticsCounter(Target.POLICY, HttpStatus.resolve(pfme.getErrorResponse().getResponseCode() + .getStatusCode()), HttpMethod.GET); + throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId); } } @@ -626,8 +645,7 @@ public class ApiRestController extends CommonRestController { * * @return the Response object containing the results of the API operation */ - @GET - @Path("/policytypes/{policyTypeId}/versions/{policyTypeVersion}/policies/{policyId}/versions/{policyVersion}") + @GetMapping("/policytypes/{policyTypeId}/versions/{policyTypeVersion}/policies/{policyId}/versions/{policyVersion}") @ApiOperation(value = "Retrieve one version of a policy created for a particular policy type version", notes = "Returns a particular version of specified policy created for the specified policy type version", response = ToscaServiceTemplate.class, @@ -656,26 +674,27 @@ public class ApiRestController extends CommonRestController { @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = NOT_FOUND_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = SERVER_ERROR_MESSAGE) }) - public Response getSpecificVersionOfPolicy( - @PathParam("policyTypeId") @ApiParam(value = "ID of policy type", required = true) String policyTypeId, - @PathParam("policyTypeVersion") @ApiParam(value = "Version of policy type", + public ResponseEntity getSpecificVersionOfPolicy( + @PathVariable("policyTypeId") @ApiParam(value = "ID of policy type", required = true) String policyTypeId, + @PathVariable("policyTypeVersion") @ApiParam(value = "Version of policy type", required = true) String policyTypeVersion, - @PathParam("policyId") @ApiParam(value = "ID of policy", required = true) String policyId, - @PathParam("policyVersion") @ApiParam(value = "Version of policy", required = true) String policyVersion, - @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, - @QueryParam("mode") @DefaultValue("bare") @ApiParam("Fetch mode for policies, BARE for bare policies (default)," - + " REFERENCED for fully referenced policies") PolicyFetchMode mode - ) { - try (var policyProvider = new PolicyProvider()) { + @PathVariable("policyId") @ApiParam(value = "ID of policy", required = true) String policyId, + @PathVariable("policyVersion") @ApiParam(value = "Version of policy", required = true) String policyVersion, + @RequestHeader(name = REQUEST_ID_NAME, required = false) + @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, + @RequestParam(name = "mode", defaultValue = "bare") @ApiParam("Fetch mode for policies, BARE for bare policies" + + " (default), REFERENCED for fully referenced policies") PolicyFetchMode mode) { + try { ToscaServiceTemplate serviceTemplate = policyProvider.fetchPolicies(policyTypeId, policyTypeVersion, policyId, policyVersion, mode); - updateApiStatisticsCounter(Target.POLICY, Result.SUCCESS, HttpMethod.GET); + updateApiStatisticsCounter(Target.POLICY, HttpStatus.OK, HttpMethod.GET); return makeOkResponse(requestId, serviceTemplate); } catch (PfModelException | PfModelRuntimeException pfme) { - LOGGER.warn("GET /policytypes/{}/versions/{}/policies/{}/versions/{}", policyTypeId, policyTypeVersion, - policyId, policyVersion, pfme); - updateApiStatisticsCounter(Target.POLICY, Result.FAILURE, HttpMethod.GET); - return makeErrorResponse(requestId, pfme); + var msg = String.format("GET /policytypes/%s/versions/%s/policies/%s/versions/%s", + policyTypeId, policyTypeVersion, policyId, policyVersion); + updateApiStatisticsCounter(Target.POLICY, HttpStatus.resolve(pfme.getErrorResponse().getResponseCode() + .getStatusCode()), HttpMethod.GET); + throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId); } } @@ -688,8 +707,7 @@ public class ApiRestController extends CommonRestController { * * @return the Response object containing the results of the API operation */ - @GET - @Path("/policytypes/{policyTypeId}/versions/{policyTypeVersion}/policies/{policyId}/versions/latest") + @GetMapping("/policytypes/{policyTypeId}/versions/{policyTypeVersion}/policies/{policyId}/versions/latest") @ApiOperation(value = "Retrieve the latest version of a particular policy", notes = "Returns the latest version of specified policy", response = ToscaServiceTemplate.class, responseHeaders = { @@ -713,25 +731,26 @@ public class ApiRestController extends CommonRestController { @ApiResponse(code = HttpURLConnection.HTTP_FORBIDDEN, message = AUTHORIZATION_ERROR_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = NOT_FOUND_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = SERVER_ERROR_MESSAGE)}) - public Response getLatestVersionOfPolicy( - @PathParam("policyTypeId") @ApiParam(value = "ID of policy type", required = true) String policyTypeId, - @PathParam("policyTypeVersion") @ApiParam(value = "Version of policy type", + public ResponseEntity getLatestVersionOfPolicy( + @PathVariable("policyTypeId") @ApiParam(value = "ID of policy type", required = true) String policyTypeId, + @PathVariable("policyTypeVersion") @ApiParam(value = "Version of policy type", required = true) String policyTypeVersion, - @PathParam("policyId") @ApiParam(value = "ID of policy", required = true) String policyId, - @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, - @QueryParam("mode") @ApiParam("Fetch mode for policies, TERSE for bare policies (default), " - + "REFERENCED for fully referenced policies") PolicyFetchMode mode) { - - try (var policyProvider = new PolicyProvider()) { + @PathVariable("policyId") @ApiParam(value = "ID of policy", required = true) String policyId, + @RequestHeader(name = REQUEST_ID_NAME, required = false) + @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, + @RequestParam(name = "mode", defaultValue = "bare") @ApiParam("Fetch mode for policies, TERSE for bare " + + "policies (default), REFERENCED for fully referenced policies") PolicyFetchMode mode) { + try { ToscaServiceTemplate serviceTemplate = policyProvider.fetchLatestPolicies(policyTypeId, policyTypeVersion, policyId, mode); - updateApiStatisticsCounter(Target.POLICY, Result.SUCCESS, HttpMethod.GET); + updateApiStatisticsCounter(Target.POLICY, HttpStatus.OK, HttpMethod.GET); return makeOkResponse(requestId, serviceTemplate); } catch (PfModelException | PfModelRuntimeException pfme) { - LOGGER.warn("GET /policytypes/{}/versions/{}/policies/{}/versions/latest", policyTypeId, policyTypeVersion, - policyId, pfme); - updateApiStatisticsCounter(Target.POLICY, Result.FAILURE, HttpMethod.GET); - return makeErrorResponse(requestId, pfme); + var msg = String.format("GET /policytypes/%s/versions/%s/policies/%s/versions/latest", + policyTypeId, policyTypeVersion, policyId); + updateApiStatisticsCounter(Target.POLICY, HttpStatus.resolve(pfme.getErrorResponse().getResponseCode() + .getStatusCode()), HttpMethod.GET); + throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId); } } @@ -744,8 +763,7 @@ public class ApiRestController extends CommonRestController { * * @return the Response object containing the results of the API operation */ - @POST - @Path("/policytypes/{policyTypeId}/versions/{policyTypeVersion}/policies") + @PostMapping("/policytypes/{policyTypeId}/versions/{policyTypeVersion}/policies") @ApiOperation(value = "Create a new policy for a policy type version", notes = "Client should provide TOSCA body of the new policy", authorizations = @Authorization(value = AUTHORIZATION_TYPE), tags = {"Policy", }, @@ -772,26 +790,26 @@ public class ApiRestController extends CommonRestController { @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = NOT_FOUND_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_NOT_ACCEPTABLE, message = INVALID_PAYLOAD_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = SERVER_ERROR_MESSAGE)}) - public Response createPolicy( - @PathParam("policyTypeId") @ApiParam(value = "ID of policy type", required = true) String policyTypeId, - @PathParam("policyTypeVersion") @ApiParam(value = "Version of policy type", + public ResponseEntity createPolicy( + @PathVariable("policyTypeId") @ApiParam(value = "ID of policy type", required = true) String policyTypeId, + @PathVariable("policyTypeVersion") @ApiParam(value = "Version of policy type", required = true) String policyTypeVersion, - @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, - @ApiParam(value = "Entity body of policy", required = true) ToscaServiceTemplate body) { - + @RequestHeader(name = REQUEST_ID_NAME, required = false) + @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, + @RequestBody @ApiParam(value = "Entity body of policy", required = true) ToscaServiceTemplate body) { if (NetLoggerUtil.getNetworkLogger().isInfoEnabled()) { NetLoggerUtil.log(EventType.IN, CommInfrastructure.REST, "/policytypes/" + policyTypeId + "/versions/" + policyTypeVersion + "/policies", toJson(body)); } - - try (var policyProvider = new PolicyProvider()) { + try { ToscaServiceTemplate serviceTemplate = policyProvider.createPolicy(policyTypeId, policyTypeVersion, body); - updateApiStatisticsCounter(Target.POLICY, Result.SUCCESS, HttpMethod.POST); + updateApiStatisticsCounter(Target.POLICY, HttpStatus.OK, HttpMethod.POST); return makeOkResponse(requestId, serviceTemplate); } catch (PfModelException | PfModelRuntimeException pfme) { - LOGGER.warn("POST /policytypes/{}/versions/{}/policies", policyTypeId, policyTypeVersion, pfme); - updateApiStatisticsCounter(Target.POLICY, Result.FAILURE, HttpMethod.POST); - return makeErrorResponse(requestId, pfme); + var msg = String.format("POST /policytypes/%s/versions/%s/policies", policyTypeId, policyTypeVersion); + updateApiStatisticsCounter(Target.POLICY, HttpStatus.resolve(pfme.getErrorResponse().getResponseCode() + .getStatusCode()), HttpMethod.POST); + throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId); } } @@ -805,8 +823,8 @@ public class ApiRestController extends CommonRestController { * * @return the Response object containing the results of the API operation */ - @DELETE - @Path("/policytypes/{policyTypeId}/versions/{policyTypeVersion}/policies/{policyId}/versions/{policyVersion}") + @DeleteMapping("/policytypes/{policyTypeId}/versions/{policyTypeVersion}/policies/{policyId}/" + + "versions/{policyVersion}") @ApiOperation(value = "Delete a particular version of a policy", notes = "Rule: the version that has been deployed in PDP group(s) cannot be deleted", authorizations = @Authorization(value = AUTHORIZATION_TYPE), tags = {"Policy", }, @@ -832,24 +850,25 @@ public class ApiRestController extends CommonRestController { @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = NOT_FOUND_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_CONFLICT, message = HTTP_CONFLICT_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = SERVER_ERROR_MESSAGE)}) - public Response deleteSpecificVersionOfPolicy( - @PathParam("policyTypeId") @ApiParam(value = "PolicyType ID", required = true) String policyTypeId, - @PathParam("policyTypeVersion") @ApiParam(value = "Version of policy type", + public ResponseEntity deleteSpecificVersionOfPolicy( + @PathVariable("policyTypeId") @ApiParam(value = "PolicyType ID", required = true) String policyTypeId, + @PathVariable("policyTypeVersion") @ApiParam(value = "Version of policy type", required = true) String policyTypeVersion, - @PathParam("policyId") @ApiParam(value = "ID of policy", required = true) String policyId, - @PathParam("policyVersion") @ApiParam(value = "Version of policy", required = true) String policyVersion, - @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId) { - - try (var policyProvider = new PolicyProvider()) { + @PathVariable("policyId") @ApiParam(value = "ID of policy", required = true) String policyId, + @PathVariable("policyVersion") @ApiParam(value = "Version of policy", required = true) String policyVersion, + @RequestHeader(name = REQUEST_ID_NAME, required = false) + @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId) { + try { ToscaServiceTemplate serviceTemplate = policyProvider.deletePolicy(policyTypeId, policyTypeVersion, policyId, policyVersion); - updateApiStatisticsCounter(Target.POLICY, Result.SUCCESS, HttpMethod.DELETE); + updateApiStatisticsCounter(Target.POLICY, HttpStatus.OK, HttpMethod.DELETE); return makeOkResponse(requestId, serviceTemplate); } catch (PfModelException | PfModelRuntimeException pfme) { - LOGGER.warn("DELETE /policytypes/{}/versions/{}/policies/{}/versions/{}", policyTypeId, policyTypeVersion, - policyId, policyVersion, pfme); - updateApiStatisticsCounter(Target.POLICY, Result.FAILURE, HttpMethod.DELETE); - return makeErrorResponse(requestId, pfme); + var msg = String.format("DELETE /policytypes/%s/versions/%s/policies/%s/versions/%s", + policyTypeId, policyTypeVersion, policyId, policyVersion); + updateApiStatisticsCounter(Target.POLICY, HttpStatus.resolve(pfme.getErrorResponse().getResponseCode() + .getStatusCode()), HttpMethod.DELETE); + throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId); } } @@ -858,8 +877,7 @@ public class ApiRestController extends CommonRestController { * * @return the Response object containing the results of the API operation */ - @GET - @Path("/policies") + @GetMapping("/policies") @ApiOperation(value = "Retrieve all versions of available policies", notes = "Returns all version of available policies", response = ToscaServiceTemplate.class, @@ -888,24 +906,25 @@ public class ApiRestController extends CommonRestController { @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = NOT_FOUND_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = SERVER_ERROR_MESSAGE) }) - public Response getPolicies( - @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, - @QueryParam("mode") @DefaultValue("bare") @ApiParam("Fetch mode for policies, BARE for bare policies (default)," - + " REFERENCED for fully referenced policies") PolicyFetchMode mode - ) { - try (var policyProvider = new PolicyProvider()) { + public ResponseEntity getPolicies( + @RequestHeader(name = REQUEST_ID_NAME, required = false) + @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, + @RequestParam(name = "mode", defaultValue = "bare") @ApiParam("Fetch mode for policies, BARE for bare" + + " policies (default), REFERENCED for fully referenced policies") PolicyFetchMode mode) { + try { ToscaServiceTemplate serviceTemplate = policyProvider.fetchPolicies(null, null, null, null, mode); - updateApiStatisticsCounter(Target.POLICY, Result.SUCCESS, HttpMethod.GET); + updateApiStatisticsCounter(Target.POLICY, HttpStatus.OK, HttpMethod.GET); return makeOkResponse(requestId, serviceTemplate); } catch (PfModelException | PfModelRuntimeException pfme) { - LOGGER.warn("GET /policies/ --", pfme); - updateApiStatisticsCounter(Target.POLICY, Result.FAILURE, HttpMethod.GET); + final var msg = "GET /policies/ --"; + updateApiStatisticsCounter(Target.POLICY, HttpStatus.resolve(pfme.getErrorResponse().getResponseCode() + .getStatusCode()), HttpMethod.GET); if (pfme.getErrorResponse().getResponseCode().equals(Status.NOT_FOUND)) { pfme.getErrorResponse().setErrorMessage(ERROR_MESSAGE_NO_POLICIES_FOUND); pfme.getErrorResponse().setErrorDetails(List.of(ERROR_MESSAGE_NO_POLICIES_FOUND)); } - return makeErrorResponse(requestId, pfme); + throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId); } } @@ -917,8 +936,7 @@ public class ApiRestController extends CommonRestController { * * @return the Response object containing the results of the API operation */ - @GET - @Path("/policies/{policyId}/versions/{policyVersion}") + @GetMapping("/policies/{policyId}/versions/{policyVersion}") @ApiOperation(value = "Retrieve specific version of a specified policy", notes = "Returns a particular version of specified policy", response = ToscaServiceTemplate.class, @@ -947,22 +965,23 @@ public class ApiRestController extends CommonRestController { @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = NOT_FOUND_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = SERVER_ERROR_MESSAGE) }) - public Response getSpecificPolicy( - @PathParam("policyId") @ApiParam(value = "Name of policy", required = true) String policyId, - @PathParam("policyVersion") @ApiParam(value = "Version of policy", required = true) String policyVersion, - @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, - @QueryParam("mode") @DefaultValue("bare") @ApiParam("Fetch mode for policies, BARE for bare policies (default)," - + " REFERENCED for fully referenced policies") PolicyFetchMode mode - ) { - try (var policyProvider = new PolicyProvider()) { + public ResponseEntity getSpecificPolicy( + @PathVariable("policyId") @ApiParam(value = "Name of policy", required = true) String policyId, + @PathVariable("policyVersion") @ApiParam(value = "Version of policy", required = true) String policyVersion, + @RequestHeader(name = REQUEST_ID_NAME, required = false) + @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, + @RequestParam(name = "mode", defaultValue = "bare") @ApiParam("Fetch mode for policies, BARE for bare" + + " policies (default), REFERENCED for fully referenced policies") PolicyFetchMode mode) { + try { ToscaServiceTemplate serviceTemplate = policyProvider.fetchPolicies(null, null, policyId, policyVersion, mode); - updateApiStatisticsCounter(Target.POLICY, Result.SUCCESS, HttpMethod.GET); + updateApiStatisticsCounter(Target.POLICY, HttpStatus.OK, HttpMethod.GET); return makeOkResponse(requestId, serviceTemplate); } catch (PfModelException | PfModelRuntimeException pfme) { - LOGGER.warn("GET /policies/{}/versions/{}", policyId, policyVersion, pfme); - updateApiStatisticsCounter(Target.POLICY, Result.FAILURE, HttpMethod.GET); - return makeErrorResponse(requestId, pfme); + var msg = String.format("GET /policies/%s/versions/%s", policyId, policyVersion); + updateApiStatisticsCounter(Target.POLICY, HttpStatus.resolve(pfme.getErrorResponse().getResponseCode() + .getStatusCode()), HttpMethod.GET); + throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId); } } @@ -973,8 +992,7 @@ public class ApiRestController extends CommonRestController { * * @return the Response object containing the results of the API operation */ - @POST - @Path("/policies") + @PostMapping("/policies") @ApiOperation(value = "Create one or more new policies", notes = "Client should provide TOSCA body of the new polic(ies)", authorizations = @Authorization(value = AUTHORIZATION_TYPE), tags = {"Policy", }, @@ -1001,22 +1019,22 @@ public class ApiRestController extends CommonRestController { @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = NOT_FOUND_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_NOT_ACCEPTABLE, message = INVALID_PAYLOAD_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = SERVER_ERROR_MESSAGE)}) - public Response createPolicies( - @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, - @ApiParam(value = "Entity body of policy", required = true) ToscaServiceTemplate body) { - + public ResponseEntity createPolicies( + @RequestHeader(name = REQUEST_ID_NAME, required = false) + @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, + @RequestBody @ApiParam(value = "Entity body of policy", required = true) ToscaServiceTemplate body) { if (NetLoggerUtil.getNetworkLogger().isInfoEnabled()) { NetLoggerUtil.log(EventType.IN, CommInfrastructure.REST, "/policies", toJson(body)); } - - try (var policyProvider = new PolicyProvider()) { + try { ToscaServiceTemplate serviceTemplate = policyProvider.createPolicies(body); - updateApiStatisticsCounter(Target.POLICY, Result.SUCCESS, HttpMethod.POST); + updateApiStatisticsCounter(Target.POLICY, HttpStatus.OK, HttpMethod.POST); return makeOkResponse(requestId, serviceTemplate); } catch (PfModelException | PfModelRuntimeException pfme) { - LOGGER.warn("POST /policies", pfme); - updateApiStatisticsCounter(Target.POLICY, Result.FAILURE, HttpMethod.POST); - return makeErrorResponse(requestId, pfme); + final var msg = "POST /policies"; + updateApiStatisticsCounter(Target.POLICY, HttpStatus.resolve(pfme.getErrorResponse().getResponseCode() + .getStatusCode()), HttpMethod.POST); + throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId); } } @@ -1028,8 +1046,7 @@ public class ApiRestController extends CommonRestController { * * @return the Response object containing the results of the API operation */ - @DELETE - @Path("/policies/{policyId}/versions/{policyVersion}") + @DeleteMapping("/policies/{policyId}/versions/{policyVersion}") @ApiOperation(value = "Delete a particular version of a policy", notes = "Rule: the version that has been deployed in PDP group(s) cannot be deleted", authorizations = @Authorization(value = AUTHORIZATION_TYPE), tags = {"Policy", }, @@ -1055,47 +1072,33 @@ public class ApiRestController extends CommonRestController { @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = NOT_FOUND_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_CONFLICT, message = HTTP_CONFLICT_MESSAGE), @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = SERVER_ERROR_MESSAGE)}) - public Response deleteSpecificPolicy( - @PathParam("policyId") @ApiParam(value = "ID of policy", required = true) String policyId, - @PathParam("policyVersion") @ApiParam(value = "Version of policy", required = true) String policyVersion, - @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId) { - - try (var policyProvider = new PolicyProvider()) { + public ResponseEntity deleteSpecificPolicy( + @PathVariable("policyId") @ApiParam(value = "ID of policy", required = true) String policyId, + @PathVariable("policyVersion") @ApiParam(value = "Version of policy", required = true) String policyVersion, + @RequestHeader(name = REQUEST_ID_NAME, required = false) + @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId) { + try { ToscaServiceTemplate serviceTemplate = policyProvider.deletePolicy(null, null, policyId, policyVersion); - updateApiStatisticsCounter(Target.POLICY, Result.SUCCESS, HttpMethod.DELETE); + updateApiStatisticsCounter(Target.POLICY, HttpStatus.OK, HttpMethod.DELETE); return makeOkResponse(requestId, serviceTemplate); } catch (PfModelException | PfModelRuntimeException pfme) { - LOGGER.warn("DELETE /policies/{}/versions/{}", policyId, policyVersion, pfme); - updateApiStatisticsCounter(Target.POLICY, Result.FAILURE, HttpMethod.DELETE); - return makeErrorResponse(requestId, pfme); + var msg = String.format("DELETE /policies/%s/versions/%s", policyId, policyVersion); + updateApiStatisticsCounter(Target.POLICY, HttpStatus.resolve(pfme.getErrorResponse().getResponseCode() + .getStatusCode()), HttpMethod.DELETE); + throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId); } } - - - private enum Target { - POLICY, - POLICY_TYPE, - OTHER - } - - private enum Result { - SUCCESS, - FAILURE - } - - private enum HttpMethod { - POST, - GET, - DELETE + @ExceptionHandler(value = {PolicyApiRuntimeException.class}) + protected ResponseEntity handleException(PolicyApiRuntimeException ex) { + LOGGER.warn(ex.getMessage(), ex.getCause()); + return makeErrorResponse(ex.getRequestId(), ex.getErrorResponse(), + ex.getErrorResponse().getResponseCode().getStatusCode()); } - private void updateApiStatisticsCounter(Target target, Result result, HttpMethod http) { - - var mgr = ApiStatisticsManager.getInstance(); + private void updateApiStatisticsCounter(Target target, HttpStatus result, HttpMethod http) { mgr.updateTotalApiCallCount(); - switch (target) { case POLICY: updatePolicyStats(result, http); @@ -1109,10 +1112,8 @@ public class ApiRestController extends CommonRestController { } } - private void updatePolicyStats(Result result, HttpMethod http) { - var mgr = ApiStatisticsManager.getInstance(); - - if (result == Result.SUCCESS) { + private void updatePolicyStats(HttpStatus result, HttpMethod http) { + if (result.equals(HttpStatus.OK)) { switch (http) { case GET: mgr.updateApiCallSuccessCount(); @@ -1157,10 +1158,8 @@ public class ApiRestController extends CommonRestController { } } - private void updatePolicyTypeStats(Result result, HttpMethod http) { - var mgr = ApiStatisticsManager.getInstance(); - - if (result == Result.SUCCESS) { + private void updatePolicyTypeStats(HttpStatus result, HttpMethod http) { + if (result.equals(HttpStatus.OK)) { switch (http) { case GET: mgr.updateApiCallSuccessCount(); @@ -1204,4 +1203,4 @@ public class ApiRestController extends CommonRestController { } } } -} +} \ No newline at end of file diff --git a/main/src/main/java/org/onap/policy/api/main/rest/ApiStatisticsManager.java b/main/src/main/java/org/onap/policy/api/main/rest/ApiStatisticsManager.java index 2a4a46ae..b497c7f0 100644 --- a/main/src/main/java/org/onap/policy/api/main/rest/ApiStatisticsManager.java +++ b/main/src/main/java/org/onap/policy/api/main/rest/ApiStatisticsManager.java @@ -3,7 +3,7 @@ * ONAP Policy API * ================================================================================ * Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved. - * Modifications Copyright (C) 2020-2021 Bell Canada. + * Modifications Copyright (C) 2020-2022 Bell Canada. 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. @@ -23,21 +23,20 @@ package org.onap.policy.api.main.rest; -import lombok.Getter; -import lombok.NoArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; /** * Class to hold statistical data for API access. * * @author Chenfei Gao (cgao@research.att.com) */ -@Getter -@NoArgsConstructor +@Component public class ApiStatisticsManager { - @Getter - private static ApiStatisticsManager instance = new ApiStatisticsManager(); - private StatisticsReport report = new StatisticsReport(); + @Autowired + private StatisticsReport report; + private long totalPolicyDeleteCount; private long totalPolicyTypeDeleteCount; private long policyDeleteSuccessCount; @@ -233,11 +232,4 @@ public class ApiStatisticsManager { public long updatePolicyTypeDeleteFailureCount() { return ++policyTypeDeleteFailureCount; } - - /** - * Resets the statistics. - */ - protected static void resetAllStatistics() { - instance = new ApiStatisticsManager(); - } -} +} \ No newline at end of file diff --git a/main/src/main/java/org/onap/policy/api/main/rest/CommonRestController.java b/main/src/main/java/org/onap/policy/api/main/rest/CommonRestController.java index b059490b..0389e0f6 100644 --- a/main/src/main/java/org/onap/policy/api/main/rest/CommonRestController.java +++ b/main/src/main/java/org/onap/policy/api/main/rest/CommonRestController.java @@ -3,6 +3,7 @@ * ONAP Policy API * ================================================================================ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2022 Bell Canada. 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. @@ -23,14 +24,13 @@ package org.onap.policy.api.main.rest; import java.util.UUID; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.ResponseBuilder; import org.onap.policy.common.utils.coder.Coder; import org.onap.policy.common.utils.coder.CoderException; import org.onap.policy.common.utils.coder.StandardCoder; -import org.onap.policy.models.errors.concepts.ErrorResponseInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.http.HttpHeaders; +import org.springframework.http.ResponseEntity; /** * Super class from which REST controllers are derived. @@ -41,27 +41,33 @@ public class CommonRestController { private final Coder coder = new StandardCoder(); - - protected Response makeOkResponse(UUID requestId, Object respEntity) { - return addLoggingHeaders(addVersionControlHeaders(Response.status(Response.Status.OK)), requestId) - .entity(respEntity).build(); + protected ResponseEntity makeOkResponse(UUID requestId, T respEntity) { + HttpHeaders headers = new HttpHeaders(); + addVersionControlHeaders(headers); + addLoggingHeaders(headers, requestId); + return ResponseEntity.ok().headers(headers).body(respEntity); } - protected Response makeErrorResponse(UUID requestId, T pfme) { - return addLoggingHeaders(addVersionControlHeaders(Response.status(pfme.getErrorResponse().getResponseCode())), - requestId).entity(pfme.getErrorResponse()).build(); + protected ResponseEntity makeErrorResponse(UUID requestId, T respEntity, int status) { + HttpHeaders headers = new HttpHeaders(); + addVersionControlHeaders(headers); + addLoggingHeaders(headers, requestId); + return ResponseEntity.status(status).headers(headers).body(respEntity); } - protected ResponseBuilder addVersionControlHeaders(ResponseBuilder rb) { - return rb.header("X-MinorVersion", "0").header("X-PatchVersion", "0").header("X-LatestVersion", "1.0.0"); + private void addVersionControlHeaders(HttpHeaders headers) { + headers.add("X-MinorVersion", "0"); + headers.add("X-PatchVersion", "0"); + headers.add("X-LatestVersion", "1.0.0"); } - protected ResponseBuilder addLoggingHeaders(ResponseBuilder rb, UUID requestId) { + private void addLoggingHeaders(HttpHeaders headers, UUID requestId) { if (requestId == null) { // Generate a random uuid if client does not embed requestId in rest request - return rb.header("X-ONAP-RequestID", UUID.randomUUID()); + headers.add("X-ONAP-RequestID", UUID.randomUUID().toString()); + } else { + headers.add("X-ONAP-RequestID", requestId.toString()); } - return rb.header("X-ONAP-RequestID", requestId); } /** @@ -83,4 +89,4 @@ public class CommonRestController { return null; } } -} +} \ No newline at end of file diff --git a/main/src/main/java/org/onap/policy/api/main/rest/provider/CommonModelProvider.java b/main/src/main/java/org/onap/policy/api/main/rest/provider/CommonModelProvider.java index e555cd86..287c0b2b 100644 --- a/main/src/main/java/org/onap/policy/api/main/rest/provider/CommonModelProvider.java +++ b/main/src/main/java/org/onap/policy/api/main/rest/provider/CommonModelProvider.java @@ -4,6 +4,7 @@ * ================================================================================ * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved. * Modifications Copyright (C) 2019-2021 Nordix Foundation. + * Modifications Copyright (C) 2022 Bell Canada. 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. @@ -30,8 +31,6 @@ import java.util.Map; import java.util.function.BiConsumer; import javax.ws.rs.core.Response; import org.apache.commons.lang3.tuple.Pair; -import org.onap.policy.api.main.parameters.ApiParameterGroup; -import org.onap.policy.common.parameters.ParameterService; import org.onap.policy.models.base.PfConceptKey; import org.onap.policy.models.base.PfModelException; import org.onap.policy.models.pdp.concepts.PdpGroup; @@ -39,38 +38,21 @@ import org.onap.policy.models.pdp.concepts.PdpGroupFilter; import org.onap.policy.models.pdp.concepts.PdpSubGroup; import org.onap.policy.models.pdp.enums.PdpState; import org.onap.policy.models.provider.PolicyModelsProvider; -import org.onap.policy.models.provider.PolicyModelsProviderFactory; -import org.onap.policy.models.provider.PolicyModelsProviderParameters; import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; /** * Super class for providers that use a model provider. */ -public class CommonModelProvider implements AutoCloseable { +public class CommonModelProvider { protected final PolicyModelsProvider modelsProvider; /** * Constructs the object, populating {@link #modelsProvider}. * - * @throws PfModelException if an error occurs */ - public CommonModelProvider() throws PfModelException { - - ApiParameterGroup parameterGroup = ParameterService.get("ApiGroup"); - PolicyModelsProviderParameters providerParameters = parameterGroup.getDatabaseProviderParameters(); - modelsProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(providerParameters); - } - - /** - * Closes the connection to database. - * - * @throws PfModelException the PfModel parsing exception - */ - @Override - public void close() throws PfModelException { - - modelsProvider.close(); + public CommonModelProvider(PolicyModelsProvider modelsProvider) { + this.modelsProvider = modelsProvider; } /** @@ -243,4 +225,4 @@ public class CommonModelProvider implements AutoCloseable { return "could not find policy with ID " + policyId + " and type " + policyType.getName() + ":" + policyType.getVersion() + " deployed in any pdp group"; } -} +} \ No newline at end of file diff --git a/main/src/main/java/org/onap/policy/api/main/rest/provider/HealthCheckProvider.java b/main/src/main/java/org/onap/policy/api/main/rest/provider/HealthCheckProvider.java index b5a198a2..40b841ef 100644 --- a/main/src/main/java/org/onap/policy/api/main/rest/provider/HealthCheckProvider.java +++ b/main/src/main/java/org/onap/policy/api/main/rest/provider/HealthCheckProvider.java @@ -5,6 +5,7 @@ * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved. * Modifications Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved. * Modifications Copyright (C) 2019 Nordix Foundation. + * Modifications Copyright (C) 2022 Bell Canada. 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. @@ -25,28 +26,32 @@ package org.onap.policy.api.main.rest.provider; import org.onap.policy.api.main.rest.PolicyFetchMode; -import org.onap.policy.api.main.startstop.ApiActivator; import org.onap.policy.common.endpoints.report.HealthCheckReport; import org.onap.policy.common.utils.network.NetworkUtil; import org.onap.policy.models.base.PfModelException; import org.onap.policy.models.base.PfModelRuntimeException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; /** * Class to fetch health check of api service. * */ +@Service public class HealthCheckProvider { private static final Logger LOGGER = LoggerFactory.getLogger(HealthCheckProvider.class); - private static final String NOT_ALIVE = "not alive"; private static final String ALIVE = "alive"; private static final String URL = NetworkUtil.getHostname(); private static final String NAME = "Policy API"; private static final String DB_CONN_FAILURE = "unable to connect with database"; + @Autowired + private PolicyProvider policyProvider; + /** * Performs the health check of api service. * @@ -54,19 +59,12 @@ public class HealthCheckProvider { */ public HealthCheckReport performHealthCheck() { final var report = new HealthCheckReport(); + final var dbConnectionStatus = verifyApiDatabase(); report.setName(NAME); report.setUrl(URL); - boolean heathStatus = ApiActivator.isAlive(); - if (heathStatus) { - boolean dbConnectionStatus = verifyApiDatabase(); - report.setHealthy(dbConnectionStatus); - report.setCode(dbConnectionStatus ? 200 : 503); - report.setMessage(dbConnectionStatus ? ALIVE : DB_CONN_FAILURE); - } else { - report.setHealthy(heathStatus); - report.setCode(500); - report.setMessage(NOT_ALIVE); - } + report.setHealthy(dbConnectionStatus); + report.setCode(dbConnectionStatus ? 200 : 503); + report.setMessage(dbConnectionStatus ? ALIVE : DB_CONN_FAILURE); return report; } @@ -76,7 +74,7 @@ public class HealthCheckProvider { * @return boolean signaling the verification result */ private boolean verifyApiDatabase() { - try (var policyProvider = new PolicyProvider()) { + try { policyProvider.fetchPolicies(null, null, null, null, PolicyFetchMode.BARE); return true; } catch (PfModelException | PfModelRuntimeException pfme) { @@ -84,4 +82,4 @@ public class HealthCheckProvider { return false; } } -} +} \ No newline at end of file diff --git a/main/src/main/java/org/onap/policy/api/main/rest/provider/PolicyProvider.java b/main/src/main/java/org/onap/policy/api/main/rest/provider/PolicyProvider.java index 33df1ccc..1e5ed477 100644 --- a/main/src/main/java/org/onap/policy/api/main/rest/provider/PolicyProvider.java +++ b/main/src/main/java/org/onap/policy/api/main/rest/provider/PolicyProvider.java @@ -4,6 +4,7 @@ * ================================================================================ * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved. * Modifications Copyright (C) 2020-2021 Nordix Foundation. + * Modifications Copyright (C) 2022 Bell Canada. 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. @@ -25,22 +26,27 @@ package org.onap.policy.api.main.rest.provider; import org.onap.policy.api.main.rest.PolicyFetchMode; import org.onap.policy.models.base.PfModelException; +import org.onap.policy.models.provider.PolicyModelsProvider; import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; import org.onap.policy.models.tosca.authorative.concepts.ToscaTypedEntityFilter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; /** * Class to provide all kinds of policy operations. * * @author Chenfei Gao (cgao@research.att.com) */ +@Service public class PolicyProvider extends CommonModelProvider { /** * Default constructor. */ - public PolicyProvider() throws PfModelException { - super(); + @Autowired + public PolicyProvider(PolicyModelsProvider modelsProvider) throws PfModelException { + super(modelsProvider); } /** @@ -156,4 +162,4 @@ public class PolicyProvider extends CommonModelProvider { return serviceTemplate; } -} +} \ No newline at end of file diff --git a/main/src/main/java/org/onap/policy/api/main/rest/provider/PolicyTypeProvider.java b/main/src/main/java/org/onap/policy/api/main/rest/provider/PolicyTypeProvider.java index e56b536c..4db16985 100644 --- a/main/src/main/java/org/onap/policy/api/main/rest/provider/PolicyTypeProvider.java +++ b/main/src/main/java/org/onap/policy/api/main/rest/provider/PolicyTypeProvider.java @@ -4,6 +4,7 @@ * ================================================================================ * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved. * Modifications Copyright (C) 2020-2021 Nordix Foundation. + * Modifications Copyright (C) 2022 Bell Canada. 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. @@ -24,22 +25,27 @@ package org.onap.policy.api.main.rest.provider; import org.onap.policy.models.base.PfModelException; +import org.onap.policy.models.provider.PolicyModelsProvider; import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityFilter; import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; /** * Class to provide all kinds of policy type operations. * * @author Chenfei Gao (cgao@research.att.com) */ +@Service public class PolicyTypeProvider extends CommonModelProvider { /** * Default constructor. */ - public PolicyTypeProvider() throws PfModelException { - super(); + @Autowired + public PolicyTypeProvider(PolicyModelsProvider modelsProvider) throws PfModelException { + super(modelsProvider); } /** @@ -118,4 +124,4 @@ public class PolicyTypeProvider extends CommonModelProvider { ToscaEntityFilter.builder().name(policyTypeName).version(policyTypeVersion).build(); return modelsProvider.getFilteredPolicyTypes(policyTypeFilter); } -} +} \ No newline at end of file diff --git a/main/src/main/java/org/onap/policy/api/main/rest/provider/StatisticsProvider.java b/main/src/main/java/org/onap/policy/api/main/rest/provider/StatisticsProvider.java index 9df00470..9dfc0dd6 100644 --- a/main/src/main/java/org/onap/policy/api/main/rest/provider/StatisticsProvider.java +++ b/main/src/main/java/org/onap/policy/api/main/rest/provider/StatisticsProvider.java @@ -1,10 +1,11 @@ -/*- /*- * ============LICENSE_START======================================================= * ONAP Policy API * ================================================================================ * Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2022 Bell Canada. 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 @@ -23,26 +24,28 @@ package org.onap.policy.api.main.rest.provider; -import org.onap.policy.api.main.rest.ApiStatisticsManager; import org.onap.policy.api.main.rest.StatisticsReport; -import org.onap.policy.api.main.startstop.ApiActivator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; /** * Class to fetch API statistics. * * @author Chenfei Gao (cgao@research.att.com) */ +@Service public class StatisticsProvider { + @Autowired + private StatisticsReport report; + /** * Return the current API statistics. * * @return Report containing API statistics */ public StatisticsReport fetchCurrentStatistics() { - final var report = ApiStatisticsManager.getInstance().getReport(); - report.setCode(ApiActivator.isAlive() ? 200 : 500); + report.setCode(200); return report; } -} - +} \ No newline at end of file diff --git a/main/src/main/java/org/onap/policy/api/main/startstop/ApiActivator.java b/main/src/main/java/org/onap/policy/api/main/startstop/ApiActivator.java deleted file mode 100644 index 156837d5..00000000 --- a/main/src/main/java/org/onap/policy/api/main/startstop/ApiActivator.java +++ /dev/null @@ -1,125 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP Policy API - * ================================================================================ - * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * Modifications Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved. - * Modifications Copyright (C) 2021 Bell Canada. 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. - * - * SPDX-License-Identifier: Apache-2.0 - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.api.main.startstop; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.Setter; -import org.onap.policy.api.main.exception.PolicyApiException; -import org.onap.policy.api.main.parameters.ApiParameterGroup; -import org.onap.policy.api.main.rest.ApiRestController; -import org.onap.policy.api.main.rest.aaf.AafApiFilter; -import org.onap.policy.common.endpoints.http.server.RestServer; -import org.onap.policy.common.parameters.ParameterService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * This class wraps a distributor so that it can be activated as a complete service together with all its api and - * forwarding handlers. - */ -@RequiredArgsConstructor -public class ApiActivator { - - private static final Logger LOGGER = LoggerFactory.getLogger(ApiActivator.class); - - @Getter - @Setter - private static boolean alive = false; - - @Getter - private final ApiParameterGroup parameterGroup; - - private RestServer restServer; - - /** - * Initialize api as a complete service. - * - * @throws PolicyApiException on errors in initializing the service - */ - public void initialize() throws PolicyApiException { - LOGGER.debug("Policy api starting as a service . . ."); - startApiRestServer(); - registerToParameterService(parameterGroup); - ApiActivator.setAlive(true); - LOGGER.debug("Policy api started as a service"); - } - - /** - * Starts the api rest server using configuration parameters. - * - * @throws PolicyApiException if server start fails - */ - private void startApiRestServer() throws PolicyApiException { - parameterGroup.getRestServerParameters().setName(parameterGroup.getName()); - restServer = new RestServer(parameterGroup.getRestServerParameters(), AafApiFilter.class, - ApiRestController.class); - if (!restServer.start()) { - throw new PolicyApiException("Failed to start api rest server. Check log for more details..."); - } - } - - /** - * Terminate policy api. - * - * @throws PolicyApiException on termination errors - */ - public void terminate() throws PolicyApiException { - try { - deregisterToParameterService(parameterGroup); - - if (ApiActivator.isAlive()) { - ApiActivator.setAlive(false); - } - - // Stop the api rest server - if (restServer.isAlive()) { - restServer.stop(); - } - } catch (final Exception exp) { - throw new PolicyApiException("Policy api service termination failed", exp); - } - } - - /** - * Method to register the parameters to Common Parameter Service. - * - * @param apiParameterGroup the api parameter group - */ - public void registerToParameterService(final ApiParameterGroup apiParameterGroup) { - ParameterService.register(apiParameterGroup, true); - } - - /** - * Method to deregister the parameters from Common Parameter Service. - * - * @param apiParameterGroup the api parameter group - */ - public void deregisterToParameterService(final ApiParameterGroup apiParameterGroup) { - if (ParameterService.contains(apiParameterGroup.getName())) { - ParameterService.deregister(apiParameterGroup.getName()); - } - } -} diff --git a/main/src/main/java/org/onap/policy/api/main/startstop/ApiCommandLineArguments.java b/main/src/main/java/org/onap/policy/api/main/startstop/ApiCommandLineArguments.java deleted file mode 100644 index 47f004ea..00000000 --- a/main/src/main/java/org/onap/policy/api/main/startstop/ApiCommandLineArguments.java +++ /dev/null @@ -1,55 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * Modifications Copyright (C) 2021 Nordix Foundation. - * ================================================================================ - * 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. - * - * SPDX-License-Identifier: Apache-2.0 - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.api.main.startstop; - -import org.onap.policy.api.main.exception.PolicyApiRuntimeException; -import org.onap.policy.common.utils.cmd.CommandLineArgumentsHandler; -import org.onap.policy.common.utils.cmd.CommandLineException; -import org.onap.policy.common.utils.resources.MessageConstants; - -/** - * This class reads and handles command line parameters for the policy api main program. - */ -public class ApiCommandLineArguments extends CommandLineArgumentsHandler { - - /** - * Construct the options for the CLI editor from super. - */ - public ApiCommandLineArguments() { - super(Main.class.getName(), MessageConstants.POLICY_API); - } - - /** - * Construct the options for the CLI editor and parse in the given arguments. - * - * @param args The command line arguments - */ - public ApiCommandLineArguments(final String[] args) { - this(); - - try { - parse(args); - } catch (final CommandLineException e) { - throw new PolicyApiRuntimeException("parse error on policy api parameters", e); - } - } -} diff --git a/main/src/main/java/org/onap/policy/api/main/startstop/ApiDatabaseInitializer.java b/main/src/main/java/org/onap/policy/api/main/startstop/ApiDatabaseInitializer.java index 76ffd9ff..4aa25168 100644 --- a/main/src/main/java/org/onap/policy/api/main/startstop/ApiDatabaseInitializer.java +++ b/main/src/main/java/org/onap/policy/api/main/startstop/ApiDatabaseInitializer.java @@ -4,6 +4,7 @@ * ================================================================================ * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved. * Modifications Copyright (C) 2019-2021 Nordix Foundation. + * Modifications Copyright (C) 2022 Bell Canada. 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. @@ -26,53 +27,60 @@ package org.onap.policy.api.main.startstop; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; +import javax.annotation.PostConstruct; +import org.onap.policy.api.main.config.PolicyPreloadConfig; import org.onap.policy.api.main.exception.PolicyApiException; -import org.onap.policy.api.main.parameters.ApiParameterGroup; import org.onap.policy.common.utils.coder.CoderException; import org.onap.policy.common.utils.coder.StandardYamlCoder; import org.onap.policy.common.utils.resources.ResourceUtils; import org.onap.policy.models.base.PfModelException; import org.onap.policy.models.base.PfModelRuntimeException; import org.onap.policy.models.provider.PolicyModelsProvider; -import org.onap.policy.models.provider.PolicyModelsProviderFactory; import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityFilter; import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; import org.onap.policy.models.tosca.authorative.concepts.ToscaTopologyTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Component; /** * This class creates initial policy types in the database. * * @author Chenfei Gao (cgao@research.att.com) */ +@Component +@ConditionalOnProperty(value = "database.initialize", havingValue = "true", matchIfMissing = true) public class ApiDatabaseInitializer { private static final Logger LOGGER = LoggerFactory.getLogger(ApiDatabaseInitializer.class); private static final StandardYamlCoder coder = new StandardYamlCoder(); - private PolicyModelsProviderFactory factory; - /** - * Constructs the object. - */ - public ApiDatabaseInitializer() { - factory = new PolicyModelsProviderFactory(); + @Autowired + PolicyModelsProvider policyModelsProvider; + + @Autowired + PolicyPreloadConfig policyPreloadConfig; + + @PostConstruct + public void loadData() throws PolicyApiException { + initializeApiDatabase(policyPreloadConfig.getPolicyTypes(), policyPreloadConfig.getPolicies()); } /** * Initializes database by preloading policy types and policies. * - * @param apiParameterGroup the apiParameterGroup parameters + * @param policyTypes List of policy types to preload. + * @param policies List of policies to preload. * @throws PolicyApiException in case of errors. */ - public void initializeApiDatabase(final ApiParameterGroup apiParameterGroup) throws PolicyApiException { - - try (var databaseProvider = - factory.createPolicyModelsProvider(apiParameterGroup.getDatabaseProviderParameters())) { - - if (alreadyExists(databaseProvider)) { + public void initializeApiDatabase(final List policyTypes, final List policies) + throws PolicyApiException { + try { + if (alreadyExists()) { LOGGER.warn("DB already contains policy data - skipping preload"); return; } @@ -82,27 +90,24 @@ public class ApiDatabaseInitializer { serviceTemplate.setPolicyTypes(new LinkedHashMap<>()); serviceTemplate.setToscaDefinitionsVersion("tosca_simple_yaml_1_1_0"); - ToscaServiceTemplate createdPolicyTypes = preloadServiceTemplate(serviceTemplate, - apiParameterGroup.getPreloadPolicyTypes(), databaseProvider::createPolicyTypes); - preloadServiceTemplate(createdPolicyTypes, apiParameterGroup.getPreloadPolicies(), - databaseProvider::createPolicies); + ToscaServiceTemplate createdPolicyTypes = + preloadServiceTemplate(serviceTemplate, policyTypes, policyModelsProvider::createPolicyTypes); + preloadServiceTemplate(createdPolicyTypes, policies, policyModelsProvider::createPolicies); } catch (final PolicyApiException | PfModelException | CoderException exp) { throw new PolicyApiException(exp); } } - private boolean alreadyExists(PolicyModelsProvider databaseProvider) throws PfModelException { + private boolean alreadyExists() throws PfModelException { try { ToscaServiceTemplate serviceTemplate = - databaseProvider.getFilteredPolicyTypes(ToscaEntityFilter.builder().build()); + policyModelsProvider.getFilteredPolicyTypes(ToscaEntityFilter.builder().build()); if (!serviceTemplate.getPolicyTypes().isEmpty()) { return true; } - } catch (PfModelRuntimeException e) { LOGGER.trace("DB does not yet contain policy types", e); } - return false; } @@ -119,7 +124,7 @@ public class ApiDatabaseInitializer { ToscaServiceTemplate singleEntity = coder.decode(entityAsStringYaml, ToscaServiceTemplate.class); if (singleEntity == null) { - throw new PolicyApiException("Error deserializaing entity from file: " + entity); + throw new PolicyApiException("Error deserializing entity from file: " + entity); } // Consolidate data types and policy types @@ -149,4 +154,4 @@ public class ApiDatabaseInitializer { protected interface FunctionWithEx { public R apply(T value) throws PfModelException; } -} +} \ No newline at end of file diff --git a/main/src/main/java/org/onap/policy/api/main/startstop/Main.java b/main/src/main/java/org/onap/policy/api/main/startstop/Main.java deleted file mode 100644 index 21bd5c48..00000000 --- a/main/src/main/java/org/onap/policy/api/main/startstop/Main.java +++ /dev/null @@ -1,141 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP Policy API - * ================================================================================ - * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * Modifications Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved. - * Modifications Copyright (C) 2020-2021 Bell Canada. All rights reserved. - * Modifications Copyright (C) 2021 Nordix Foundation. - * ================================================================================ - * 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. - * - * SPDX-License-Identifier: Apache-2.0 - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.api.main.startstop; - -import java.util.Arrays; -import lombok.Getter; -import org.onap.policy.api.main.exception.PolicyApiException; -import org.onap.policy.api.main.exception.PolicyApiRuntimeException; -import org.onap.policy.api.main.parameters.ApiParameterGroup; -import org.onap.policy.api.main.parameters.ApiParameterHandler; -import org.onap.policy.common.utils.cmd.CommandLineException; -import org.onap.policy.common.utils.resources.MessageConstants; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * This class initiates ONAP Policy Framework policy api. - * - */ -public class Main { - - private static final Logger LOGGER = LoggerFactory.getLogger(Main.class); - - // The policy api Activator that activates the policy api service - private ApiActivator activator; - - // The parameters read in from JSON - @Getter - private ApiParameterGroup parameterGroup; - - /** - * Instantiates the policy api service. - * - * @param args the command line arguments - */ - public Main(final String[] args) { - final var argumentString = Arrays.toString(args); - LOGGER.info("Starting policy api service with arguments - {}", argumentString); - - // Check the arguments - final var arguments = new ApiCommandLineArguments(); - try { - // The arguments return a string if there is a message to print and we should exit - final String argumentMessage = arguments.parse(args); - if (argumentMessage != null) { - LOGGER.info(argumentMessage); - return; - } - - // Validate that the arguments are sane - arguments.validate(); - - // Read the parameters - parameterGroup = new ApiParameterHandler().getParameters(arguments); - // Initialize database - new ApiDatabaseInitializer().initializeApiDatabase(parameterGroup); - - // Now, create the activator for the policy api service - activator = new ApiActivator(parameterGroup); - - // Start the activator - activator.initialize(); - } catch (final PolicyApiException | CommandLineException e) { - throw new PolicyApiRuntimeException( - String.format(MessageConstants.START_FAILURE_MSG, MessageConstants.POLICY_API), e); - } - - // Add a shutdown hook to shut everything down in an orderly manner - Runtime.getRuntime().addShutdownHook(new PolicyApiShutdownHookClass()); - var successMsg = String.format(MessageConstants.START_SUCCESS_MSG, MessageConstants.POLICY_API); - LOGGER.info(successMsg); - } - - /** - * Shut down Execution. - * - * @throws PolicyApiException on shutdown errors - */ - public void shutdown() throws PolicyApiException { - // clear the parameterGroup variable - parameterGroup = null; - - // clear the api activator - if (activator != null) { - activator.terminate(); - } - } - - /** - * The Class PolicyApiShutdownHookClass terminates the policy api service when its run method is - * called. - */ - private class PolicyApiShutdownHookClass extends Thread { - /* - * (non-Javadoc) - * - * @see java.lang.Runnable#run() - */ - @Override - public void run() { - try { - // Shutdown the policy api service and wait for everything to stop - activator.terminate(); - } catch (final PolicyApiException e) { - LOGGER.warn("error occured during shut down of the policy api service", e); - } - } - } - - /** - * The main method. - * - * @param args the arguments - */ - public static void main(final String[] args) { - new Main(args); - } -} diff --git a/main/src/main/resources/application.yaml b/main/src/main/resources/application.yaml new file mode 100644 index 00000000..96b79823 --- /dev/null +++ b/main/src/main/resources/application.yaml @@ -0,0 +1,65 @@ +server: + port: 6969 + +spring: + security.user: + name: policyadmin + password: zb!XztG34 + mvc.converters.preferred-json-mapper: gson + +policy-api: + name: ApiGroup + aaf: false + +database: + name: PolicyProviderParameterGroup + implementation: org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl + driver: org.mariadb.jdbc.Driver + url: jdbc:mariadb://mariadb:3306/policyadmin + user: policy_user + password: policy_user + persistenceUnit: PolicyDb + +policy-preload: + policyTypes: + - policytypes/onap.policies.monitoring.tcagen2.yaml + - policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server.yaml + - policytypes/onap.policies.monitoring.dcae-restconfcollector.yaml + - policytypes/onap.policies.monitoring.dcae-pm-subscription-handler.yaml + - policytypes/onap.policies.monitoring.dcae-pm-mapper.yaml + - policytypes/onap.policies.Optimization.yaml + - policytypes/onap.policies.optimization.Resource.yaml + - policytypes/onap.policies.optimization.Service.yaml + - policytypes/onap.policies.optimization.resource.AffinityPolicy.yaml + - policytypes/onap.policies.optimization.resource.DistancePolicy.yaml + - policytypes/onap.policies.optimization.resource.HpaPolicy.yaml + - policytypes/onap.policies.optimization.resource.OptimizationPolicy.yaml + - policytypes/onap.policies.optimization.resource.PciPolicy.yaml + - policytypes/onap.policies.optimization.service.QueryPolicy.yaml + - policytypes/onap.policies.optimization.service.SubscriberPolicy.yaml + - policytypes/onap.policies.optimization.resource.Vim_fit.yaml + - policytypes/onap.policies.optimization.resource.VnfPolicy.yaml + - policytypes/onap.policies.controlloop.guard.Common.yaml + - policytypes/onap.policies.controlloop.guard.common.Blacklist.yaml + - policytypes/onap.policies.controlloop.guard.common.FrequencyLimiter.yaml + - policytypes/onap.policies.controlloop.guard.common.MinMax.yaml + - policytypes/onap.policies.controlloop.guard.common.Filter.yaml + - policytypes/onap.policies.controlloop.guard.coordination.FirstBlocksSecond.yaml + - policytypes/onap.policies.Naming.yaml + - policytypes/onap.policies.Match.yaml + - policytypes/onap.policies.native.Drools.yaml + - policytypes/onap.policies.native.Xacml.yaml + - policytypes/onap.policies.native.Apex.yaml + - policytypes/onap.policies.controlloop.operational.Common.yaml + - policytypes/onap.policies.controlloop.operational.common.Apex.yaml + - policytypes/onap.policies.controlloop.operational.common.Drools.yaml + policies: + - policies/sdnc.policy.naming.input.tosca.yaml + +management: + endpoints: + web: + base-path: / + exposure: + include: health,metrics,prometheus + path-mapping.prometheus: metrics \ No newline at end of file diff --git a/main/src/test/java/org/onap/policy/api/main/parameters/CommonTestData.java b/main/src/test/java/org/onap/policy/api/main/parameters/CommonTestData.java deleted file mode 100644 index 32c44602..00000000 --- a/main/src/test/java/org/onap/policy/api/main/parameters/CommonTestData.java +++ /dev/null @@ -1,119 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP Policy API - * ================================================================================ - * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * Copyright (C) 2019 AT&T 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. - * - * SPDX-License-Identifier: Apache-2.0 - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.api.main.parameters; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import org.onap.policy.common.endpoints.parameters.RestServerParameters; -import org.onap.policy.common.utils.coder.Coder; -import org.onap.policy.common.utils.coder.CoderException; -import org.onap.policy.common.utils.coder.StandardCoder; -import org.onap.policy.common.utils.resources.TextFileUtils; -import org.onap.policy.models.provider.PolicyModelsProviderParameters; - -/** - * Class to hold/create all parameters for test cases. - * - */ -public class CommonTestData { - - public static final String API_GROUP_NAME = "ApiGroup"; - - /** - * Server port, as it appears within the config files. - */ - private static final String REST_SERVER_PORT = "6969"; - - private static final String PROVIDER_GROUP_NAME = "PolicyProviderParameterGroup"; - private static final String PROVIDER_IMPL = "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl"; - private static final String DATABASE_DRIVER = "org.h2.Driver"; - private static final String DATABASE_URL = "jdbc:h2:mem:testdb"; - private static final String DATABASE_USER = "policy"; - private static final String DATABASE_PASSWORD = "P01icY"; - private static final String PERSISTENCE_UNIT = "ToscaConceptTest"; - - private Coder coder = new StandardCoder(); - - /** - * Returns an instance of RestServerParameters for test cases. - * - * @param isEmpty boolean value to represent that object created should be empty or not - * @param port server port - * @return the RestServerParameters object - */ - public RestServerParameters getRestServerParameters(final boolean isEmpty, int port) { - String fileName = "src/test/resources/parameters/" - + (isEmpty ? "RestServerParametersEmpty" : "RestServerParameters") + ".json"; - try { - String text = new String(Files.readAllBytes(new File(fileName).toPath()), StandardCharsets.UTF_8); - text = text.replace("6969", String.valueOf(port)); - return coder.decode(text, RestServerParameters.class); - } catch (CoderException | IOException e) { - throw new RuntimeException("cannot read/decode " + fileName, e); - } - } - - /** - * Returns an instance of PolicyModelsProviderParameters for test cases. - * - * @param isEmpty boolean value to represent that object created should be empty or not - * @return the PolicyModelsProviderParameters object - */ - public PolicyModelsProviderParameters getDatabaseProviderParameters(final boolean isEmpty) { - final PolicyModelsProviderParameters databaseProviderParameters; - if (!isEmpty) { - databaseProviderParameters = new PolicyModelsProviderParameters(); - databaseProviderParameters.setName(PROVIDER_GROUP_NAME); - databaseProviderParameters.setImplementation(PROVIDER_IMPL); - databaseProviderParameters.setDatabaseDriver(DATABASE_DRIVER); - databaseProviderParameters.setDatabaseUrl(DATABASE_URL); - databaseProviderParameters.setDatabaseUser(DATABASE_USER); - databaseProviderParameters.setDatabasePassword(DATABASE_PASSWORD); - databaseProviderParameters.setPersistenceUnit(PERSISTENCE_UNIT); - } else { - databaseProviderParameters = new PolicyModelsProviderParameters(); - } - return databaseProviderParameters; - } - - /** - * Copies a source file to a target file, replacing occurrances of - * {@link #REST_SERVER_PORT} with the given port number. - * - * @param source source file name - * @param target target file name - * @param port port to be substituted - * @throws IOException if an error occurs - */ - public void makeParameters(String source, String target, int port) throws IOException { - String text = TextFileUtils.getTextFileAsString(source); - text = text.replace(REST_SERVER_PORT, String.valueOf(port)); - - File file = new File(target); - file.deleteOnExit(); - TextFileUtils.putStringAsFile(text, file); - } -} diff --git a/main/src/test/java/org/onap/policy/api/main/parameters/TestApiParameterGroup.java b/main/src/test/java/org/onap/policy/api/main/parameters/TestApiParameterGroup.java deleted file mode 100644 index 28982489..00000000 --- a/main/src/test/java/org/onap/policy/api/main/parameters/TestApiParameterGroup.java +++ /dev/null @@ -1,152 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP Policy API - * ================================================================================ - * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * Copyright (C) 2019, 2021 AT&T 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. - * - * SPDX-License-Identifier: Apache-2.0 - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.api.main.parameters; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import java.util.Collections; -import org.junit.Test; -import org.onap.policy.common.endpoints.parameters.RestServerParameters; -import org.onap.policy.common.parameters.ValidationResult; -import org.onap.policy.models.provider.PolicyModelsProviderParameters; - -/** - * Class to perform unit test of ApiParameterGroup. - * - */ -public class TestApiParameterGroup { - private static final int PORT = 6969; - private CommonTestData commonTestData = new CommonTestData(); - - @Test - public void testApiParameterGroup() { - final RestServerParameters restServerParameters = commonTestData.getRestServerParameters(false, PORT); - final PolicyModelsProviderParameters databaseProviderParameters = - commonTestData.getDatabaseProviderParameters(false); - final ApiParameterGroup apiParameters = new ApiParameterGroup(CommonTestData.API_GROUP_NAME, - restServerParameters, databaseProviderParameters, Collections.emptyList(), Collections.emptyList()); - final ValidationResult validationResult = apiParameters.validate(); - assertTrue(validationResult.isValid()); - assertEquals(restServerParameters.getHost(), apiParameters.getRestServerParameters().getHost()); - assertEquals(restServerParameters.getPort(), apiParameters.getRestServerParameters().getPort()); - assertEquals(restServerParameters.getUserName(), - apiParameters.getRestServerParameters().getUserName()); - assertEquals(restServerParameters.getPassword(), - apiParameters.getRestServerParameters().getPassword()); - assertEquals(restServerParameters.isHttps(), apiParameters.getRestServerParameters().isHttps()); - assertEquals(restServerParameters.isAaf(), apiParameters.getRestServerParameters().isAaf()); - assertEquals(CommonTestData.API_GROUP_NAME, apiParameters.getName()); - assertTrue(apiParameters.getPreloadPolicyTypes().isEmpty()); - } - - @Test - public void testApiParameterGroup_NullName() { - final RestServerParameters restServerParameters = commonTestData.getRestServerParameters(false, PORT); - final PolicyModelsProviderParameters databaseProviderParameters = - commonTestData.getDatabaseProviderParameters(false); - final ApiParameterGroup apiParameters = new ApiParameterGroup(null, restServerParameters, - databaseProviderParameters, Collections.emptyList(), Collections.emptyList()); - final ValidationResult validationResult = apiParameters.validate(); - assertFalse(validationResult.isValid()); - assertEquals(null, apiParameters.getName()); - assertThat(validationResult.getResult()).contains("\"name\" value \"null\" INVALID, is null"); - } - - @Test - public void testApiParameterGroup_EmptyName() { - final RestServerParameters restServerParameters = commonTestData.getRestServerParameters(false, PORT); - final PolicyModelsProviderParameters databaseProviderParameters = - commonTestData.getDatabaseProviderParameters(false); - final ApiParameterGroup apiParameters = new ApiParameterGroup("", restServerParameters, - databaseProviderParameters, Collections.emptyList(), Collections.emptyList()); - final ValidationResult validationResult = apiParameters.validate(); - assertFalse(validationResult.isValid()); - assertEquals("", apiParameters.getName()); - assertThat(validationResult.getResult()).contains("\"name\" value \"\" INVALID, is blank"); - } - - @Test - public void testApiParameterGroup_EmptyRestServerParameters() { - final RestServerParameters restServerParameters = commonTestData.getRestServerParameters(true, PORT); - final PolicyModelsProviderParameters databaseProviderParameters = - commonTestData.getDatabaseProviderParameters(false); - final ApiParameterGroup apiParameters = new ApiParameterGroup(CommonTestData.API_GROUP_NAME, - restServerParameters, databaseProviderParameters, Collections.emptyList(), Collections.emptyList()); - final ValidationResult validationResult = apiParameters.validate(); - assertFalse(validationResult.isValid()); - assertThat(validationResult.getResult()) - .contains("\"RestServerParameters\" INVALID, item has status INVALID"); - } - - @Test - public void testApiParameterGroup_NullRestServerParameters() { - final RestServerParameters restServerParameters = null; - final PolicyModelsProviderParameters databaseProviderParameters = - commonTestData.getDatabaseProviderParameters(false); - final ApiParameterGroup apiParameters = new ApiParameterGroup(CommonTestData.API_GROUP_NAME, - restServerParameters, databaseProviderParameters, Collections.emptyList(), Collections.emptyList()); - final ValidationResult validationResult = apiParameters.validate(); - assertFalse(validationResult.isValid()); - assertThat(validationResult.getResult()) - .contains("item \"restServerParameters\" value \"null\" INVALID, is null"); - } - - - @Test - public void testApiParameterGroup_EmptyDatabaseProviderParameters() { - final RestServerParameters restServerParameters = commonTestData.getRestServerParameters(false, PORT); - final PolicyModelsProviderParameters databaseProviderParameters = - commonTestData.getDatabaseProviderParameters(true); - final ApiParameterGroup apiParameters = new ApiParameterGroup(CommonTestData.API_GROUP_NAME, - restServerParameters, databaseProviderParameters, Collections.emptyList(), Collections.emptyList()); - final ValidationResult validationResult = apiParameters.validate(); - assertFalse(validationResult.isValid()); - assertThat(validationResult.getResult()) - .contains("\"PolicyModelsProviderParameters\" INVALID, item has status INVALID"); - } - - @Test - public void testApiParameterGroup_NullDatabaseProviderParameters() { - final RestServerParameters restServerParameters = commonTestData.getRestServerParameters(false, PORT); - final PolicyModelsProviderParameters databaseProviderParameters = null; - final ApiParameterGroup apiParameters = new ApiParameterGroup(CommonTestData.API_GROUP_NAME, - restServerParameters, databaseProviderParameters, Collections.emptyList(), Collections.emptyList()); - final ValidationResult validationResult = apiParameters.validate(); - assertFalse(validationResult.isValid()); - assertThat(validationResult.getResult()) - .contains("item \"databaseProviderParameters\" value \"null\" INVALID, is null"); - } - - @Test - public void testApiParameterGroup_SetName() { - final ApiParameterGroup apiParameters = new ApiParameterGroup(CommonTestData.API_GROUP_NAME, - null, null, Collections.emptyList(), Collections.emptyList()); - assertEquals(CommonTestData.API_GROUP_NAME, apiParameters.getName()); - apiParameters.setName("SampleName"); - assertEquals("SampleName", apiParameters.getName()); - } -} diff --git a/main/src/test/java/org/onap/policy/api/main/parameters/TestApiParameterHandler.java b/main/src/test/java/org/onap/policy/api/main/parameters/TestApiParameterHandler.java deleted file mode 100644 index 26ecd026..00000000 --- a/main/src/test/java/org/onap/policy/api/main/parameters/TestApiParameterHandler.java +++ /dev/null @@ -1,175 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved. - * Modifications Copyright (C) 2022 Nordix Foundation. - * ================================================================================ - * 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. - * - * SPDX-License-Identifier: Apache-2.0 - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.api.main.parameters; - -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import org.junit.Test; -import org.onap.policy.api.main.exception.PolicyApiException; -import org.onap.policy.api.main.startstop.ApiCommandLineArguments; -import org.onap.policy.common.utils.cmd.CommandLineException; - -/** - * Class to perform unit test of ApiParameterHandler. - * - */ -public class TestApiParameterHandler { - @Test - public void testParameterHandlerNoParameterFile() throws PolicyApiException, CommandLineException { - final String[] noArgumentString = {"-c", "parameters/NoParameterFile.json"}; - final ApiCommandLineArguments noArguments = new ApiCommandLineArguments(); - noArguments.parse(noArgumentString); - - try { - new ApiParameterHandler().getParameters(noArguments); - fail("test should throw an exception here"); - } catch (final Exception e) { - assertTrue(e.getMessage().contains("FileNotFoundException")); - } - } - - @Test - public void testParameterHandlerEmptyParameters() throws PolicyApiException, CommandLineException { - final String[] emptyArgumentString = {"-c", "parameters/EmptyParameters.json"}; - final ApiCommandLineArguments emptyArguments = new ApiCommandLineArguments(); - emptyArguments.parse(emptyArgumentString); - - try { - new ApiParameterHandler().getParameters(emptyArguments); - fail("test should throw an exception here"); - } catch (final Exception e) { - assertEquals("no parameters found in \"parameters/EmptyParameters.json\"", e.getMessage()); - } - } - - @Test - public void testParameterHandlerBadParameters() throws PolicyApiException, CommandLineException { - final String[] badArgumentString = {"-c", "parameters/BadParameters.json"}; - final ApiCommandLineArguments badArguments = new ApiCommandLineArguments(); - badArguments.parse(badArgumentString); - - try { - new ApiParameterHandler().getParameters(badArguments); - fail("test should throw an exception here"); - } catch (final Exception e) { - assertEquals("error reading parameters from \"parameters/BadParameters.json\"\n" - + "(JsonSyntaxException):java.lang.IllegalStateException: " - + "Expected a string but was BEGIN_ARRAY at line 2 column 15 path $.name", e.getMessage()); - } - } - - @Test - public void testParameterHandlerInvalidParameters() throws PolicyApiException, CommandLineException { - final String[] invalidArgumentString = {"-c", "parameters/InvalidParameters.json"}; - final ApiCommandLineArguments invalidArguments = new ApiCommandLineArguments(); - invalidArguments.parse(invalidArgumentString); - - try { - new ApiParameterHandler().getParameters(invalidArguments); - fail("test should throw an exception here"); - } catch (final Exception e) { - assertEquals("error reading parameters from \"parameters/InvalidParameters.json\"\n" - + "(JsonSyntaxException):java.lang.IllegalStateException: " - + "Expected a string but was BEGIN_ARRAY at line 2 column 15 path $.name", e.getMessage()); - } - } - - @Test - public void testParameterHandlerNoParameters() throws PolicyApiException, CommandLineException { - final String[] noArgumentString = {"-c", "parameters/NoParameters.json"}; - final ApiCommandLineArguments noArguments = new ApiCommandLineArguments(); - noArguments.parse(noArgumentString); - - assertThatThrownBy(() -> new ApiParameterHandler().getParameters(noArguments)) - .hasMessageContaining("\"name\"", "is null"); - } - - @Test - public void testParameterHandlerMinumumParameters() throws PolicyApiException, CommandLineException { - final String[] minArgumentString = {"-c", "parameters/MinimumParameters.json"}; - final ApiCommandLineArguments minArguments = new ApiCommandLineArguments(); - minArguments.parse(minArgumentString); - final ApiParameterGroup parGroup = new ApiParameterHandler().getParameters(minArguments); - assertEquals(CommonTestData.API_GROUP_NAME, parGroup.getName()); - } - - @Test - public void testApiParameterGroup() throws PolicyApiException, CommandLineException { - final String[] apiConfigParameters = {"-c", "parameters/ApiConfigParameters_Https.json"}; - final ApiCommandLineArguments arguments = new ApiCommandLineArguments(); - arguments.parse(apiConfigParameters); - final ApiParameterGroup parGroup = new ApiParameterHandler().getParameters(arguments); - assertTrue(arguments.checkSetConfigurationFilePath()); - assertEquals(CommonTestData.API_GROUP_NAME, parGroup.getName()); - } - - @Test - public void testApiParameterGroup_Postgres() throws PolicyApiException, CommandLineException { - final String[] apiConfigParameters = {"-c", "parameters/ApiConfigParameters_Postgres.json"}; - final ApiCommandLineArguments arguments = new ApiCommandLineArguments(); - arguments.parse(apiConfigParameters); - final ApiParameterGroup parGroup = new ApiParameterHandler().getParameters(arguments); - assertTrue(arguments.checkSetConfigurationFilePath()); - assertEquals(CommonTestData.API_GROUP_NAME, parGroup.getName()); - } - - @Test - public void testApiParameterGroup_Invalid() throws PolicyApiException, CommandLineException { - final String[] apiConfigParameters = {"-c", "parameters/ApiConfigParameters_InvalidName.json"}; - final ApiCommandLineArguments arguments = new ApiCommandLineArguments(); - arguments.parse(apiConfigParameters); - - assertThatThrownBy(() -> new ApiParameterHandler().getParameters(arguments)).hasMessageContaining("\"name\"", - "is null"); - } - - @Test - public void testApiVersion() throws PolicyApiException, CommandLineException { - final String[] apiConfigParameters = {"-v"}; - final ApiCommandLineArguments arguments = new ApiCommandLineArguments(); - final String version = arguments.parse(apiConfigParameters); - assertTrue(version.startsWith("ONAP Policy Framework Api Service")); - } - - @Test - public void testApiHelp() throws PolicyApiException, CommandLineException { - final String[] apiConfigParameters = {"-h"}; - final ApiCommandLineArguments arguments = new ApiCommandLineArguments(); - final String help = arguments.parse(apiConfigParameters); - assertTrue(help.startsWith("usage:")); - } - - @Test - public void testApiInvalidOption() throws PolicyApiException { - final String[] apiConfigParameters = {"-d"}; - final ApiCommandLineArguments arguments = new ApiCommandLineArguments(); - try { - arguments.parse(apiConfigParameters); - } catch (final Exception exp) { - assertTrue(exp.getMessage().startsWith("invalid command line arguments specified")); - } - } -} diff --git a/main/src/test/java/org/onap/policy/api/main/rest/TestApiRestServer.java b/main/src/test/java/org/onap/policy/api/main/rest/TestApiRestServer.java index 9f22ff23..ae654c6c 100644 --- a/main/src/test/java/org/onap/policy/api/main/rest/TestApiRestServer.java +++ b/main/src/test/java/org/onap/policy/api/main/rest/TestApiRestServer.java @@ -3,7 +3,7 @@ * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved. * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved. * Modifications Copyright (C) 2019-2020 Nordix Foundation. - * Modifications Copyright (C) 2020 Bell Canada. + * Modifications Copyright (C) 2020-2022 Bell Canada. 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. @@ -32,10 +32,8 @@ import static org.junit.Assert.assertNull; import java.io.File; import java.io.IOException; import java.security.SecureRandom; -import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.Properties; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.ws.rs.client.Client; @@ -47,34 +45,40 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import org.glassfish.jersey.client.ClientProperties; import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature; -import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; -import org.onap.policy.api.main.parameters.ApiParameterGroup; -import org.onap.policy.api.main.parameters.CommonTestData; -import org.onap.policy.api.main.rest.provider.PolicyProvider; -import org.onap.policy.api.main.rest.provider.PolicyTypeProvider; -import org.onap.policy.api.main.startstop.Main; +import org.junit.runner.RunWith; +import org.onap.policy.api.main.PolicyApiApplication; import org.onap.policy.common.endpoints.http.server.YamlMessageBodyHandler; import org.onap.policy.common.endpoints.report.HealthCheckReport; import org.onap.policy.common.gson.GsonMessageBodyHandler; -import org.onap.policy.common.parameters.ParameterService; import org.onap.policy.common.utils.coder.StandardCoder; import org.onap.policy.common.utils.coder.StandardYamlCoder; import org.onap.policy.common.utils.network.NetworkUtil; import org.onap.policy.common.utils.resources.ResourceUtils; import org.onap.policy.common.utils.resources.TextFileUtils; import org.onap.policy.common.utils.security.SelfSignedKeyStore; -import org.onap.policy.models.base.PfModelException; import org.onap.policy.models.errors.concepts.ErrorResponse; -import org.onap.policy.models.provider.PolicyModelsProviderParameters; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.annotation.DirtiesContext.ClassMode; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; +import org.springframework.test.context.junit4.SpringRunner; /** * Class to perform unit test of {@link ApiRestController}. * * @author Chenfei Gao (cgao@research.att.com) */ +@RunWith(SpringRunner.class) +@SpringBootTest(classes = PolicyApiApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@ActiveProfiles("test") +@DirtiesContext(classMode = ClassMode.AFTER_CLASS) public class TestApiRestServer { private static final String ALIVE = "alive"; @@ -156,70 +160,37 @@ public class TestApiRestServer { "policies/vCPE.policy.operational.input.tosca.yaml"; private static final String POLICIES_VCPE_VERSION1 = "policies/onap.restart.tca/versions/1.0.0"; - - private static PolicyModelsProviderParameters providerParams; - private static ApiParameterGroup apiParamGroup; - private static PolicyProvider policyProvider; - private static PolicyTypeProvider policyTypeProvider; - // @formatter:on private static final StandardCoder standardCoder = new StandardCoder(); + private static StandardYamlCoder standardYamlCoder = new StandardYamlCoder(); + private static SelfSignedKeyStore keystore; - private static int apiPort; - private static Main apiMain; + @LocalServerPort + private int apiPort; - private static StandardYamlCoder standardYamlCoder = new StandardYamlCoder(); + @Autowired + private ApiStatisticsManager mgr; /** * Initializes parameters and set up test environment. * - * @throws PfModelException the PfModel parsing exception * @throws IOException on I/O exceptions * @throws InterruptedException if interrupted */ @BeforeClass - public static void setupParameters() throws PfModelException, IOException, InterruptedException { - providerParams = new PolicyModelsProviderParameters(); - // H2, use "org.mariadb.jdbc.Driver" and "jdbc:mariadb://localhost:3306/policy" for locally installed MariaDB - providerParams.setDatabaseDriver("org.h2.Driver"); - providerParams.setDatabaseUrl("jdbc:h2:mem:testdb"); - providerParams.setDatabaseUser("policy"); - providerParams.setDatabasePassword("P01icY"); - providerParams.setPersistenceUnit("ToscaConceptTest"); - apiParamGroup = new ApiParameterGroup("ApiGroup", null, providerParams, Collections.emptyList(), - Collections.emptyList()); - ParameterService.register(apiParamGroup, true); - - policyTypeProvider = new PolicyTypeProvider(); - policyProvider = new PolicyProvider(); - - apiPort = NetworkUtil.allocPort(); - - final String[] apiConfigParameters = new String[2]; - final Properties systemProps = System.getProperties(); - systemProps.put("javax.net.ssl.keyStore", new SelfSignedKeyStore().getKeystoreName()); - systemProps.put("javax.net.ssl.keyStorePassword", SelfSignedKeyStore.KEYSTORE_PASSWORD); - System.setProperties(systemProps); - new CommonTestData().makeParameters("src/test/resources/parameters/ApiConfigParameters_Https.json", - "src/test/resources/parameters/ApiConfigParameters_HttpsXXX.json", apiPort); - apiConfigParameters[0] = "-c"; - apiConfigParameters[1] = "src/test/resources/parameters/ApiConfigParameters_HttpsXXX.json"; - - apiMain = new Main(apiConfigParameters); + public static void setupParameters() throws IOException, InterruptedException { + keystore = new SelfSignedKeyStore(); } - /** - * Method for cleanup after each test. - */ - @AfterClass - public static void teardown() throws Exception { - policyTypeProvider.close(); - policyProvider.close(); - - if (apiMain != null) { - apiMain.shutdown(); - } + @DynamicPropertySource + static void registerPgProperties(DynamicPropertyRegistry registry) { + registry.add("server.ssl.enabled", () -> "true"); + registry.add("server.ssl.key-store", () -> keystore.getKeystoreName()); + registry.add("server.ssl.key-store-password", () -> SelfSignedKeyStore.KEYSTORE_PASSWORD); + registry.add("server.ssl.key-store-type", () -> "PKCS12"); + registry.add("server.ssl.key-alias", () -> "policy@policy.onap.org"); + registry.add("server.ssl.key-password", () -> SelfSignedKeyStore.PRIVATE_KEY_PASSWORD); } @Test @@ -378,7 +349,7 @@ public class TestApiRestServer { invocationBuilder = sendHttpsRequest(STATISTICS_ENDPOINT, mediaType); report = invocationBuilder.get(StatisticsReport.class); validateStatisticsReport(report, 200); - ApiStatisticsManager.resetAllStatistics(); + // ApiStatisticsManager.resetAllStatistics(); } @Test @@ -798,8 +769,6 @@ public class TestApiRestServer { } private void updateApiStatistics() { - var mgr = ApiStatisticsManager.getInstance(); - mgr.updateTotalApiCallCount(); mgr.updateApiCallSuccessCount(); mgr.updateApiCallFailureCount(); @@ -831,4 +800,4 @@ public class TestApiRestServer { assertEquals(code, report.getCode()); assertEquals(message, report.getMessage()); } -} +} \ No newline at end of file diff --git a/main/src/test/java/org/onap/policy/api/main/rest/TestApiStatisticsManager.java b/main/src/test/java/org/onap/policy/api/main/rest/TestApiStatisticsManager.java index 5f5c586d..bc67d21c 100644 --- a/main/src/test/java/org/onap/policy/api/main/rest/TestApiStatisticsManager.java +++ b/main/src/test/java/org/onap/policy/api/main/rest/TestApiStatisticsManager.java @@ -3,7 +3,7 @@ * ONAP Policy API * ================================================================================ * Copyright (C) 2019 IBM. - * Modifications Copyright (C) 2020 Bell Canada. + * Modifications Copyright (C) 2020-2022 Bell Canada. * Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); @@ -27,13 +27,23 @@ package org.onap.policy.api.main.rest; import static org.junit.Assert.assertEquals; import org.junit.Test; +import org.junit.runner.RunWith; +import org.onap.policy.api.main.PolicyApiApplication; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringRunner; +@RunWith(SpringRunner.class) +@SpringBootTest(classes = PolicyApiApplication.class) +@ActiveProfiles("test") public class TestApiStatisticsManager { + @Autowired + private ApiStatisticsManager mgr = new ApiStatisticsManager(); + @Test public void testUpdateMethods() { - var mgr = new ApiStatisticsManager(); - assertEquals(1, mgr.updateTotalApiCallCount()); assertEquals(1, mgr.updateApiCallSuccessCount()); assertEquals(1, mgr.updateApiCallFailureCount()); @@ -56,4 +66,4 @@ public class TestApiStatisticsManager { assertEquals(1, mgr.updatePolicyTypeDeleteSuccessCount()); assertEquals(1, mgr.updatePolicyTypeDeleteFailureCount()); } -} +} \ No newline at end of file diff --git a/main/src/test/java/org/onap/policy/api/main/rest/TestCommonRestController.java b/main/src/test/java/org/onap/policy/api/main/rest/TestCommonRestController.java index dc921488..2213bbf9 100644 --- a/main/src/test/java/org/onap/policy/api/main/rest/TestCommonRestController.java +++ b/main/src/test/java/org/onap/policy/api/main/rest/TestCommonRestController.java @@ -4,6 +4,7 @@ * ================================================================================ * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved. * Modifications Copyright (C) 2019 Nordix Foundation. + * Modifications Copyright (C) 2022 Bell Canada. 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. @@ -23,13 +24,12 @@ package org.onap.policy.api.main.rest; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertSame; import java.util.UUID; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.ResponseBuilder; import org.junit.Test; +import org.springframework.http.ResponseEntity; /** * Class to perform unit testing of CommonRestController. @@ -40,9 +40,8 @@ public class TestCommonRestController { @Test public void testAddLoggingHeaders() { UUID requestId = UUID.randomUUID(); - ResponseBuilder rb = - crc.addLoggingHeaders(crc.addVersionControlHeaders(Response.status(Response.Status.OK)), requestId); - assertSame(rb, rb.header("X-ONAP-RequestID", requestId)); + ResponseEntity rb = crc.makeOkResponse(requestId, null); + assertEquals(requestId.toString(), rb.getHeaders().getFirst("X-ONAP-RequestID")); } /* @@ -52,4 +51,4 @@ public class TestCommonRestController { public void testToJsonNull() { assertNull(crc.toJson(null)); } -} +} \ No newline at end of file diff --git a/main/src/test/java/org/onap/policy/api/main/rest/provider/TestPolicyProvider.java b/main/src/test/java/org/onap/policy/api/main/rest/provider/TestPolicyProvider.java index e47a4ce6..ad394e33 100644 --- a/main/src/test/java/org/onap/policy/api/main/rest/provider/TestPolicyProvider.java +++ b/main/src/test/java/org/onap/policy/api/main/rest/provider/TestPolicyProvider.java @@ -4,7 +4,7 @@ * ================================================================================ * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved. * Modifications Copyright (C) 2019-2021 Nordix Foundation. - * Modifications Copyright (C) 2020 Bell Canada. + * Modifications Copyright (C) 2020,2022 Bell Canada. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,13 +33,11 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; import java.util.ArrayList; -import java.util.Collections; import java.util.List; -import org.junit.After; -import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; -import org.onap.policy.api.main.parameters.ApiParameterGroup; -import org.onap.policy.common.parameters.ParameterService; +import org.junit.runner.RunWith; +import org.onap.policy.api.main.PolicyApiApplication; import org.onap.policy.common.utils.coder.CoderException; import org.onap.policy.common.utils.coder.StandardCoder; import org.onap.policy.common.utils.coder.StandardYamlCoder; @@ -52,24 +50,30 @@ import org.onap.policy.models.pdp.concepts.PdpSubGroup; import org.onap.policy.models.pdp.enums.PdpHealthStatus; import org.onap.policy.models.pdp.enums.PdpState; import org.onap.policy.models.provider.PolicyModelsProvider; -import org.onap.policy.models.provider.PolicyModelsProviderFactory; -import org.onap.policy.models.provider.PolicyModelsProviderParameters; import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.annotation.DirtiesContext.ClassMode; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringRunner; /** * This class performs unit test of {@link PolicyProvider}. * * @author Chenfei Gao (cgao@research.att.com) */ +// Provider classes will be obsolete upon migration to Hibernate +@Ignore +@RunWith(SpringRunner.class) +@SpringBootTest(classes = PolicyApiApplication.class, properties = {"database.initialize=false"}) +@ActiveProfiles("test") +@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD) public class TestPolicyProvider { - private static PolicyProvider policyProvider; - private static PolicyTypeProvider policyTypeProvider; - private static PolicyModelsProviderParameters providerParams; - private static ApiParameterGroup apiParamGroup; - private static StandardCoder standardCoder; - private static StandardYamlCoder standardYamlCoder; + private static StandardCoder standardCoder = new StandardCoder(); + private static StandardYamlCoder standardYamlCoder = new StandardYamlCoder(); private static final String POLICY_RESOURCE = "policies/vCPE.policy.monitoring.input.tosca.json"; private static final String POLICY_TYPE_RESOURCE = "policytypes/onap.policies.monitoring.tcagen2.yaml"; @@ -88,41 +92,12 @@ public class TestPolicyProvider { private static final String POLICY_RESOURCE_OPERATIONAL = "policies/vCPE.policy.operational.input.tosca.json"; private static final String POLICY_TYPE_OPERATIONAL_DROOLS = "onap.policies.controlloop.operational.common.Drools"; - /** - * Initializes parameters. - * - * @throws PfModelException the PfModel parsing exception - */ - @Before - public void setupParameters() throws PfModelException { - - standardCoder = new StandardCoder(); - standardYamlCoder = new StandardYamlCoder(); - providerParams = new PolicyModelsProviderParameters(); - providerParams.setDatabaseDriver("org.h2.Driver"); - providerParams.setDatabaseUrl("jdbc:h2:mem:testdb"); - providerParams.setDatabaseUser("policy"); - providerParams.setDatabasePassword("P01icY"); - providerParams.setPersistenceUnit("ToscaConceptTest"); - apiParamGroup = new ApiParameterGroup("ApiGroup", null, providerParams, Collections.emptyList(), - Collections.emptyList()); - ParameterService.register(apiParamGroup, true); - policyTypeProvider = new PolicyTypeProvider(); - policyProvider = new PolicyProvider(); - } - - /** - * Closes up DB connections and deregisters API parameter group. - * - * @throws PfModelException the PfModel parsing exception - */ - @After - public void tearDown() throws PfModelException { - - policyTypeProvider.close(); - policyProvider.close(); - ParameterService.deregister(apiParamGroup); - } + @Autowired + private PolicyProvider policyProvider; + @Autowired + private PolicyTypeProvider policyTypeProvider; + @Autowired + private PolicyModelsProvider databaseProvider; @Test public void testFetchPolicies() { @@ -159,8 +134,7 @@ public class TestPolicyProvider { String policyTypeVersion = "1.0.0"; String policyTypeId = "onap.policies.monitoring.cdap.tca.hi.lo.app"; - try (PolicyModelsProvider databaseProvider = - new PolicyModelsProviderFactory().createPolicyModelsProvider(providerParams)) { + try { assertEquals(0, databaseProvider.getPdpGroups("name").size()); assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size()); @@ -511,4 +485,4 @@ public class TestPolicyProvider { assertThatThrownBy(() -> policyProvider.deletePolicy(null, null, "onap.restart.tca.unavailable", "1.0.0")) .hasMessageContaining("not found"); } -} +} \ No newline at end of file diff --git a/main/src/test/java/org/onap/policy/api/main/rest/provider/TestPolicyTypeProvider.java b/main/src/test/java/org/onap/policy/api/main/rest/provider/TestPolicyTypeProvider.java index 355f3d45..6b7630c7 100644 --- a/main/src/test/java/org/onap/policy/api/main/rest/provider/TestPolicyTypeProvider.java +++ b/main/src/test/java/org/onap/policy/api/main/rest/provider/TestPolicyTypeProvider.java @@ -4,7 +4,7 @@ * ================================================================================ * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved. * Modifications Copyright (C) 2019-2021 Nordix Foundation. - * Modifications Copyright (C) 2020 Bell Canada. All rights reserved. + * Modifications Copyright (C) 2020-2022 Bell Canada. 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. @@ -29,32 +29,43 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; -import java.util.Collections; -import org.junit.AfterClass; -import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Test; -import org.onap.policy.api.main.parameters.ApiParameterGroup; -import org.onap.policy.common.parameters.ParameterService; +import org.junit.runner.RunWith; +import org.onap.policy.api.main.PolicyApiApplication; import org.onap.policy.common.utils.coder.CoderException; import org.onap.policy.common.utils.coder.StandardYamlCoder; import org.onap.policy.common.utils.resources.ResourceUtils; import org.onap.policy.models.base.PfModelException; -import org.onap.policy.models.provider.PolicyModelsProviderParameters; import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.annotation.DirtiesContext.ClassMode; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringRunner; /** * This class performs unit test of {@link PolicyTypeProvider}. * * @author Chenfei Gao (cgao@research.att.com) */ +// Provider classes will be obsolete upon migration to Hibernate +@Ignore +@RunWith(SpringRunner.class) +@SpringBootTest(classes = PolicyApiApplication.class, properties = {"database.initialize=false"}) +@ActiveProfiles("test") +@DirtiesContext(classMode = ClassMode.AFTER_CLASS) public class TestPolicyTypeProvider { - private static PolicyTypeProvider policyTypeProvider; - private static PolicyProvider policyProvider; - private static PolicyModelsProviderParameters providerParams; - private static ApiParameterGroup apiParamGroup; - private static StandardYamlCoder standardYamlCoder; + private static StandardYamlCoder standardYamlCoder = new StandardYamlCoder(); + + @Autowired + private PolicyProvider policyProvider; + + @Autowired + private PolicyTypeProvider policyTypeProvider; private static final String POLICY_TYPE_VERSION = "1.0.0"; @@ -74,41 +85,6 @@ public class TestPolicyTypeProvider { private static final String POLICY_TYPE_OPERATIONAL_APEX = "onap.policies.controlloop.operational.common.Apex"; private static final String POLICY_TYPE_OPERATIONAL_DROOLS = "onap.policies.controlloop.operational.common.Drools"; - /** - * Initializes parameters. - * - * @throws PfModelException the PfModel parsing exception - */ - @BeforeClass - public static void setupParameters() throws PfModelException { - - standardYamlCoder = new StandardYamlCoder(); - providerParams = new PolicyModelsProviderParameters(); - providerParams.setDatabaseDriver("org.h2.Driver"); - providerParams.setDatabaseUrl("jdbc:h2:mem:testdb"); - providerParams.setDatabaseUser("policy"); - providerParams.setDatabasePassword("P01icY"); - providerParams.setPersistenceUnit("ToscaConceptTest"); - apiParamGroup = new ApiParameterGroup("ApiGroup", null, providerParams, Collections.emptyList(), - Collections.emptyList()); - ParameterService.register(apiParamGroup, true); - policyTypeProvider = new PolicyTypeProvider(); - policyProvider = new PolicyProvider(); - } - - /** - * Closes up DB connections and deregisters API parameter group. - * - * @throws PfModelException the PfModel parsing exception - */ - @AfterClass - public static void tearDown() throws PfModelException { - - policyTypeProvider.close(); - policyProvider.close(); - ParameterService.deregister(apiParamGroup); - } - @Test public void testFetchPolicyTypes() throws Exception { @@ -220,4 +196,4 @@ public class TestPolicyTypeProvider { policyTypeProvider.deletePolicyType("onap.policies.monitoring.tcagen2", "1.0.0"); }).hasMessage("policy type onap.policies.monitoring.tcagen2:1.0.0 not found"); } -} +} \ No newline at end of file diff --git a/main/src/test/java/org/onap/policy/api/main/startstop/ApiDatabaseInitializerTest.java b/main/src/test/java/org/onap/policy/api/main/startstop/ApiDatabaseInitializerTest.java index f7e43b8d..aa86d739 100644 --- a/main/src/test/java/org/onap/policy/api/main/startstop/ApiDatabaseInitializerTest.java +++ b/main/src/test/java/org/onap/policy/api/main/startstop/ApiDatabaseInitializerTest.java @@ -3,6 +3,7 @@ * ONAP * ================================================================================ * Copyright (C) 2020-2021 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2022 Bell Canada. 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. @@ -21,54 +22,36 @@ package org.onap.policy.api.main.startstop; import static org.assertj.core.api.Assertions.assertThatCode; -import static org.junit.Assert.fail; -import java.io.File; -import org.junit.AfterClass; -import org.junit.BeforeClass; import org.junit.Test; -import org.onap.policy.api.main.exception.PolicyApiException; -import org.onap.policy.api.main.parameters.ApiParameterGroup; -import org.onap.policy.api.main.parameters.CommonTestData; -import org.onap.policy.common.parameters.ValidationResult; -import org.onap.policy.common.utils.coder.StandardCoder; -import org.onap.policy.models.provider.PolicyModelsProvider; -import org.onap.policy.models.provider.PolicyModelsProviderFactory; - +import org.junit.runner.RunWith; +import org.onap.policy.api.main.PolicyApiApplication; +import org.onap.policy.api.main.config.PolicyPreloadConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = PolicyApiApplication.class) +@ActiveProfiles("test") +@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) public class ApiDatabaseInitializerTest { - private static final String PARAM_FILE = "src/test/resources/parameters/ApiConfigParameters_Https.json"; - private static final CommonTestData COMMON_TEST_DATA = new CommonTestData(); - private static ApiParameterGroup params; - private static PolicyModelsProvider provider; - - /** - * Creates the DB and keeps it open. - */ - @BeforeClass - public static void setUpBeforeClass() throws Exception { - COMMON_TEST_DATA.makeParameters(PARAM_FILE, "src/test/resources/parameters/ApiConfigParametersXXX.json", 6969); - params = new StandardCoder().decode(new File(PARAM_FILE), ApiParameterGroup.class); - ValidationResult result = params.validate(); - if (!result.isValid()) { - fail(result.getResult()); - } + @Autowired + private PolicyPreloadConfig params; - // keep the DB open until the test completes - provider = new PolicyModelsProviderFactory().createPolicyModelsProvider(params.getDatabaseProviderParameters()); - } - - @AfterClass - public static void tearDownAfterClass() throws Exception { - provider.close(); - } + @Autowired + private ApiDatabaseInitializer adi; @Test - public void testInitializeApiDatabase() throws PolicyApiException { - ApiDatabaseInitializer adi = new ApiDatabaseInitializer(); - assertThatCode(() -> adi.initializeApiDatabase(params)).doesNotThrowAnyException(); + public void testInitializeApiDatabase() { + assertThatCode(() -> adi.initializeApiDatabase(params.getPolicyTypes(), + params.getPolicies())).doesNotThrowAnyException(); // invoke it again - should still be OK - assertThatCode(() -> adi.initializeApiDatabase(params)).doesNotThrowAnyException(); + assertThatCode(() -> adi.initializeApiDatabase(params.getPolicyTypes(), + params.getPolicies())).doesNotThrowAnyException(); } -} +} \ No newline at end of file diff --git a/main/src/test/java/org/onap/policy/api/main/startstop/TestApiActivator.java b/main/src/test/java/org/onap/policy/api/main/startstop/TestApiActivator.java deleted file mode 100644 index ccd0f14d..00000000 --- a/main/src/test/java/org/onap/policy/api/main/startstop/TestApiActivator.java +++ /dev/null @@ -1,54 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * Modifications Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved. - * Modifications Copyright (C) 2021 Bell Canada. 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. - * - * SPDX-License-Identifier: Apache-2.0 - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.api.main.startstop; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import org.junit.Test; -import org.onap.policy.api.main.parameters.ApiParameterGroup; -import org.onap.policy.api.main.parameters.ApiParameterHandler; -import org.onap.policy.api.main.parameters.CommonTestData; -import org.onap.policy.common.utils.network.NetworkUtil; - -/** - * Class to perform unit test of ApiActivator. - * - */ -public class TestApiActivator { - private static final CommonTestData COMMON_TEST_DATA = new CommonTestData(); - - @Test - public void testApiActivator() throws Exception { - COMMON_TEST_DATA.makeParameters("src/test/resources/parameters/ApiConfigParameters_Https.json", - "src/test/resources/parameters/ApiConfigParametersXXX.json", NetworkUtil.allocPort()); - final String[] apiConfigParameters = {"-c", "src/test/resources/parameters/ApiConfigParametersXXX.json"}; - final ApiCommandLineArguments arguments = new ApiCommandLineArguments(apiConfigParameters); - final ApiParameterGroup parGroup = new ApiParameterHandler().getParameters(arguments); - final ApiActivator activator = new ApiActivator(parGroup); - activator.initialize(); - assertTrue(activator.getParameterGroup().isValid()); - assertEquals(CommonTestData.API_GROUP_NAME, activator.getParameterGroup().getName()); - activator.terminate(); - } -} diff --git a/main/src/test/java/org/onap/policy/api/main/startstop/TestApiCommandLineArguments.java b/main/src/test/java/org/onap/policy/api/main/startstop/TestApiCommandLineArguments.java deleted file mode 100644 index 8d3c42c9..00000000 --- a/main/src/test/java/org/onap/policy/api/main/startstop/TestApiCommandLineArguments.java +++ /dev/null @@ -1,68 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP Policy API - * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. - * Modifications Copyright (C) 2021 Nordix Foundation. - * ================================================================================ - * 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. - * - * SPDX-License-Identifier: Apache-2.0 - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.api.main.startstop; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -import org.junit.Test; -import org.onap.policy.api.main.exception.PolicyApiRuntimeException; - -public class TestApiCommandLineArguments { - private ApiCommandLineArguments apiCmdArgs = new ApiCommandLineArguments(); - - @Test(expected = PolicyApiRuntimeException.class) - public void testApiCommandLineArgumentsStringArray() { - String[] args = {"---d"}; - new ApiCommandLineArguments(args); - } - - @Test - public void testNonExistentFileValidateReadableFile() { - apiCmdArgs.setConfigurationFilePath("src/test/resources/filetest/nonexist.json "); - assertThatThrownBy(apiCmdArgs::validate) - .hasMessageContaining("file \"src/test/resources/filetest/nonexist.json \" does not exist"); - } - - @Test - public void testEmptyFileNameValidateReadableFile() { - apiCmdArgs.setConfigurationFilePath(""); - assertThatThrownBy(apiCmdArgs::validate) - .hasMessageContaining("policy-api configuration file was not specified as an argument"); - } - - @Test - public void testInvalidUrlValidateReadableFile() { - apiCmdArgs.setConfigurationFilePath("src/test\\resources/filetest\\n"); - assertThatThrownBy(apiCmdArgs::validate).hasMessageContaining( - "policy-api configuration file \"src/test\\resources/filetest\\n\" does not exist"); - } - - @Test - public void testVersion() { - String[] testArgs = {"-v"}; - ApiCommandLineArguments cmdArgs = new ApiCommandLineArguments(testArgs); - assertThat(cmdArgs.version()).startsWith("ONAP Policy Framework Api Service"); - } -} diff --git a/main/src/test/java/org/onap/policy/api/main/startstop/TestMain.java b/main/src/test/java/org/onap/policy/api/main/startstop/TestMain.java deleted file mode 100644 index 6c8c514d..00000000 --- a/main/src/test/java/org/onap/policy/api/main/startstop/TestMain.java +++ /dev/null @@ -1,80 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * Modifications Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved. - * Modifications Copyright (C) 2020-2021 Bell Canada. 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. - * - * SPDX-License-Identifier: Apache-2.0 - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.api.main.startstop; - -import static org.assertj.core.api.Assertions.assertThatCode; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import org.junit.Test; -import org.onap.policy.api.main.exception.PolicyApiRuntimeException; -import org.onap.policy.api.main.parameters.CommonTestData; -import org.onap.policy.common.utils.network.NetworkUtil; -import org.onap.policy.common.utils.resources.MessageConstants; - -/** - * Class to perform unit test of Main. - * - */ -public class TestMain { - private static final CommonTestData COMMON_TEST_DATA = new CommonTestData(); - - @Test - public void testMain() throws Exception { - COMMON_TEST_DATA.makeParameters("src/test/resources/parameters/ApiConfigParameters_Https.json", - "src/test/resources/parameters/ApiConfigParametersXXX.json", NetworkUtil.allocPort()); - final String[] apiConfigParameters = {"-c", "src/test/resources/parameters/ApiConfigParametersXXX.json"}; - final Main main = new Main(apiConfigParameters); - assertTrue(main.getParameterGroup().isValid()); - assertEquals(CommonTestData.API_GROUP_NAME, main.getParameterGroup().getName()); - main.shutdown(); - } - - @Test - public void testMain_NoArguments() { - final String[] apiConfigParameters = {}; - assertThatThrownBy(() -> new Main(apiConfigParameters)).isInstanceOf(PolicyApiRuntimeException.class) - .hasMessage(String.format(MessageConstants.START_FAILURE_MSG, MessageConstants.POLICY_API)); - } - - @Test - public void testMain_InvalidArguments() { - final String[] apiConfigParameters = {"parameters/ApiConfigParameters.json"}; - assertThatThrownBy(() -> new Main(apiConfigParameters)).isInstanceOf(PolicyApiRuntimeException.class) - .hasMessage(String.format(MessageConstants.START_FAILURE_MSG, MessageConstants.POLICY_API)); - } - - @Test - public void testMain_Help() { - final String[] apiConfigParameters = {"-h"}; - assertThatCode(() -> Main.main(apiConfigParameters)).doesNotThrowAnyException(); - } - - @Test - public void testMain_InvalidParameters() { - final String[] apiConfigParameters = {"-c", "parameters/ApiConfigParameters_InvalidName.json"}; - assertThatThrownBy(() -> new Main(apiConfigParameters)).isInstanceOf(PolicyApiRuntimeException.class) - .hasMessage(String.format(MessageConstants.START_FAILURE_MSG, MessageConstants.POLICY_API)); - } -} diff --git a/main/src/test/resources/application-test.yaml b/main/src/test/resources/application-test.yaml new file mode 100644 index 00000000..240d3640 --- /dev/null +++ b/main/src/test/resources/application-test.yaml @@ -0,0 +1,8 @@ +database: + name: PolicyProviderParameterGroup + implementation: org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl + driver: org.h2.Driver + url: jdbc:h2:mem:testdb + user: policy_user + password: policy_user + persistenceUnit: ToscaConceptTest \ No newline at end of file diff --git a/main/src/test/resources/logback-test.xml b/main/src/test/resources/logback-test.xml deleted file mode 100644 index 88187371..00000000 --- a/main/src/test/resources/logback-test.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - policy-api - - - - - - %d %contextName [%t] %level %logger{36} - %msg%n - - - - - - - - - - - - - - - - - - - - - - - diff --git a/main/src/test/resources/parameters/ApiConfigParameters_Https.json b/main/src/test/resources/parameters/ApiConfigParameters_Https.json deleted file mode 100644 index 1d33e2ec..00000000 --- a/main/src/test/resources/parameters/ApiConfigParameters_Https.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "name":"ApiGroup", - "restServerParameters":{ - "host":"0.0.0.0", - "port":6969, - "userName":"policyadmin", - "password":"zb!XztG34", - "https":true - }, - "databaseProviderParameters": { - "name": "PolicyProviderParameterGroup", - "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl", - "databaseDriver": "org.h2.Driver", - "databaseUrl": "jdbc:h2:mem:testdb", - "databaseUser": "policy", - "databasePassword": "UDAxaWNZ", - "persistenceUnit": "ToscaConceptTest" - }, - "preloadPolicyTypes": [ - "policytypes/onap.policies.monitoring.tcagen2.yaml", - "policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server.yaml", - "policytypes/onap.policies.monitoring.dcae-restconfcollector.yaml", - "policytypes/onap.policies.monitoring.dcae-pm-subscription-handler.yaml", - "policytypes/onap.policies.monitoring.dcae-pm-mapper.yaml", - "policytypes/onap.policies.Optimization.yaml", - "policytypes/onap.policies.optimization.Resource.yaml", - "policytypes/onap.policies.optimization.Service.yaml", - "policytypes/onap.policies.optimization.resource.AffinityPolicy.yaml", - "policytypes/onap.policies.optimization.resource.DistancePolicy.yaml", - "policytypes/onap.policies.optimization.resource.HpaPolicy.yaml", - "policytypes/onap.policies.optimization.resource.OptimizationPolicy.yaml", - "policytypes/onap.policies.optimization.resource.PciPolicy.yaml", - "policytypes/onap.policies.optimization.service.QueryPolicy.yaml", - "policytypes/onap.policies.optimization.service.SubscriberPolicy.yaml", - "policytypes/onap.policies.optimization.resource.Vim_fit.yaml", - "policytypes/onap.policies.optimization.resource.VnfPolicy.yaml", - "policytypes/onap.policies.controlloop.guard.Common.yaml", - "policytypes/onap.policies.controlloop.guard.common.Blacklist.yaml", - "policytypes/onap.policies.controlloop.guard.common.FrequencyLimiter.yaml", - "policytypes/onap.policies.controlloop.guard.common.MinMax.yaml", - "policytypes/onap.policies.controlloop.guard.common.Filter.yaml", - "policytypes/onap.policies.controlloop.guard.coordination.FirstBlocksSecond.yaml", - "policytypes/onap.policies.controlloop.Operational.yaml", - "policytypes/onap.policies.Naming.yaml", - "policytypes/onap.policies.Match.yaml", - "policytypes/onap.policies.native.Drools.yaml", - "policytypes/onap.policies.native.Xacml.yaml", - "policytypes/onap.policies.native.Apex.yaml", - "policytypes/onap.policies.controlloop.operational.Common.yaml", - "policytypes/onap.policies.controlloop.operational.common.Apex.yaml", - "policytypes/onap.policies.controlloop.operational.common.Drools.yaml" - ], - "preloadPolicies" : [ - "policies/sdnc.policy.naming.input.tosca.yaml" - ] -} diff --git a/main/src/test/resources/parameters/ApiConfigParameters_InvalidName.json b/main/src/test/resources/parameters/ApiConfigParameters_InvalidName.json deleted file mode 100644 index 832035ec..00000000 --- a/main/src/test/resources/parameters/ApiConfigParameters_InvalidName.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name":" ", - "restServerParameters":{ - "host":"0.0.0.0", - "port":6969, - "userName":"policyadmin", - "password":"zb!XztG34" - }, - "databaseProviderParameters": { - "name": "PolicyProviderParameterGroup", - "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl", - "databaseUrl": "jdbc:h2:mem:testdb", - "databaseUser": "policy", - "databasePassword": "UDAxaWNZ", - "persistenceUnit": "ToscaConceptTest" - }, - "preloadPolicyTypes": [], - "preloadPolicies": [] -} diff --git a/main/src/test/resources/parameters/ApiConfigParameters_InvalidRestServerParameters.json b/main/src/test/resources/parameters/ApiConfigParameters_InvalidRestServerParameters.json deleted file mode 100644 index 4e9083ec..00000000 --- a/main/src/test/resources/parameters/ApiConfigParameters_InvalidRestServerParameters.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name":"ApiGroup", - "restServerParameters":{ - "host":"", - "port":-1, - "userName":"", - "password":"" - }, - "databaseProviderParameters": { - "name": "PolicyProviderParameterGroup", - "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl", - "databaseDriver": "org.h2.Driver", - "databaseUrl": "jdbc:h2:mem:testdb", - "databaseUser": "policy", - "databasePassword": "UDAxaWNZ", - "persistenceUnit": "ToscaConceptTest" - }, - "preloadPolicyTypes": [], - "preloadPolicies": [] -} diff --git a/main/src/test/resources/parameters/ApiConfigParameters_Postgres.json b/main/src/test/resources/parameters/ApiConfigParameters_Postgres.json deleted file mode 100644 index e5c375a0..00000000 --- a/main/src/test/resources/parameters/ApiConfigParameters_Postgres.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "name":"ApiGroup", - "restServerParameters":{ - "host":"0.0.0.0", - "port":6968, - "userName":"healthcheck", - "password":"zb!XztG34", - "https":false - }, - "databaseProviderParameters": { - "name": "PolicyProviderParameterGroup", - "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl", - "databaseDriver": "org.postgresql.Driver", - "databaseUrl": "jdbc:postgresql://localhost:5432/policyadmin", - "databaseUser": "policy_user", - "databasePassword": "policy_user", - "persistenceUnit": "PolicyDb" - }, - "preloadPolicyTypes": [ - "policytypes/onap.policies.monitoring.tcagen2.yaml", - "policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server.yaml", - "policytypes/onap.policies.monitoring.dcae-restconfcollector.yaml", - "policytypes/onap.policies.monitoring.dcae-pm-subscription-handler.yaml", - "policytypes/onap.policies.monitoring.dcae-pm-mapper.yaml", - "policytypes/onap.policies.Optimization.yaml", - "policytypes/onap.policies.optimization.Resource.yaml", - "policytypes/onap.policies.optimization.Service.yaml", - "policytypes/onap.policies.optimization.resource.AffinityPolicy.yaml", - "policytypes/onap.policies.optimization.resource.DistancePolicy.yaml", - "policytypes/onap.policies.optimization.resource.HpaPolicy.yaml", - "policytypes/onap.policies.optimization.resource.OptimizationPolicy.yaml", - "policytypes/onap.policies.optimization.resource.PciPolicy.yaml", - "policytypes/onap.policies.optimization.service.QueryPolicy.yaml", - "policytypes/onap.policies.optimization.service.SubscriberPolicy.yaml", - "policytypes/onap.policies.optimization.resource.Vim_fit.yaml", - "policytypes/onap.policies.optimization.resource.VnfPolicy.yaml", - "policytypes/onap.policies.controlloop.guard.Common.yaml", - "policytypes/onap.policies.controlloop.guard.common.Blacklist.yaml", - "policytypes/onap.policies.controlloop.guard.common.FrequencyLimiter.yaml", - "policytypes/onap.policies.controlloop.guard.common.MinMax.yaml", - "policytypes/onap.policies.controlloop.guard.common.Filter.yaml", - "policytypes/onap.policies.controlloop.guard.coordination.FirstBlocksSecond.yaml", - "policytypes/onap.policies.controlloop.Operational.yaml", - "policytypes/onap.policies.Naming.yaml", - "policytypes/onap.policies.Match.yaml", - "policytypes/onap.policies.native.Drools.yaml", - "policytypes/onap.policies.native.Xacml.yaml", - "policytypes/onap.policies.native.Apex.yaml", - "policytypes/onap.policies.controlloop.operational.Common.yaml", - "policytypes/onap.policies.controlloop.operational.common.Apex.yaml", - "policytypes/onap.policies.controlloop.operational.common.Drools.yaml" - ], - "preloadPolicies" : [ - "policies/sdnc.policy.naming.input.tosca.yaml" - ] -} diff --git a/main/src/test/resources/parameters/BadParameters.json b/main/src/test/resources/parameters/BadParameters.json deleted file mode 100644 index de2040cc..00000000 --- a/main/src/test/resources/parameters/BadParameters.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "name" : [] -} \ No newline at end of file diff --git a/main/src/test/resources/parameters/EmptyParameters.json b/main/src/test/resources/parameters/EmptyParameters.json deleted file mode 100644 index e69de29b..00000000 diff --git a/main/src/test/resources/parameters/InvalidParameters.json b/main/src/test/resources/parameters/InvalidParameters.json deleted file mode 100644 index de2040cc..00000000 --- a/main/src/test/resources/parameters/InvalidParameters.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "name" : [] -} \ No newline at end of file diff --git a/main/src/test/resources/parameters/MinimumParameters.json b/main/src/test/resources/parameters/MinimumParameters.json deleted file mode 100644 index 5d671d2f..00000000 --- a/main/src/test/resources/parameters/MinimumParameters.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name":"ApiGroup", - "restServerParameters":{ - "host":"0.0.0.0", - "port":6969, - "userName":"policyadmin", - "password":"zb!XztG34" - }, - "databaseProviderParameters": { - "name": "PolicyProviderParameterGroup", - "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl", - "databaseDriver": "org.h2.Driver", - "databaseUrl": "jdbc:h2:mem:testdb", - "databaseUser": "policy", - "databasePassword": "UDAxaWNZ", - "persistenceUnit": "ToscaConceptTest" - }, - "preloadPolicyTypes": [], - "preloadPolicies": [] -} \ No newline at end of file diff --git a/main/src/test/resources/parameters/NoParameters.json b/main/src/test/resources/parameters/NoParameters.json deleted file mode 100644 index 36e33afb..00000000 --- a/main/src/test/resources/parameters/NoParameters.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "restServerParameters":{ - "host":"0.0.0.0", - "port":6969, - "userName":"policyadmin", - "password":"zb!XztG34" - }, - "databaseProviderParameters": { - "name": "PolicyProviderParameterGroup", - "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl", - "databaseDriver": "org.h2.Driver", - "databaseUrl": "jdbc:h2:mem:testdb", - "databaseUser": "policy", - "databasePassword": "UDAxaWNZ", - "persistenceUnit": "ToscaConceptTest" - }, - "preloadPolicyTypes": [], - "preloadPolicies": [] -} \ No newline at end of file diff --git a/main/src/test/resources/parameters/RestServerParameters.json b/main/src/test/resources/parameters/RestServerParameters.json deleted file mode 100644 index 8d3bc580..00000000 --- a/main/src/test/resources/parameters/RestServerParameters.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "host": "0.0.0.0", - "port": 6969, - "userName": "policyadmin", - "password": "zb!XztG34" -} diff --git a/main/src/test/resources/parameters/RestServerParametersEmpty.json b/main/src/test/resources/parameters/RestServerParametersEmpty.json deleted file mode 100644 index e02aef27..00000000 --- a/main/src/test/resources/parameters/RestServerParametersEmpty.json +++ /dev/null @@ -1,2 +0,0 @@ -{ -} \ No newline at end of file diff --git a/packages/policy-api-docker/pom.xml b/packages/policy-api-docker/pom.xml index 57078d52..e9c45879 100644 --- a/packages/policy-api-docker/pom.xml +++ b/packages/policy-api-docker/pom.xml @@ -1,7 +1,7 @@