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