Fix cascaded get filtering and speed
[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.junit.Assert.assertEquals;
24 import static org.junit.Assert.assertNotNull;
25
26 import java.net.URISyntaxException;
27 import java.util.Base64;
28 import java.util.List;
29 import java.util.Map;
30 import java.util.Set;
31
32 import lombok.NonNull;
33
34 import org.junit.After;
35 import org.junit.Before;
36 import org.junit.Test;
37 import org.onap.policy.common.utils.coder.CoderException;
38 import org.onap.policy.common.utils.coder.StandardCoder;
39 import org.onap.policy.common.utils.coder.YamlJsonTranslator;
40 import org.onap.policy.common.utils.resources.ResourceUtils;
41 import org.onap.policy.models.base.PfModelException;
42 import org.onap.policy.models.provider.PolicyModelsProvider;
43 import org.onap.policy.models.provider.PolicyModelsProviderFactory;
44 import org.onap.policy.models.provider.PolicyModelsProviderParameters;
45 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
46 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyFilter;
47 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeFilter;
48 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
49 import org.slf4j.Logger;
50 import org.slf4j.LoggerFactory;
51
52 /**
53  * Test persistence of monitoring policies to and from the database.
54  *
55  * @author Liam Fallon (liam.fallon@est.tech)
56  */
57 public class PolicyToscaPersistenceTest {
58     private static final Logger LOGGER = LoggerFactory.getLogger(PolicyToscaPersistenceTest.class);
59
60     private YamlJsonTranslator yamlJsonTranslator = new YamlJsonTranslator();
61     private StandardCoder standardCoder = new StandardCoder();
62
63     private PolicyModelsProvider databaseProvider;
64
65     /**
66      * Initialize provider.
67      *
68      * @throws PfModelException on exceptions in the tests
69      * @throws CoderException on JSON encoding and decoding errors
70      */
71     @Before
72     public void setupParameters() throws Exception {
73         // H2, use "org.mariadb.jdbc.Driver" and "jdbc:mariadb://localhost:3306/policy" for locally installed MariaDB
74
75         PolicyModelsProviderParameters parameters = new PolicyModelsProviderParameters();
76         parameters.setDatabaseDriver("org.h2.Driver");
77         parameters.setDatabaseUrl("jdbc:h2:mem:testdb");
78         parameters.setDatabaseUser("policy");
79         parameters.setDatabasePassword(Base64.getEncoder().encodeToString("P01icY".getBytes()));
80         parameters.setPersistenceUnit("ToscaConceptTest");
81
82         databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
83
84         createPolicyTypes();
85     }
86
87     @After
88     public void teardown() throws Exception {
89         databaseProvider.close();
90     }
91
92     @Test
93     public void testToscaPolicyPersistence() throws Exception {
94         Set<String> policyResources = ResourceUtils.getDirectoryContents("policies");
95
96         for (String policyResource : policyResources) {
97             if (!policyResource.contains("\\.tosca\\.")) {
98                 continue;
99             }
100
101             String policyString = ResourceUtils.getResourceAsString(policyResource);
102
103             if (policyResource.endsWith("yaml")) {
104                 testPolicyPersistence(yamlJsonTranslator.fromYaml(policyString, ToscaServiceTemplate.class));
105             } else {
106                 testPolicyPersistence(standardCoder.decode(policyString, ToscaServiceTemplate.class));
107             }
108         }
109     }
110
111     @Test
112     public void testHpaPolicyTypeGet() throws PfModelException {
113         long getStartTime = System.currentTimeMillis();
114         ToscaServiceTemplate hpaServiceTemplate =
115                 databaseProvider.getPolicyTypes("onap.policies.optimization.resource.HpaPolicy", "1.0.0");
116         LOGGER.trace("HPA policy normal get time (ms): {}", System.currentTimeMillis() - getStartTime);
117
118         assertEquals(3, hpaServiceTemplate.getPolicyTypesAsMap().size());
119         assertEquals(5, hpaServiceTemplate.getDataTypesAsMap().size());
120
121         getStartTime = System.currentTimeMillis();
122         ToscaPolicyTypeFilter hpaFilter = ToscaPolicyTypeFilter.builder()
123                 .name("onap.policies.optimization.resource.HpaPolicy").version("1.0.0").build();
124         hpaServiceTemplate = databaseProvider.getFilteredPolicyTypes(hpaFilter);
125         LOGGER.trace("HPA policy filter name version get time (ms): {}", System.currentTimeMillis() - getStartTime);
126
127         assertEquals(3, hpaServiceTemplate.getPolicyTypesAsMap().size());
128         assertEquals(5, hpaServiceTemplate.getDataTypesAsMap().size());
129
130         getStartTime = System.currentTimeMillis();
131         hpaFilter = ToscaPolicyTypeFilter.builder().name("onap.policies.optimization.resource.HpaPolicy").build();
132         hpaServiceTemplate = databaseProvider.getFilteredPolicyTypes(hpaFilter);
133         LOGGER.trace("HPA policy filter name only get time (ms): {}", System.currentTimeMillis() - getStartTime);
134
135         assertEquals(3, hpaServiceTemplate.getPolicyTypesAsMap().size());
136         assertEquals(5, hpaServiceTemplate.getDataTypesAsMap().size());
137     }
138
139     @Test
140     public void testNamingPolicyGet() throws PfModelException {
141         String policyYamlString = ResourceUtils.getResourceAsString("policies/sdnc.policy.naming.input.tosca.yaml");
142         ToscaServiceTemplate serviceTemplate =
143                 yamlJsonTranslator.fromYaml(policyYamlString, ToscaServiceTemplate.class);
144
145         long createStartTime = System.currentTimeMillis();
146         databaseProvider.createPolicies(serviceTemplate);
147         LOGGER.trace("Naming policy create time (ms): {}", System.currentTimeMillis() - createStartTime);
148
149         long getStartTime = System.currentTimeMillis();
150         ToscaServiceTemplate namingServiceTemplate =
151                 databaseProvider.getPolicies("SDNC_Policy.ONAP_VNF_NAMING_TIMESTAMP", "1.0.0");
152         LOGGER.trace("Naming policy normal get time (ms): {}", System.currentTimeMillis() - getStartTime);
153
154         assertEquals(1, namingServiceTemplate.getToscaTopologyTemplate().getPoliciesAsMap().size());
155         assertEquals(1, namingServiceTemplate.getPolicyTypesAsMap().size());
156         assertEquals(3, namingServiceTemplate.getDataTypesAsMap().size());
157
158         getStartTime = System.currentTimeMillis();
159         ToscaPolicyFilter filter =
160                 ToscaPolicyFilter.builder().name("SDNC_Policy.ONAP_VNF_NAMING_TIMESTAMP").version("1.0.0").build();
161         namingServiceTemplate = databaseProvider.getFilteredPolicies(filter);
162         LOGGER.trace("Naming policy filtered get time (ms): {}", System.currentTimeMillis() - getStartTime);
163
164         assertEquals(1, namingServiceTemplate.getToscaTopologyTemplate().getPoliciesAsMap().size());
165         assertEquals(1, namingServiceTemplate.getPolicyTypesAsMap().size());
166         assertEquals(3, namingServiceTemplate.getDataTypesAsMap().size());
167
168         getStartTime = System.currentTimeMillis();
169         filter = ToscaPolicyFilter.builder().name("SDNC_Policy.ONAP_VNF_NAMING_TIMESTAMP").build();
170         namingServiceTemplate = databaseProvider.getFilteredPolicies(filter);
171         LOGGER.trace("Naming policy filtered name only get time (ms): {}", System.currentTimeMillis() - getStartTime);
172
173         assertEquals(1, namingServiceTemplate.getToscaTopologyTemplate().getPoliciesAsMap().size());
174         assertEquals(1, namingServiceTemplate.getPolicyTypesAsMap().size());
175         assertEquals(3, namingServiceTemplate.getDataTypesAsMap().size());
176
177         long deleteStartTime = System.currentTimeMillis();
178         databaseProvider.deletePolicy("SDNC_Policy.ONAP_VNF_NAMING_TIMESTAMP", "1.0.0");
179         LOGGER.trace("Naming policy delete time (ms): {}", System.currentTimeMillis() - deleteStartTime);
180     }
181
182     /**
183      * Check persistence of a policy.
184      *
185      * @param serviceTemplate the service template containing the policy
186      * @throws Exception any exception thrown
187      */
188     public void testPolicyPersistence(@NonNull final ToscaServiceTemplate serviceTemplate) throws Exception {
189         assertNotNull(serviceTemplate);
190
191         databaseProvider.createPolicies(serviceTemplate);
192         databaseProvider.updatePolicies(serviceTemplate);
193
194         for (Map<String, ToscaPolicy> policyMap : serviceTemplate.getToscaTopologyTemplate().getPolicies()) {
195             for (ToscaPolicy policy : policyMap.values()) {
196                 ToscaServiceTemplate gotToscaServiceTemplate =
197                         databaseProvider.getPolicies(policy.getName(), policy.getVersion());
198
199                 assertEquals(policy.getType(), gotToscaServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0)
200                         .get(policy.getName()).getType());
201
202                 gotToscaServiceTemplate = databaseProvider.getFilteredPolicies(ToscaPolicyFilter.builder().build());
203
204                 assertEquals(policy.getType(),
205                         getToscaPolicyFromMapList(gotToscaServiceTemplate.getToscaTopologyTemplate().getPolicies(),
206                                 policy.getName()).getType());
207
208                 gotToscaServiceTemplate = databaseProvider.getFilteredPolicies(
209                         ToscaPolicyFilter.builder().name(policy.getName()).version(policy.getVersion()).build());
210
211                 assertEquals(policy.getType(), gotToscaServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0)
212                         .get(policy.getName()).getType());
213             }
214         }
215     }
216
217     private ToscaPolicy getToscaPolicyFromMapList(List<Map<String, ToscaPolicy>> toscaPolicyMapList,
218             String policyName) {
219         ToscaPolicy toscaPolicy = new ToscaPolicy();
220         for (Map<String, ToscaPolicy> policyMap : toscaPolicyMapList) {
221             toscaPolicy = policyMap.get(policyName);
222             if (toscaPolicy != null) {
223                 break;
224             }
225         }
226         return toscaPolicy;
227     }
228
229     private void createPolicyTypes() throws CoderException, PfModelException, URISyntaxException {
230         Set<String> policyTypeResources = ResourceUtils.getDirectoryContents("policytypes");
231
232         for (String policyTypeResource : policyTypeResources) {
233             String policyTypeYamlString = ResourceUtils.getResourceAsString(policyTypeResource);
234             ToscaServiceTemplate toscaServiceTemplatePolicyType =
235                     yamlJsonTranslator.fromYaml(policyTypeYamlString, ToscaServiceTemplate.class);
236
237             assertNotNull(toscaServiceTemplatePolicyType);
238             databaseProvider.createPolicyTypes(toscaServiceTemplatePolicyType);
239         }
240     }
241 }