Merge "Fix sonar issues for tests in policy-models"
[policy/models.git] / models-provider / src / test / java / org / onap / policy / models / provider / impl / PolicyToscaPersistenceTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2019-2021 Nordix Foundation.
4  *  Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
5  * ================================================================================
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  * SPDX-License-Identifier: Apache-2.0
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.policy.models.provider.impl;
23
24 import static org.assertj.core.api.Assertions.assertThatCode;
25 import static org.junit.Assert.assertEquals;
26 import static org.junit.Assert.assertNotNull;
27
28 import java.net.URISyntaxException;
29 import java.util.LinkedHashMap;
30 import java.util.List;
31 import java.util.Map;
32 import java.util.Set;
33 import java.util.concurrent.CountDownLatch;
34 import java.util.concurrent.TimeUnit;
35 import lombok.NonNull;
36 import org.junit.After;
37 import org.junit.Before;
38 import org.junit.Test;
39 import org.onap.policy.common.utils.coder.CoderException;
40 import org.onap.policy.common.utils.coder.StandardCoder;
41 import org.onap.policy.common.utils.coder.YamlJsonTranslator;
42 import org.onap.policy.common.utils.resources.ResourceUtils;
43 import org.onap.policy.models.base.PfModelException;
44 import org.onap.policy.models.provider.PolicyModelsProvider;
45 import org.onap.policy.models.provider.PolicyModelsProviderFactory;
46 import org.onap.policy.models.provider.PolicyModelsProviderParameters;
47 import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityFilter;
48 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
49 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType;
50 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
51 import org.onap.policy.models.tosca.authorative.concepts.ToscaTypedEntityFilter;
52 import org.slf4j.Logger;
53 import org.slf4j.LoggerFactory;
54
55 /**
56  * Test persistence of monitoring policies to and from the database.
57  *
58  * @author Liam Fallon (liam.fallon@est.tech)
59  */
60 public class PolicyToscaPersistenceTest {
61     private static final Logger LOGGER = LoggerFactory.getLogger(PolicyToscaPersistenceTest.class);
62
63     private YamlJsonTranslator yamlJsonTranslator = new YamlJsonTranslator();
64     private StandardCoder standardCoder = new StandardCoder();
65
66     private PolicyModelsProvider databaseProvider;
67
68     /**
69      * Initialize provider.
70      *
71      * @throws PfModelException on exceptions in the tests
72      * @throws CoderException on JSON encoding and decoding errors
73      */
74     @Before
75     public void setupParameters() throws Exception {
76         // H2, use "org.mariadb.jdbc.Driver" and "jdbc:mariadb://localhost:3306/policy" for locally installed MariaDB
77
78         PolicyModelsProviderParameters parameters = new PolicyModelsProviderParameters();
79
80         if (System.getProperty("USE-MARIADB") != null) {
81             parameters.setDatabaseDriver("org.mariadb.jdbc.Driver");
82             parameters.setDatabaseUrl("jdbc:mariadb://localhost:3306/policy");
83         } else {
84             parameters.setDatabaseDriver("org.h2.Driver");
85             parameters.setDatabaseUrl("jdbc:h2:mem:testdb");
86         }
87
88         parameters.setDatabaseUser("policy");
89         parameters.setDatabasePassword("P01icY");
90         parameters.setPersistenceUnit("ToscaConceptTest");
91
92
93         databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
94
95         createPolicyTypes();
96     }
97
98     @After
99     public void teardown() throws Exception {
100         databaseProvider.close();
101     }
102
103     @Test
104     public void testToscaPolicyPersistence() throws Exception {
105         Set<String> policyResources = ResourceUtils.getDirectoryContents("policies");
106
107         for (String policyResource : policyResources) {
108             if (!policyResource.contains("\\.tosca\\.")) {
109                 continue;
110             }
111
112             String policyString = ResourceUtils.getResourceAsString(policyResource);
113
114             if (policyResource.endsWith("yaml")) {
115                 testPolicyPersistence(yamlJsonTranslator.fromYaml(policyString, ToscaServiceTemplate.class));
116             } else {
117                 testPolicyPersistence(standardCoder.decode(policyString, ToscaServiceTemplate.class));
118             }
119         }
120     }
121
122     @Test
123     public void testHpaPolicyTypeGet() throws PfModelException {
124         long getStartTime = System.currentTimeMillis();
125         ToscaServiceTemplate hpaServiceTemplate =
126                 databaseProvider.getPolicyTypes("onap.policies.optimization.resource.HpaPolicy", "1.0.0");
127         LOGGER.trace("HPA policy normal get time (ms): {}", System.currentTimeMillis() - getStartTime);
128
129         assertEquals(3, hpaServiceTemplate.getPolicyTypesAsMap().size());
130         assertEquals(5, hpaServiceTemplate.getDataTypesAsMap().size());
131
132         getStartTime = System.currentTimeMillis();
133         ToscaEntityFilter<ToscaPolicyType> hpaFilter = ToscaEntityFilter.<ToscaPolicyType>builder()
134                 .name("onap.policies.optimization.resource.HpaPolicy").version("1.0.0").build();
135         hpaServiceTemplate = databaseProvider.getFilteredPolicyTypes(hpaFilter);
136         LOGGER.trace("HPA policy filter name version get time (ms): {}", System.currentTimeMillis() - getStartTime);
137
138         assertEquals(3, hpaServiceTemplate.getPolicyTypesAsMap().size());
139         assertEquals(5, hpaServiceTemplate.getDataTypesAsMap().size());
140
141         getStartTime = System.currentTimeMillis();
142         hpaFilter = ToscaEntityFilter.<ToscaPolicyType>builder().name("onap.policies.optimization.resource.HpaPolicy")
143                 .build();
144         hpaServiceTemplate = databaseProvider.getFilteredPolicyTypes(hpaFilter);
145         LOGGER.trace("HPA policy filter name only get time (ms): {}", System.currentTimeMillis() - getStartTime);
146
147         assertEquals(3, hpaServiceTemplate.getPolicyTypesAsMap().size());
148         assertEquals(5, hpaServiceTemplate.getDataTypesAsMap().size());
149     }
150
151     @Test
152     public void testNamingPolicyGet() throws PfModelException {
153         String policyYamlString = ResourceUtils.getResourceAsString("policies/sdnc.policy.naming.input.tosca.yaml");
154         ToscaServiceTemplate serviceTemplate =
155                 yamlJsonTranslator.fromYaml(policyYamlString, ToscaServiceTemplate.class);
156
157         long createStartTime = System.currentTimeMillis();
158         databaseProvider.createPolicies(serviceTemplate);
159         LOGGER.trace("Naming policy create time (ms): {}", System.currentTimeMillis() - createStartTime);
160
161         long getStartTime = System.currentTimeMillis();
162         ToscaServiceTemplate namingServiceTemplate =
163                 databaseProvider.getPolicies("SDNC_Policy.ONAP_NF_NAMING_TIMESTAMP", "1.0.0");
164         LOGGER.trace("Naming policy normal get time (ms): {}", System.currentTimeMillis() - getStartTime);
165
166         assertEquals(1, namingServiceTemplate.getToscaTopologyTemplate().getPoliciesAsMap().size());
167         assertEquals(1, namingServiceTemplate.getPolicyTypesAsMap().size());
168         assertEquals(3, namingServiceTemplate.getDataTypesAsMap().size());
169
170         getStartTime = System.currentTimeMillis();
171         ToscaTypedEntityFilter<ToscaPolicy> filter = ToscaTypedEntityFilter.<ToscaPolicy>builder()
172                 .name("SDNC_Policy.ONAP_NF_NAMING_TIMESTAMP").version("1.0.0").build();
173         namingServiceTemplate = databaseProvider.getFilteredPolicies(filter);
174         LOGGER.trace("Naming policy filtered get time (ms): {}", System.currentTimeMillis() - getStartTime);
175
176         assertEquals(1, namingServiceTemplate.getToscaTopologyTemplate().getPoliciesAsMap().size());
177         assertEquals(1, namingServiceTemplate.getPolicyTypesAsMap().size());
178         assertEquals(3, namingServiceTemplate.getDataTypesAsMap().size());
179
180         getStartTime = System.currentTimeMillis();
181         filter = ToscaTypedEntityFilter.<ToscaPolicy>builder().name("SDNC_Policy.ONAP_NF_NAMING_TIMESTAMP").build();
182         namingServiceTemplate = databaseProvider.getFilteredPolicies(filter);
183         LOGGER.trace("Naming policy filtered name only get time (ms): {}", System.currentTimeMillis() - getStartTime);
184
185         assertEquals(1, namingServiceTemplate.getToscaTopologyTemplate().getPoliciesAsMap().size());
186         assertEquals(1, namingServiceTemplate.getPolicyTypesAsMap().size());
187         assertEquals(3, namingServiceTemplate.getDataTypesAsMap().size());
188
189         long deleteStartTime = System.currentTimeMillis();
190         ToscaServiceTemplate deletedServiceTemplate =
191                 databaseProvider.deletePolicy("SDNC_Policy.ONAP_NF_NAMING_TIMESTAMP", "1.0.0");
192         LOGGER.trace("Naming policy delete time (ms): {}", System.currentTimeMillis() - deleteStartTime);
193
194         assertEquals(1, deletedServiceTemplate.getToscaTopologyTemplate().getPoliciesAsMap().size());
195     }
196
197     @Test
198     public void testNamingPolicyVersions() throws PfModelException {
199         String policyYamlString = ResourceUtils.getResourceAsString("policies/sdnc.policy.naming.input.tosca.yaml");
200         ToscaServiceTemplate serviceTemplate =
201                 yamlJsonTranslator.fromYaml(policyYamlString, ToscaServiceTemplate.class);
202
203         // Create policy types and data types
204         List<Map<String, ToscaPolicy>> policyMapList = serviceTemplate.getToscaTopologyTemplate().getPolicies();
205         databaseProvider.createPolicies(serviceTemplate);
206
207         // Clear the policy map list so we start from afresh with versions
208         ToscaPolicy namingPolicy = policyMapList.get(0).values().iterator().next();
209         policyMapList.clear();
210
211         // Create 21 more versions of the policy
212         for (int i = 2; i < 22; i++) {
213             ToscaPolicy clonedNamingPolicy = new ToscaPolicy(namingPolicy);
214             clonedNamingPolicy.setVersion(i + ".0.0");
215             Map<String, ToscaPolicy> policyMap = new LinkedHashMap<>(1);
216             policyMap.put(clonedNamingPolicy.getName(), clonedNamingPolicy);
217             policyMapList.add(policyMap);
218         }
219
220         databaseProvider.createPolicies(serviceTemplate);
221
222         for (int i = 1; i < 22; i++) {
223             ToscaServiceTemplate namingServiceTemplate =
224                     databaseProvider.getPolicies("SDNC_Policy.ONAP_NF_NAMING_TIMESTAMP", i + ".0.0");
225             assertEquals(i + ".0.0", namingServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0).values()
226                     .iterator().next().getVersion());
227
228             ToscaTypedEntityFilter<ToscaPolicy> policyFilter = ToscaTypedEntityFilter.<ToscaPolicy>builder()
229                     .name("SDNC_Policy.ONAP_NF_NAMING_TIMESTAMP").version(i + ".0.0").build();
230             namingServiceTemplate = databaseProvider.getFilteredPolicies(policyFilter);
231             assertEquals(i + ".0.0", namingServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0).values()
232                     .iterator().next().getVersion());
233         }
234
235         ToscaTypedEntityFilter<ToscaPolicy> policyFilter = ToscaTypedEntityFilter.<ToscaPolicy>builder()
236                 .name("SDNC_Policy.ONAP_NF_NAMING_TIMESTAMP").version(ToscaTypedEntityFilter.LATEST_VERSION).build();
237         ToscaServiceTemplate namingServiceTemplate = databaseProvider.getFilteredPolicies(policyFilter);
238         assertEquals("21.0.0", namingServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0).values().iterator()
239                 .next().getVersion());
240
241         for (int i = 1; i < 22; i++) {
242             ToscaServiceTemplate deletedServiceTemplate =
243                     databaseProvider.deletePolicy("SDNC_Policy.ONAP_NF_NAMING_TIMESTAMP", i + ".0.0");
244             assertEquals(1, deletedServiceTemplate.getToscaTopologyTemplate().getPoliciesAsMap().size());
245         }
246     }
247
248     /**
249      * Check persistence of a policy.
250      *
251      * @param serviceTemplate the service template containing the policy
252      * @throws Exception any exception thrown
253      */
254     public void testPolicyPersistence(@NonNull final ToscaServiceTemplate serviceTemplate) throws Exception {
255         assertNotNull(serviceTemplate);
256
257         CountDownLatch threadCountDownLatch = new CountDownLatch(10);
258
259         for (int i = 0; i < 10; i++) {
260             new Thread() {
261                 @Override
262                 public void run() {
263                     assertThatCode(() -> databaseProvider.createPolicies(serviceTemplate)).doesNotThrowAnyException();
264                     assertThatCode(() -> databaseProvider.updatePolicies(serviceTemplate)).doesNotThrowAnyException();
265                     threadCountDownLatch.countDown();
266                 }
267             }.start();
268         }
269
270         threadCountDownLatch.await(10, TimeUnit.SECONDS);
271
272         for (Map<String, ToscaPolicy> policyMap : serviceTemplate.getToscaTopologyTemplate().getPolicies()) {
273             for (ToscaPolicy policy : policyMap.values()) {
274                 ToscaServiceTemplate gotToscaServiceTemplate =
275                         databaseProvider.getPolicies(policy.getName(), policy.getVersion());
276
277                 assertEquals(policy.getType(), gotToscaServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0)
278                         .get(policy.getName()).getType());
279
280                 gotToscaServiceTemplate =
281                         databaseProvider.getFilteredPolicies(ToscaTypedEntityFilter.<ToscaPolicy>builder().build());
282
283                 assertEquals(policy.getType(),
284                         getToscaPolicyFromMapList(gotToscaServiceTemplate.getToscaTopologyTemplate().getPolicies(),
285                                 policy.getName()).getType());
286
287                 gotToscaServiceTemplate = databaseProvider.getFilteredPolicies(ToscaTypedEntityFilter
288                         .<ToscaPolicy>builder().name(policy.getName()).version(policy.getVersion()).build());
289
290                 assertEquals(policy.getType(), gotToscaServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0)
291                         .get(policy.getName()).getType());
292             }
293         }
294     }
295
296     private ToscaPolicy getToscaPolicyFromMapList(List<Map<String, ToscaPolicy>> toscaPolicyMapList,
297             String policyName) {
298         ToscaPolicy toscaPolicy = new ToscaPolicy();
299         for (Map<String, ToscaPolicy> policyMap : toscaPolicyMapList) {
300             toscaPolicy = policyMap.get(policyName);
301             if (toscaPolicy != null) {
302                 break;
303             }
304         }
305         return toscaPolicy;
306     }
307
308     private void createPolicyTypes() throws CoderException, PfModelException, URISyntaxException {
309         Set<String> policyTypeResources = ResourceUtils.getDirectoryContents("policytypes");
310
311         for (String policyTypeResource : policyTypeResources) {
312             String policyTypeYamlString = ResourceUtils.getResourceAsString(policyTypeResource);
313             ToscaServiceTemplate toscaServiceTemplatePolicyType =
314                     yamlJsonTranslator.fromYaml(policyTypeYamlString, ToscaServiceTemplate.class);
315
316             assertNotNull(toscaServiceTemplatePolicyType);
317             databaseProvider.createPolicyTypes(toscaServiceTemplatePolicyType);
318         }
319     }
320 }