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$");
196 assertThatThrownBy(() -> {
197 databaseProvider.getFilteredPdpGroups(null);
198 }).hasMessageMatching(FILTER_IS_NULL);
200 assertThatThrownBy(() -> {
201 databaseProvider.createPdpGroups(null);
202 }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
204 assertThatThrownBy(() -> {
205 databaseProvider.updatePdpGroups(null);
206 }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
208 assertThatThrownBy(() -> {
209 databaseProvider.updatePdpSubGroup(null, null);
210 }).hasMessageMatching(GROUP_IS_NULL);
212 assertThatThrownBy(() -> {
213 databaseProvider.updatePdpSubGroup(null, new PdpSubGroup());
214 }).hasMessageMatching(GROUP_IS_NULL);
216 assertThatThrownBy(() -> {
217 databaseProvider.updatePdpSubGroup(NAME, null);
218 }).hasMessageMatching(SUBGROUP_IS_NULL);
220 assertThatThrownBy(() -> {
221 databaseProvider.updatePdpSubGroup(NAME, new PdpSubGroup());
222 }).hasMessage("parameter \"localName\" is null");
224 assertThatThrownBy(() -> {
225 databaseProvider.updatePdp(null, null, null);
226 }).hasMessageMatching(GROUP_IS_NULL);
228 assertThatThrownBy(() -> {
229 databaseProvider.updatePdp(null, null, new Pdp());
230 }).hasMessageMatching(GROUP_IS_NULL);
232 assertThatThrownBy(() -> {
233 databaseProvider.updatePdp(null, "sub", null);
234 }).hasMessageMatching(GROUP_IS_NULL);
236 assertThatThrownBy(() -> {
237 databaseProvider.updatePdp(null, "sub", new Pdp());
238 }).hasMessageMatching(GROUP_IS_NULL);
240 assertThatThrownBy(() -> {
241 databaseProvider.updatePdp(NAME, null, null);
242 }).hasMessageMatching(SUBGROUP_IS_NULL);
244 assertThatThrownBy(() -> {
245 databaseProvider.updatePdp(NAME, null, new Pdp());
246 }).hasMessageMatching(SUBGROUP_IS_NULL);
248 assertThatThrownBy(() -> {
249 databaseProvider.updatePdp(NAME, "sub", null);
250 }).hasMessageMatching("^pdp is marked .*on.*ull but is null$");
252 assertThatThrownBy(() -> {
253 databaseProvider.updatePdp(NAME, "sub", new Pdp());
254 }).hasMessage("parameter \"localName\" is null");
256 assertThatThrownBy(() -> {
257 databaseProvider.deletePdpGroup(null);
258 }).hasMessageMatching(NAME_IS_NULL);
260 assertThatThrownBy(() -> {
261 databaseProvider.getFilteredPdpStatistics(NAME, null, "sub", TIMESTAMP, TIMESTAMP, ORDER, 0);
262 }).hasMessageMatching(GROUP_IS_NULL);
264 assertThatThrownBy(() -> {
265 databaseProvider.createPdpStatistics(null);
266 }).hasMessageMatching("^pdpStatisticsList is marked .*on.*ull but is null$");
268 assertThatThrownBy(() -> {
269 databaseProvider.updatePdpStatistics(null);
270 }).hasMessageMatching("^pdpStatisticsList is marked .*on.*ull but is null$");
272 assertThatThrownBy(() -> {
273 databaseProvider.deletePdpStatistics(null, TIMESTAMP);
274 }).hasMessageMatching(NAME_IS_NULL);
276 databaseProvider.close();
280 public void testProviderMethodsNotInit() throws Exception {
281 PolicyModelsProvider databaseProvider =
282 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
284 databaseProvider.close();
286 assertThatThrownBy(() -> {
287 databaseProvider.getPolicyTypes(NAME, "version");
288 }).hasMessage("policy models provider is not initilaized");
292 public void testProviderMethods() throws PfModelException {
293 PolicyModelsProvider databaseProvider =
294 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
296 assertThatThrownBy(() -> databaseProvider.getPolicyTypes(NAME, VERSION_100))
297 .hasMessage("service template not found in database");
299 assertTrue(databaseProvider.getPolicyTypeList(NAME, VERSION_100).isEmpty());
302 () -> databaseProvider.getFilteredPolicyTypes(ToscaEntityFilter.<ToscaPolicyType>builder().build()))
303 .hasMessage("service template not found in database");
305 assertTrue(databaseProvider.getFilteredPolicyTypeList(ToscaEntityFilter.<ToscaPolicyType>builder().build())
308 assertThatThrownBy(() -> {
309 databaseProvider.createPolicyTypes(new ToscaServiceTemplate());
310 }).hasMessage("no policy types specified on service template");
312 assertThatThrownBy(() -> {
313 databaseProvider.updatePolicyTypes(new ToscaServiceTemplate());
314 }).hasMessage("no policy types specified on service template");
316 assertThatThrownBy(() -> databaseProvider.deletePolicyType(NAME, VERSION_100))
317 .hasMessage("service template not found in database");
319 assertThatThrownBy(() -> databaseProvider.getPolicies(NAME, VERSION_100))
320 .hasMessage("service template not found in database");
322 assertTrue(databaseProvider.getPolicyList(NAME, VERSION_100).isEmpty());
325 () -> databaseProvider.getFilteredPolicies(ToscaTypedEntityFilter.<ToscaPolicy>builder().build()))
326 .hasMessage("service template not found in database");
328 assertTrue(databaseProvider.getFilteredPolicyList(ToscaTypedEntityFilter.<ToscaPolicy>builder().build())
331 assertThatThrownBy(() -> {
332 databaseProvider.createPolicies(new ToscaServiceTemplate());
333 }).hasMessage("topology template not specified on service template");
335 assertThatThrownBy(() -> {
336 databaseProvider.updatePolicies(new ToscaServiceTemplate());
337 }).hasMessage("topology template not specified on service template");
339 assertThatThrownBy(() -> databaseProvider.deletePolicy("Policy", "0.0.0").getToscaTopologyTemplate())
340 .hasMessage("service template not found in database");
342 assertEquals(0, databaseProvider.getPdpGroups(NAME).size());
343 assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
345 assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
346 assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
348 PdpGroup pdpGroup = new PdpGroup();
349 pdpGroup.setName(GROUP);
350 pdpGroup.setVersion("1.2.3");
351 pdpGroup.setPdpGroupState(PdpState.ACTIVE);
352 pdpGroup.setPdpSubgroups(new ArrayList<>());
353 List<PdpGroup> groupList = new ArrayList<>();
354 groupList.add(pdpGroup);
356 PdpSubGroup pdpSubGroup = new PdpSubGroup();
357 pdpSubGroup.setPdpType("type");
358 pdpSubGroup.setDesiredInstanceCount(123);
359 pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
360 pdpSubGroup.getSupportedPolicyTypes().add(new ToscaConceptIdentifier("type", "7.8.9"));
361 pdpGroup.getPdpSubgroups().add(pdpSubGroup);
364 pdp.setInstanceId("type-0");
365 pdp.setMessage("Hello");
366 pdp.setPdpState(PdpState.ACTIVE);
367 pdp.setHealthy(PdpHealthStatus.UNKNOWN);
368 pdpSubGroup.setPdpInstances(new ArrayList<>());
369 pdpSubGroup.getPdpInstances().add(pdp);
371 PdpStatistics pdpStatistics = new PdpStatistics();
372 pdpStatistics.setPdpInstanceId(NAME);
373 pdpStatistics.setTimeStamp(TIMESTAMP);
374 pdpStatistics.setPdpGroupName(GROUP);
375 pdpStatistics.setPdpSubGroupName("type");
376 ArrayList<PdpStatistics> statisticsArrayList = new ArrayList<>();
377 statisticsArrayList.add(pdpStatistics);
380 databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getDesiredInstanceCount());
381 assertEquals(1, databaseProvider.getPdpGroups(GROUP).size());
383 pdpSubGroup.setDesiredInstanceCount(234);
384 databaseProvider.updatePdpSubGroup(GROUP, pdpSubGroup);
386 databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getDesiredInstanceCount());
388 assertEquals("Hello", databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getPdpInstances()
389 .get(0).getMessage());
390 pdp.setMessage("Howdy");
391 databaseProvider.updatePdp(GROUP, "type", pdp);
392 assertEquals("Howdy", databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getPdpInstances()
393 .get(0).getMessage());
395 assertThatThrownBy(() -> {
396 databaseProvider.deletePdpGroup(NAME);
397 }).hasMessage("delete of PDP group \"name:0.0.0\" failed, PDP group does not exist");
399 assertEquals(pdpGroup.getName(), databaseProvider.deletePdpGroup(GROUP).getName());
401 assertEquals(0, databaseProvider.getPdpStatistics(null, null).size());
402 assertEquals(1, databaseProvider.createPdpStatistics(statisticsArrayList).size());
403 assertEquals(1, databaseProvider.updatePdpStatistics(statisticsArrayList).size());
405 assertEquals(NAME, databaseProvider.getPdpStatistics(null, null).get(0).getPdpInstanceId());
406 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(null, GROUP, null,
407 null, null, ORDER, 0).get(0).getPdpInstanceId());
408 assertEquals(0, databaseProvider.getFilteredPdpStatistics(null, GROUP, null,
409 Instant.now(), null, ORDER, 0).size());
410 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(null, GROUP, null,
411 null, TIMESTAMP, ORDER, 0).get(0).getPdpInstanceId());
413 databaseProvider.getFilteredPdpStatistics(null, GROUP, null, Instant.now(),
414 Instant.now(), ORDER, 0).size());
416 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, null, null,
417 null, ORDER, 0).get(0).getPdpInstanceId());
419 databaseProvider.getFilteredPdpStatistics(NAME, GROUP, null, Instant.now(), Instant.now(),
422 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type",
423 null, null, ORDER, 0).get(0).getPdpInstanceId());
425 assertEquals(0, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type",
426 Instant.now(), Instant.now(), ORDER, 0).size());
428 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type",
429 null, null, ORDER, 1).get(0).getPdpInstanceId());
430 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type",
431 null, null, ORDER, 5).get(0).getPdpInstanceId());
432 assertEquals(0, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type",
433 Instant.now(), Instant.now(), ORDER, 5).size());
435 assertEquals(NAME, databaseProvider.deletePdpStatistics(NAME, null).get(0).getPdpInstanceId());
436 assertEquals(0, databaseProvider.getPdpStatistics(null, null).size());
438 assertThat(databaseProvider.getAllPolicyStatus()).isEmpty();
439 assertThat(databaseProvider.getAllPolicyStatus(new ToscaConceptIdentifierOptVersion("MyPolicy", null)))
441 assertThat(databaseProvider.getGroupPolicyStatus(GROUP)).isEmpty();
442 assertThatCode(() -> databaseProvider.cudPolicyStatus(null, null, null))
443 .doesNotThrowAnyException();
445 databaseProvider.close();
449 public void testDeletePolicyDeployedInSubgroup() throws PfModelException {
450 List<ToscaConceptIdentifier> policies = new ArrayList<>();
452 policies.add(new ToscaConceptIdentifier("p0", "0.0.1"));
453 policies.add(new ToscaConceptIdentifier("p1", "0.0.1"));
455 List<ToscaConceptIdentifier> supportedPolicyTypes = new ArrayList<>();
456 supportedPolicyTypes.add(new ToscaConceptIdentifier("pt2", "0.0.1"));
458 PdpSubGroup subGroup = new PdpSubGroup();
459 subGroup.setPdpType("pdpType");
460 subGroup.setSupportedPolicyTypes(supportedPolicyTypes);
461 subGroup.setPolicies(policies);
463 List<PdpSubGroup> pdpSubgroups = new ArrayList<>();
464 pdpSubgroups.add(subGroup);
466 PdpGroup pdpGroup = new PdpGroup();
467 pdpGroup.setName("pdpGroup");
468 pdpGroup.setPdpGroupState(PdpState.PASSIVE);
469 pdpGroup.setPdpSubgroups(pdpSubgroups);
471 List<PdpGroup> pdpGroups = new ArrayList<>();
472 pdpGroups.add(pdpGroup);
474 PolicyModelsProvider databaseProvider =
475 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
477 databaseProvider.createPdpGroups(pdpGroups);
479 assertThatThrownBy(() -> databaseProvider.deletePolicy("p0", "0.0.1"))
480 .hasMessageContaining("policy is in use, it is deployed in PDP group pdpGroup subgroup pdpType");
482 assertThatThrownBy(() -> databaseProvider.deletePolicy("p3", "0.0.1"))
483 .hasMessageContaining("service template not found in database");
485 databaseProvider.close();
489 public void testDeletePolicyTypeSupportedInSubgroup() throws PfModelException {
490 List<ToscaConceptIdentifier> supportedPolicyTypes = new ArrayList<>();
491 supportedPolicyTypes.add(new ToscaConceptIdentifier("pt1", "0.0.1"));
492 supportedPolicyTypes.add(new ToscaConceptIdentifier("pt2", "0.0.1"));
494 PdpSubGroup subGroup = new PdpSubGroup();
495 subGroup.setPdpType("pdpType");
496 subGroup.setSupportedPolicyTypes(supportedPolicyTypes);
498 List<PdpSubGroup> pdpSubgroups = new ArrayList<>();
499 pdpSubgroups.add(subGroup);
501 PdpGroup pdpGroup = new PdpGroup();
502 pdpGroup.setName("pdpGroup");
503 pdpGroup.setPdpGroupState(PdpState.PASSIVE);
504 pdpGroup.setPdpSubgroups(pdpSubgroups);
506 List<PdpGroup> pdpGroups = new ArrayList<>();
507 pdpGroups.add(pdpGroup);
509 PolicyModelsProvider databaseProvider =
510 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
512 databaseProvider.createPdpGroups(pdpGroups);
514 assertThatThrownBy(() -> databaseProvider.deletePolicyType("pt2", "0.0.1"))
515 .hasMessageContaining("policy type is in use, it is referenced in PDP group pdpGroup subgroup pdpType");
517 assertThatThrownBy(() -> databaseProvider.deletePolicyType("pt0", "0.0.1"))
518 .hasMessageContaining("service template not found in database");
520 databaseProvider.close();