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