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.ToscaPolicyFilter;
50 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeFilter;
51 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
54 * Test the database models provider implementation.
56 * @author Liam Fallon (liam.fallon@est.tech)
58 public class DatabasePolicyModelsProviderTest {
59 private static final String NAME = "name";
61 private static final String TEMPLATE_IS_NULL = "^serviceTemplate is marked .*on.*ull but is null$";
63 private static final String SUBGROUP_IS_NULL = "^pdpSubGroup is marked .*on.*ull but is null$";
65 private static final String GROUP_IS_NULL = "^pdpGroupName is marked .*on.*ull but is null$";
67 private static final String NAME_IS_NULL = "^name is marked .*on.*ull but is null$";
69 private static final String FILTER_IS_NULL = "^filter is marked .*on.*ull but is null$";
71 private static final String GROUP = "group";
73 private static final String VERSION_100 = "1.0.0";
75 private static final Date TIMESTAMP = new Date();
77 private static final String ORDER = "DESC";
79 PolicyModelsProviderParameters parameters;
82 * Initialize parameters.
85 public void setupParameters() {
86 parameters = new PolicyModelsProviderParameters();
87 parameters.setDatabaseDriver("org.h2.Driver");
88 parameters.setDatabaseUrl("jdbc:h2:mem:testdb");
89 parameters.setDatabaseUser("policy");
90 parameters.setDatabasePassword("P01icY");
91 parameters.setPersistenceUnit("ToscaConceptTest");
95 public void testInitAndClose() throws Exception {
96 assertThatThrownBy(() -> {
97 new DatabasePolicyModelsProviderImpl(null);
98 }).hasMessageMatching("^parameters is marked .*on.*ull but is null$");
100 PolicyModelsProvider databaseProvider =
101 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
103 parameters.setDatabaseUrl("jdbc://www.acmecorp.nonexist");
105 databaseProvider.close();
106 databaseProvider.init();
108 databaseProvider.close();
110 parameters.setDatabaseUrl("jdbc:h2:mem:testdb");
112 parameters.setPersistenceUnit("WileECoyote");
114 assertThatThrownBy(databaseProvider::init).hasMessageContaining("could not create Data Access Object (DAO)");
116 parameters.setPersistenceUnit("ToscaConceptTest");
118 databaseProvider.init();
119 databaseProvider.close();
121 assertThatThrownBy(() -> {
122 databaseProvider.init();
123 databaseProvider.init();
124 }).hasMessage("provider is already initialized");
126 databaseProvider.close();
128 databaseProvider.close();
132 public void testProviderMethodsNull() throws Exception {
134 PolicyModelsProvider databaseProvider =
135 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
137 assertThatThrownBy(() -> {
138 databaseProvider.getFilteredPolicyTypes(null);
139 }).hasMessageMatching(FILTER_IS_NULL);
141 assertThatThrownBy(() -> {
142 databaseProvider.getFilteredPolicyTypeList(null);
143 }).hasMessageMatching(FILTER_IS_NULL);
145 assertThatThrownBy(() -> {
146 databaseProvider.createPolicyTypes(null);
147 }).hasMessageMatching(TEMPLATE_IS_NULL);
149 assertThatThrownBy(() -> {
150 databaseProvider.updatePolicyTypes(null);
151 }).hasMessageMatching(TEMPLATE_IS_NULL);
153 assertThatThrownBy(() -> {
154 databaseProvider.deletePolicyType(null, null);
155 }).hasMessageMatching(NAME_IS_NULL);
157 assertThatThrownBy(() -> {
158 databaseProvider.deletePolicyType("aaa", null);
159 }).hasMessageMatching("^version is marked .*on.*ull but is null$");
161 assertThatThrownBy(() -> {
162 databaseProvider.deletePolicyType(null, "aaa");
163 }).hasMessageMatching(NAME_IS_NULL);
165 assertThatThrownBy(() -> {
166 databaseProvider.getFilteredPolicies(null);
167 }).hasMessageMatching(FILTER_IS_NULL);
169 assertThatThrownBy(() -> {
170 databaseProvider.getFilteredPolicyList(null);
171 }).hasMessageMatching(FILTER_IS_NULL);
173 assertThatThrownBy(() -> {
174 databaseProvider.createPolicies(null);
175 }).hasMessageMatching(TEMPLATE_IS_NULL);
177 assertThatThrownBy(() -> {
178 databaseProvider.updatePolicies(null);
179 }).hasMessageMatching(TEMPLATE_IS_NULL);
181 assertThatThrownBy(() -> {
182 databaseProvider.deletePolicy(null, null);
183 }).hasMessageMatching(NAME_IS_NULL);
185 assertThatThrownBy(() -> {
186 databaseProvider.deletePolicy(null, "aaa");
187 }).hasMessageMatching(NAME_IS_NULL);
189 assertThatThrownBy(() -> {
190 databaseProvider.deletePolicy("aaa", null);
191 }).hasMessageMatching("^version is marked .*on.*ull but is null$");
193 assertThatThrownBy(() -> {
194 databaseProvider.getFilteredPdpGroups(null);
195 }).hasMessageMatching(FILTER_IS_NULL);
197 assertThatThrownBy(() -> {
198 databaseProvider.createPdpGroups(null);
199 }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
201 assertThatThrownBy(() -> {
202 databaseProvider.updatePdpGroups(null);
203 }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
205 assertThatThrownBy(() -> {
206 databaseProvider.updatePdpSubGroup(null, null);
207 }).hasMessageMatching(GROUP_IS_NULL);
209 assertThatThrownBy(() -> {
210 databaseProvider.updatePdpSubGroup(null, new PdpSubGroup());
211 }).hasMessageMatching(GROUP_IS_NULL);
213 assertThatThrownBy(() -> {
214 databaseProvider.updatePdpSubGroup(NAME, null);
215 }).hasMessageMatching(SUBGROUP_IS_NULL);
217 assertThatThrownBy(() -> {
218 databaseProvider.updatePdpSubGroup(NAME, new PdpSubGroup());
219 }).hasMessage("parameter \"localName\" is null");
221 assertThatThrownBy(() -> {
222 databaseProvider.updatePdp(null, null, null);
223 }).hasMessageMatching(GROUP_IS_NULL);
225 assertThatThrownBy(() -> {
226 databaseProvider.updatePdp(null, null, new Pdp());
227 }).hasMessageMatching(GROUP_IS_NULL);
229 assertThatThrownBy(() -> {
230 databaseProvider.updatePdp(null, "sub", null);
231 }).hasMessageMatching(GROUP_IS_NULL);
233 assertThatThrownBy(() -> {
234 databaseProvider.updatePdp(null, "sub", new Pdp());
235 }).hasMessageMatching(GROUP_IS_NULL);
237 assertThatThrownBy(() -> {
238 databaseProvider.updatePdp(NAME, null, null);
239 }).hasMessageMatching(SUBGROUP_IS_NULL);
241 assertThatThrownBy(() -> {
242 databaseProvider.updatePdp(NAME, null, new Pdp());
243 }).hasMessageMatching(SUBGROUP_IS_NULL);
245 assertThatThrownBy(() -> {
246 databaseProvider.updatePdp(NAME, "sub", null);
247 }).hasMessageMatching("^pdp is marked .*on.*ull but is null$");
249 assertThatThrownBy(() -> {
250 databaseProvider.updatePdp(NAME, "sub", new Pdp());
251 }).hasMessage("parameter \"localName\" is null");
253 assertThatThrownBy(() -> {
254 databaseProvider.deletePdpGroup(null);
255 }).hasMessageMatching(NAME_IS_NULL);
257 assertThatThrownBy(() -> {
258 databaseProvider.getFilteredPdpStatistics(NAME, null, "sub", TIMESTAMP, TIMESTAMP, ORDER, 0);
259 }).hasMessageMatching(GROUP_IS_NULL);
261 assertThatThrownBy(() -> {
262 databaseProvider.createPdpStatistics(null);
263 }).hasMessageMatching("^pdpStatisticsList is marked .*on.*ull but is null$");
265 assertThatThrownBy(() -> {
266 databaseProvider.updatePdpStatistics(null);
267 }).hasMessageMatching("^pdpStatisticsList is marked .*on.*ull but is null$");
269 assertThatThrownBy(() -> {
270 databaseProvider.deletePdpStatistics(null, TIMESTAMP);
271 }).hasMessageMatching(NAME_IS_NULL);
273 databaseProvider.close();
277 public void testProviderMethodsNotInit() throws Exception {
278 PolicyModelsProvider databaseProvider =
279 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
281 databaseProvider.close();
283 assertThatThrownBy(() -> {
284 databaseProvider.getPolicyTypes(NAME, "version");
285 }).hasMessage("policy models provider is not initilaized");
289 public void testProviderMethods() throws PfModelException {
290 PolicyModelsProvider databaseProvider =
291 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
293 assertThatThrownBy(() -> databaseProvider.getPolicyTypes(NAME, VERSION_100))
294 .hasMessage("service template not found in database");
296 assertTrue(databaseProvider.getPolicyTypeList(NAME, VERSION_100).isEmpty());
298 assertThatThrownBy(() -> databaseProvider.getFilteredPolicyTypes(ToscaPolicyTypeFilter.builder().build()))
299 .hasMessage("service template not found in database");
301 assertTrue(databaseProvider.getFilteredPolicyTypeList(ToscaPolicyTypeFilter.builder().build()).isEmpty());
303 assertThatThrownBy(() -> {
304 databaseProvider.createPolicyTypes(new ToscaServiceTemplate());
305 }).hasMessage("no policy types specified on service template");
307 assertThatThrownBy(() -> {
308 databaseProvider.updatePolicyTypes(new ToscaServiceTemplate());
309 }).hasMessage("no policy types specified on service template");
311 assertThatThrownBy(() -> databaseProvider.deletePolicyType(NAME, VERSION_100))
312 .hasMessage("service template not found in database");
314 assertThatThrownBy(() -> databaseProvider.getPolicies(NAME, VERSION_100))
315 .hasMessage("service template not found in database");
317 assertTrue(databaseProvider.getPolicyList(NAME, VERSION_100).isEmpty());
319 assertThatThrownBy(() -> databaseProvider.getFilteredPolicies(ToscaPolicyFilter.builder().build()))
320 .hasMessage("service template not found in database");
322 assertTrue(databaseProvider.getFilteredPolicyList(ToscaPolicyFilter.builder().build()).isEmpty());
324 assertThatThrownBy(() -> {
325 databaseProvider.createPolicies(new ToscaServiceTemplate());
326 }).hasMessage("topology template not specified on service template");
328 assertThatThrownBy(() -> {
329 databaseProvider.updatePolicies(new ToscaServiceTemplate());
330 }).hasMessage("topology template not specified on service template");
332 assertThatThrownBy(() -> databaseProvider.deletePolicy("Policy", "0.0.0").getToscaTopologyTemplate())
333 .hasMessage("service template not found in database");
335 assertEquals(0, databaseProvider.getPdpGroups(NAME).size());
336 assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
338 assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
339 assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
341 PdpGroup pdpGroup = new PdpGroup();
342 pdpGroup.setName(GROUP);
343 pdpGroup.setVersion("1.2.3");
344 pdpGroup.setPdpGroupState(PdpState.ACTIVE);
345 pdpGroup.setPdpSubgroups(new ArrayList<>());
346 List<PdpGroup> groupList = new ArrayList<>();
347 groupList.add(pdpGroup);
349 PdpSubGroup pdpSubGroup = new PdpSubGroup();
350 pdpSubGroup.setPdpType("type");
351 pdpSubGroup.setDesiredInstanceCount(123);
352 pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
353 pdpSubGroup.getSupportedPolicyTypes().add(new ToscaConceptIdentifier("type", "7.8.9"));
354 pdpGroup.getPdpSubgroups().add(pdpSubGroup);
357 pdp.setInstanceId("type-0");
358 pdp.setMessage("Hello");
359 pdp.setPdpState(PdpState.ACTIVE);
360 pdp.setHealthy(PdpHealthStatus.UNKNOWN);
361 pdpSubGroup.setPdpInstances(new ArrayList<>());
362 pdpSubGroup.getPdpInstances().add(pdp);
364 PdpStatistics pdpStatistics = new PdpStatistics();
365 pdpStatistics.setPdpInstanceId(NAME);
366 pdpStatistics.setTimeStamp(new Date());
367 pdpStatistics.setPdpGroupName(GROUP);
368 pdpStatistics.setPdpSubGroupName("type");
369 ArrayList<PdpStatistics> statisticsArrayList = new ArrayList<>();
370 statisticsArrayList.add(pdpStatistics);
373 databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getDesiredInstanceCount());
374 assertEquals(1, databaseProvider.getPdpGroups(GROUP).size());
376 pdpSubGroup.setDesiredInstanceCount(234);
377 databaseProvider.updatePdpSubGroup(GROUP, pdpSubGroup);
379 databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getDesiredInstanceCount());
381 assertEquals("Hello", databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getPdpInstances()
382 .get(0).getMessage());
383 pdp.setMessage("Howdy");
384 databaseProvider.updatePdp(GROUP, "type", pdp);
385 assertEquals("Howdy", databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getPdpInstances()
386 .get(0).getMessage());
388 assertThatThrownBy(() -> {
389 databaseProvider.deletePdpGroup(NAME);
390 }).hasMessage("delete of PDP group \"name:0.0.0\" failed, PDP group does not exist");
392 assertEquals(pdpGroup.getName(), databaseProvider.deletePdpGroup(GROUP).getName());
394 assertEquals(0, databaseProvider.getPdpStatistics(null, null).size());
395 assertEquals(1, databaseProvider.createPdpStatistics(statisticsArrayList).size());
396 assertEquals(1, databaseProvider.updatePdpStatistics(statisticsArrayList).size());
398 assertEquals(NAME, databaseProvider.getPdpStatistics(null, null).get(0).getPdpInstanceId());
399 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(null, GROUP, null, null, null, ORDER, 0).get(0)
400 .getPdpInstanceId());
402 databaseProvider.getFilteredPdpStatistics(null, GROUP, null, new Date(), null, ORDER, 0).size());
403 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(null, GROUP, null, null, new Date(), ORDER, 0)
404 .get(0).getPdpInstanceId());
406 databaseProvider.getFilteredPdpStatistics(null, GROUP, null, new Date(), new Date(), ORDER, 0).size());
408 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, null, null, null, ORDER, 0).get(0)
409 .getPdpInstanceId());
411 databaseProvider.getFilteredPdpStatistics(NAME, GROUP, null, new Date(), new Date(), ORDER, 0).size());
413 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type", null, null, ORDER, 0).get(0)
414 .getPdpInstanceId());
415 assertEquals(0, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type", new Date(), new Date(), ORDER, 0)
418 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type", null, null, ORDER, 1).get(0)
419 .getPdpInstanceId());
420 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type", null, null, ORDER, 5).get(0)
421 .getPdpInstanceId());
422 assertEquals(0, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type", new Date(), new Date(), ORDER, 5)
425 assertEquals(NAME, databaseProvider.deletePdpStatistics(NAME, null).get(0).getPdpInstanceId());
426 assertEquals(0, databaseProvider.getPdpStatistics(null, null).size());
428 assertThat(databaseProvider.getGroupPolicyStatus(GROUP)).isEmpty();
429 assertThatCode(() -> databaseProvider.cudPolicyStatus(null, null, null)).doesNotThrowAnyException();
431 databaseProvider.close();
435 public void testDeletePolicyDeployedInSubgroup() throws PfModelException {
436 List<ToscaConceptIdentifier> policies = new ArrayList<>();
438 policies.add(new ToscaConceptIdentifier("p0", "0.0.1"));
439 policies.add(new ToscaConceptIdentifier("p1", "0.0.1"));
441 List<ToscaConceptIdentifier> supportedPolicyTypes = new ArrayList<>();
442 supportedPolicyTypes.add(new ToscaConceptIdentifier("pt2", "0.0.1"));
444 PdpSubGroup subGroup = new PdpSubGroup();
445 subGroup.setPdpType("pdpType");
446 subGroup.setSupportedPolicyTypes(supportedPolicyTypes);
447 subGroup.setPolicies(policies);
449 List<PdpSubGroup> pdpSubgroups = new ArrayList<>();
450 pdpSubgroups.add(subGroup);
452 PdpGroup pdpGroup = new PdpGroup();
453 pdpGroup.setName("pdpGroup");
454 pdpGroup.setPdpGroupState(PdpState.PASSIVE);
455 pdpGroup.setPdpSubgroups(pdpSubgroups);
457 List<PdpGroup> pdpGroups = new ArrayList<>();
458 pdpGroups.add(pdpGroup);
460 PolicyModelsProvider databaseProvider =
461 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
463 databaseProvider.createPdpGroups(pdpGroups);
465 assertThatThrownBy(() -> databaseProvider.deletePolicy("p0", "0.0.1"))
466 .hasMessageContaining("policy is in use, it is deployed in PDP group pdpGroup subgroup pdpType");
468 assertThatThrownBy(() -> databaseProvider.deletePolicy("p3", "0.0.1"))
469 .hasMessageContaining("service template not found in database");
471 databaseProvider.close();
475 public void testDeletePolicyTypeSupportedInSubgroup() throws PfModelException {
476 List<ToscaConceptIdentifier> supportedPolicyTypes = new ArrayList<>();
477 supportedPolicyTypes.add(new ToscaConceptIdentifier("pt1", "0.0.1"));
478 supportedPolicyTypes.add(new ToscaConceptIdentifier("pt2", "0.0.1"));
480 PdpSubGroup subGroup = new PdpSubGroup();
481 subGroup.setPdpType("pdpType");
482 subGroup.setSupportedPolicyTypes(supportedPolicyTypes);
484 List<PdpSubGroup> pdpSubgroups = new ArrayList<>();
485 pdpSubgroups.add(subGroup);
487 PdpGroup pdpGroup = new PdpGroup();
488 pdpGroup.setName("pdpGroup");
489 pdpGroup.setPdpGroupState(PdpState.PASSIVE);
490 pdpGroup.setPdpSubgroups(pdpSubgroups);
492 List<PdpGroup> pdpGroups = new ArrayList<>();
493 pdpGroups.add(pdpGroup);
495 PolicyModelsProvider databaseProvider =
496 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
498 databaseProvider.createPdpGroups(pdpGroups);
500 assertThatThrownBy(() -> databaseProvider.deletePolicyType("pt2", "0.0.1"))
501 .hasMessageContaining("policy type is in use, it is referenced in PDP group pdpGroup subgroup pdpType");
503 assertThatThrownBy(() -> databaseProvider.deletePolicyType("pt0", "0.0.1"))
504 .hasMessageContaining("service template not found in database");
506 databaseProvider.close();