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