Replace Eclipselink with Hibernate
[policy/models.git] / models-provider / src / test / java / org / onap / policy / models / provider / impl / PolicyToscaPersistenceTest.java
index 613c5a2..1f99316 100644 (file)
@@ -1,6 +1,8 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2019 Nordix Foundation.
+ *  Copyright (C) 2019-2021,2023 Nordix Foundation.
+ *  Modifications Copyright (C) 2020 Bell Canada. 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.
 
 package org.onap.policy.models.provider.impl;
 
+import static org.assertj.core.api.Assertions.assertThatCode;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-
-import com.google.gson.GsonBuilder;
-
-import java.util.Base64;
 
+import java.net.URISyntaxException;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 import lombok.NonNull;
-
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.onap.policy.common.utils.coder.CoderException;
 import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.common.utils.coder.YamlJsonTranslator;
 import org.onap.policy.common.utils.resources.ResourceUtils;
 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.onap.policy.models.tosca.authorative.concepts.ToscaEntityFilter;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
+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.ToscaTypedEntityFilter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.yaml.snakeyaml.Yaml;
 
 /**
  * Test persistence of monitoring policies to and from the database.
@@ -51,53 +59,43 @@ import org.yaml.snakeyaml.Yaml;
  * @author Liam Fallon (liam.fallon@est.tech)
  */
 public class PolicyToscaPersistenceTest {
-    // Logger for this class
     private static final Logger LOGGER = LoggerFactory.getLogger(PolicyToscaPersistenceTest.class);
 
-    private StandardCoder standardCoder;
+    private YamlJsonTranslator yamlJsonTranslator = new YamlJsonTranslator();
+    private StandardCoder standardCoder = new StandardCoder();
 
     private PolicyModelsProvider databaseProvider;
 
-    // @formatter:off
-    private String[] policyResourceNames = {
-        "policies/vCPE.policy.monitoring.input.tosca.json",
-        "policies/vCPE.policy.monitoring.input.tosca.yaml",
-        "policies/vCPE.policy.operational.input.tosca.yaml",
-        "policies/vDNS.policy.guard.frequency.input.tosca.json",
-        "policies/vDNS.policy.guard.frequency.input.tosca.yaml",
-        "policies/vDNS.policy.monitoring.input.tosca.json",
-        "policies/vDNS.policy.monitoring.input.tosca.yaml",
-        "policies/vDNS.policy.operational.input.tosca.yaml",
-        "policies/vFirewall.policy.monitoring.input.tosca.json",
-        "policies/vFirewall.policy.monitoring.input.tosca.yaml",
-        "policies/vFirewall.policy.operational.input.tosca.json",
-        "policies/vFirewall.policy.operational.input.tosca.yaml"
-    };
-    // @formatter:on
-
     /**
      * Initialize provider.
      *
      * @throws PfModelException on exceptions in the tests
+     * @throws CoderException on JSON encoding and decoding errors
      */
     @Before
-    public void setupParameters() throws PfModelException {
+    public void setupParameters() throws Exception {
+        // H2, use "org.mariadb.jdbc.Driver" and "jdbc:mariadb://localhost:3306/policy" for locally installed MariaDB
+
         PolicyModelsProviderParameters parameters = new PolicyModelsProviderParameters();
-        parameters.setDatabaseDriver("org.h2.Driver");
-        parameters.setDatabaseUrl("jdbc:h2:mem:testdb");
+
+        if (System.getProperty("USE-MARIADB") != null) {
+            parameters.setDatabaseDriver("org.mariadb.jdbc.Driver");
+            parameters.setDatabaseUrl("jdbc:mariadb://localhost:3306/policy");
+            parameters.setDatabaseType("org.hibernate.dialect.MariaDBDialect");
+        } else {
+            parameters.setDatabaseDriver("org.h2.Driver");
+            parameters.setDatabaseUrl("jdbc:h2:mem:PolicyToscaPersistenceTest");
+            parameters.setDatabaseType("org.hibernate.dialect.H2Dialect");
+        }
+
         parameters.setDatabaseUser("policy");
-        parameters.setDatabasePassword(Base64.getEncoder().encodeToString("P01icY".getBytes()));
+        parameters.setDatabasePassword("P01icY");
         parameters.setPersistenceUnit("ToscaConceptTest");
 
+
         databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
-    }
 
-    /**
-     * Set up the standard coder.
-     */
-    @Before
-    public void setupStandardCoder() {
-        standardCoder = new StandardCoder();
+        createPolicyTypes();
     }
 
     @After
@@ -106,49 +104,220 @@ public class PolicyToscaPersistenceTest {
     }
 
     @Test
-    public void testPolicyPersistence() {
-        try {
-            for (String policyResourceName : policyResourceNames) {
-                String policyString = ResourceUtils.getResourceAsString(policyResourceName);
-
-                if (policyResourceName.endsWith("yaml")) {
-                    testYamlStringPolicyPersistence(policyString);
-                } else {
-                    testJsonStringPolicyPersistence(policyString);
-                }
+    public void testToscaPolicyPersistence() throws Exception {
+        Set<String> policyResources = ResourceUtils.getDirectoryContents("policies");
+
+        for (String policyResource : policyResources) {
+            if (!policyResource.contains("\\.tosca\\.")) {
+                continue;
+            }
+
+            String policyString = ResourceUtils.getResourceAsString(policyResource);
+
+            if (policyResource.endsWith("yaml")) {
+                testPolicyPersistence(yamlJsonTranslator.fromYaml(policyString, ToscaServiceTemplate.class));
+            } else {
+                testPolicyPersistence(standardCoder.decode(policyString, ToscaServiceTemplate.class));
             }
-        } catch (Exception exc) {
-            LOGGER.warn("error processing policy types", exc);
-            fail("test should not throw an exception");
         }
     }
 
-    private void testYamlStringPolicyPersistence(final String policyString) throws Exception {
-        Object yamlObject = new Yaml().load(policyString);
-        String yamlAsJsonString = new GsonBuilder().setPrettyPrinting().create().toJson(yamlObject);
+    @Test
+    public void testHpaPolicyTypeGet() throws PfModelException {
+        long getStartTime = System.currentTimeMillis();
+        ToscaServiceTemplate hpaServiceTemplate =
+                databaseProvider.getPolicyTypes("onap.policies.optimization.resource.HpaPolicy", "1.0.0");
+        LOGGER.trace("HPA policy normal get time (ms): {}", System.currentTimeMillis() - getStartTime);
 
-        testJsonStringPolicyPersistence(yamlAsJsonString);
+        assertEquals(3, hpaServiceTemplate.getPolicyTypesAsMap().size());
+        assertEquals(5, hpaServiceTemplate.getDataTypesAsMap().size());
+
+        getStartTime = System.currentTimeMillis();
+        ToscaEntityFilter<ToscaPolicyType> hpaFilter = ToscaEntityFilter.<ToscaPolicyType>builder()
+                .name("onap.policies.optimization.resource.HpaPolicy").version("1.0.0").build();
+        hpaServiceTemplate = databaseProvider.getFilteredPolicyTypes(hpaFilter);
+        LOGGER.trace("HPA policy filter name version get time (ms): {}", System.currentTimeMillis() - getStartTime);
+
+        assertEquals(3, hpaServiceTemplate.getPolicyTypesAsMap().size());
+        assertEquals(5, hpaServiceTemplate.getDataTypesAsMap().size());
+
+        getStartTime = System.currentTimeMillis();
+        hpaFilter = ToscaEntityFilter.<ToscaPolicyType>builder().name("onap.policies.optimization.resource.HpaPolicy")
+                .build();
+        hpaServiceTemplate = databaseProvider.getFilteredPolicyTypes(hpaFilter);
+        LOGGER.trace("HPA policy filter name only get time (ms): {}", System.currentTimeMillis() - getStartTime);
+
+        assertEquals(3, hpaServiceTemplate.getPolicyTypesAsMap().size());
+        assertEquals(5, hpaServiceTemplate.getDataTypesAsMap().size());
+    }
+
+    @Test
+    public void testNamingPolicyGet() throws PfModelException {
+        String policyYamlString = ResourceUtils.getResourceAsString("policies/sdnc.policy.naming.input.tosca.yaml");
+        ToscaServiceTemplate serviceTemplate =
+                yamlJsonTranslator.fromYaml(policyYamlString, ToscaServiceTemplate.class);
+
+        long createStartTime = System.currentTimeMillis();
+        databaseProvider.createPolicies(serviceTemplate);
+        LOGGER.trace("Naming policy create time (ms): {}", System.currentTimeMillis() - createStartTime);
+
+        long getStartTime = System.currentTimeMillis();
+        ToscaServiceTemplate namingServiceTemplate =
+                databaseProvider.getPolicies("SDNC_Policy.ONAP_NF_NAMING_TIMESTAMP", "1.0.0");
+        LOGGER.trace("Naming policy normal get time (ms): {}", System.currentTimeMillis() - getStartTime);
+
+        assertEquals(1, namingServiceTemplate.getToscaTopologyTemplate().getPoliciesAsMap().size());
+        assertEquals(1, namingServiceTemplate.getPolicyTypesAsMap().size());
+        assertEquals(3, namingServiceTemplate.getDataTypesAsMap().size());
+
+        getStartTime = System.currentTimeMillis();
+        ToscaTypedEntityFilter<ToscaPolicy> filter = ToscaTypedEntityFilter.<ToscaPolicy>builder()
+                .name("SDNC_Policy.ONAP_NF_NAMING_TIMESTAMP").version("1.0.0").build();
+        namingServiceTemplate = databaseProvider.getFilteredPolicies(filter);
+        LOGGER.trace("Naming policy filtered get time (ms): {}", System.currentTimeMillis() - getStartTime);
+
+        assertEquals(1, namingServiceTemplate.getToscaTopologyTemplate().getPoliciesAsMap().size());
+        assertEquals(1, namingServiceTemplate.getPolicyTypesAsMap().size());
+        assertEquals(3, namingServiceTemplate.getDataTypesAsMap().size());
+
+        getStartTime = System.currentTimeMillis();
+        filter = ToscaTypedEntityFilter.<ToscaPolicy>builder().name("SDNC_Policy.ONAP_NF_NAMING_TIMESTAMP").build();
+        namingServiceTemplate = databaseProvider.getFilteredPolicies(filter);
+        LOGGER.trace("Naming policy filtered name only get time (ms): {}", System.currentTimeMillis() - getStartTime);
+
+        assertEquals(1, namingServiceTemplate.getToscaTopologyTemplate().getPoliciesAsMap().size());
+        assertEquals(1, namingServiceTemplate.getPolicyTypesAsMap().size());
+        assertEquals(3, namingServiceTemplate.getDataTypesAsMap().size());
+
+        long deleteStartTime = System.currentTimeMillis();
+        ToscaServiceTemplate deletedServiceTemplate =
+                databaseProvider.deletePolicy("SDNC_Policy.ONAP_NF_NAMING_TIMESTAMP", "1.0.0");
+        LOGGER.trace("Naming policy delete time (ms): {}", System.currentTimeMillis() - deleteStartTime);
+
+        assertEquals(1, deletedServiceTemplate.getToscaTopologyTemplate().getPoliciesAsMap().size());
+    }
+
+    @Test
+    public void testNamingPolicyVersions() throws PfModelException {
+        String policyYamlString = ResourceUtils.getResourceAsString("policies/sdnc.policy.naming.input.tosca.yaml");
+        ToscaServiceTemplate serviceTemplate =
+                yamlJsonTranslator.fromYaml(policyYamlString, ToscaServiceTemplate.class);
+
+        // Create policy types and data types
+        List<Map<String, ToscaPolicy>> policyMapList = serviceTemplate.getToscaTopologyTemplate().getPolicies();
+        databaseProvider.createPolicies(serviceTemplate);
+
+        // Clear the policy map list so we start from afresh with versions
+        ToscaPolicy namingPolicy = policyMapList.get(0).values().iterator().next();
+        policyMapList.clear();
+
+        // Create 21 more versions of the policy
+        for (int i = 2; i < 22; i++) {
+            ToscaPolicy clonedNamingPolicy = new ToscaPolicy(namingPolicy);
+            clonedNamingPolicy.setVersion(i + ".0.0");
+            Map<String, ToscaPolicy> policyMap = new LinkedHashMap<>(1);
+            policyMap.put(clonedNamingPolicy.getName(), clonedNamingPolicy);
+            policyMapList.add(policyMap);
+        }
+
+        databaseProvider.createPolicies(serviceTemplate);
+
+        for (int i = 1; i < 22; i++) {
+            ToscaServiceTemplate namingServiceTemplate =
+                    databaseProvider.getPolicies("SDNC_Policy.ONAP_NF_NAMING_TIMESTAMP", i + ".0.0");
+            assertEquals(i + ".0.0", namingServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0).values()
+                    .iterator().next().getVersion());
+
+            ToscaTypedEntityFilter<ToscaPolicy> policyFilter = ToscaTypedEntityFilter.<ToscaPolicy>builder()
+                    .name("SDNC_Policy.ONAP_NF_NAMING_TIMESTAMP").version(i + ".0.0").build();
+            namingServiceTemplate = databaseProvider.getFilteredPolicies(policyFilter);
+            assertEquals(i + ".0.0", namingServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0).values()
+                    .iterator().next().getVersion());
+        }
+
+        ToscaTypedEntityFilter<ToscaPolicy> policyFilter = ToscaTypedEntityFilter.<ToscaPolicy>builder()
+                .name("SDNC_Policy.ONAP_NF_NAMING_TIMESTAMP").version(ToscaTypedEntityFilter.LATEST_VERSION).build();
+        ToscaServiceTemplate namingServiceTemplate = databaseProvider.getFilteredPolicies(policyFilter);
+        assertEquals("21.0.0", namingServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0).values().iterator()
+                .next().getVersion());
+
+        for (int i = 1; i < 22; i++) {
+            ToscaServiceTemplate deletedServiceTemplate =
+                    databaseProvider.deletePolicy("SDNC_Policy.ONAP_NF_NAMING_TIMESTAMP", i + ".0.0");
+            assertEquals(1, deletedServiceTemplate.getToscaTopologyTemplate().getPoliciesAsMap().size());
+        }
     }
 
     /**
      * Check persistence of a policy.
      *
-     * @param policyString the policy as a string
+     * @param serviceTemplate the service template containing the policy
      * @throws Exception any exception thrown
      */
-    public void testJsonStringPolicyPersistence(@NonNull final String policyString) throws Exception {
-        ToscaServiceTemplate serviceTemplate = standardCoder.decode(policyString, ToscaServiceTemplate.class);
-
+    public void testPolicyPersistence(@NonNull final ToscaServiceTemplate serviceTemplate) throws Exception {
         assertNotNull(serviceTemplate);
 
-        databaseProvider.createPolicies(serviceTemplate);
+        CountDownLatch threadCountDownLatch = new CountDownLatch(10);
+
+        for (int i = 0; i < 10; i++) {
+            new Thread() {
+                @Override
+                public void run() {
+                    assertThatCode(() -> databaseProvider.createPolicies(serviceTemplate)).doesNotThrowAnyException();
+                    assertThatCode(() -> databaseProvider.updatePolicies(serviceTemplate)).doesNotThrowAnyException();
+                    threadCountDownLatch.countDown();
+                }
+            }.start();
+        }
+
+        threadCountDownLatch.await(10, TimeUnit.SECONDS);
+
+        for (Map<String, ToscaPolicy> policyMap : serviceTemplate.getToscaTopologyTemplate().getPolicies()) {
+            for (ToscaPolicy policy : policyMap.values()) {
+                ToscaServiceTemplate gotToscaServiceTemplate =
+                        databaseProvider.getPolicies(policy.getName(), policy.getVersion());
+
+                assertEquals(policy.getType(), gotToscaServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0)
+                        .get(policy.getName()).getType());
+
+                gotToscaServiceTemplate =
+                        databaseProvider.getFilteredPolicies(ToscaTypedEntityFilter.<ToscaPolicy>builder().build());
+
+                assertEquals(policy.getType(),
+                        getToscaPolicyFromMapList(gotToscaServiceTemplate.getToscaTopologyTemplate().getPolicies(),
+                                policy.getName()).getType());
+
+                gotToscaServiceTemplate = databaseProvider.getFilteredPolicies(ToscaTypedEntityFilter
+                        .<ToscaPolicy>builder().name(policy.getName()).version(policy.getVersion()).build());
+
+                assertEquals(policy.getType(), gotToscaServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0)
+                        .get(policy.getName()).getType());
+            }
+        }
+    }
+
+    private ToscaPolicy getToscaPolicyFromMapList(List<Map<String, ToscaPolicy>> toscaPolicyMapList,
+            String policyName) {
+        ToscaPolicy toscaPolicy = new ToscaPolicy();
+        for (Map<String, ToscaPolicy> policyMap : toscaPolicyMapList) {
+            toscaPolicy = policyMap.get(policyName);
+            if (toscaPolicy != null) {
+                break;
+            }
+        }
+        return toscaPolicy;
+    }
+
+    private void createPolicyTypes() throws CoderException, PfModelException, URISyntaxException {
+        Set<String> policyTypeResources = ResourceUtils.getDirectoryContents("policytypes");
+
+        for (String policyTypeResource : policyTypeResources) {
+            String policyTypeYamlString = ResourceUtils.getResourceAsString(policyTypeResource);
+            ToscaServiceTemplate toscaServiceTemplatePolicyType =
+                    yamlJsonTranslator.fromYaml(policyTypeYamlString, ToscaServiceTemplate.class);
 
-        for (String policyKey : serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).keySet()) {
-            ToscaPolicy incomingPolicy = serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).get(policyKey);
-            ToscaPolicy databasePolicy =
-                    databaseProvider.getPolicies(incomingPolicy.getName(), incomingPolicy.getVersion())
-                            .getToscaTopologyTemplate().getPolicies().get(0).get(policyKey);
-            assertEquals(incomingPolicy.getType(), databasePolicy.getType());
+            assertNotNull(toscaServiceTemplatePolicyType);
+            databaseProvider.createPolicyTypes(toscaServiceTemplatePolicyType);
         }
     }
 }