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.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.ToscaEntityFilter;
51 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
52 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType;
53 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
54 import org.onap.policy.models.tosca.authorative.concepts.ToscaTypedEntityFilter;
57 * Test the database models provider implementation.
59 * @author Liam Fallon (liam.fallon@est.tech)
61 public class DatabasePolicyModelsProviderTest {
62 private static final String NAME = "name";
64 private static final String TEMPLATE_IS_NULL = "^serviceTemplate is marked .*on.*ull but is null$";
66 private static final String SUBGROUP_IS_NULL = "^pdpSubGroup is marked .*on.*ull but is null$";
68 private static final String GROUP_IS_NULL = "^pdpGroupName is marked .*on.*ull but is null$";
70 private static final String NAME_IS_NULL = "^name is marked .*on.*ull but is null$";
72 private static final String FILTER_IS_NULL = "^filter is marked .*on.*ull but is null$";
74 private static final String GROUP = "group";
76 private static final String VERSION_100 = "1.0.0";
78 private static final Instant TIMESTAMP = Instant.EPOCH;
80 private static final String ORDER = "DESC";
82 PolicyModelsProviderParameters parameters;
85 * Initialize parameters.
88 public void setupParameters() {
89 parameters = new PolicyModelsProviderParameters();
90 parameters.setDatabaseDriver("org.h2.Driver");
91 parameters.setDatabaseUrl("jdbc:h2:mem:testdb");
92 parameters.setDatabaseUser("policy");
93 parameters.setDatabasePassword("P01icY");
94 parameters.setPersistenceUnit("ToscaConceptTest");
98 public void testInitAndClose() throws Exception {
99 assertThatThrownBy(() -> {
100 new DatabasePolicyModelsProviderImpl(null);
101 }).hasMessageMatching("^parameters is marked .*on.*ull but is null$");
103 PolicyModelsProvider databaseProvider =
104 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
106 parameters.setDatabaseUrl("jdbc://www.acmecorp.nonexist");
108 databaseProvider.close();
109 databaseProvider.init();
111 databaseProvider.close();
113 parameters.setDatabaseUrl("jdbc:h2:mem:testdb");
115 parameters.setPersistenceUnit("WileECoyote");
117 assertThatThrownBy(databaseProvider::init).hasMessageContaining("could not create Data Access Object (DAO)");
119 parameters.setPersistenceUnit("ToscaConceptTest");
121 databaseProvider.init();
122 databaseProvider.close();
124 assertThatThrownBy(() -> {
125 databaseProvider.init();
126 databaseProvider.init();
127 }).hasMessage("provider is already initialized");
129 databaseProvider.close();
131 databaseProvider.close();
135 public void testProviderMethodsNull() throws Exception {
137 PolicyModelsProvider databaseProvider =
138 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
140 assertThatThrownBy(() -> {
141 databaseProvider.getFilteredPolicyTypes(null);
142 }).hasMessageMatching(FILTER_IS_NULL);
144 assertThatThrownBy(() -> {
145 databaseProvider.getFilteredPolicyTypeList(null);
146 }).hasMessageMatching(FILTER_IS_NULL);
148 assertThatThrownBy(() -> {
149 databaseProvider.createPolicyTypes(null);
150 }).hasMessageMatching(TEMPLATE_IS_NULL);
152 assertThatThrownBy(() -> {
153 databaseProvider.updatePolicyTypes(null);
154 }).hasMessageMatching(TEMPLATE_IS_NULL);
156 assertThatThrownBy(() -> {
157 databaseProvider.deletePolicyType(null, null);
158 }).hasMessageMatching(NAME_IS_NULL);
160 assertThatThrownBy(() -> {
161 databaseProvider.deletePolicyType("aaa", null);
162 }).hasMessageMatching("^version is marked .*on.*ull but is null$");
164 assertThatThrownBy(() -> {
165 databaseProvider.deletePolicyType(null, "aaa");
166 }).hasMessageMatching(NAME_IS_NULL);
168 assertThatThrownBy(() -> {
169 databaseProvider.getFilteredPolicies(null);
170 }).hasMessageMatching(FILTER_IS_NULL);
172 assertThatThrownBy(() -> {
173 databaseProvider.getFilteredPolicyList(null);
174 }).hasMessageMatching(FILTER_IS_NULL);
176 assertThatThrownBy(() -> {
177 databaseProvider.createPolicies(null);
178 }).hasMessageMatching(TEMPLATE_IS_NULL);
180 assertThatThrownBy(() -> {
181 databaseProvider.updatePolicies(null);
182 }).hasMessageMatching(TEMPLATE_IS_NULL);
184 assertThatThrownBy(() -> {
185 databaseProvider.deletePolicy(null, null);
186 }).hasMessageMatching(NAME_IS_NULL);
188 assertThatThrownBy(() -> {
189 databaseProvider.deletePolicy(null, "aaa");
190 }).hasMessageMatching(NAME_IS_NULL);
192 assertThatThrownBy(() -> {
193 databaseProvider.deletePolicy("aaa", null);
194 }).hasMessageMatching("^version is marked .*on.*ull but is null$");
198 public void testProviderMethodsNullGroup() throws Exception {
200 PolicyModelsProvider databaseProvider =
201 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
203 assertThatThrownBy(() -> {
204 databaseProvider.getFilteredPdpGroups(null);
205 }).hasMessageMatching(FILTER_IS_NULL);
207 assertThatThrownBy(() -> {
208 databaseProvider.createPdpGroups(null);
209 }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
211 assertThatThrownBy(() -> {
212 databaseProvider.updatePdpGroups(null);
213 }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
215 assertThatThrownBy(() -> {
216 databaseProvider.updatePdpSubGroup(null, null);
217 }).hasMessageMatching(GROUP_IS_NULL);
219 assertThatThrownBy(() -> {
220 databaseProvider.updatePdpSubGroup(null, new PdpSubGroup());
221 }).hasMessageMatching(GROUP_IS_NULL);
223 assertThatThrownBy(() -> {
224 databaseProvider.updatePdpSubGroup(NAME, null);
225 }).hasMessageMatching(SUBGROUP_IS_NULL);
227 assertThatThrownBy(() -> {
228 databaseProvider.updatePdpSubGroup(NAME, new PdpSubGroup());
229 }).hasMessage("parameter \"localName\" is null");
231 assertThatThrownBy(() -> {
232 databaseProvider.updatePdp(null, null, null);
233 }).hasMessageMatching(GROUP_IS_NULL);
235 assertThatThrownBy(() -> {
236 databaseProvider.updatePdp(null, null, new Pdp());
237 }).hasMessageMatching(GROUP_IS_NULL);
239 assertThatThrownBy(() -> {
240 databaseProvider.updatePdp(null, "sub", null);
241 }).hasMessageMatching(GROUP_IS_NULL);
243 assertThatThrownBy(() -> {
244 databaseProvider.updatePdp(null, "sub", new Pdp());
245 }).hasMessageMatching(GROUP_IS_NULL);
247 assertThatThrownBy(() -> {
248 databaseProvider.updatePdp(NAME, null, null);
249 }).hasMessageMatching(SUBGROUP_IS_NULL);
251 assertThatThrownBy(() -> {
252 databaseProvider.updatePdp(NAME, null, new Pdp());
253 }).hasMessageMatching(SUBGROUP_IS_NULL);
255 assertThatThrownBy(() -> {
256 databaseProvider.updatePdp(NAME, "sub", null);
257 }).hasMessageMatching("^pdp is marked .*on.*ull but is null$");
259 assertThatThrownBy(() -> {
260 databaseProvider.updatePdp(NAME, "sub", new Pdp());
261 }).hasMessage("parameter \"localName\" is null");
263 assertThatThrownBy(() -> {
264 databaseProvider.deletePdpGroup(null);
265 }).hasMessageMatching(NAME_IS_NULL);
267 assertThatThrownBy(() -> {
268 databaseProvider.getFilteredPdpStatistics(NAME, null, "sub", TIMESTAMP, TIMESTAMP, ORDER, 0);
269 }).hasMessageMatching(GROUP_IS_NULL);
271 assertThatThrownBy(() -> {
272 databaseProvider.createPdpStatistics(null);
273 }).hasMessageMatching("^pdpStatisticsList is marked .*on.*ull but is null$");
275 assertThatThrownBy(() -> {
276 databaseProvider.updatePdpStatistics(null);
277 }).hasMessageMatching("^pdpStatisticsList is marked .*on.*ull but is null$");
279 assertThatThrownBy(() -> {
280 databaseProvider.deletePdpStatistics(null, TIMESTAMP);
281 }).hasMessageMatching(NAME_IS_NULL);
283 databaseProvider.close();
287 public void testProviderMethodsNotInit() throws Exception {
288 PolicyModelsProvider databaseProvider =
289 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
291 databaseProvider.close();
293 assertThatThrownBy(() -> {
294 databaseProvider.getPolicyTypes(NAME, "version");
295 }).hasMessage("policy models provider is not initilaized");
299 public void testProviderMethods() throws PfModelException {
300 PolicyModelsProvider databaseProvider =
301 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
303 assertThatThrownBy(() -> databaseProvider.getPolicyTypes(NAME, VERSION_100))
304 .hasMessage("service template not found in database");
306 assertTrue(databaseProvider.getPolicyTypeList(NAME, VERSION_100).isEmpty());
309 () -> databaseProvider.getFilteredPolicyTypes(ToscaEntityFilter.<ToscaPolicyType>builder().build()))
310 .hasMessage("service template not found in database");
312 assertTrue(databaseProvider.getFilteredPolicyTypeList(ToscaEntityFilter.<ToscaPolicyType>builder().build())
315 assertThatThrownBy(() -> {
316 databaseProvider.createPolicyTypes(new ToscaServiceTemplate());
317 }).hasMessage("no policy types specified on service template");
319 assertThatThrownBy(() -> {
320 databaseProvider.updatePolicyTypes(new ToscaServiceTemplate());
321 }).hasMessage("no policy types specified on service template");
323 assertThatThrownBy(() -> databaseProvider.deletePolicyType(NAME, VERSION_100))
324 .hasMessage("service template not found in database");
326 assertThatThrownBy(() -> databaseProvider.getPolicies(NAME, VERSION_100))
327 .hasMessage("service template not found in database");
329 assertTrue(databaseProvider.getPolicyList(NAME, VERSION_100).isEmpty());
332 () -> databaseProvider.getFilteredPolicies(ToscaTypedEntityFilter.<ToscaPolicy>builder().build()))
333 .hasMessage("service template not found in database");
335 assertTrue(databaseProvider.getFilteredPolicyList(ToscaTypedEntityFilter.<ToscaPolicy>builder().build())
338 assertThatThrownBy(() -> {
339 databaseProvider.createPolicies(new ToscaServiceTemplate());
340 }).hasMessage("topology template not specified on service template");
342 assertThatThrownBy(() -> {
343 databaseProvider.updatePolicies(new ToscaServiceTemplate());
344 }).hasMessage("topology template not specified on service template");
346 assertThatThrownBy(() -> databaseProvider.deletePolicy("Policy", "0.0.0").getToscaTopologyTemplate())
347 .hasMessage("service template not found in database");
349 assertEquals(0, databaseProvider.getPdpGroups(NAME).size());
350 assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
352 assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
353 assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
357 public void testProviderMethodsInGroups() throws PfModelException {
358 PdpGroup pdpGroup = new PdpGroup();
359 pdpGroup.setName(GROUP);
360 pdpGroup.setVersion("1.2.3");
361 pdpGroup.setPdpGroupState(PdpState.ACTIVE);
362 pdpGroup.setPdpSubgroups(new ArrayList<>());
363 List<PdpGroup> groupList = new ArrayList<>();
364 groupList.add(pdpGroup);
366 PdpSubGroup pdpSubGroup = new PdpSubGroup();
367 pdpSubGroup.setPdpType("type");
368 pdpSubGroup.setDesiredInstanceCount(123);
369 pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
370 pdpSubGroup.getSupportedPolicyTypes().add(new ToscaConceptIdentifier("type", "7.8.9"));
371 pdpGroup.getPdpSubgroups().add(pdpSubGroup);
374 pdp.setInstanceId("type-0");
375 pdp.setMessage("Hello");
376 pdp.setPdpState(PdpState.ACTIVE);
377 pdp.setHealthy(PdpHealthStatus.UNKNOWN);
378 pdpSubGroup.setPdpInstances(new ArrayList<>());
379 pdpSubGroup.getPdpInstances().add(pdp);
381 PdpStatistics pdpStatistics = new PdpStatistics();
382 pdpStatistics.setPdpInstanceId(NAME);
383 pdpStatistics.setTimeStamp(TIMESTAMP);
384 pdpStatistics.setPdpGroupName(GROUP);
385 pdpStatistics.setPdpSubGroupName("type");
386 ArrayList<PdpStatistics> statisticsArrayList = new ArrayList<>();
387 statisticsArrayList.add(pdpStatistics);
389 PolicyModelsProvider databaseProvider =
390 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
393 databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getDesiredInstanceCount());
394 assertEquals(1, databaseProvider.getPdpGroups(GROUP).size());
396 pdpSubGroup.setDesiredInstanceCount(234);
397 databaseProvider.updatePdpSubGroup(GROUP, pdpSubGroup);
399 databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getDesiredInstanceCount());
401 assertEquals("Hello", databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getPdpInstances()
402 .get(0).getMessage());
403 pdp.setMessage("Howdy");
404 databaseProvider.updatePdp(GROUP, "type", pdp);
405 assertEquals("Howdy", databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getPdpInstances()
406 .get(0).getMessage());
408 assertThatThrownBy(() -> {
409 databaseProvider.deletePdpGroup(NAME);
410 }).hasMessage("delete of PDP group \"name:0.0.0\" failed, PDP group does not exist");
412 assertEquals(pdpGroup.getName(), databaseProvider.deletePdpGroup(GROUP).getName());
414 assertEquals(0, databaseProvider.getPdpStatistics(null, null).size());
415 assertEquals(1, databaseProvider.createPdpStatistics(statisticsArrayList).size());
416 assertEquals(1, databaseProvider.updatePdpStatistics(statisticsArrayList).size());
421 public void testProviderMethodsStatistics() throws PfModelException {
422 PolicyModelsProvider databaseProvider =
423 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
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 PolicyModelsProvider databaseProvider =
495 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
497 databaseProvider.createPdpGroups(pdpGroups);
499 assertThatThrownBy(() -> databaseProvider.deletePolicy("p0", "0.0.1"))
500 .hasMessageContaining("policy is in use, it is deployed in PDP group pdpGroup subgroup pdpType");
502 assertThatThrownBy(() -> databaseProvider.deletePolicy("p3", "0.0.1"))
503 .hasMessageContaining("service template not found in database");
505 databaseProvider.close();
509 public void testDeletePolicyTypeSupportedInSubgroup() throws PfModelException {
510 List<ToscaConceptIdentifier> supportedPolicyTypes = new ArrayList<>();
511 supportedPolicyTypes.add(new ToscaConceptIdentifier("pt1", "0.0.1"));
512 supportedPolicyTypes.add(new ToscaConceptIdentifier("pt2", "0.0.1"));
514 PdpSubGroup subGroup = new PdpSubGroup();
515 subGroup.setPdpType("pdpType");
516 subGroup.setSupportedPolicyTypes(supportedPolicyTypes);
518 List<PdpSubGroup> pdpSubgroups = new ArrayList<>();
519 pdpSubgroups.add(subGroup);
521 PdpGroup pdpGroup = new PdpGroup();
522 pdpGroup.setName("pdpGroup");
523 pdpGroup.setPdpGroupState(PdpState.PASSIVE);
524 pdpGroup.setPdpSubgroups(pdpSubgroups);
526 List<PdpGroup> pdpGroups = new ArrayList<>();
527 pdpGroups.add(pdpGroup);
529 PolicyModelsProvider databaseProvider =
530 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
532 databaseProvider.createPdpGroups(pdpGroups);
534 assertThatThrownBy(() -> databaseProvider.deletePolicyType("pt2", "0.0.1"))
535 .hasMessageContaining("policy type is in use, it is referenced in PDP group pdpGroup subgroup pdpType");
537 assertThatThrownBy(() -> databaseProvider.deletePolicyType("pt0", "0.0.1"))
538 .hasMessageContaining("service template not found in database");
540 databaseProvider.close();