X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=models-provider%2Fsrc%2Ftest%2Fjava%2Forg%2Fonap%2Fpolicy%2Fmodels%2Fprovider%2Fimpl%2FPolicyToscaPersistenceTest.java;h=1f9931678ff92cb347d5bed29aa91de79257c599;hb=e53df8d3f8ab0464b0876bdb339fa91dc9085cd2;hp=613c5a2c698c6368459e9196fcceb1886e62b18b;hpb=d010fb918de5215fd5ff9219041ea11c77a4059a;p=policy%2Fmodels.git diff --git a/models-provider/src/test/java/org/onap/policy/models/provider/impl/PolicyToscaPersistenceTest.java b/models-provider/src/test/java/org/onap/policy/models/provider/impl/PolicyToscaPersistenceTest.java index 613c5a2c6..1f9931678 100644 --- a/models-provider/src/test/java/org/onap/policy/models/provider/impl/PolicyToscaPersistenceTest.java +++ b/models-provider/src/test/java/org/onap/policy/models/provider/impl/PolicyToscaPersistenceTest.java @@ -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. @@ -20,30 +22,36 @@ 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 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 hpaFilter = ToscaEntityFilter.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.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 filter = ToscaTypedEntityFilter.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.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> 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 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 policyFilter = ToscaTypedEntityFilter.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 policyFilter = ToscaTypedEntityFilter.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 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.builder().build()); + + assertEquals(policy.getType(), + getToscaPolicyFromMapList(gotToscaServiceTemplate.getToscaTopologyTemplate().getPolicies(), + policy.getName()).getType()); + + gotToscaServiceTemplate = databaseProvider.getFilteredPolicies(ToscaTypedEntityFilter + .builder().name(policy.getName()).version(policy.getVersion()).build()); + + assertEquals(policy.getType(), gotToscaServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0) + .get(policy.getName()).getType()); + } + } + } + + private ToscaPolicy getToscaPolicyFromMapList(List> toscaPolicyMapList, + String policyName) { + ToscaPolicy toscaPolicy = new ToscaPolicy(); + for (Map policyMap : toscaPolicyMapList) { + toscaPolicy = policyMap.get(policyName); + if (toscaPolicy != null) { + break; + } + } + return toscaPolicy; + } + + private void createPolicyTypes() throws CoderException, PfModelException, URISyntaxException { + Set 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); } } }