Replace Eclipselink with Hibernate
[policy/models.git] / models-provider / src / test / java / org / onap / policy / models / provider / impl / DatabasePolicyModelsProviderTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2019-2023 Nordix Foundation.
4  *  Modifications Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved.
5  *  Modifications Copyright (C) 2020, 2022 Bell Canada. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  * SPDX-License-Identifier: Apache-2.0
20  * ============LICENSE_END=========================================================
21  */
22
23 package org.onap.policy.models.provider.impl;
24
25 import static org.assertj.core.api.Assertions.assertThatThrownBy;
26 import static org.junit.Assert.assertEquals;
27 import static org.junit.Assert.assertNotNull;
28 import static org.junit.Assert.assertTrue;
29
30 import java.util.ArrayList;
31 import java.util.List;
32 import java.util.Map;
33 import org.junit.After;
34 import org.junit.Before;
35 import org.junit.Test;
36 import org.onap.policy.models.base.PfModelException;
37 import org.onap.policy.models.pdp.concepts.Pdp;
38 import org.onap.policy.models.pdp.concepts.PdpGroup;
39 import org.onap.policy.models.pdp.concepts.PdpGroupFilter;
40 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
41 import org.onap.policy.models.pdp.enums.PdpHealthStatus;
42 import org.onap.policy.models.pdp.enums.PdpState;
43 import org.onap.policy.models.provider.PolicyModelsProvider;
44 import org.onap.policy.models.provider.PolicyModelsProviderFactory;
45 import org.onap.policy.models.provider.PolicyModelsProviderParameters;
46 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
47 import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityFilter;
48 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
49 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeType;
50 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
51 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType;
52 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
53 import org.onap.policy.models.tosca.authorative.concepts.ToscaTopologyTemplate;
54 import org.onap.policy.models.tosca.authorative.concepts.ToscaTypedEntityFilter;
55
56 /**
57  * Test the database models provider implementation.
58  *
59  * @author Liam Fallon (liam.fallon@est.tech)
60  */
61 public class DatabasePolicyModelsProviderTest {
62     private static final String NAME = "name";
63
64     private static final String TEMPLATE_IS_NULL = "^serviceTemplate is marked .*on.*ull but is null$";
65
66     private static final String SUBGROUP_IS_NULL = "^pdpSubGroup is marked .*on.*ull but is null$";
67
68     private static final String GROUP_IS_NULL = "^pdpGroupName is marked .*on.*ull but is null$";
69
70     private static final String NAME_IS_NULL = "^name is marked .*on.*ull but is null$";
71
72     private static final String FILTER_IS_NULL = "^filter is marked .*on.*ull but is null$";
73
74     private static final String GROUP = "group";
75
76     private static final String VERSION_100 = "1.0.0";
77
78     private PolicyModelsProviderParameters parameters;
79
80     private PolicyModelsProvider databaseProvider;
81
82     /**
83      * Initialize parameters.
84      */
85     @Before
86     public void setupParameters() {
87         parameters = new PolicyModelsProviderParameters();
88         parameters.setDatabaseDriver("org.h2.Driver");
89         parameters.setDatabaseUrl("jdbc:h2:mem:DatabasePolicyModelsProviderTest");
90         parameters.setDatabaseUser("policy");
91         parameters.setDatabasePassword("P01icY");
92         parameters.setPersistenceUnit("ToscaConceptTest");
93         parameters.setDatabaseType("org.hibernate.dialect.H2Dialect");
94     }
95
96     /**
97      * Closes the DB.
98      */
99     @After
100     public void tearDown() throws PfModelException {
101         if (databaseProvider != null) {
102             databaseProvider.close();
103         }
104     }
105
106     @Test
107     public void testInitAndClose() throws Exception {
108         assertThatThrownBy(() -> {
109             new DatabasePolicyModelsProviderImpl(null);
110         }).hasMessageMatching("^parameters is marked .*on.*ull but is null$");
111
112         databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
113
114         final String savedDatabaseUrl = parameters.getDatabaseUrl();
115         parameters.setDatabaseUrl("jdbc://www.acmecorp.nonexist");
116
117         databaseProvider.close();
118         assertThatThrownBy(() -> {
119             databaseProvider.init();
120         }).hasMessageContaining("could not create Data Access Object (DAO)");
121
122         databaseProvider.close();
123
124         parameters.setDatabaseUrl(savedDatabaseUrl);
125
126         final String savedPersistenceUnit = parameters.getPersistenceUnit();
127         parameters.setPersistenceUnit("WileECoyote");
128
129         assertThatThrownBy(databaseProvider::init).hasMessageContaining("could not create Data Access Object (DAO)");
130         parameters.setPersistenceUnit(savedPersistenceUnit);
131
132         databaseProvider.init();
133         databaseProvider.close();
134
135         assertThatThrownBy(() -> {
136             databaseProvider.init();
137             databaseProvider.init();
138         }).hasMessage("provider is already initialized");
139
140         databaseProvider.close();
141
142         databaseProvider.close();
143     }
144
145     @Test
146     public void testProviderMethodsNull() throws Exception {
147
148         databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
149
150         assertThatThrownBy(() -> {
151             databaseProvider.getFilteredPolicyTypes(null);
152         }).hasMessageMatching(FILTER_IS_NULL);
153
154         assertThatThrownBy(() -> {
155             databaseProvider.getFilteredPolicyTypeList(null);
156         }).hasMessageMatching(FILTER_IS_NULL);
157
158         assertThatThrownBy(() -> {
159             databaseProvider.createPolicyTypes(null);
160         }).hasMessageMatching(TEMPLATE_IS_NULL);
161
162         assertThatThrownBy(() -> {
163             databaseProvider.updatePolicyTypes(null);
164         }).hasMessageMatching(TEMPLATE_IS_NULL);
165
166         assertThatThrownBy(() -> {
167             databaseProvider.deletePolicyType(null, null);
168         }).hasMessageMatching(NAME_IS_NULL);
169
170         assertThatThrownBy(() -> {
171             databaseProvider.deletePolicyType("aaa", null);
172         }).hasMessageMatching("^version is marked .*on.*ull but is null$");
173
174         assertThatThrownBy(() -> {
175             databaseProvider.deletePolicyType(null, "aaa");
176         }).hasMessageMatching(NAME_IS_NULL);
177
178         assertThatThrownBy(() -> {
179             databaseProvider.getFilteredPolicies(null);
180         }).hasMessageMatching(FILTER_IS_NULL);
181
182         assertThatThrownBy(() -> {
183             databaseProvider.getFilteredPolicyList(null);
184         }).hasMessageMatching(FILTER_IS_NULL);
185
186         assertThatThrownBy(() -> {
187             databaseProvider.createPolicies(null);
188         }).hasMessageMatching(TEMPLATE_IS_NULL);
189
190         assertThatThrownBy(() -> {
191             databaseProvider.updatePolicies(null);
192         }).hasMessageMatching(TEMPLATE_IS_NULL);
193
194         assertThatThrownBy(() -> {
195             databaseProvider.deletePolicy(null, null);
196         }).hasMessageMatching(NAME_IS_NULL);
197
198         assertThatThrownBy(() -> {
199             databaseProvider.deletePolicy(null, "aaa");
200         }).hasMessageMatching(NAME_IS_NULL);
201
202         assertThatThrownBy(() -> {
203             databaseProvider.deletePolicy("aaa", null);
204         }).hasMessageMatching("^version is marked .*on.*ull but is null$");
205     }
206
207     @Test
208     public void testProviderMethodsNullGroup() throws Exception {
209
210         databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
211
212         assertThatThrownBy(() -> {
213             databaseProvider.getFilteredPdpGroups(null);
214         }).hasMessageMatching(FILTER_IS_NULL);
215
216         assertThatThrownBy(() -> {
217             databaseProvider.createPdpGroups(null);
218         }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
219
220         assertThatThrownBy(() -> {
221             databaseProvider.updatePdpGroups(null);
222         }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
223
224         assertThatThrownBy(() -> {
225             databaseProvider.updatePdpSubGroup(null, null);
226         }).hasMessageMatching(GROUP_IS_NULL);
227
228         assertThatThrownBy(() -> {
229             databaseProvider.updatePdpSubGroup(null, new PdpSubGroup());
230         }).hasMessageMatching(GROUP_IS_NULL);
231
232         assertThatThrownBy(() -> {
233             databaseProvider.updatePdpSubGroup(NAME, null);
234         }).hasMessageMatching(SUBGROUP_IS_NULL);
235
236         assertThatThrownBy(() -> {
237             databaseProvider.updatePdpSubGroup(NAME, new PdpSubGroup());
238         }).hasMessage("parameter \"localName\" is null");
239
240         assertThatThrownBy(() -> {
241             databaseProvider.updatePdp(null, null, null);
242         }).hasMessageMatching(GROUP_IS_NULL);
243
244         assertThatThrownBy(() -> {
245             databaseProvider.updatePdp(null, null, new Pdp());
246         }).hasMessageMatching(GROUP_IS_NULL);
247
248         assertThatThrownBy(() -> {
249             databaseProvider.updatePdp(null, "sub", null);
250         }).hasMessageMatching(GROUP_IS_NULL);
251
252         assertThatThrownBy(() -> {
253             databaseProvider.updatePdp(null, "sub", new Pdp());
254         }).hasMessageMatching(GROUP_IS_NULL);
255
256         assertThatThrownBy(() -> {
257             databaseProvider.updatePdp(NAME, null, null);
258         }).hasMessageMatching(SUBGROUP_IS_NULL);
259
260         assertThatThrownBy(() -> {
261             databaseProvider.updatePdp(NAME, null, new Pdp());
262         }).hasMessageMatching(SUBGROUP_IS_NULL);
263
264         assertThatThrownBy(() -> {
265             databaseProvider.updatePdp(NAME, "sub", null);
266         }).hasMessageMatching("^pdp is marked .*on.*ull but is null$");
267
268         assertThatThrownBy(() -> {
269             databaseProvider.updatePdp(NAME, "sub", new Pdp());
270         }).hasMessage("parameter \"localName\" is null");
271
272         assertThatThrownBy(() -> {
273             databaseProvider.deletePdpGroup(null);
274         }).hasMessageMatching(NAME_IS_NULL);
275
276         databaseProvider.close();
277     }
278
279     @Test
280     public void testProviderMethodsNotInit() throws Exception {
281         databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
282
283         databaseProvider.close();
284
285         assertThatThrownBy(() -> {
286             databaseProvider.getPolicyTypes(NAME, "version");
287         }).hasMessage("policy models provider is not initilaized");
288     }
289
290     @Test
291     public void testProviderMethods() throws PfModelException {
292         databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
293
294         assertThatThrownBy(() -> databaseProvider.getPolicyTypes(NAME, VERSION_100))
295                 .hasMessage("service template not found in database");
296
297         assertTrue(databaseProvider.getPolicyTypeList(NAME, VERSION_100).isEmpty());
298
299         assertThatThrownBy(
300             () -> databaseProvider.getFilteredPolicyTypes(ToscaEntityFilter.<ToscaPolicyType>builder().build()))
301                         .hasMessage("service template not found in database");
302
303         assertTrue(databaseProvider.getFilteredPolicyTypeList(ToscaEntityFilter.<ToscaPolicyType>builder().build())
304                 .isEmpty());
305
306         assertThatThrownBy(() -> {
307             databaseProvider.createPolicyTypes(new ToscaServiceTemplate());
308         }).hasMessage("no policy types specified on service template");
309
310         assertThatThrownBy(() -> {
311             databaseProvider.updatePolicyTypes(new ToscaServiceTemplate());
312         }).hasMessage("no policy types specified on service template");
313
314         assertThatThrownBy(() -> databaseProvider.deletePolicyType(NAME, VERSION_100))
315                 .hasMessage("service template not found in database");
316
317         assertThatThrownBy(() -> databaseProvider.getPolicies(NAME, VERSION_100))
318                 .hasMessage("service template not found in database");
319
320         assertTrue(databaseProvider.getPolicyList(NAME, VERSION_100).isEmpty());
321
322         assertThatThrownBy(
323             () -> databaseProvider.getFilteredPolicies(ToscaTypedEntityFilter.<ToscaPolicy>builder().build()))
324                         .hasMessage("service template not found in database");
325
326         assertTrue(databaseProvider.getFilteredPolicyList(ToscaTypedEntityFilter.<ToscaPolicy>builder().build())
327                 .isEmpty());
328
329         assertThatThrownBy(() -> {
330             databaseProvider.createPolicies(new ToscaServiceTemplate());
331         }).hasMessage("topology template not specified on service template");
332
333         assertThatThrownBy(() -> {
334             databaseProvider.updatePolicies(new ToscaServiceTemplate());
335         }).hasMessage("topology template not specified on service template");
336
337         assertThatThrownBy(() -> databaseProvider.deletePolicy("Policy", "0.0.0").getToscaTopologyTemplate())
338                 .hasMessage("service template not found in database");
339
340         assertEquals(0, databaseProvider.getPdpGroups(NAME).size());
341         assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
342
343         assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
344         assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
345     }
346
347     @Test
348     public void testProviderMethodsInGroups() throws PfModelException {
349         PdpGroup pdpGroup = new PdpGroup();
350         pdpGroup.setName(GROUP);
351         pdpGroup.setVersion("1.2.3");
352         pdpGroup.setPdpGroupState(PdpState.ACTIVE);
353         pdpGroup.setPdpSubgroups(new ArrayList<>());
354         List<PdpGroup> groupList = new ArrayList<>();
355         groupList.add(pdpGroup);
356
357         PdpSubGroup pdpSubGroup = new PdpSubGroup();
358         pdpSubGroup.setPdpType("type");
359         pdpSubGroup.setDesiredInstanceCount(123);
360         pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
361         pdpSubGroup.getSupportedPolicyTypes().add(new ToscaConceptIdentifier("type", "7.8.9"));
362         pdpGroup.getPdpSubgroups().add(pdpSubGroup);
363
364         Pdp pdp = new Pdp();
365         pdp.setInstanceId("type-0");
366         pdp.setMessage("Hello");
367         pdp.setPdpState(PdpState.ACTIVE);
368         pdp.setHealthy(PdpHealthStatus.UNKNOWN);
369         pdpSubGroup.setPdpInstances(new ArrayList<>());
370         pdpSubGroup.getPdpInstances().add(pdp);
371
372         databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
373
374         assertEquals(123,
375                 databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getDesiredInstanceCount());
376         assertEquals(1, databaseProvider.getPdpGroups(GROUP).size());
377
378         pdpSubGroup.setDesiredInstanceCount(234);
379         databaseProvider.updatePdpSubGroup(GROUP, pdpSubGroup);
380         assertEquals(234,
381                 databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getDesiredInstanceCount());
382
383         assertEquals("Hello", databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getPdpInstances()
384                 .get(0).getMessage());
385         pdp.setMessage("Howdy");
386         databaseProvider.updatePdp(GROUP, "type", pdp);
387         assertEquals("Howdy", databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getPdpInstances()
388                 .get(0).getMessage());
389
390         assertThatThrownBy(() -> {
391             databaseProvider.deletePdpGroup(NAME);
392         }).hasMessage("delete of PDP group \"name:0.0.0\" failed, PDP group does not exist");
393
394         assertEquals(pdpGroup.getName(), databaseProvider.deletePdpGroup(GROUP).getName());
395     }
396
397     @Test
398     public void testDeletePolicyDeployedInSubgroup() throws PfModelException {
399         List<ToscaConceptIdentifier> policies = new ArrayList<>();
400
401         policies.add(new ToscaConceptIdentifier("p0", "0.0.1"));
402         policies.add(new ToscaConceptIdentifier("p1", "0.0.1"));
403
404         List<ToscaConceptIdentifier> supportedPolicyTypes = new ArrayList<>();
405         supportedPolicyTypes.add(new ToscaConceptIdentifier("pt2", "0.0.1"));
406
407         PdpSubGroup subGroup = new PdpSubGroup();
408         subGroup.setPdpType("pdpType");
409         subGroup.setSupportedPolicyTypes(supportedPolicyTypes);
410         subGroup.setPolicies(policies);
411
412         List<PdpSubGroup> pdpSubgroups = new ArrayList<>();
413         pdpSubgroups.add(subGroup);
414
415         PdpGroup pdpGroup = new PdpGroup();
416         pdpGroup.setName("pdpGroup");
417         pdpGroup.setPdpGroupState(PdpState.PASSIVE);
418         pdpGroup.setPdpSubgroups(pdpSubgroups);
419
420         List<PdpGroup> pdpGroups = new ArrayList<>();
421         pdpGroups.add(pdpGroup);
422
423         databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
424
425         databaseProvider.createPdpGroups(pdpGroups);
426
427         assertThatThrownBy(() -> databaseProvider.deletePolicy("p0", "0.0.1"))
428                 .hasMessageContaining("policy is in use, it is deployed in PDP group pdpGroup subgroup pdpType");
429
430         assertThatThrownBy(() -> databaseProvider.deletePolicy("p3", "0.0.1"))
431                 .hasMessageContaining("service template not found in database");
432
433         databaseProvider.close();
434     }
435
436     @Test
437     public void testDeletePolicyTypeSupportedInSubgroup() throws PfModelException {
438         List<ToscaConceptIdentifier> supportedPolicyTypes = new ArrayList<>();
439         supportedPolicyTypes.add(new ToscaConceptIdentifier("pt1", "0.0.1"));
440         supportedPolicyTypes.add(new ToscaConceptIdentifier("pt2", "0.0.1"));
441
442         PdpSubGroup subGroup = new PdpSubGroup();
443         subGroup.setPdpType("pdpType");
444         subGroup.setSupportedPolicyTypes(supportedPolicyTypes);
445
446         List<PdpSubGroup> pdpSubgroups = new ArrayList<>();
447         pdpSubgroups.add(subGroup);
448
449         PdpGroup pdpGroup = new PdpGroup();
450         pdpGroup.setName("pdpGroup");
451         pdpGroup.setPdpGroupState(PdpState.PASSIVE);
452         pdpGroup.setPdpSubgroups(pdpSubgroups);
453
454         List<PdpGroup> pdpGroups = new ArrayList<>();
455         pdpGroups.add(pdpGroup);
456
457         databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
458
459         databaseProvider.createPdpGroups(pdpGroups);
460
461         assertThatThrownBy(() -> databaseProvider.deletePolicyType("pt2", "0.0.1"))
462                 .hasMessageContaining("policy type is in use, it is referenced in PDP group pdpGroup subgroup pdpType");
463
464         assertThatThrownBy(() -> databaseProvider.deletePolicyType("pt0", "0.0.1"))
465                 .hasMessageContaining("service template not found in database");
466
467         databaseProvider.close();
468     }
469
470     @Test
471     public void testToscaNodeTemplateHandling() throws PfModelException {
472         databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
473
474         ToscaServiceTemplate serviceTemplate = makeNodeTemplate();
475
476         assertEquals("1.0.1",
477             databaseProvider.createToscaNodeTemplates(serviceTemplate).getToscaTopologyTemplate().getNodeTemplates()
478                 .get("metadataSet1").getVersion());
479         assertEquals(1, databaseProvider.getNodeTemplateMetadataSets(null, null).size());
480
481         ToscaNodeTemplate nodeTemplate1 = serviceTemplate.getToscaTopologyTemplate().getNodeTemplates()
482             .get("metadataSet1");
483         nodeTemplate1.setMetadata(Map.of("dummyKey", "updatedValue"));
484         serviceTemplate.getToscaTopologyTemplate().setNodeTemplates(Map.of("metadataSet1:1.0.1", nodeTemplate1));
485         assertEquals("updatedValue", databaseProvider.updateToscaNodeTemplates(serviceTemplate)
486             .getToscaTopologyTemplate().getNodeTemplates().get("metadataSet1").getMetadata().get("dummyKey"));
487
488         assertThatThrownBy(() -> {
489             databaseProvider.deleteToscaNodeTemplate("invalidName", "1.0.1");
490         }).hasMessage("node template invalidName:1.0.1 not found");
491
492         databaseProvider.close();
493     }
494
495     private ToscaServiceTemplate makeNodeTemplate() {
496         ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
497         serviceTemplate.setToscaDefinitionsVersion("sample:1.1.0");
498         serviceTemplate.setToscaTopologyTemplate(new ToscaTopologyTemplate());
499         serviceTemplate.setNodeTypes(Map.of("org.onap.policy.metadataSet:1.0.0", new ToscaNodeType()));
500         ToscaNodeTemplate nodeTemplate1 = new ToscaNodeTemplate();
501         nodeTemplate1.setName("metadataSet1");
502         nodeTemplate1.setVersion("1.0.1");
503         nodeTemplate1.setType("org.onap.policy.metadataSet");
504         nodeTemplate1.setTypeVersion("1.0.0");
505         nodeTemplate1.setMetadata(Map.of("dummyKey", "dummyValue"));
506
507         serviceTemplate.getToscaTopologyTemplate().setNodeTemplates(Map.of("metadataSet1", nodeTemplate1));
508
509         return serviceTemplate;
510     }
511 }