From baf0a9fdfd5e699ce5950914121f093282a3e4ed Mon Sep 17 00:00:00 2001 From: FrancescoFioraEst Date: Thu, 28 Oct 2021 10:19:09 +0100 Subject: Add Spring Jpa configuration Issue-ID: POLICY-3795 Change-Id: Ic0955f412bfcd94094c19aceb4f25be8e695099a Signed-off-by: FrancescoFioraEst --- .../clamp/controlloop/runtime/Application.java | 5 + .../runtime/config/JpaConfiguration.java | 119 +++++++++++++++++++++ .../main/parameters/ClRuntimeParameterGroup.java | 5 + .../runtime/supervision/SupervisionHandler.java | 6 +- .../runtime/supervision/SupervisionScanner.java | 13 +-- .../comm/ControlLoopUpdatePublisher.java | 6 +- .../src/main/resources/META-INF/persistence.xml | 48 --------- .../src/main/resources/application.yaml | 11 ++ 8 files changed, 153 insertions(+), 60 deletions(-) create mode 100644 runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/config/JpaConfiguration.java (limited to 'runtime-controlloop/src/main') diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/Application.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/Application.java index a9b45c589..3f51f1f2b 100644 --- a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/Application.java +++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/Application.java @@ -22,16 +22,21 @@ package org.onap.policy.clamp.controlloop.runtime; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.boot.context.properties.ConfigurationPropertiesScan; import org.springframework.context.annotation.ComponentScan; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.scheduling.annotation.EnableScheduling; @EnableScheduling @SpringBootApplication +@EnableJpaRepositories @ComponentScan({"org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider", "org.onap.policy.clamp.controlloop.runtime", "org.onap.policy.clamp.controlloop.common.rest"}) @ConfigurationPropertiesScan("org.onap.policy.clamp.controlloop.runtime.main.parameters") +@EntityScan({"org.onap.policy.models.tosca.simple.concepts", + "org.onap.policy.clamp.controlloop.models.controlloop.concepts"}) public class Application { public static void main(String[] args) { diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/config/JpaConfiguration.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/config/JpaConfiguration.java new file mode 100644 index 000000000..290b74e3a --- /dev/null +++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/config/JpaConfiguration.java @@ -0,0 +1,119 @@ +/*- + * ============LICENSE_START======================================================= + * 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.clamp.controlloop.runtime.config; + +import java.util.HashMap; +import java.util.Map; +import javax.persistence.EntityManagerFactory; +import javax.sql.DataSource; +import org.eclipse.persistence.config.BatchWriting; +import org.eclipse.persistence.config.PersistenceUnitProperties; +import org.eclipse.persistence.logging.SessionLog; +import org.onap.policy.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterGroup; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration; +import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; +import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.AbstractJpaVendorAdapter; +import org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.springframework.transaction.jta.JtaTransactionManager; + +@Configuration +@EnableTransactionManagement +public class JpaConfiguration extends JpaBaseConfiguration { + + protected JpaConfiguration(DataSource dataSource, JpaProperties properties, + ObjectProvider jtaTransactionManager) { + super(dataSource, properties, jtaTransactionManager); + } + + @Override + protected AbstractJpaVendorAdapter createJpaVendorAdapter() { + return new EclipseLinkJpaVendorAdapter(); + } + + @Override + protected Map getVendorProperties() { + return Map.of(PersistenceUnitProperties.BATCH_WRITING, BatchWriting.JDBC); + } + + /** + * Create EntityManagerFactory. + * + * @param builder EntityManagerFactoryBuilder + * @param dataSource DataSource + * @return LocalContainerEntityManagerFactoryBean + */ + @Bean("entityManagerFactory") + public LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactory( + EntityManagerFactoryBuilder builder, DataSource dataSource, + ClRuntimeParameterGroup clRuntimeParameterGroup) { + + return builder.dataSource(dataSource) + .persistenceUnit(clRuntimeParameterGroup.getDatabaseProviderParameters().getPersistenceUnit()) + .properties(initJpaProperties()).build(); + } + + /** + * create a PlatformTransactionManager. + * + * @param emf EntityManagerFactory + * @return PlatformTransactionManager + */ + @Bean + public static PlatformTransactionManager transactionManager(EntityManagerFactory emf) { + final var transactionManager = new JpaTransactionManager(); + transactionManager.setEntityManagerFactory(emf); + return transactionManager; + } + + /** + * create Jpa Properties. + * + * @return JpaProperties + */ + @Bean + @Primary + public static JpaProperties properties(ClRuntimeParameterGroup clRuntimeParameterGroup) { + final var jpaProperties = new JpaProperties(); + jpaProperties.setShowSql(clRuntimeParameterGroup.isShowSql()); + jpaProperties.setDatabasePlatform(clRuntimeParameterGroup.getDatabasePlatform()); + return jpaProperties; + } + + private static Map initJpaProperties() { + final Map ret = new HashMap<>(); + // Add any JpaProperty you are interested in and is supported by your Database and JPA implementation + ret.put(PersistenceUnitProperties.BATCH_WRITING, BatchWriting.JDBC); + ret.put(PersistenceUnitProperties.LOGGING_LEVEL, SessionLog.INFO_LABEL); + ret.put(PersistenceUnitProperties.WEAVING, "false"); + ret.put(PersistenceUnitProperties.DDL_GENERATION, PersistenceUnitProperties.CREATE_ONLY); + ret.put(PersistenceUnitProperties.DDL_GENERATION_MODE, PersistenceUnitProperties.DDL_DATABASE_GENERATION); + return ret; + } +} diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/parameters/ClRuntimeParameterGroup.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/parameters/ClRuntimeParameterGroup.java index 86473caa8..9211ca211 100644 --- a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/parameters/ClRuntimeParameterGroup.java +++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/parameters/ClRuntimeParameterGroup.java @@ -22,6 +22,7 @@ package org.onap.policy.clamp.controlloop.runtime.main.parameters; import javax.validation.Valid; import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; @@ -65,4 +66,8 @@ public class ClRuntimeParameterGroup { private long participantDeregisterAckIntervalSec; private long participantUpdateIntervalSec; + @NotBlank + private String databasePlatform; + + private boolean showSql = false; } diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/SupervisionHandler.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/SupervisionHandler.java index 2a1f9082f..f011d9392 100644 --- a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/SupervisionHandler.java +++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/SupervisionHandler.java @@ -40,6 +40,7 @@ import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantUtils; import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ControlLoopProvider; import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ParticipantProvider; +import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ServiceTemplateProvider; import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ControlLoopAck; import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantDeregister; import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessage; @@ -54,7 +55,6 @@ import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ParticipantReg import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ParticipantUpdatePublisher; 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.tosca.authorative.concepts.ToscaConceptIdentifier; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; import org.slf4j.Logger; @@ -80,7 +80,7 @@ public class SupervisionHandler { private final ControlLoopProvider controlLoopProvider; private final ParticipantProvider participantProvider; private final MonitoringProvider monitoringProvider; - private final PolicyModelsProvider modelsProvider; + private final ServiceTemplateProvider serviceTemplateProvider; // Publishers for participant communication private final ControlLoopUpdatePublisher controlLoopUpdatePublisher; @@ -427,7 +427,7 @@ public class SupervisionHandler { private int getFirstStartPhase(ControlLoop controlLoop) { ToscaServiceTemplate toscaServiceTemplate = null; try { - toscaServiceTemplate = modelsProvider.getServiceTemplateList(null, null).get(0); + toscaServiceTemplate = serviceTemplateProvider.getServiceTemplateList(null, null).get(0); } catch (PfModelException e) { throw new PfModelRuntimeException(Status.BAD_REQUEST, "Canont load ToscaServiceTemplate from DB", e); } diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/SupervisionScanner.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/SupervisionScanner.java index 48e06010d..900a117bd 100644 --- a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/SupervisionScanner.java +++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/SupervisionScanner.java @@ -34,13 +34,13 @@ import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantUtils; import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ControlLoopProvider; import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ParticipantProvider; +import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ServiceTemplateProvider; import org.onap.policy.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterGroup; import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ControlLoopStateChangePublisher; import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ControlLoopUpdatePublisher; import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ParticipantStatusReqPublisher; import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ParticipantUpdatePublisher; import org.onap.policy.models.base.PfModelException; -import org.onap.policy.models.provider.PolicyModelsProvider; import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; @@ -63,7 +63,7 @@ public class SupervisionScanner { private final Map phaseMap = new HashMap<>(); private final ControlLoopProvider controlLoopProvider; - private final PolicyModelsProvider modelsProvider; + private final ServiceTemplateProvider serviceTemplateProvider; private final ControlLoopStateChangePublisher controlLoopStateChangePublisher; private final ControlLoopUpdatePublisher controlLoopUpdatePublisher; private final ParticipantProvider participantProvider; @@ -74,7 +74,7 @@ public class SupervisionScanner { * Constructor for instantiating SupervisionScanner. * * @param controlLoopProvider the provider to use to read control loops from the database - * @param modelsProvider the Policy Models Provider + * @param serviceTemplateProvider the Policy Models Provider * @param controlLoopStateChangePublisher the ControlLoop StateChange Publisher * @param controlLoopUpdatePublisher the ControlLoopUpdate Publisher * @param participantProvider the Participant Provider @@ -82,14 +82,15 @@ public class SupervisionScanner { * @param participantUpdatePublisher the Participant Update Publisher * @param clRuntimeParameterGroup the parameters for the control loop runtime */ - public SupervisionScanner(final ControlLoopProvider controlLoopProvider, PolicyModelsProvider modelsProvider, + public SupervisionScanner(final ControlLoopProvider controlLoopProvider, + ServiceTemplateProvider serviceTemplateProvider, final ControlLoopStateChangePublisher controlLoopStateChangePublisher, ControlLoopUpdatePublisher controlLoopUpdatePublisher, ParticipantProvider participantProvider, ParticipantStatusReqPublisher participantStatusReqPublisher, ParticipantUpdatePublisher participantUpdatePublisher, final ClRuntimeParameterGroup clRuntimeParameterGroup) { this.controlLoopProvider = controlLoopProvider; - this.modelsProvider = modelsProvider; + this.serviceTemplateProvider = serviceTemplateProvider; this.controlLoopStateChangePublisher = controlLoopStateChangePublisher; this.controlLoopUpdatePublisher = controlLoopUpdatePublisher; this.participantProvider = participantProvider; @@ -130,7 +131,7 @@ public class SupervisionScanner { } try { - var list = modelsProvider.getServiceTemplateList(null, null); + var list = serviceTemplateProvider.getServiceTemplateList(null, null); if (list != null && !list.isEmpty()) { ToscaServiceTemplate toscaServiceTemplate = list.get(0); diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/comm/ControlLoopUpdatePublisher.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/comm/ControlLoopUpdatePublisher.java index 06fbcd649..32c0638af 100644 --- a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/comm/ControlLoopUpdatePublisher.java +++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/comm/ControlLoopUpdatePublisher.java @@ -31,9 +31,9 @@ import org.onap.policy.clamp.controlloop.common.utils.CommonUtils; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantUpdates; +import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ServiceTemplateProvider; import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ControlLoopUpdate; import org.onap.policy.models.base.PfModelException; -import org.onap.policy.models.provider.PolicyModelsProvider; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -47,7 +47,7 @@ import org.springframework.stereotype.Component; public class ControlLoopUpdatePublisher extends AbstractParticipantPublisher { private static final Logger LOGGER = LoggerFactory.getLogger(ControlLoopUpdatePublisher.class); - private final PolicyModelsProvider modelsProvider; + private final ServiceTemplateProvider serviceTemplateProvider; /** * Send ControlLoopUpdate to Participant. @@ -72,7 +72,7 @@ public class ControlLoopUpdatePublisher extends AbstractParticipantPublisherNONE - - org.eclipse.persistence.jpa.PersistenceProvider - - org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityAssignment - org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityAssignments - org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityType - org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityTypes - org.onap.policy.models.tosca.simple.concepts.JpaToscaDataType - org.onap.policy.models.tosca.simple.concepts.JpaToscaDataTypes - org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplate - org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplates - org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeType - org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTypes - org.onap.policy.models.tosca.simple.concepts.JpaToscaParameter - org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicies - org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicy - org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyType - org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyTypes - org.onap.policy.models.tosca.simple.concepts.JpaToscaProperty - org.onap.policy.models.tosca.simple.concepts.JpaToscaRelationshipType - org.onap.policy.models.tosca.simple.concepts.JpaToscaRelationshipTypes - org.onap.policy.models.tosca.simple.concepts.JpaToscaRequirement - org.onap.policy.models.tosca.simple.concepts.JpaToscaRequirements - org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate - org.onap.policy.models.tosca.simple.concepts.JpaToscaTopologyTemplate - org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaControlLoop - org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaControlLoopElement - org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipant - org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipantStatistics - org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaClElementStatistics - - - - - - - - NONE - diff --git a/runtime-controlloop/src/main/resources/application.yaml b/runtime-controlloop/src/main/resources/application.yaml index 50c063fb3..c4fc77b4d 100644 --- a/runtime-controlloop/src/main/resources/application.yaml +++ b/runtime-controlloop/src/main/resources/application.yaml @@ -6,6 +6,16 @@ spring: http: converters: preferred-json-mapper: gson + datasource: + url: jdbc:mariadb://${mariadb.host:localhost}:${mariadb.port:3306}/controlloop + driverClassName: org.mariadb.jdbc.Driver + username: policy + password: P01icY + hikari: + connectionTimeout: 30000 + idleTimeout: 600000 + maxLifetime: 1800000 + maximumPoolSize: 10 security: enable-csrf: false @@ -28,6 +38,7 @@ runtime: updateParameters: maxRetryCount: 4 maxWaitMs: 20000 + databasePlatform: org.eclipse.persistence.platform.database.MySQLPlatform databaseProviderParameters: name: PolicyProviderParameterGroup implementation: org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl -- cgit 1.2.3-korg