Changed identifiers to concept identifiers
[policy/models.git] / models-provider / src / test / java / org / onap / policy / models / provider / impl / DatabasePolicyModelsProviderTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2019-2021 Nordix Foundation.
4  *  Modifications Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
5  *  Modifications Copyright (C) 2020 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.Date;
32 import java.util.List;
33 import org.junit.Before;
34 import org.junit.Test;
35 import org.onap.policy.models.base.PfModelException;
36 import org.onap.policy.models.pdp.concepts.Pdp;
37 import org.onap.policy.models.pdp.concepts.PdpGroup;
38 import org.onap.policy.models.pdp.concepts.PdpGroupFilter;
39 import org.onap.policy.models.pdp.concepts.PdpStatistics;
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.ToscaPolicyFilter;
48 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeFilter;
49 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
50
51 /**
52  * Test the database models provider implementation.
53  *
54  * @author Liam Fallon (liam.fallon@est.tech)
55  */
56 public class DatabasePolicyModelsProviderTest {
57     private static final String NAME = "name";
58
59     private static final String TEMPLATE_IS_NULL = "^serviceTemplate is marked .*on.*ull but is null$";
60
61     private static final String SUBGROUP_IS_NULL = "^pdpSubGroup is marked .*on.*ull but is null$";
62
63     private static final String GROUP_IS_NULL = "^pdpGroupName is marked .*on.*ull but is null$";
64
65     private static final String NAME_IS_NULL = "^name is marked .*on.*ull but is null$";
66
67     private static final String FILTER_IS_NULL = "^filter is marked .*on.*ull but is null$";
68
69     private static final String GROUP = "group";
70
71     private static final String VERSION_100 = "1.0.0";
72
73     private static final Date TIMESTAMP = new Date();
74
75     private static final String ORDER = "DESC";
76
77     PolicyModelsProviderParameters parameters;
78
79     /**
80      * Initialize parameters.
81      */
82     @Before
83     public void setupParameters() {
84         parameters = new PolicyModelsProviderParameters();
85         parameters.setDatabaseDriver("org.h2.Driver");
86         parameters.setDatabaseUrl("jdbc:h2:mem:testdb");
87         parameters.setDatabaseUser("policy");
88         parameters.setDatabasePassword("P01icY");
89         parameters.setPersistenceUnit("ToscaConceptTest");
90     }
91
92     @Test
93     public void testInitAndClose() throws Exception {
94         assertThatThrownBy(() -> {
95             new DatabasePolicyModelsProviderImpl(null);
96         }).hasMessageMatching("^parameters is marked .*on.*ull but is null$");
97
98         PolicyModelsProvider databaseProvider =
99                 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
100
101         parameters.setDatabaseUrl("jdbc://www.acmecorp.nonexist");
102
103         databaseProvider.close();
104         databaseProvider.init();
105
106         databaseProvider.close();
107
108         parameters.setDatabaseUrl("jdbc:h2:mem:testdb");
109
110         parameters.setPersistenceUnit("WileECoyote");
111
112         assertThatThrownBy(databaseProvider::init).hasMessageContaining("could not create Data Access Object (DAO)");
113
114         parameters.setPersistenceUnit("ToscaConceptTest");
115
116         databaseProvider.init();
117         databaseProvider.close();
118
119         assertThatThrownBy(() -> {
120             databaseProvider.init();
121             databaseProvider.init();
122         }).hasMessage("provider is already initialized");
123
124         databaseProvider.close();
125
126         databaseProvider.close();
127     }
128
129     @Test
130     public void testProviderMethodsNull() throws Exception {
131
132         PolicyModelsProvider databaseProvider =
133                 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
134
135         assertThatThrownBy(() -> {
136             databaseProvider.getFilteredPolicyTypes(null);
137         }).hasMessageMatching(FILTER_IS_NULL);
138
139         assertThatThrownBy(() -> {
140             databaseProvider.getFilteredPolicyTypeList(null);
141         }).hasMessageMatching(FILTER_IS_NULL);
142
143         assertThatThrownBy(() -> {
144             databaseProvider.createPolicyTypes(null);
145         }).hasMessageMatching(TEMPLATE_IS_NULL);
146
147         assertThatThrownBy(() -> {
148             databaseProvider.updatePolicyTypes(null);
149         }).hasMessageMatching(TEMPLATE_IS_NULL);
150
151         assertThatThrownBy(() -> {
152             databaseProvider.deletePolicyType(null, null);
153         }).hasMessageMatching(NAME_IS_NULL);
154
155         assertThatThrownBy(() -> {
156             databaseProvider.deletePolicyType("aaa", null);
157         }).hasMessageMatching("^version is marked .*on.*ull but is null$");
158
159         assertThatThrownBy(() -> {
160             databaseProvider.deletePolicyType(null, "aaa");
161         }).hasMessageMatching(NAME_IS_NULL);
162
163         assertThatThrownBy(() -> {
164             databaseProvider.getFilteredPolicies(null);
165         }).hasMessageMatching(FILTER_IS_NULL);
166
167         assertThatThrownBy(() -> {
168             databaseProvider.getFilteredPolicyList(null);
169         }).hasMessageMatching(FILTER_IS_NULL);
170
171         assertThatThrownBy(() -> {
172             databaseProvider.createPolicies(null);
173         }).hasMessageMatching(TEMPLATE_IS_NULL);
174
175         assertThatThrownBy(() -> {
176             databaseProvider.updatePolicies(null);
177         }).hasMessageMatching(TEMPLATE_IS_NULL);
178
179         assertThatThrownBy(() -> {
180             databaseProvider.deletePolicy(null, null);
181         }).hasMessageMatching(NAME_IS_NULL);
182
183         assertThatThrownBy(() -> {
184             databaseProvider.deletePolicy(null, "aaa");
185         }).hasMessageMatching(NAME_IS_NULL);
186
187         assertThatThrownBy(() -> {
188             databaseProvider.deletePolicy("aaa", null);
189         }).hasMessageMatching("^version is marked .*on.*ull but is null$");
190
191         assertThatThrownBy(() -> {
192             databaseProvider.getFilteredPdpGroups(null);
193         }).hasMessageMatching(FILTER_IS_NULL);
194
195         assertThatThrownBy(() -> {
196             databaseProvider.createPdpGroups(null);
197         }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
198
199         assertThatThrownBy(() -> {
200             databaseProvider.updatePdpGroups(null);
201         }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
202
203         assertThatThrownBy(() -> {
204             databaseProvider.updatePdpSubGroup(null, null);
205         }).hasMessageMatching(GROUP_IS_NULL);
206
207         assertThatThrownBy(() -> {
208             databaseProvider.updatePdpSubGroup(null, new PdpSubGroup());
209         }).hasMessageMatching(GROUP_IS_NULL);
210
211         assertThatThrownBy(() -> {
212             databaseProvider.updatePdpSubGroup(NAME, null);
213         }).hasMessageMatching(SUBGROUP_IS_NULL);
214
215         assertThatThrownBy(() -> {
216             databaseProvider.updatePdpSubGroup(NAME, new PdpSubGroup());
217         }).hasMessage("parameter \"localName\" is null");
218
219         assertThatThrownBy(() -> {
220             databaseProvider.updatePdp(null, null, null);
221         }).hasMessageMatching(GROUP_IS_NULL);
222
223         assertThatThrownBy(() -> {
224             databaseProvider.updatePdp(null, null, new Pdp());
225         }).hasMessageMatching(GROUP_IS_NULL);
226
227         assertThatThrownBy(() -> {
228             databaseProvider.updatePdp(null, "sub", null);
229         }).hasMessageMatching(GROUP_IS_NULL);
230
231         assertThatThrownBy(() -> {
232             databaseProvider.updatePdp(null, "sub", new Pdp());
233         }).hasMessageMatching(GROUP_IS_NULL);
234
235         assertThatThrownBy(() -> {
236             databaseProvider.updatePdp(NAME, null, null);
237         }).hasMessageMatching(SUBGROUP_IS_NULL);
238
239         assertThatThrownBy(() -> {
240             databaseProvider.updatePdp(NAME, null, new Pdp());
241         }).hasMessageMatching(SUBGROUP_IS_NULL);
242
243         assertThatThrownBy(() -> {
244             databaseProvider.updatePdp(NAME, "sub", null);
245         }).hasMessageMatching("^pdp is marked .*on.*ull but is null$");
246
247         assertThatThrownBy(() -> {
248             databaseProvider.updatePdp(NAME, "sub", new Pdp());
249         }).hasMessage("parameter \"localName\" is null");
250
251         assertThatThrownBy(() -> {
252             databaseProvider.deletePdpGroup(null);
253         }).hasMessageMatching(NAME_IS_NULL);
254
255         assertThatThrownBy(() -> {
256             databaseProvider.getFilteredPdpStatistics(NAME, null, "sub", TIMESTAMP, TIMESTAMP, ORDER, 0);
257         }).hasMessageMatching(GROUP_IS_NULL);
258
259         assertThatThrownBy(() -> {
260             databaseProvider.createPdpStatistics(null);
261         }).hasMessageMatching("^pdpStatisticsList is marked .*on.*ull but is null$");
262
263         assertThatThrownBy(() -> {
264             databaseProvider.updatePdpStatistics(null);
265         }).hasMessageMatching("^pdpStatisticsList is marked .*on.*ull but is null$");
266
267         assertThatThrownBy(() -> {
268             databaseProvider.deletePdpStatistics(null, TIMESTAMP);
269         }).hasMessageMatching(NAME_IS_NULL);
270
271         databaseProvider.close();
272     }
273
274     @Test
275     public void testProviderMethodsNotInit() throws Exception {
276         PolicyModelsProvider databaseProvider =
277                 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         PolicyModelsProvider databaseProvider =
289                 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
290
291         assertThatThrownBy(() -> databaseProvider.getPolicyTypes(NAME, VERSION_100))
292                 .hasMessage("service template not found in database");
293
294         assertTrue(databaseProvider.getPolicyTypeList(NAME, VERSION_100).isEmpty());
295
296         assertThatThrownBy(() -> databaseProvider.getFilteredPolicyTypes(ToscaPolicyTypeFilter.builder().build()))
297                 .hasMessage("service template not found in database");
298
299         assertTrue(databaseProvider.getFilteredPolicyTypeList(ToscaPolicyTypeFilter.builder().build()).isEmpty());
300
301         assertThatThrownBy(() -> {
302             databaseProvider.createPolicyTypes(new ToscaServiceTemplate());
303         }).hasMessage("no policy types specified on service template");
304
305         assertThatThrownBy(() -> {
306             databaseProvider.updatePolicyTypes(new ToscaServiceTemplate());
307         }).hasMessage("no policy types specified on service template");
308
309         assertThatThrownBy(() -> databaseProvider.deletePolicyType(NAME, VERSION_100))
310                 .hasMessage("service template not found in database");
311
312         assertThatThrownBy(() -> databaseProvider.getPolicies(NAME, VERSION_100))
313                 .hasMessage("service template not found in database");
314
315         assertTrue(databaseProvider.getPolicyList(NAME, VERSION_100).isEmpty());
316
317         assertThatThrownBy(() -> databaseProvider.getFilteredPolicies(ToscaPolicyFilter.builder().build()))
318                 .hasMessage("service template not found in database");
319
320         assertTrue(databaseProvider.getFilteredPolicyList(ToscaPolicyFilter.builder().build()).isEmpty());
321
322         assertThatThrownBy(() -> {
323             databaseProvider.createPolicies(new ToscaServiceTemplate());
324         }).hasMessage("topology template not specified on service template");
325
326         assertThatThrownBy(() -> {
327             databaseProvider.updatePolicies(new ToscaServiceTemplate());
328         }).hasMessage("topology template not specified on service template");
329
330         assertThatThrownBy(() -> databaseProvider.deletePolicy("Policy", "0.0.0").getToscaTopologyTemplate())
331                 .hasMessage("service template not found in database");
332
333         assertEquals(0, databaseProvider.getPdpGroups(NAME).size());
334         assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
335
336         assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
337         assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
338
339         PdpGroup pdpGroup = new PdpGroup();
340         pdpGroup.setName(GROUP);
341         pdpGroup.setVersion("1.2.3");
342         pdpGroup.setPdpGroupState(PdpState.ACTIVE);
343         pdpGroup.setPdpSubgroups(new ArrayList<>());
344         List<PdpGroup> groupList = new ArrayList<>();
345         groupList.add(pdpGroup);
346
347         PdpSubGroup pdpSubGroup = new PdpSubGroup();
348         pdpSubGroup.setPdpType("type");
349         pdpSubGroup.setDesiredInstanceCount(123);
350         pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
351         pdpSubGroup.getSupportedPolicyTypes().add(new ToscaConceptIdentifier("type", "7.8.9"));
352         pdpGroup.getPdpSubgroups().add(pdpSubGroup);
353
354         Pdp pdp = new Pdp();
355         pdp.setInstanceId("type-0");
356         pdp.setMessage("Hello");
357         pdp.setPdpState(PdpState.ACTIVE);
358         pdp.setHealthy(PdpHealthStatus.UNKNOWN);
359         pdpSubGroup.setPdpInstances(new ArrayList<>());
360         pdpSubGroup.getPdpInstances().add(pdp);
361
362         PdpStatistics pdpStatistics = new PdpStatistics();
363         pdpStatistics.setPdpInstanceId(NAME);
364         pdpStatistics.setTimeStamp(new Date());
365         pdpStatistics.setPdpGroupName(GROUP);
366         pdpStatistics.setPdpSubGroupName("type");
367         ArrayList<PdpStatistics> statisticsArrayList = new ArrayList<>();
368         statisticsArrayList.add(pdpStatistics);
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         assertEquals(0, databaseProvider.getPdpStatistics(null, null).size());
393         assertEquals(1, databaseProvider.createPdpStatistics(statisticsArrayList).size());
394         assertEquals(1, databaseProvider.updatePdpStatistics(statisticsArrayList).size());
395
396         assertEquals(NAME, databaseProvider.getPdpStatistics(null, null).get(0).getPdpInstanceId());
397         assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(null, GROUP, null, null, null, ORDER, 0).get(0)
398                 .getPdpInstanceId());
399         assertEquals(0,
400                 databaseProvider.getFilteredPdpStatistics(null, GROUP, null, new Date(), null, ORDER, 0).size());
401         assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(null, GROUP, null, null, new Date(), ORDER, 0)
402                 .get(0).getPdpInstanceId());
403         assertEquals(0,
404                 databaseProvider.getFilteredPdpStatistics(null, GROUP, null, new Date(), new Date(), ORDER, 0).size());
405
406         assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, null, null, null, ORDER, 0).get(0)
407                 .getPdpInstanceId());
408         assertEquals(0,
409                 databaseProvider.getFilteredPdpStatistics(NAME, GROUP, null, new Date(), new Date(), ORDER, 0).size());
410
411         assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type", null, null, ORDER, 0).get(0)
412                 .getPdpInstanceId());
413         assertEquals(0, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type", new Date(), new Date(), ORDER, 0)
414                 .size());
415
416         assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type", null, null, ORDER, 1).get(0)
417                 .getPdpInstanceId());
418         assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type", null, null, ORDER, 5).get(0)
419                 .getPdpInstanceId());
420         assertEquals(0, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type", new Date(), new Date(), ORDER, 5)
421                 .size());
422
423         assertEquals(NAME, databaseProvider.deletePdpStatistics(NAME, null).get(0).getPdpInstanceId());
424         assertEquals(0, databaseProvider.getPdpStatistics(null, null).size());
425
426         databaseProvider.close();
427     }
428
429     @Test
430     public void testDeletePolicyDeployedInSubgroup() throws PfModelException {
431         List<ToscaConceptIdentifier> policies = new ArrayList<>();
432
433         policies.add(new ToscaConceptIdentifier("p0", "0.0.1"));
434         policies.add(new ToscaConceptIdentifier("p1", "0.0.1"));
435
436         List<ToscaConceptIdentifier> supportedPolicyTypes = new ArrayList<>();
437         supportedPolicyTypes.add(new ToscaConceptIdentifier("pt2", "0.0.1"));
438
439         PdpSubGroup subGroup = new PdpSubGroup();
440         subGroup.setPdpType("pdpType");
441         subGroup.setSupportedPolicyTypes(supportedPolicyTypes);
442         subGroup.setPolicies(policies);
443
444         List<PdpSubGroup> pdpSubgroups = new ArrayList<>();
445         pdpSubgroups.add(subGroup);
446
447         PdpGroup pdpGroup = new PdpGroup();
448         pdpGroup.setName("pdpGroup");
449         pdpGroup.setPdpGroupState(PdpState.PASSIVE);
450         pdpGroup.setPdpSubgroups(pdpSubgroups);
451
452         List<PdpGroup> pdpGroups = new ArrayList<>();
453         pdpGroups.add(pdpGroup);
454
455         PolicyModelsProvider databaseProvider =
456                 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
457
458         databaseProvider.createPdpGroups(pdpGroups);
459
460         assertThatThrownBy(() -> databaseProvider.deletePolicy("p0", "0.0.1"))
461                 .hasMessageContaining("policy is in use, it is deployed in PDP group pdpGroup subgroup pdpType");
462
463         assertThatThrownBy(() -> databaseProvider.deletePolicy("p3", "0.0.1"))
464                 .hasMessageContaining("service template not found in database");
465
466         databaseProvider.close();
467     }
468
469     @Test
470     public void testDeletePolicyTypeSupportedInSubgroup() throws PfModelException {
471         List<ToscaConceptIdentifier> supportedPolicyTypes = new ArrayList<>();
472         supportedPolicyTypes.add(new ToscaConceptIdentifier("pt1", "0.0.1"));
473         supportedPolicyTypes.add(new ToscaConceptIdentifier("pt2", "0.0.1"));
474
475         PdpSubGroup subGroup = new PdpSubGroup();
476         subGroup.setPdpType("pdpType");
477         subGroup.setSupportedPolicyTypes(supportedPolicyTypes);
478
479         List<PdpSubGroup> pdpSubgroups = new ArrayList<>();
480         pdpSubgroups.add(subGroup);
481
482         PdpGroup pdpGroup = new PdpGroup();
483         pdpGroup.setName("pdpGroup");
484         pdpGroup.setPdpGroupState(PdpState.PASSIVE);
485         pdpGroup.setPdpSubgroups(pdpSubgroups);
486
487         List<PdpGroup> pdpGroups = new ArrayList<>();
488         pdpGroups.add(pdpGroup);
489
490         PolicyModelsProvider databaseProvider =
491                 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
492
493         databaseProvider.createPdpGroups(pdpGroups);
494
495         assertThatThrownBy(() -> databaseProvider.deletePolicyType("pt2", "0.0.1"))
496                 .hasMessageContaining("policy type is in use, it is referenced in PDP group pdpGroup subgroup pdpType");
497
498         assertThatThrownBy(() -> databaseProvider.deletePolicyType("pt0", "0.0.1"))
499                 .hasMessageContaining("service template not found in database");
500
501         databaseProvider.close();
502     }
503 }