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