Fix config files to remove outdated configuration for 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-2024 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     }
94
95     /**
96      * Closes the DB.
97      */
98     @After
99     public void tearDown() throws PfModelException {
100         if (databaseProvider != null) {
101             databaseProvider.close();
102         }
103     }
104
105     @Test
106     public void testInitAndClose() throws Exception {
107         assertThatThrownBy(() -> {
108             new DatabasePolicyModelsProviderImpl(null);
109         }).hasMessageMatching("^parameters is marked .*on.*ull but is null$");
110
111         databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
112
113         final String savedDatabaseUrl = parameters.getDatabaseUrl();
114         parameters.setDatabaseUrl("jdbc://www.acmecorp.nonexist");
115
116         databaseProvider.close();
117         assertThatThrownBy(() -> {
118             databaseProvider.init();
119         }).hasMessageContaining("could not create Data Access Object (DAO)");
120
121         databaseProvider.close();
122
123         parameters.setDatabaseUrl(savedDatabaseUrl);
124
125         final String savedPersistenceUnit = parameters.getPersistenceUnit();
126         parameters.setPersistenceUnit("WileECoyote");
127
128         assertThatThrownBy(databaseProvider::init).hasMessageContaining("could not create Data Access Object (DAO)");
129         parameters.setPersistenceUnit(savedPersistenceUnit);
130
131         databaseProvider.init();
132         databaseProvider.close();
133
134         assertThatThrownBy(() -> {
135             databaseProvider.init();
136             databaseProvider.init();
137         }).hasMessage("provider is already initialized");
138
139         databaseProvider.close();
140
141         databaseProvider.close();
142     }
143
144     @Test
145     public void testProviderMethodsNull() throws Exception {
146
147         databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
148
149         assertThatThrownBy(() -> {
150             databaseProvider.getFilteredPolicyTypes(null);
151         }).hasMessageMatching(FILTER_IS_NULL);
152
153         assertThatThrownBy(() -> {
154             databaseProvider.getFilteredPolicyTypeList(null);
155         }).hasMessageMatching(FILTER_IS_NULL);
156
157         assertThatThrownBy(() -> {
158             databaseProvider.createPolicyTypes(null);
159         }).hasMessageMatching(TEMPLATE_IS_NULL);
160
161         assertThatThrownBy(() -> {
162             databaseProvider.updatePolicyTypes(null);
163         }).hasMessageMatching(TEMPLATE_IS_NULL);
164
165         assertThatThrownBy(() -> {
166             databaseProvider.deletePolicyType(null, null);
167         }).hasMessageMatching(NAME_IS_NULL);
168
169         assertThatThrownBy(() -> {
170             databaseProvider.deletePolicyType("aaa", null);
171         }).hasMessageMatching("^version is marked .*on.*ull but is null$");
172
173         assertThatThrownBy(() -> {
174             databaseProvider.deletePolicyType(null, "aaa");
175         }).hasMessageMatching(NAME_IS_NULL);
176
177         assertThatThrownBy(() -> {
178             databaseProvider.getFilteredPolicies(null);
179         }).hasMessageMatching(FILTER_IS_NULL);
180
181         assertThatThrownBy(() -> {
182             databaseProvider.getFilteredPolicyList(null);
183         }).hasMessageMatching(FILTER_IS_NULL);
184
185         assertThatThrownBy(() -> {
186             databaseProvider.createPolicies(null);
187         }).hasMessageMatching(TEMPLATE_IS_NULL);
188
189         assertThatThrownBy(() -> {
190             databaseProvider.updatePolicies(null);
191         }).hasMessageMatching(TEMPLATE_IS_NULL);
192
193         assertThatThrownBy(() -> {
194             databaseProvider.deletePolicy(null, null);
195         }).hasMessageMatching(NAME_IS_NULL);
196
197         assertThatThrownBy(() -> {
198             databaseProvider.deletePolicy(null, "aaa");
199         }).hasMessageMatching(NAME_IS_NULL);
200
201         assertThatThrownBy(() -> {
202             databaseProvider.deletePolicy("aaa", null);
203         }).hasMessageMatching("^version is marked .*on.*ull but is null$");
204     }
205
206     @Test
207     public void testProviderMethodsNullGroup() throws Exception {
208
209         databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
210
211         assertThatThrownBy(() -> {
212             databaseProvider.getFilteredPdpGroups(null);
213         }).hasMessageMatching(FILTER_IS_NULL);
214
215         assertThatThrownBy(() -> {
216             databaseProvider.createPdpGroups(null);
217         }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
218
219         assertThatThrownBy(() -> {
220             databaseProvider.updatePdpGroups(null);
221         }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
222
223         assertThatThrownBy(() -> {
224             databaseProvider.updatePdpSubGroup(null, null);
225         }).hasMessageMatching(GROUP_IS_NULL);
226
227         assertThatThrownBy(() -> {
228             databaseProvider.updatePdpSubGroup(null, new PdpSubGroup());
229         }).hasMessageMatching(GROUP_IS_NULL);
230
231         assertThatThrownBy(() -> {
232             databaseProvider.updatePdpSubGroup(NAME, null);
233         }).hasMessageMatching(SUBGROUP_IS_NULL);
234
235         assertThatThrownBy(() -> {
236             databaseProvider.updatePdpSubGroup(NAME, new PdpSubGroup());
237         }).hasMessage("parameter \"localName\" is null");
238
239         assertThatThrownBy(() -> {
240             databaseProvider.updatePdp(null, null, null);
241         }).hasMessageMatching(GROUP_IS_NULL);
242
243         assertThatThrownBy(() -> {
244             databaseProvider.updatePdp(null, null, new Pdp());
245         }).hasMessageMatching(GROUP_IS_NULL);
246
247         assertThatThrownBy(() -> {
248             databaseProvider.updatePdp(null, "sub", null);
249         }).hasMessageMatching(GROUP_IS_NULL);
250
251         assertThatThrownBy(() -> {
252             databaseProvider.updatePdp(null, "sub", new Pdp());
253         }).hasMessageMatching(GROUP_IS_NULL);
254
255         assertThatThrownBy(() -> {
256             databaseProvider.updatePdp(NAME, null, null);
257         }).hasMessageMatching(SUBGROUP_IS_NULL);
258
259         assertThatThrownBy(() -> {
260             databaseProvider.updatePdp(NAME, null, new Pdp());
261         }).hasMessageMatching(SUBGROUP_IS_NULL);
262
263         assertThatThrownBy(() -> {
264             databaseProvider.updatePdp(NAME, "sub", null);
265         }).hasMessageMatching("^pdp is marked .*on.*ull but is null$");
266
267         assertThatThrownBy(() -> {
268             databaseProvider.updatePdp(NAME, "sub", new Pdp());
269         }).hasMessage("parameter \"localName\" is null");
270
271         assertThatThrownBy(() -> {
272             databaseProvider.deletePdpGroup(null);
273         }).hasMessageMatching(NAME_IS_NULL);
274
275         databaseProvider.close();
276     }
277
278     @Test
279     public void testProviderMethodsNotInit() throws Exception {
280         databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
281
282         databaseProvider.close();
283
284         assertThatThrownBy(() -> {
285             databaseProvider.getPolicyTypes(NAME, "version");
286         }).hasMessage("policy models provider is not initilaized");
287     }
288
289     @Test
290     public void testProviderMethods() throws PfModelException {
291         databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
292
293         assertThatThrownBy(() -> databaseProvider.getPolicyTypes(NAME, VERSION_100))
294                 .hasMessage("service template not found in database");
295
296         assertTrue(databaseProvider.getPolicyTypeList(NAME, VERSION_100).isEmpty());
297
298         assertThatThrownBy(
299             () -> databaseProvider.getFilteredPolicyTypes(ToscaEntityFilter.<ToscaPolicyType>builder().build()))
300                         .hasMessage("service template not found in database");
301
302         assertTrue(databaseProvider.getFilteredPolicyTypeList(ToscaEntityFilter.<ToscaPolicyType>builder().build())
303                 .isEmpty());
304
305         assertThatThrownBy(() -> {
306             databaseProvider.createPolicyTypes(new ToscaServiceTemplate());
307         }).hasMessage("no policy types specified on service template");
308
309         assertThatThrownBy(() -> {
310             databaseProvider.updatePolicyTypes(new ToscaServiceTemplate());
311         }).hasMessage("no policy types specified on service template");
312
313         assertThatThrownBy(() -> databaseProvider.deletePolicyType(NAME, VERSION_100))
314                 .hasMessage("service template not found in database");
315
316         assertThatThrownBy(() -> databaseProvider.getPolicies(NAME, VERSION_100))
317                 .hasMessage("service template not found in database");
318
319         assertTrue(databaseProvider.getPolicyList(NAME, VERSION_100).isEmpty());
320
321         assertThatThrownBy(
322             () -> databaseProvider.getFilteredPolicies(ToscaTypedEntityFilter.<ToscaPolicy>builder().build()))
323                         .hasMessage("service template not found in database");
324
325         assertTrue(databaseProvider.getFilteredPolicyList(ToscaTypedEntityFilter.<ToscaPolicy>builder().build())
326                 .isEmpty());
327
328         assertThatThrownBy(() -> {
329             databaseProvider.createPolicies(new ToscaServiceTemplate());
330         }).hasMessage("topology template not specified on service template");
331
332         assertThatThrownBy(() -> {
333             databaseProvider.updatePolicies(new ToscaServiceTemplate());
334         }).hasMessage("topology template not specified on service template");
335
336         assertThatThrownBy(() -> databaseProvider.deletePolicy("Policy", "0.0.0").getToscaTopologyTemplate())
337                 .hasMessage("service template not found in database");
338
339         assertEquals(0, databaseProvider.getPdpGroups(NAME).size());
340         assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
341
342         assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
343         assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
344     }
345
346     @Test
347     public void testProviderMethodsInGroups() throws PfModelException {
348         PdpGroup pdpGroup = new PdpGroup();
349         pdpGroup.setName(GROUP);
350         pdpGroup.setVersion("1.2.3");
351         pdpGroup.setPdpGroupState(PdpState.ACTIVE);
352         pdpGroup.setPdpSubgroups(new ArrayList<>());
353         List<PdpGroup> groupList = new ArrayList<>();
354         groupList.add(pdpGroup);
355
356         PdpSubGroup pdpSubGroup = new PdpSubGroup();
357         pdpSubGroup.setPdpType("type");
358         pdpSubGroup.setDesiredInstanceCount(123);
359         pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
360         pdpSubGroup.getSupportedPolicyTypes().add(new ToscaConceptIdentifier("type", "7.8.9"));
361         pdpGroup.getPdpSubgroups().add(pdpSubGroup);
362
363         Pdp pdp = new Pdp();
364         pdp.setInstanceId("type-0");
365         pdp.setMessage("Hello");
366         pdp.setPdpState(PdpState.ACTIVE);
367         pdp.setHealthy(PdpHealthStatus.UNKNOWN);
368         pdpSubGroup.setPdpInstances(new ArrayList<>());
369         pdpSubGroup.getPdpInstances().add(pdp);
370
371         databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
372
373         assertEquals(123,
374                 databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getDesiredInstanceCount());
375         assertEquals(1, databaseProvider.getPdpGroups(GROUP).size());
376
377         pdpSubGroup.setDesiredInstanceCount(234);
378         databaseProvider.updatePdpSubGroup(GROUP, pdpSubGroup);
379         assertEquals(234,
380                 databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getDesiredInstanceCount());
381
382         assertEquals("Hello", databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getPdpInstances()
383                 .get(0).getMessage());
384         pdp.setMessage("Howdy");
385         databaseProvider.updatePdp(GROUP, "type", pdp);
386         assertEquals("Howdy", databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getPdpInstances()
387                 .get(0).getMessage());
388
389         assertThatThrownBy(() -> {
390             databaseProvider.deletePdpGroup(NAME);
391         }).hasMessage("delete of PDP group \"name:0.0.0\" failed, PDP group does not exist");
392
393         assertEquals(pdpGroup.getName(), databaseProvider.deletePdpGroup(GROUP).getName());
394     }
395
396     @Test
397     public void testDeletePolicyDeployedInSubgroup() throws PfModelException {
398         List<ToscaConceptIdentifier> policies = new ArrayList<>();
399
400         policies.add(new ToscaConceptIdentifier("p0", "0.0.1"));
401         policies.add(new ToscaConceptIdentifier("p1", "0.0.1"));
402
403         List<ToscaConceptIdentifier> supportedPolicyTypes = new ArrayList<>();
404         supportedPolicyTypes.add(new ToscaConceptIdentifier("pt2", "0.0.1"));
405
406         PdpSubGroup subGroup = new PdpSubGroup();
407         subGroup.setPdpType("pdpType");
408         subGroup.setSupportedPolicyTypes(supportedPolicyTypes);
409         subGroup.setPolicies(policies);
410
411         List<PdpSubGroup> pdpSubgroups = new ArrayList<>();
412         pdpSubgroups.add(subGroup);
413
414         PdpGroup pdpGroup = new PdpGroup();
415         pdpGroup.setName("pdpGroup");
416         pdpGroup.setPdpGroupState(PdpState.PASSIVE);
417         pdpGroup.setPdpSubgroups(pdpSubgroups);
418
419         List<PdpGroup> pdpGroups = new ArrayList<>();
420         pdpGroups.add(pdpGroup);
421
422         databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
423
424         databaseProvider.createPdpGroups(pdpGroups);
425
426         assertThatThrownBy(() -> databaseProvider.deletePolicy("p0", "0.0.1"))
427                 .hasMessageContaining("policy is in use, it is deployed in PDP group pdpGroup subgroup pdpType");
428
429         assertThatThrownBy(() -> databaseProvider.deletePolicy("p3", "0.0.1"))
430                 .hasMessageContaining("service template not found in database");
431
432         databaseProvider.close();
433     }
434
435     @Test
436     public void testDeletePolicyTypeSupportedInSubgroup() throws PfModelException {
437         List<ToscaConceptIdentifier> supportedPolicyTypes = new ArrayList<>();
438         supportedPolicyTypes.add(new ToscaConceptIdentifier("pt1", "0.0.1"));
439         supportedPolicyTypes.add(new ToscaConceptIdentifier("pt2", "0.0.1"));
440
441         PdpSubGroup subGroup = new PdpSubGroup();
442         subGroup.setPdpType("pdpType");
443         subGroup.setSupportedPolicyTypes(supportedPolicyTypes);
444
445         List<PdpSubGroup> pdpSubgroups = new ArrayList<>();
446         pdpSubgroups.add(subGroup);
447
448         PdpGroup pdpGroup = new PdpGroup();
449         pdpGroup.setName("pdpGroup");
450         pdpGroup.setPdpGroupState(PdpState.PASSIVE);
451         pdpGroup.setPdpSubgroups(pdpSubgroups);
452
453         List<PdpGroup> pdpGroups = new ArrayList<>();
454         pdpGroups.add(pdpGroup);
455
456         databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
457
458         databaseProvider.createPdpGroups(pdpGroups);
459
460         assertThatThrownBy(() -> databaseProvider.deletePolicyType("pt2", "0.0.1"))
461                 .hasMessageContaining("policy type is in use, it is referenced in PDP group pdpGroup subgroup pdpType");
462
463         assertThatThrownBy(() -> databaseProvider.deletePolicyType("pt0", "0.0.1"))
464                 .hasMessageContaining("service template not found in database");
465
466         databaseProvider.close();
467     }
468
469     @Test
470     public void testToscaNodeTemplateHandling() throws PfModelException {
471         databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
472
473         ToscaServiceTemplate serviceTemplate = makeNodeTemplate();
474
475         assertEquals("1.0.1",
476             databaseProvider.createToscaNodeTemplates(serviceTemplate).getToscaTopologyTemplate().getNodeTemplates()
477                 .get("metadataSet1").getVersion());
478         assertEquals(1, databaseProvider.getNodeTemplateMetadataSets(null, null).size());
479
480         ToscaNodeTemplate nodeTemplate1 = serviceTemplate.getToscaTopologyTemplate().getNodeTemplates()
481             .get("metadataSet1");
482         nodeTemplate1.setMetadata(Map.of("dummyKey", "updatedValue"));
483         serviceTemplate.getToscaTopologyTemplate().setNodeTemplates(Map.of("metadataSet1:1.0.1", nodeTemplate1));
484         assertEquals("updatedValue", databaseProvider.updateToscaNodeTemplates(serviceTemplate)
485             .getToscaTopologyTemplate().getNodeTemplates().get("metadataSet1").getMetadata().get("dummyKey"));
486
487         assertThatThrownBy(() -> {
488             databaseProvider.deleteToscaNodeTemplate("invalidName", "1.0.1");
489         }).hasMessage("node template invalidName:1.0.1 not found");
490
491         databaseProvider.close();
492     }
493
494     private ToscaServiceTemplate makeNodeTemplate() {
495         ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
496         serviceTemplate.setToscaDefinitionsVersion("sample:1.1.0");
497         serviceTemplate.setToscaTopologyTemplate(new ToscaTopologyTemplate());
498         serviceTemplate.setNodeTypes(Map.of("org.onap.policy.metadataSet:1.0.0", new ToscaNodeType()));
499         ToscaNodeTemplate nodeTemplate1 = new ToscaNodeTemplate();
500         nodeTemplate1.setName("metadataSet1");
501         nodeTemplate1.setVersion("1.0.1");
502         nodeTemplate1.setType("org.onap.policy.metadataSet");
503         nodeTemplate1.setTypeVersion("1.0.0");
504         nodeTemplate1.setMetadata(Map.of("dummyKey", "dummyValue"));
505
506         serviceTemplate.getToscaTopologyTemplate().setNodeTemplates(Map.of("metadataSet1", nodeTemplate1));
507
508         return serviceTemplate;
509     }
510 }