Merge "pdp statistics database provider implementation"
[policy/models.git] / models-provider / src / test / java / org / onap / policy / models / provider / impl / DatabasePolicyModelsProviderTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2019 Nordix Foundation.
4  *  Modifications Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
5  * ================================================================================
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  * SPDX-License-Identifier: Apache-2.0
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.policy.models.provider.impl;
23
24 import static org.assertj.core.api.Assertions.assertThatThrownBy;
25 import static org.junit.Assert.assertEquals;
26 import static org.junit.Assert.assertNotNull;
27 import static org.junit.Assert.assertTrue;
28 import static org.junit.Assert.fail;
29
30 import java.util.ArrayList;
31 import java.util.Base64;
32 import java.util.Date;
33 import java.util.List;
34
35 import org.junit.Before;
36 import org.junit.Test;
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.PdpStatistics;
41 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
42 import org.onap.policy.models.pdp.enums.PdpHealthStatus;
43 import org.onap.policy.models.pdp.enums.PdpState;
44 import org.onap.policy.models.provider.PolicyModelsProvider;
45 import org.onap.policy.models.provider.PolicyModelsProviderFactory;
46 import org.onap.policy.models.provider.PolicyModelsProviderParameters;
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.ToscaPolicyTypeIdentifier;
50 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
51 import org.onap.policy.models.tosca.legacy.concepts.LegacyGuardPolicyInput;
52 import org.onap.policy.models.tosca.legacy.concepts.LegacyOperationalPolicy;
53 import org.slf4j.Logger;
54 import org.slf4j.LoggerFactory;
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 @NonNull but is null";
65
66     private static final String POLICY_ID_IS_NULL = "policyId is marked @NonNull but is null";
67
68     private static final String PDP_TYPE_IS_NULL = "pdpType is marked @NonNull but is null";
69
70     private static final String SUBGROUP_IS_NULL = "pdpSubGroup is marked @NonNull but is null";
71
72     private static final String GROUP_IS_NULL = "pdpGroupName is marked @NonNull but is null";
73
74     private static final String NAME_IS_NULL = "name is marked @NonNull but is null";
75
76     private static final String FILTER_IS_NULL = "filter is marked @NonNull but is null";
77
78     private static final String INSTANCE = "Instance";
79
80     private static final String POLICY_ID = "policy_id";
81
82     private static final String GROUP = "group";
83
84     private static final String VERSION_100 = "1.0.0";
85
86     private static final Date TIMESTAMP = new Date();
87
88     private static final Logger LOGGER = LoggerFactory.getLogger(DatabasePolicyModelsProviderTest.class);
89
90     PolicyModelsProviderParameters parameters;
91
92     /**
93      * Initialize parameters.
94      */
95     @Before
96     public void setupParameters() {
97         parameters = new PolicyModelsProviderParameters();
98         parameters.setDatabaseDriver("org.h2.Driver");
99         parameters.setDatabaseUrl("jdbc:h2:mem:testdb");
100         parameters.setDatabaseUser("policy");
101         parameters.setDatabasePassword(Base64.getEncoder().encodeToString("P01icY".getBytes()));
102         parameters.setPersistenceUnit("ToscaConceptTest");
103     }
104
105     @Test
106     public void testInitAndClose() throws Exception {
107         assertThatThrownBy(() -> {
108             new DatabasePolicyModelsProviderImpl(null);
109         }).hasMessage("parameters is marked @NonNull but is null");
110
111         PolicyModelsProvider databaseProvider =
112                 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
113
114         parameters.setDatabaseUrl("jdbc://www.acmecorp.nonexist");
115
116         databaseProvider.close();
117         databaseProvider.init();
118
119         databaseProvider.close();
120
121         parameters.setDatabaseUrl("jdbc:h2:mem:testdb");
122
123         parameters.setPersistenceUnit("WileECoyote");
124
125         assertThatThrownBy(databaseProvider::init).hasMessageContaining("could not create Data Access Object (DAO)");
126
127         parameters.setPersistenceUnit("ToscaConceptTest");
128
129         databaseProvider.init();
130         databaseProvider.close();
131
132         assertThatThrownBy(() -> {
133             databaseProvider.init();
134             databaseProvider.init();
135         }).hasMessage("provider is already initialized");
136
137         databaseProvider.close();
138
139         databaseProvider.close();
140     }
141
142     @Test
143     public void testProviderMethodsNull() throws Exception {
144
145         try (PolicyModelsProvider databaseProvider =
146                         new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters)) {
147
148             assertThatThrownBy(() -> {
149                 databaseProvider.getFilteredPolicyTypes(null);
150             }).hasMessage(FILTER_IS_NULL);
151
152             assertThatThrownBy(() -> {
153                 databaseProvider.getFilteredPolicyTypeList(null);
154             }).hasMessage(FILTER_IS_NULL);
155
156             assertThatThrownBy(() -> {
157                 databaseProvider.createPolicyTypes(null);
158             }).hasMessage(TEMPLATE_IS_NULL);
159
160             assertThatThrownBy(() -> {
161                 databaseProvider.updatePolicyTypes(null);
162             }).hasMessage(TEMPLATE_IS_NULL);
163
164             assertThatThrownBy(() -> {
165                 databaseProvider.deletePolicyType(null, null);
166             }).hasMessage(NAME_IS_NULL);
167
168             assertThatThrownBy(() -> {
169                 databaseProvider.deletePolicyType("aaa", null);
170             }).hasMessage("version is marked @NonNull but is null");
171
172             assertThatThrownBy(() -> {
173                 databaseProvider.deletePolicyType(null, "aaa");
174             }).hasMessage(NAME_IS_NULL);
175
176             assertThatThrownBy(() -> {
177                 databaseProvider.getFilteredPolicies(null);
178             }).hasMessage(FILTER_IS_NULL);
179
180             assertThatThrownBy(() -> {
181                 databaseProvider.getFilteredPolicyList(null);
182             }).hasMessage(FILTER_IS_NULL);
183
184             assertThatThrownBy(() -> {
185                 databaseProvider.createPolicies(null);
186             }).hasMessage(TEMPLATE_IS_NULL);
187
188             assertThatThrownBy(() -> {
189                 databaseProvider.updatePolicies(null);
190             }).hasMessage(TEMPLATE_IS_NULL);
191
192             assertThatThrownBy(() -> {
193                 databaseProvider.deletePolicy(null, null);
194             }).hasMessage(NAME_IS_NULL);
195
196             assertThatThrownBy(() -> {
197                 databaseProvider.deletePolicy(null, "aaa");
198             }).hasMessage(NAME_IS_NULL);
199
200             assertThatThrownBy(() -> {
201                 databaseProvider.deletePolicy("aaa", null);
202             }).hasMessage("version is marked @NonNull but is null");
203
204             assertThatThrownBy(() -> {
205                 databaseProvider.getOperationalPolicy(null, null);
206             }).hasMessage(POLICY_ID_IS_NULL);
207
208             assertThatThrownBy(() -> {
209                 databaseProvider.getOperationalPolicy(null, "");
210             }).hasMessage(POLICY_ID_IS_NULL);
211
212             assertThatThrownBy(() -> {
213                 databaseProvider.getOperationalPolicy("", null);
214             }).hasMessage("no policy found for policy: :null");
215
216             assertThatThrownBy(() -> {
217                 databaseProvider.createOperationalPolicy(null);
218             }).hasMessage("legacyOperationalPolicy is marked @NonNull but is null");
219
220             assertThatThrownBy(() -> {
221                 databaseProvider.updateOperationalPolicy(null);
222             }).hasMessage("legacyOperationalPolicy is marked @NonNull but is null");
223
224             assertThatThrownBy(() -> {
225                 databaseProvider.deleteOperationalPolicy(null, null);
226             }).hasMessage(POLICY_ID_IS_NULL);
227
228             assertThatThrownBy(() -> {
229                 databaseProvider.deleteOperationalPolicy(null, "");
230             }).hasMessage(POLICY_ID_IS_NULL);
231
232             assertThatThrownBy(() -> {
233                 databaseProvider.deleteOperationalPolicy("", null);
234             }).hasMessage("policyVersion is marked @NonNull but is null");
235
236             assertThatThrownBy(() -> {
237                 databaseProvider.getGuardPolicy(null, null);
238             }).hasMessage(POLICY_ID_IS_NULL);
239
240             assertThatThrownBy(() -> {
241                 databaseProvider.getGuardPolicy(null, "");
242             }).hasMessage(POLICY_ID_IS_NULL);
243
244             assertThatThrownBy(() -> {
245                 databaseProvider.getGuardPolicy("", null);
246             }).hasMessage("no policy found for policy: :null");
247
248             assertThatThrownBy(() -> {
249                 databaseProvider.createGuardPolicy(null);
250             }).hasMessage("legacyGuardPolicy is marked @NonNull but is null");
251
252             assertThatThrownBy(() -> {
253                 databaseProvider.updateGuardPolicy(null);
254             }).hasMessage("legacyGuardPolicy is marked @NonNull but is null");
255
256             assertThatThrownBy(() -> {
257                 databaseProvider.deleteGuardPolicy(null, null);
258             }).hasMessage(POLICY_ID_IS_NULL);
259
260             assertThatThrownBy(() -> {
261                 databaseProvider.deleteGuardPolicy(null, "");
262             }).hasMessage(POLICY_ID_IS_NULL);
263
264             assertThatThrownBy(() -> {
265                 databaseProvider.deleteGuardPolicy("", null);
266             }).hasMessage("policyVersion is marked @NonNull but is null");
267
268             assertThatThrownBy(() -> {
269                 databaseProvider.getFilteredPdpGroups(null);
270             }).hasMessage(FILTER_IS_NULL);
271
272             assertThatThrownBy(() -> {
273                 databaseProvider.createPdpGroups(null);
274             }).hasMessage("pdpGroups is marked @NonNull but is null");
275
276             assertThatThrownBy(() -> {
277                 databaseProvider.updatePdpGroups(null);
278             }).hasMessage("pdpGroups is marked @NonNull but is null");
279
280             assertThatThrownBy(() -> {
281                 databaseProvider.updatePdpSubGroup(null, null);
282             }).hasMessage(GROUP_IS_NULL);
283
284             assertThatThrownBy(() -> {
285                 databaseProvider.updatePdpSubGroup(null, new PdpSubGroup());
286             }).hasMessage(GROUP_IS_NULL);
287
288             assertThatThrownBy(() -> {
289                 databaseProvider.updatePdpSubGroup(NAME, null);
290             }).hasMessage(SUBGROUP_IS_NULL);
291
292             assertThatThrownBy(() -> {
293                 databaseProvider.updatePdpSubGroup(NAME, new PdpSubGroup());
294             }).hasMessage("parameter \"localName\" is null");
295
296             assertThatThrownBy(() -> {
297                 databaseProvider.updatePdp(null, null, null);
298             }).hasMessage(GROUP_IS_NULL);
299
300             assertThatThrownBy(() -> {
301                 databaseProvider.updatePdp(null, null, new Pdp());
302             }).hasMessage(GROUP_IS_NULL);
303
304             assertThatThrownBy(() -> {
305                 databaseProvider.updatePdp(null, "sub", null);
306             }).hasMessage(GROUP_IS_NULL);
307
308             assertThatThrownBy(() -> {
309                 databaseProvider.updatePdp(null, "sub", new Pdp());
310             }).hasMessage(GROUP_IS_NULL);
311
312             assertThatThrownBy(() -> {
313                 databaseProvider.updatePdp(NAME, null, null);
314             }).hasMessage(SUBGROUP_IS_NULL);
315
316             assertThatThrownBy(() -> {
317                 databaseProvider.updatePdp(NAME, null, new Pdp());
318             }).hasMessage(SUBGROUP_IS_NULL);
319
320             assertThatThrownBy(() -> {
321                 databaseProvider.updatePdp(NAME, "sub", null);
322             }).hasMessage("pdp is marked @NonNull but is null");
323
324             assertThatThrownBy(() -> {
325                 databaseProvider.updatePdp(NAME, "sub", new Pdp());
326             }).hasMessage("parameter \"localName\" is null");
327
328             assertThatThrownBy(() -> {
329                 databaseProvider.deletePdpGroup(null);
330             }).hasMessage(NAME_IS_NULL);
331
332             assertThatThrownBy(() -> {
333                 databaseProvider.getFilteredPdpStatistics(NAME, null, "sub", TIMESTAMP, TIMESTAMP);
334             }).hasMessage(GROUP_IS_NULL);
335
336             assertThatThrownBy(() -> {
337                 databaseProvider.createPdpStatistics(null);
338             }).hasMessage("pdpStatisticsList is marked @NonNull but is null");
339
340             assertThatThrownBy(() -> {
341                 databaseProvider.updatePdpStatistics(null);
342             }).hasMessage("pdpStatisticsList is marked @NonNull but is null");
343
344             assertThatThrownBy(() -> {
345                 databaseProvider.deletePdpStatistics(null, TIMESTAMP);
346             }).hasMessage(NAME_IS_NULL);
347
348         }
349     }
350
351     @Test
352     public void testProviderMethodsNotInit() throws Exception {
353         PolicyModelsProvider databaseProvider =
354                 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
355
356         databaseProvider.close();
357
358         assertThatThrownBy(() -> {
359             databaseProvider.getPolicyTypes(NAME, "version");
360         }).hasMessage("policy models provider is not initilaized");
361     }
362
363     @Test
364     public void testProviderMethods() {
365         try (PolicyModelsProvider databaseProvider =
366                 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters)) {
367
368             assertTrue(databaseProvider.getPolicyTypes(NAME, VERSION_100).getPolicyTypes().isEmpty());
369             assertTrue(databaseProvider.getPolicyTypeList(NAME, VERSION_100).isEmpty());
370             assertEquals(0, databaseProvider.getFilteredPolicyTypes(ToscaPolicyTypeFilter.builder().build())
371                     .getPolicyTypes().size());
372             assertEquals(0, databaseProvider.getFilteredPolicyTypeList(ToscaPolicyTypeFilter.builder().build()).size());
373
374             assertThatThrownBy(() -> {
375                 databaseProvider.createPolicyTypes(new ToscaServiceTemplate());
376             }).hasMessage("no policy types specified on service template");
377
378             assertThatThrownBy(() -> {
379                 databaseProvider.updatePolicyTypes(new ToscaServiceTemplate());
380             }).hasMessage("no policy types specified on service template");
381
382             assertTrue(databaseProvider.deletePolicyType(NAME, VERSION_100).getPolicyTypes().isEmpty());
383
384             assertTrue(databaseProvider.deletePolicyType(NAME, VERSION_100).getPolicyTypes().isEmpty());
385
386             assertTrue(
387                     databaseProvider.getPolicies(NAME, VERSION_100).getToscaTopologyTemplate().getPolicies().isEmpty());
388             assertTrue(databaseProvider.getPolicyList(NAME, VERSION_100).isEmpty());
389             assertEquals(0, databaseProvider.getFilteredPolicies(ToscaPolicyFilter.builder().build())
390                     .getToscaTopologyTemplate().getPolicies().size());
391             assertEquals(0, databaseProvider.getFilteredPolicyList(ToscaPolicyFilter.builder().build()).size());
392
393             assertThatThrownBy(() -> {
394                 databaseProvider.createPolicies(new ToscaServiceTemplate());
395             }).hasMessage("topology template not specified on service template");
396
397             assertThatThrownBy(() -> {
398                 databaseProvider.updatePolicies(new ToscaServiceTemplate());
399             }).hasMessage("topology template not specified on service template");
400
401             assertTrue(databaseProvider.deletePolicy("Policy", "0.0.0").getToscaTopologyTemplate().getPolicies()
402                     .isEmpty());
403
404             assertThatThrownBy(() -> {
405                 databaseProvider.getOperationalPolicy(POLICY_ID, null);
406             }).hasMessage("no policy found for policy: policy_id:null");
407
408             assertThatThrownBy(() -> {
409                 databaseProvider.getOperationalPolicy(POLICY_ID, "10");
410             }).hasMessage("no policy found for policy: policy_id:10");
411
412             assertThatThrownBy(() -> {
413                 databaseProvider.createOperationalPolicy(new LegacyOperationalPolicy());
414             }).hasMessage(NAME_IS_NULL);
415
416             assertThatThrownBy(() -> {
417                 databaseProvider.updateOperationalPolicy(new LegacyOperationalPolicy());
418             }).hasMessage(NAME_IS_NULL);
419
420             assertThatThrownBy(() -> {
421                 databaseProvider.deleteOperationalPolicy(POLICY_ID, "55");
422             }).hasMessage("no policy found for policy: policy_id:55");
423
424             assertThatThrownBy(() -> {
425                 databaseProvider.getGuardPolicy(POLICY_ID, null);
426             }).hasMessage("no policy found for policy: policy_id:null");
427
428             assertThatThrownBy(() -> {
429                 databaseProvider.getGuardPolicy(POLICY_ID, "6");
430             }).hasMessage("no policy found for policy: policy_id:6");
431
432             assertThatThrownBy(() -> {
433                 databaseProvider.createGuardPolicy(new LegacyGuardPolicyInput());
434             }).hasMessage("policy type for guard policy \"null\" unknown");
435
436             assertThatThrownBy(() -> {
437                 databaseProvider.updateGuardPolicy(new LegacyGuardPolicyInput());
438             }).hasMessage("policy type for guard policy \"null\" unknown");
439
440             assertThatThrownBy(() -> {
441                 databaseProvider.deleteGuardPolicy(POLICY_ID, "33");
442             }).hasMessage("no policy found for policy: policy_id:33");
443
444             assertEquals(0, databaseProvider.getPdpGroups(NAME).size());
445             assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
446
447             assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
448             assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
449
450             PdpGroup pdpGroup = new PdpGroup();
451             pdpGroup.setName(GROUP);
452             pdpGroup.setVersion("1.2.3");
453             pdpGroup.setPdpGroupState(PdpState.ACTIVE);
454             pdpGroup.setPdpSubgroups(new ArrayList<>());
455             List<PdpGroup> groupList = new ArrayList<>();
456             groupList.add(pdpGroup);
457
458             PdpSubGroup pdpSubGroup = new PdpSubGroup();
459             pdpSubGroup.setPdpType("type");
460             pdpSubGroup.setDesiredInstanceCount(123);
461             pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
462             pdpSubGroup.getSupportedPolicyTypes().add(new ToscaPolicyTypeIdentifier("type", "7.8.9"));
463             pdpGroup.getPdpSubgroups().add(pdpSubGroup);
464
465             Pdp pdp = new Pdp();
466             pdp.setInstanceId("type-0");
467             pdp.setMessage("Hello");
468             pdp.setPdpState(PdpState.ACTIVE);
469             pdp.setHealthy(PdpHealthStatus.UNKNOWN);
470             pdpSubGroup.setPdpInstances(new ArrayList<>());
471             pdpSubGroup.getPdpInstances().add(pdp);
472
473             PdpStatistics pdpStatistics = new PdpStatistics();
474             pdpStatistics.setPdpInstanceId("Pdp1");
475             pdpStatistics.setTimeStamp(new Date());
476             pdpStatistics.setPdpGroupName("DefaultGroup");
477             ArrayList<PdpStatistics> statisticsArrayList = new ArrayList<>();
478             statisticsArrayList.add(pdpStatistics);
479
480             assertEquals(123, databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0)
481                     .getDesiredInstanceCount());
482             assertEquals(1, databaseProvider.getPdpGroups(GROUP).size());
483
484             pdpSubGroup.setDesiredInstanceCount(234);
485             databaseProvider.updatePdpSubGroup(GROUP, pdpSubGroup);
486             assertEquals(234, databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups()
487                     .get(0).getDesiredInstanceCount());
488
489             assertEquals("Hello", databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups()
490                     .get(0).getPdpInstances().get(0).getMessage());
491             pdp.setMessage("Howdy");
492             databaseProvider.updatePdp(GROUP, "type", pdp);
493             assertEquals("Howdy", databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups()
494                     .get(0).getPdpInstances().get(0).getMessage());
495
496             assertThatThrownBy(() -> {
497                 databaseProvider.deletePdpGroup(NAME);
498             }).hasMessage("delete of PDP group \"name:0.0.0\" failed, PDP group does not exist");
499
500             assertEquals(pdpGroup.getName(), databaseProvider.deletePdpGroup(GROUP).getName());
501
502             assertEquals(0, databaseProvider.getPdpStatistics(null,null).size());
503
504             databaseProvider.getFilteredPdpStatistics(null, GROUP,null, null, null);
505             databaseProvider.getFilteredPdpStatistics(null, GROUP,null, new Date(), null);
506             databaseProvider.getFilteredPdpStatistics(null, GROUP,null, null, new Date());
507             databaseProvider.getFilteredPdpStatistics(null, GROUP,null, new Date(), new Date());
508
509             databaseProvider.getFilteredPdpStatistics(NAME, GROUP,null, null, null);
510             databaseProvider.getFilteredPdpStatistics(NAME, GROUP,null, new Date(), new Date());
511
512             databaseProvider.getFilteredPdpStatistics(NAME, GROUP,"type", null, null);
513             databaseProvider.getFilteredPdpStatistics(NAME, GROUP,"type", new Date(), new Date());
514
515             databaseProvider.createPdpStatistics(statisticsArrayList);
516             databaseProvider.updatePdpStatistics(statisticsArrayList);
517
518             databaseProvider.deletePdpStatistics("pdp1",null);
519         } catch (Exception exc) {
520             LOGGER.warn("test should not throw an exception", exc);
521             fail("test should not throw an exception");
522         }
523     }
524 }