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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 * SPDX-License-Identifier: Apache-2.0
20 * ============LICENSE_END=========================================================
23 package org.onap.policy.models.provider.impl;
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;
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;
55 * Test the database models provider implementation.
57 * @author Liam Fallon (liam.fallon@est.tech)
59 public class DatabasePolicyModelsProviderTest {
60 private static final String NAME = "name";
62 private static final String TEMPLATE_IS_NULL = "^serviceTemplate is marked .*on.*ull but is null$";
64 private static final String SUBGROUP_IS_NULL = "^pdpSubGroup is marked .*on.*ull but is null$";
66 private static final String GROUP_IS_NULL = "^pdpGroupName is marked .*on.*ull but is null$";
68 private static final String NAME_IS_NULL = "^name is marked .*on.*ull but is null$";
70 private static final String FILTER_IS_NULL = "^filter is marked .*on.*ull but is null$";
72 private static final String GROUP = "group";
74 private static final String VERSION_100 = "1.0.0";
76 private static final Date TIMESTAMP = new Date();
78 private static final String ORDER = "DESC";
80 PolicyModelsProviderParameters parameters;
83 * Initialize parameters.
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");
96 public void testInitAndClose() throws Exception {
97 assertThatThrownBy(() -> {
98 new DatabasePolicyModelsProviderImpl(null);
99 }).hasMessageMatching("^parameters is marked .*on.*ull but is null$");
101 PolicyModelsProvider databaseProvider =
102 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
104 parameters.setDatabaseUrl("jdbc://www.acmecorp.nonexist");
106 databaseProvider.close();
107 databaseProvider.init();
109 databaseProvider.close();
111 parameters.setDatabaseUrl("jdbc:h2:mem:testdb");
113 parameters.setPersistenceUnit("WileECoyote");
115 assertThatThrownBy(databaseProvider::init).hasMessageContaining("could not create Data Access Object (DAO)");
117 parameters.setPersistenceUnit("ToscaConceptTest");
119 databaseProvider.init();
120 databaseProvider.close();
122 assertThatThrownBy(() -> {
123 databaseProvider.init();
124 databaseProvider.init();
125 }).hasMessage("provider is already initialized");
127 databaseProvider.close();
129 databaseProvider.close();
133 public void testProviderMethodsNull() throws Exception {
135 PolicyModelsProvider databaseProvider =
136 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
138 assertThatThrownBy(() -> {
139 databaseProvider.getFilteredPolicyTypes(null);
140 }).hasMessageMatching(FILTER_IS_NULL);
142 assertThatThrownBy(() -> {
143 databaseProvider.getFilteredPolicyTypeList(null);
144 }).hasMessageMatching(FILTER_IS_NULL);
146 assertThatThrownBy(() -> {
147 databaseProvider.createPolicyTypes(null);
148 }).hasMessageMatching(TEMPLATE_IS_NULL);
150 assertThatThrownBy(() -> {
151 databaseProvider.updatePolicyTypes(null);
152 }).hasMessageMatching(TEMPLATE_IS_NULL);
154 assertThatThrownBy(() -> {
155 databaseProvider.deletePolicyType(null, null);
156 }).hasMessageMatching(NAME_IS_NULL);
158 assertThatThrownBy(() -> {
159 databaseProvider.deletePolicyType("aaa", null);
160 }).hasMessageMatching("^version is marked .*on.*ull but is null$");
162 assertThatThrownBy(() -> {
163 databaseProvider.deletePolicyType(null, "aaa");
164 }).hasMessageMatching(NAME_IS_NULL);
166 assertThatThrownBy(() -> {
167 databaseProvider.getFilteredPolicies(null);
168 }).hasMessageMatching(FILTER_IS_NULL);
170 assertThatThrownBy(() -> {
171 databaseProvider.getFilteredPolicyList(null);
172 }).hasMessageMatching(FILTER_IS_NULL);
174 assertThatThrownBy(() -> {
175 databaseProvider.createPolicies(null);
176 }).hasMessageMatching(TEMPLATE_IS_NULL);
178 assertThatThrownBy(() -> {
179 databaseProvider.updatePolicies(null);
180 }).hasMessageMatching(TEMPLATE_IS_NULL);
182 assertThatThrownBy(() -> {
183 databaseProvider.deletePolicy(null, null);
184 }).hasMessageMatching(NAME_IS_NULL);
186 assertThatThrownBy(() -> {
187 databaseProvider.deletePolicy(null, "aaa");
188 }).hasMessageMatching(NAME_IS_NULL);
190 assertThatThrownBy(() -> {
191 databaseProvider.deletePolicy("aaa", null);
192 }).hasMessageMatching("^version is marked .*on.*ull but is null$");
194 assertThatThrownBy(() -> {
195 databaseProvider.getFilteredPdpGroups(null);
196 }).hasMessageMatching(FILTER_IS_NULL);
198 assertThatThrownBy(() -> {
199 databaseProvider.createPdpGroups(null);
200 }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
202 assertThatThrownBy(() -> {
203 databaseProvider.updatePdpGroups(null);
204 }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
206 assertThatThrownBy(() -> {
207 databaseProvider.updatePdpSubGroup(null, null);
208 }).hasMessageMatching(GROUP_IS_NULL);
210 assertThatThrownBy(() -> {
211 databaseProvider.updatePdpSubGroup(null, new PdpSubGroup());
212 }).hasMessageMatching(GROUP_IS_NULL);
214 assertThatThrownBy(() -> {
215 databaseProvider.updatePdpSubGroup(NAME, null);
216 }).hasMessageMatching(SUBGROUP_IS_NULL);
218 assertThatThrownBy(() -> {
219 databaseProvider.updatePdpSubGroup(NAME, new PdpSubGroup());
220 }).hasMessage("parameter \"localName\" is null");
222 assertThatThrownBy(() -> {
223 databaseProvider.updatePdp(null, null, null);
224 }).hasMessageMatching(GROUP_IS_NULL);
226 assertThatThrownBy(() -> {
227 databaseProvider.updatePdp(null, null, new Pdp());
228 }).hasMessageMatching(GROUP_IS_NULL);
230 assertThatThrownBy(() -> {
231 databaseProvider.updatePdp(null, "sub", null);
232 }).hasMessageMatching(GROUP_IS_NULL);
234 assertThatThrownBy(() -> {
235 databaseProvider.updatePdp(null, "sub", new Pdp());
236 }).hasMessageMatching(GROUP_IS_NULL);
238 assertThatThrownBy(() -> {
239 databaseProvider.updatePdp(NAME, null, null);
240 }).hasMessageMatching(SUBGROUP_IS_NULL);
242 assertThatThrownBy(() -> {
243 databaseProvider.updatePdp(NAME, null, new Pdp());
244 }).hasMessageMatching(SUBGROUP_IS_NULL);
246 assertThatThrownBy(() -> {
247 databaseProvider.updatePdp(NAME, "sub", null);
248 }).hasMessageMatching("^pdp is marked .*on.*ull but is null$");
250 assertThatThrownBy(() -> {
251 databaseProvider.updatePdp(NAME, "sub", new Pdp());
252 }).hasMessage("parameter \"localName\" is null");
254 assertThatThrownBy(() -> {
255 databaseProvider.deletePdpGroup(null);
256 }).hasMessageMatching(NAME_IS_NULL);
258 assertThatThrownBy(() -> {
259 databaseProvider.getFilteredPdpStatistics(NAME, null, "sub", TIMESTAMP, TIMESTAMP, ORDER, 0);
260 }).hasMessageMatching(GROUP_IS_NULL);
262 assertThatThrownBy(() -> {
263 databaseProvider.createPdpStatistics(null);
264 }).hasMessageMatching("^pdpStatisticsList is marked .*on.*ull but is null$");
266 assertThatThrownBy(() -> {
267 databaseProvider.updatePdpStatistics(null);
268 }).hasMessageMatching("^pdpStatisticsList is marked .*on.*ull but is null$");
270 assertThatThrownBy(() -> {
271 databaseProvider.deletePdpStatistics(null, TIMESTAMP);
272 }).hasMessageMatching(NAME_IS_NULL);
274 databaseProvider.close();
278 public void testProviderMethodsNotInit() throws Exception {
279 PolicyModelsProvider databaseProvider =
280 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
282 databaseProvider.close();
284 assertThatThrownBy(() -> {
285 databaseProvider.getPolicyTypes(NAME, "version");
286 }).hasMessage("policy models provider is not initilaized");
290 public void testProviderMethods() throws PfModelException {
291 PolicyModelsProvider databaseProvider =
292 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
294 assertThatThrownBy(() -> databaseProvider.getPolicyTypes(NAME, VERSION_100))
295 .hasMessage("service template not found in database");
297 assertTrue(databaseProvider.getPolicyTypeList(NAME, VERSION_100).isEmpty());
299 assertThatThrownBy(() -> databaseProvider.getFilteredPolicyTypes(ToscaPolicyTypeFilter.builder().build()))
300 .hasMessage("service template not found in database");
302 assertTrue(databaseProvider.getFilteredPolicyTypeList(ToscaPolicyTypeFilter.builder().build()).isEmpty());
304 assertThatThrownBy(() -> {
305 databaseProvider.createPolicyTypes(new ToscaServiceTemplate());
306 }).hasMessage("no policy types specified on service template");
308 assertThatThrownBy(() -> {
309 databaseProvider.updatePolicyTypes(new ToscaServiceTemplate());
310 }).hasMessage("no policy types specified on service template");
312 assertThatThrownBy(() -> databaseProvider.deletePolicyType(NAME, VERSION_100))
313 .hasMessage("service template not found in database");
315 assertThatThrownBy(() -> databaseProvider.getPolicies(NAME, VERSION_100))
316 .hasMessage("service template not found in database");
318 assertTrue(databaseProvider.getPolicyList(NAME, VERSION_100).isEmpty());
320 assertThatThrownBy(() -> databaseProvider.getFilteredPolicies(ToscaPolicyFilter.builder().build()))
321 .hasMessage("service template not found in database");
323 assertTrue(databaseProvider.getFilteredPolicyList(ToscaPolicyFilter.builder().build()).isEmpty());
325 assertThatThrownBy(() -> {
326 databaseProvider.createPolicies(new ToscaServiceTemplate());
327 }).hasMessage("topology template not specified on service template");
329 assertThatThrownBy(() -> {
330 databaseProvider.updatePolicies(new ToscaServiceTemplate());
331 }).hasMessage("topology template not specified on service template");
333 assertThatThrownBy(() -> databaseProvider.deletePolicy("Policy", "0.0.0").getToscaTopologyTemplate())
334 .hasMessage("service template not found in database");
336 assertEquals(0, databaseProvider.getPdpGroups(NAME).size());
337 assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
339 assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
340 assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
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);
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);
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);
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);
374 databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getDesiredInstanceCount());
375 assertEquals(1, databaseProvider.getPdpGroups(GROUP).size());
377 pdpSubGroup.setDesiredInstanceCount(234);
378 databaseProvider.updatePdpSubGroup(GROUP, pdpSubGroup);
380 databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getDesiredInstanceCount());
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());
389 assertThatThrownBy(() -> {
390 databaseProvider.deletePdpGroup(NAME);
391 }).hasMessage("delete of PDP group \"name:0.0.0\" failed, PDP group does not exist");
393 assertEquals(pdpGroup.getName(), databaseProvider.deletePdpGroup(GROUP).getName());
395 assertEquals(0, databaseProvider.getPdpStatistics(null, null).size());
396 assertEquals(1, databaseProvider.createPdpStatistics(statisticsArrayList).size());
397 assertEquals(1, databaseProvider.updatePdpStatistics(statisticsArrayList).size());
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());
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());
407 databaseProvider.getFilteredPdpStatistics(null, GROUP, null, new Date(), new Date(), ORDER, 0).size());
409 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, null, null, null, ORDER, 0).get(0)
410 .getPdpInstanceId());
412 databaseProvider.getFilteredPdpStatistics(NAME, GROUP, null, new Date(), new Date(), ORDER, 0).size());
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)
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)
426 assertEquals(NAME, databaseProvider.deletePdpStatistics(NAME, null).get(0).getPdpInstanceId());
427 assertEquals(0, databaseProvider.getPdpStatistics(null, null).size());
429 assertThat(databaseProvider.getAllPolicyStatus()).isEmpty();
430 assertThat(databaseProvider.getAllPolicyStatus(new ToscaConceptIdentifierOptVersion("MyPolicy", null)))
432 assertThat(databaseProvider.getGroupPolicyStatus(GROUP)).isEmpty();
433 assertThatCode(() -> databaseProvider.cudPolicyStatus(null, null, null)).doesNotThrowAnyException();
435 databaseProvider.close();
439 public void testDeletePolicyDeployedInSubgroup() throws PfModelException {
440 List<ToscaConceptIdentifier> policies = new ArrayList<>();
442 policies.add(new ToscaConceptIdentifier("p0", "0.0.1"));
443 policies.add(new ToscaConceptIdentifier("p1", "0.0.1"));
445 List<ToscaConceptIdentifier> supportedPolicyTypes = new ArrayList<>();
446 supportedPolicyTypes.add(new ToscaConceptIdentifier("pt2", "0.0.1"));
448 PdpSubGroup subGroup = new PdpSubGroup();
449 subGroup.setPdpType("pdpType");
450 subGroup.setSupportedPolicyTypes(supportedPolicyTypes);
451 subGroup.setPolicies(policies);
453 List<PdpSubGroup> pdpSubgroups = new ArrayList<>();
454 pdpSubgroups.add(subGroup);
456 PdpGroup pdpGroup = new PdpGroup();
457 pdpGroup.setName("pdpGroup");
458 pdpGroup.setPdpGroupState(PdpState.PASSIVE);
459 pdpGroup.setPdpSubgroups(pdpSubgroups);
461 List<PdpGroup> pdpGroups = new ArrayList<>();
462 pdpGroups.add(pdpGroup);
464 PolicyModelsProvider databaseProvider =
465 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
467 databaseProvider.createPdpGroups(pdpGroups);
469 assertThatThrownBy(() -> databaseProvider.deletePolicy("p0", "0.0.1"))
470 .hasMessageContaining("policy is in use, it is deployed in PDP group pdpGroup subgroup pdpType");
472 assertThatThrownBy(() -> databaseProvider.deletePolicy("p3", "0.0.1"))
473 .hasMessageContaining("service template not found in database");
475 databaseProvider.close();
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"));
484 PdpSubGroup subGroup = new PdpSubGroup();
485 subGroup.setPdpType("pdpType");
486 subGroup.setSupportedPolicyTypes(supportedPolicyTypes);
488 List<PdpSubGroup> pdpSubgroups = new ArrayList<>();
489 pdpSubgroups.add(subGroup);
491 PdpGroup pdpGroup = new PdpGroup();
492 pdpGroup.setName("pdpGroup");
493 pdpGroup.setPdpGroupState(PdpState.PASSIVE);
494 pdpGroup.setPdpSubgroups(pdpSubgroups);
496 List<PdpGroup> pdpGroups = new ArrayList<>();
497 pdpGroups.add(pdpGroup);
499 PolicyModelsProvider databaseProvider =
500 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
502 databaseProvider.createPdpGroups(pdpGroups);
504 assertThatThrownBy(() -> databaseProvider.deletePolicyType("pt2", "0.0.1"))
505 .hasMessageContaining("policy type is in use, it is referenced in PDP group pdpGroup subgroup pdpType");
507 assertThatThrownBy(() -> databaseProvider.deletePolicyType("pt0", "0.0.1"))
508 .hasMessageContaining("service template not found in database");
510 databaseProvider.close();