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.time.Instant;
33 import java.util.ArrayList;
34 import java.util.List;
35 import org.junit.After;
36 import org.junit.Before;
37 import org.junit.Test;
38 import org.onap.policy.models.base.PfModelException;
39 import org.onap.policy.models.pdp.concepts.Pdp;
40 import org.onap.policy.models.pdp.concepts.PdpGroup;
41 import org.onap.policy.models.pdp.concepts.PdpGroupFilter;
42 import org.onap.policy.models.pdp.concepts.PdpStatistics;
43 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
44 import org.onap.policy.models.pdp.enums.PdpHealthStatus;
45 import org.onap.policy.models.pdp.enums.PdpState;
46 import org.onap.policy.models.provider.PolicyModelsProvider;
47 import org.onap.policy.models.provider.PolicyModelsProviderFactory;
48 import org.onap.policy.models.provider.PolicyModelsProviderParameters;
49 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
50 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifierOptVersion;
51 import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityFilter;
52 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
53 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType;
54 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
55 import org.onap.policy.models.tosca.authorative.concepts.ToscaTypedEntityFilter;
58 * Test the database models provider implementation.
60 * @author Liam Fallon (liam.fallon@est.tech)
62 public class DatabasePolicyModelsProviderTest {
63 private static final String NAME = "name";
65 private static final String TEMPLATE_IS_NULL = "^serviceTemplate is marked .*on.*ull but is null$";
67 private static final String SUBGROUP_IS_NULL = "^pdpSubGroup is marked .*on.*ull but is null$";
69 private static final String GROUP_IS_NULL = "^pdpGroupName is marked .*on.*ull but is null$";
71 private static final String NAME_IS_NULL = "^name is marked .*on.*ull but is null$";
73 private static final String FILTER_IS_NULL = "^filter is marked .*on.*ull but is null$";
75 private static final String GROUP = "group";
77 private static final String VERSION_100 = "1.0.0";
79 private static final Instant TIMESTAMP = Instant.EPOCH;
81 private static final String ORDER = "DESC";
83 private PolicyModelsProviderParameters parameters;
85 private PolicyModelsProvider databaseProvider;
88 * Initialize parameters.
91 public void setupParameters() {
92 parameters = new PolicyModelsProviderParameters();
93 parameters.setDatabaseDriver("org.h2.Driver");
94 parameters.setDatabaseUrl("jdbc:h2:mem:DatabasePolicyModelsProviderTest");
95 parameters.setDatabaseUser("policy");
96 parameters.setDatabasePassword("P01icY");
97 parameters.setPersistenceUnit("ToscaConceptTest");
104 public void tearDown() throws PfModelException {
105 if (databaseProvider != null) {
106 databaseProvider.close();
111 public void testInitAndClose() throws Exception {
112 assertThatThrownBy(() -> {
113 new DatabasePolicyModelsProviderImpl(null);
114 }).hasMessageMatching("^parameters is marked .*on.*ull but is null$");
116 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
118 parameters.setDatabaseUrl("jdbc://www.acmecorp.nonexist");
120 databaseProvider.close();
121 databaseProvider.init();
123 databaseProvider.close();
125 parameters.setDatabaseUrl("jdbc:h2:mem:DatabasePolicyModelsProviderTest");
127 parameters.setPersistenceUnit("WileECoyote");
129 assertThatThrownBy(databaseProvider::init).hasMessageContaining("could not create Data Access Object (DAO)");
131 parameters.setPersistenceUnit("ToscaConceptTest");
133 databaseProvider.init();
134 databaseProvider.close();
136 assertThatThrownBy(() -> {
137 databaseProvider.init();
138 databaseProvider.init();
139 }).hasMessage("provider is already initialized");
141 databaseProvider.close();
143 databaseProvider.close();
147 public void testProviderMethodsNull() throws Exception {
149 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
151 assertThatThrownBy(() -> {
152 databaseProvider.getFilteredPolicyTypes(null);
153 }).hasMessageMatching(FILTER_IS_NULL);
155 assertThatThrownBy(() -> {
156 databaseProvider.getFilteredPolicyTypeList(null);
157 }).hasMessageMatching(FILTER_IS_NULL);
159 assertThatThrownBy(() -> {
160 databaseProvider.createPolicyTypes(null);
161 }).hasMessageMatching(TEMPLATE_IS_NULL);
163 assertThatThrownBy(() -> {
164 databaseProvider.updatePolicyTypes(null);
165 }).hasMessageMatching(TEMPLATE_IS_NULL);
167 assertThatThrownBy(() -> {
168 databaseProvider.deletePolicyType(null, null);
169 }).hasMessageMatching(NAME_IS_NULL);
171 assertThatThrownBy(() -> {
172 databaseProvider.deletePolicyType("aaa", null);
173 }).hasMessageMatching("^version is marked .*on.*ull but is null$");
175 assertThatThrownBy(() -> {
176 databaseProvider.deletePolicyType(null, "aaa");
177 }).hasMessageMatching(NAME_IS_NULL);
179 assertThatThrownBy(() -> {
180 databaseProvider.getFilteredPolicies(null);
181 }).hasMessageMatching(FILTER_IS_NULL);
183 assertThatThrownBy(() -> {
184 databaseProvider.getFilteredPolicyList(null);
185 }).hasMessageMatching(FILTER_IS_NULL);
187 assertThatThrownBy(() -> {
188 databaseProvider.createPolicies(null);
189 }).hasMessageMatching(TEMPLATE_IS_NULL);
191 assertThatThrownBy(() -> {
192 databaseProvider.updatePolicies(null);
193 }).hasMessageMatching(TEMPLATE_IS_NULL);
195 assertThatThrownBy(() -> {
196 databaseProvider.deletePolicy(null, null);
197 }).hasMessageMatching(NAME_IS_NULL);
199 assertThatThrownBy(() -> {
200 databaseProvider.deletePolicy(null, "aaa");
201 }).hasMessageMatching(NAME_IS_NULL);
203 assertThatThrownBy(() -> {
204 databaseProvider.deletePolicy("aaa", null);
205 }).hasMessageMatching("^version is marked .*on.*ull but is null$");
209 public void testProviderMethodsNullGroup() throws Exception {
211 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
213 assertThatThrownBy(() -> {
214 databaseProvider.getFilteredPdpGroups(null);
215 }).hasMessageMatching(FILTER_IS_NULL);
217 assertThatThrownBy(() -> {
218 databaseProvider.createPdpGroups(null);
219 }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
221 assertThatThrownBy(() -> {
222 databaseProvider.updatePdpGroups(null);
223 }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
225 assertThatThrownBy(() -> {
226 databaseProvider.updatePdpSubGroup(null, null);
227 }).hasMessageMatching(GROUP_IS_NULL);
229 assertThatThrownBy(() -> {
230 databaseProvider.updatePdpSubGroup(null, new PdpSubGroup());
231 }).hasMessageMatching(GROUP_IS_NULL);
233 assertThatThrownBy(() -> {
234 databaseProvider.updatePdpSubGroup(NAME, null);
235 }).hasMessageMatching(SUBGROUP_IS_NULL);
237 assertThatThrownBy(() -> {
238 databaseProvider.updatePdpSubGroup(NAME, new PdpSubGroup());
239 }).hasMessage("parameter \"localName\" is null");
241 assertThatThrownBy(() -> {
242 databaseProvider.updatePdp(null, null, null);
243 }).hasMessageMatching(GROUP_IS_NULL);
245 assertThatThrownBy(() -> {
246 databaseProvider.updatePdp(null, null, new Pdp());
247 }).hasMessageMatching(GROUP_IS_NULL);
249 assertThatThrownBy(() -> {
250 databaseProvider.updatePdp(null, "sub", null);
251 }).hasMessageMatching(GROUP_IS_NULL);
253 assertThatThrownBy(() -> {
254 databaseProvider.updatePdp(null, "sub", new Pdp());
255 }).hasMessageMatching(GROUP_IS_NULL);
257 assertThatThrownBy(() -> {
258 databaseProvider.updatePdp(NAME, null, null);
259 }).hasMessageMatching(SUBGROUP_IS_NULL);
261 assertThatThrownBy(() -> {
262 databaseProvider.updatePdp(NAME, null, new Pdp());
263 }).hasMessageMatching(SUBGROUP_IS_NULL);
265 assertThatThrownBy(() -> {
266 databaseProvider.updatePdp(NAME, "sub", null);
267 }).hasMessageMatching("^pdp is marked .*on.*ull but is null$");
269 assertThatThrownBy(() -> {
270 databaseProvider.updatePdp(NAME, "sub", new Pdp());
271 }).hasMessage("parameter \"localName\" is null");
273 assertThatThrownBy(() -> {
274 databaseProvider.deletePdpGroup(null);
275 }).hasMessageMatching(NAME_IS_NULL);
277 assertThatThrownBy(() -> {
278 databaseProvider.getFilteredPdpStatistics(NAME, null, "sub", TIMESTAMP, TIMESTAMP, ORDER, 0);
279 }).hasMessageMatching(GROUP_IS_NULL);
281 assertThatThrownBy(() -> {
282 databaseProvider.createPdpStatistics(null);
283 }).hasMessageMatching("^pdpStatisticsList is marked .*on.*ull but is null$");
285 assertThatThrownBy(() -> {
286 databaseProvider.updatePdpStatistics(null);
287 }).hasMessageMatching("^pdpStatisticsList is marked .*on.*ull but is null$");
289 assertThatThrownBy(() -> {
290 databaseProvider.deletePdpStatistics(null, TIMESTAMP);
291 }).hasMessageMatching(NAME_IS_NULL);
293 databaseProvider.close();
297 public void testProviderMethodsNotInit() throws Exception {
298 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
300 databaseProvider.close();
302 assertThatThrownBy(() -> {
303 databaseProvider.getPolicyTypes(NAME, "version");
304 }).hasMessage("policy models provider is not initilaized");
308 public void testProviderMethods() throws PfModelException {
309 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
311 assertThatThrownBy(() -> databaseProvider.getPolicyTypes(NAME, VERSION_100))
312 .hasMessage("service template not found in database");
314 assertTrue(databaseProvider.getPolicyTypeList(NAME, VERSION_100).isEmpty());
317 () -> databaseProvider.getFilteredPolicyTypes(ToscaEntityFilter.<ToscaPolicyType>builder().build()))
318 .hasMessage("service template not found in database");
320 assertTrue(databaseProvider.getFilteredPolicyTypeList(ToscaEntityFilter.<ToscaPolicyType>builder().build())
323 assertThatThrownBy(() -> {
324 databaseProvider.createPolicyTypes(new ToscaServiceTemplate());
325 }).hasMessage("no policy types specified on service template");
327 assertThatThrownBy(() -> {
328 databaseProvider.updatePolicyTypes(new ToscaServiceTemplate());
329 }).hasMessage("no policy types specified on service template");
331 assertThatThrownBy(() -> databaseProvider.deletePolicyType(NAME, VERSION_100))
332 .hasMessage("service template not found in database");
334 assertThatThrownBy(() -> databaseProvider.getPolicies(NAME, VERSION_100))
335 .hasMessage("service template not found in database");
337 assertTrue(databaseProvider.getPolicyList(NAME, VERSION_100).isEmpty());
340 () -> databaseProvider.getFilteredPolicies(ToscaTypedEntityFilter.<ToscaPolicy>builder().build()))
341 .hasMessage("service template not found in database");
343 assertTrue(databaseProvider.getFilteredPolicyList(ToscaTypedEntityFilter.<ToscaPolicy>builder().build())
346 assertThatThrownBy(() -> {
347 databaseProvider.createPolicies(new ToscaServiceTemplate());
348 }).hasMessage("topology template not specified on service template");
350 assertThatThrownBy(() -> {
351 databaseProvider.updatePolicies(new ToscaServiceTemplate());
352 }).hasMessage("topology template not specified on service template");
354 assertThatThrownBy(() -> databaseProvider.deletePolicy("Policy", "0.0.0").getToscaTopologyTemplate())
355 .hasMessage("service template not found in database");
357 assertEquals(0, databaseProvider.getPdpGroups(NAME).size());
358 assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
360 assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
361 assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
365 public void testProviderMethodsInGroups() throws PfModelException {
366 PdpGroup pdpGroup = new PdpGroup();
367 pdpGroup.setName(GROUP);
368 pdpGroup.setVersion("1.2.3");
369 pdpGroup.setPdpGroupState(PdpState.ACTIVE);
370 pdpGroup.setPdpSubgroups(new ArrayList<>());
371 List<PdpGroup> groupList = new ArrayList<>();
372 groupList.add(pdpGroup);
374 PdpSubGroup pdpSubGroup = new PdpSubGroup();
375 pdpSubGroup.setPdpType("type");
376 pdpSubGroup.setDesiredInstanceCount(123);
377 pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
378 pdpSubGroup.getSupportedPolicyTypes().add(new ToscaConceptIdentifier("type", "7.8.9"));
379 pdpGroup.getPdpSubgroups().add(pdpSubGroup);
382 pdp.setInstanceId("type-0");
383 pdp.setMessage("Hello");
384 pdp.setPdpState(PdpState.ACTIVE);
385 pdp.setHealthy(PdpHealthStatus.UNKNOWN);
386 pdpSubGroup.setPdpInstances(new ArrayList<>());
387 pdpSubGroup.getPdpInstances().add(pdp);
389 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
392 databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getDesiredInstanceCount());
393 assertEquals(1, databaseProvider.getPdpGroups(GROUP).size());
395 pdpSubGroup.setDesiredInstanceCount(234);
396 databaseProvider.updatePdpSubGroup(GROUP, pdpSubGroup);
398 databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getDesiredInstanceCount());
400 assertEquals("Hello", databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getPdpInstances()
401 .get(0).getMessage());
402 pdp.setMessage("Howdy");
403 databaseProvider.updatePdp(GROUP, "type", pdp);
404 assertEquals("Howdy", databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getPdpInstances()
405 .get(0).getMessage());
407 assertThatThrownBy(() -> {
408 databaseProvider.deletePdpGroup(NAME);
409 }).hasMessage("delete of PDP group \"name:0.0.0\" failed, PDP group does not exist");
411 assertEquals(pdpGroup.getName(), databaseProvider.deletePdpGroup(GROUP).getName());
413 List<PdpStatistics> statisticsArrayList = makePdpStatisticsList();
415 assertThat(databaseProvider.getPdpStatistics(null, null)).isEmpty();
416 assertThat(databaseProvider.createPdpStatistics(statisticsArrayList)).hasSize(1);
417 assertThat(databaseProvider.updatePdpStatistics(statisticsArrayList)).hasSize(1);
421 public void testProviderMethodsStatistics() throws PfModelException {
422 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
423 databaseProvider.createPdpStatistics(makePdpStatisticsList());
425 assertEquals(NAME, databaseProvider.getPdpStatistics(null, null).get(0).getPdpInstanceId());
426 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(null, GROUP, null,
427 null, null, ORDER, 0).get(0).getPdpInstanceId());
428 assertEquals(0, databaseProvider.getFilteredPdpStatistics(null, GROUP, null,
429 Instant.now(), null, ORDER, 0).size());
430 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(null, GROUP, null,
431 null, TIMESTAMP, ORDER, 0).get(0).getPdpInstanceId());
433 databaseProvider.getFilteredPdpStatistics(null, GROUP, null, Instant.now(),
434 Instant.now(), ORDER, 0).size());
436 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, null, null,
437 null, ORDER, 0).get(0).getPdpInstanceId());
439 databaseProvider.getFilteredPdpStatistics(NAME, GROUP, null, Instant.now(), Instant.now(),
442 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type",
443 null, null, ORDER, 0).get(0).getPdpInstanceId());
445 assertEquals(0, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type",
446 Instant.now(), Instant.now(), ORDER, 0).size());
448 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type",
449 null, null, ORDER, 1).get(0).getPdpInstanceId());
450 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type",
451 null, null, ORDER, 5).get(0).getPdpInstanceId());
452 assertEquals(0, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type",
453 Instant.now(), Instant.now(), ORDER, 5).size());
455 assertEquals(NAME, databaseProvider.deletePdpStatistics(NAME, null).get(0).getPdpInstanceId());
456 assertEquals(0, databaseProvider.getPdpStatistics(null, null).size());
458 assertThat(databaseProvider.getAllPolicyStatus()).isEmpty();
459 assertThat(databaseProvider.getAllPolicyStatus(new ToscaConceptIdentifierOptVersion("MyPolicy", null)))
461 assertThat(databaseProvider.getGroupPolicyStatus(GROUP)).isEmpty();
462 assertThatCode(() -> databaseProvider.cudPolicyStatus(null, null, null))
463 .doesNotThrowAnyException();
465 databaseProvider.close();
469 public void testDeletePolicyDeployedInSubgroup() throws PfModelException {
470 List<ToscaConceptIdentifier> policies = new ArrayList<>();
472 policies.add(new ToscaConceptIdentifier("p0", "0.0.1"));
473 policies.add(new ToscaConceptIdentifier("p1", "0.0.1"));
475 List<ToscaConceptIdentifier> supportedPolicyTypes = new ArrayList<>();
476 supportedPolicyTypes.add(new ToscaConceptIdentifier("pt2", "0.0.1"));
478 PdpSubGroup subGroup = new PdpSubGroup();
479 subGroup.setPdpType("pdpType");
480 subGroup.setSupportedPolicyTypes(supportedPolicyTypes);
481 subGroup.setPolicies(policies);
483 List<PdpSubGroup> pdpSubgroups = new ArrayList<>();
484 pdpSubgroups.add(subGroup);
486 PdpGroup pdpGroup = new PdpGroup();
487 pdpGroup.setName("pdpGroup");
488 pdpGroup.setPdpGroupState(PdpState.PASSIVE);
489 pdpGroup.setPdpSubgroups(pdpSubgroups);
491 List<PdpGroup> pdpGroups = new ArrayList<>();
492 pdpGroups.add(pdpGroup);
494 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
496 databaseProvider.createPdpGroups(pdpGroups);
498 assertThatThrownBy(() -> databaseProvider.deletePolicy("p0", "0.0.1"))
499 .hasMessageContaining("policy is in use, it is deployed in PDP group pdpGroup subgroup pdpType");
501 assertThatThrownBy(() -> databaseProvider.deletePolicy("p3", "0.0.1"))
502 .hasMessageContaining("service template not found in database");
504 databaseProvider.close();
508 public void testDeletePolicyTypeSupportedInSubgroup() throws PfModelException {
509 List<ToscaConceptIdentifier> supportedPolicyTypes = new ArrayList<>();
510 supportedPolicyTypes.add(new ToscaConceptIdentifier("pt1", "0.0.1"));
511 supportedPolicyTypes.add(new ToscaConceptIdentifier("pt2", "0.0.1"));
513 PdpSubGroup subGroup = new PdpSubGroup();
514 subGroup.setPdpType("pdpType");
515 subGroup.setSupportedPolicyTypes(supportedPolicyTypes);
517 List<PdpSubGroup> pdpSubgroups = new ArrayList<>();
518 pdpSubgroups.add(subGroup);
520 PdpGroup pdpGroup = new PdpGroup();
521 pdpGroup.setName("pdpGroup");
522 pdpGroup.setPdpGroupState(PdpState.PASSIVE);
523 pdpGroup.setPdpSubgroups(pdpSubgroups);
525 List<PdpGroup> pdpGroups = new ArrayList<>();
526 pdpGroups.add(pdpGroup);
528 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
530 databaseProvider.createPdpGroups(pdpGroups);
532 assertThatThrownBy(() -> databaseProvider.deletePolicyType("pt2", "0.0.1"))
533 .hasMessageContaining("policy type is in use, it is referenced in PDP group pdpGroup subgroup pdpType");
535 assertThatThrownBy(() -> databaseProvider.deletePolicyType("pt0", "0.0.1"))
536 .hasMessageContaining("service template not found in database");
538 databaseProvider.close();
541 private List<PdpStatistics> makePdpStatisticsList() {
542 PdpStatistics pdpStatistics = new PdpStatistics();
543 pdpStatistics.setPdpInstanceId(NAME);
544 pdpStatistics.setTimeStamp(TIMESTAMP);
545 pdpStatistics.setPdpGroupName(GROUP);
546 pdpStatistics.setPdpSubGroupName("type");
547 List<PdpStatistics> statisticsArrayList = List.of(pdpStatistics);
548 return statisticsArrayList;