2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2019-2020 Nordix Foundation.
4 * Modifications Copyright (C) 2019 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.assertThatThrownBy;
26 import static org.junit.Assert.assertEquals;
27 import static org.junit.Assert.assertNotNull;
28 import static org.junit.Assert.assertTrue;
30 import java.util.ArrayList;
31 import java.util.Date;
32 import java.util.List;
33 import org.junit.Before;
34 import org.junit.Test;
35 import org.onap.policy.models.base.PfModelException;
36 import org.onap.policy.models.pdp.concepts.Pdp;
37 import org.onap.policy.models.pdp.concepts.PdpGroup;
38 import org.onap.policy.models.pdp.concepts.PdpGroupFilter;
39 import org.onap.policy.models.pdp.concepts.PdpStatistics;
40 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
41 import org.onap.policy.models.pdp.enums.PdpHealthStatus;
42 import org.onap.policy.models.pdp.enums.PdpState;
43 import org.onap.policy.models.provider.PolicyModelsProvider;
44 import org.onap.policy.models.provider.PolicyModelsProviderFactory;
45 import org.onap.policy.models.provider.PolicyModelsProviderParameters;
46 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyFilter;
47 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifier;
48 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeFilter;
49 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier;
50 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
53 * Test the database models provider implementation.
55 * @author Liam Fallon (liam.fallon@est.tech)
57 public class DatabasePolicyModelsProviderTest {
58 private static final String NAME = "name";
60 private static final String TEMPLATE_IS_NULL = "^serviceTemplate is marked .*on.*ull but is null$";
62 private static final String SUBGROUP_IS_NULL = "^pdpSubGroup is marked .*on.*ull but is null$";
64 private static final String GROUP_IS_NULL = "^pdpGroupName is marked .*on.*ull but is null$";
66 private static final String NAME_IS_NULL = "^name is marked .*on.*ull but is null$";
68 private static final String FILTER_IS_NULL = "^filter is marked .*on.*ull but is null$";
70 private static final String GROUP = "group";
72 private static final String VERSION_100 = "1.0.0";
74 private static final Date TIMESTAMP = new Date();
76 private static final String ORDER = "DESC";
78 PolicyModelsProviderParameters parameters;
81 * Initialize parameters.
84 public void setupParameters() {
85 parameters = new PolicyModelsProviderParameters();
86 parameters.setDatabaseDriver("org.h2.Driver");
87 parameters.setDatabaseUrl("jdbc:h2:mem:testdb");
88 parameters.setDatabaseUser("policy");
89 parameters.setDatabasePassword("P01icY");
90 parameters.setPersistenceUnit("ToscaConceptTest");
94 public void testInitAndClose() throws Exception {
95 assertThatThrownBy(() -> {
96 new DatabasePolicyModelsProviderImpl(null);
97 }).hasMessageMatching("^parameters is marked .*on.*ull but is null$");
99 PolicyModelsProvider databaseProvider =
100 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
102 parameters.setDatabaseUrl("jdbc://www.acmecorp.nonexist");
104 databaseProvider.close();
105 databaseProvider.init();
107 databaseProvider.close();
109 parameters.setDatabaseUrl("jdbc:h2:mem:testdb");
111 parameters.setPersistenceUnit("WileECoyote");
113 assertThatThrownBy(databaseProvider::init).hasMessageContaining("could not create Data Access Object (DAO)");
115 parameters.setPersistenceUnit("ToscaConceptTest");
117 databaseProvider.init();
118 databaseProvider.close();
120 assertThatThrownBy(() -> {
121 databaseProvider.init();
122 databaseProvider.init();
123 }).hasMessage("provider is already initialized");
125 databaseProvider.close();
127 databaseProvider.close();
131 public void testProviderMethodsNull() throws Exception {
133 PolicyModelsProvider databaseProvider =
134 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
136 assertThatThrownBy(() -> {
137 databaseProvider.getFilteredPolicyTypes(null);
138 }).hasMessageMatching(FILTER_IS_NULL);
140 assertThatThrownBy(() -> {
141 databaseProvider.getFilteredPolicyTypeList(null);
142 }).hasMessageMatching(FILTER_IS_NULL);
144 assertThatThrownBy(() -> {
145 databaseProvider.createPolicyTypes(null);
146 }).hasMessageMatching(TEMPLATE_IS_NULL);
148 assertThatThrownBy(() -> {
149 databaseProvider.updatePolicyTypes(null);
150 }).hasMessageMatching(TEMPLATE_IS_NULL);
152 assertThatThrownBy(() -> {
153 databaseProvider.deletePolicyType(null, null);
154 }).hasMessageMatching(NAME_IS_NULL);
156 assertThatThrownBy(() -> {
157 databaseProvider.deletePolicyType("aaa", null);
158 }).hasMessageMatching("^version is marked .*on.*ull but is null$");
160 assertThatThrownBy(() -> {
161 databaseProvider.deletePolicyType(null, "aaa");
162 }).hasMessageMatching(NAME_IS_NULL);
164 assertThatThrownBy(() -> {
165 databaseProvider.getFilteredPolicies(null);
166 }).hasMessageMatching(FILTER_IS_NULL);
168 assertThatThrownBy(() -> {
169 databaseProvider.getFilteredPolicyList(null);
170 }).hasMessageMatching(FILTER_IS_NULL);
172 assertThatThrownBy(() -> {
173 databaseProvider.createPolicies(null);
174 }).hasMessageMatching(TEMPLATE_IS_NULL);
176 assertThatThrownBy(() -> {
177 databaseProvider.updatePolicies(null);
178 }).hasMessageMatching(TEMPLATE_IS_NULL);
180 assertThatThrownBy(() -> {
181 databaseProvider.deletePolicy(null, null);
182 }).hasMessageMatching(NAME_IS_NULL);
184 assertThatThrownBy(() -> {
185 databaseProvider.deletePolicy(null, "aaa");
186 }).hasMessageMatching(NAME_IS_NULL);
188 assertThatThrownBy(() -> {
189 databaseProvider.deletePolicy("aaa", null);
190 }).hasMessageMatching("^version is marked .*on.*ull but is null$");
192 assertThatThrownBy(() -> {
193 databaseProvider.getFilteredPdpGroups(null);
194 }).hasMessageMatching(FILTER_IS_NULL);
196 assertThatThrownBy(() -> {
197 databaseProvider.createPdpGroups(null);
198 }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
200 assertThatThrownBy(() -> {
201 databaseProvider.updatePdpGroups(null);
202 }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
204 assertThatThrownBy(() -> {
205 databaseProvider.updatePdpSubGroup(null, null);
206 }).hasMessageMatching(GROUP_IS_NULL);
208 assertThatThrownBy(() -> {
209 databaseProvider.updatePdpSubGroup(null, new PdpSubGroup());
210 }).hasMessageMatching(GROUP_IS_NULL);
212 assertThatThrownBy(() -> {
213 databaseProvider.updatePdpSubGroup(NAME, null);
214 }).hasMessageMatching(SUBGROUP_IS_NULL);
216 assertThatThrownBy(() -> {
217 databaseProvider.updatePdpSubGroup(NAME, new PdpSubGroup());
218 }).hasMessage("parameter \"localName\" is null");
220 assertThatThrownBy(() -> {
221 databaseProvider.updatePdp(null, null, null);
222 }).hasMessageMatching(GROUP_IS_NULL);
224 assertThatThrownBy(() -> {
225 databaseProvider.updatePdp(null, null, new Pdp());
226 }).hasMessageMatching(GROUP_IS_NULL);
228 assertThatThrownBy(() -> {
229 databaseProvider.updatePdp(null, "sub", null);
230 }).hasMessageMatching(GROUP_IS_NULL);
232 assertThatThrownBy(() -> {
233 databaseProvider.updatePdp(null, "sub", new Pdp());
234 }).hasMessageMatching(GROUP_IS_NULL);
236 assertThatThrownBy(() -> {
237 databaseProvider.updatePdp(NAME, null, null);
238 }).hasMessageMatching(SUBGROUP_IS_NULL);
240 assertThatThrownBy(() -> {
241 databaseProvider.updatePdp(NAME, null, new Pdp());
242 }).hasMessageMatching(SUBGROUP_IS_NULL);
244 assertThatThrownBy(() -> {
245 databaseProvider.updatePdp(NAME, "sub", null);
246 }).hasMessageMatching("^pdp is marked .*on.*ull but is null$");
248 assertThatThrownBy(() -> {
249 databaseProvider.updatePdp(NAME, "sub", new Pdp());
250 }).hasMessage("parameter \"localName\" is null");
252 assertThatThrownBy(() -> {
253 databaseProvider.deletePdpGroup(null);
254 }).hasMessageMatching(NAME_IS_NULL);
256 assertThatThrownBy(() -> {
257 databaseProvider.getFilteredPdpStatistics(NAME, null, "sub", TIMESTAMP, TIMESTAMP, ORDER, 0);
258 }).hasMessageMatching(GROUP_IS_NULL);
260 assertThatThrownBy(() -> {
261 databaseProvider.createPdpStatistics(null);
262 }).hasMessageMatching("^pdpStatisticsList is marked .*on.*ull but is null$");
264 assertThatThrownBy(() -> {
265 databaseProvider.updatePdpStatistics(null);
266 }).hasMessageMatching("^pdpStatisticsList is marked .*on.*ull but is null$");
268 assertThatThrownBy(() -> {
269 databaseProvider.deletePdpStatistics(null, TIMESTAMP);
270 }).hasMessageMatching(NAME_IS_NULL);
272 databaseProvider.close();
276 public void testProviderMethodsNotInit() throws Exception {
277 PolicyModelsProvider databaseProvider =
278 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
280 databaseProvider.close();
282 assertThatThrownBy(() -> {
283 databaseProvider.getPolicyTypes(NAME, "version");
284 }).hasMessage("policy models provider is not initilaized");
288 public void testProviderMethods() throws PfModelException {
289 PolicyModelsProvider databaseProvider =
290 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
292 assertThatThrownBy(() -> databaseProvider.getPolicyTypes(NAME, VERSION_100))
293 .hasMessage("service template not found in database");
295 assertTrue(databaseProvider.getPolicyTypeList(NAME, VERSION_100).isEmpty());
297 assertThatThrownBy(() -> databaseProvider.getFilteredPolicyTypes(ToscaPolicyTypeFilter.builder().build()))
298 .hasMessage("service template not found in database");
300 assertTrue(databaseProvider.getFilteredPolicyTypeList(ToscaPolicyTypeFilter.builder().build()).isEmpty());
302 assertThatThrownBy(() -> {
303 databaseProvider.createPolicyTypes(new ToscaServiceTemplate());
304 }).hasMessage("no policy types specified on service template");
306 assertThatThrownBy(() -> {
307 databaseProvider.updatePolicyTypes(new ToscaServiceTemplate());
308 }).hasMessage("no policy types specified on service template");
310 assertThatThrownBy(() -> databaseProvider.deletePolicyType(NAME, VERSION_100))
311 .hasMessage("service template not found in database");
313 assertThatThrownBy(() -> databaseProvider.getPolicies(NAME, VERSION_100))
314 .hasMessage("service template not found in database");
316 assertTrue(databaseProvider.getPolicyList(NAME, VERSION_100).isEmpty());
318 assertThatThrownBy(() -> databaseProvider.getFilteredPolicies(ToscaPolicyFilter.builder().build()))
319 .hasMessage("service template not found in database");
321 assertTrue(databaseProvider.getFilteredPolicyList(ToscaPolicyFilter.builder().build()).isEmpty());
323 assertThatThrownBy(() -> {
324 databaseProvider.createPolicies(new ToscaServiceTemplate());
325 }).hasMessage("topology template not specified on service template");
327 assertThatThrownBy(() -> {
328 databaseProvider.updatePolicies(new ToscaServiceTemplate());
329 }).hasMessage("topology template not specified on service template");
331 assertThatThrownBy(() -> databaseProvider.deletePolicy("Policy", "0.0.0").getToscaTopologyTemplate())
332 .hasMessage("service template not found in database");
334 assertEquals(0, databaseProvider.getPdpGroups(NAME).size());
335 assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
337 assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
338 assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
340 PdpGroup pdpGroup = new PdpGroup();
341 pdpGroup.setName(GROUP);
342 pdpGroup.setVersion("1.2.3");
343 pdpGroup.setPdpGroupState(PdpState.ACTIVE);
344 pdpGroup.setPdpSubgroups(new ArrayList<>());
345 List<PdpGroup> groupList = new ArrayList<>();
346 groupList.add(pdpGroup);
348 PdpSubGroup pdpSubGroup = new PdpSubGroup();
349 pdpSubGroup.setPdpType("type");
350 pdpSubGroup.setDesiredInstanceCount(123);
351 pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
352 pdpSubGroup.getSupportedPolicyTypes().add(new ToscaPolicyTypeIdentifier("type", "7.8.9"));
353 pdpGroup.getPdpSubgroups().add(pdpSubGroup);
356 pdp.setInstanceId("type-0");
357 pdp.setMessage("Hello");
358 pdp.setPdpState(PdpState.ACTIVE);
359 pdp.setHealthy(PdpHealthStatus.UNKNOWN);
360 pdpSubGroup.setPdpInstances(new ArrayList<>());
361 pdpSubGroup.getPdpInstances().add(pdp);
363 PdpStatistics pdpStatistics = new PdpStatistics();
364 pdpStatistics.setPdpInstanceId(NAME);
365 pdpStatistics.setTimeStamp(new Date());
366 pdpStatistics.setPdpGroupName(GROUP);
367 pdpStatistics.setPdpSubGroupName("type");
368 ArrayList<PdpStatistics> statisticsArrayList = new ArrayList<>();
369 statisticsArrayList.add(pdpStatistics);
372 databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getDesiredInstanceCount());
373 assertEquals(1, databaseProvider.getPdpGroups(GROUP).size());
375 pdpSubGroup.setDesiredInstanceCount(234);
376 databaseProvider.updatePdpSubGroup(GROUP, pdpSubGroup);
378 databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getDesiredInstanceCount());
380 assertEquals("Hello",
381 databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getPdpInstances().get(0).getMessage());
382 pdp.setMessage("Howdy");
383 databaseProvider.updatePdp(GROUP, "type", pdp);
384 assertEquals("Howdy",
385 databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getPdpInstances().get(0).getMessage());
387 assertThatThrownBy(() -> {
388 databaseProvider.deletePdpGroup(NAME);
389 }).hasMessage("delete of PDP group \"name:0.0.0\" failed, PDP group does not exist");
391 assertEquals(pdpGroup.getName(), databaseProvider.deletePdpGroup(GROUP).getName());
393 assertEquals(0, databaseProvider.getPdpStatistics(null, null).size());
394 assertEquals(1, databaseProvider.createPdpStatistics(statisticsArrayList).size());
395 assertEquals(1, databaseProvider.updatePdpStatistics(statisticsArrayList).size());
397 assertEquals(NAME, databaseProvider.getPdpStatistics(null, null).get(0).getPdpInstanceId());
398 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(null, GROUP, null, null, null, ORDER, 0).get(0)
399 .getPdpInstanceId());
401 databaseProvider.getFilteredPdpStatistics(null, GROUP, null, new Date(), null, ORDER, 0).size());
402 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(null, GROUP, null, null, new Date(), ORDER, 0)
403 .get(0).getPdpInstanceId());
405 databaseProvider.getFilteredPdpStatistics(null, GROUP, null, new Date(), new Date(), ORDER, 0).size());
407 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, null, null, null, ORDER, 0).get(0)
408 .getPdpInstanceId());
410 databaseProvider.getFilteredPdpStatistics(NAME, GROUP, null, new Date(), new Date(), ORDER, 0).size());
412 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type", null, null, ORDER, 0).get(0)
413 .getPdpInstanceId());
415 databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type", new Date(), new Date(), ORDER, 0).size());
417 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type", null, null, ORDER, 1).get(0)
418 .getPdpInstanceId());
419 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type", null, null, ORDER, 5).get(0)
420 .getPdpInstanceId());
422 databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type", new Date(), new Date(), ORDER, 5).size());
424 assertEquals(NAME, databaseProvider.deletePdpStatistics(NAME, null).get(0).getPdpInstanceId());
425 assertEquals(0, databaseProvider.getPdpStatistics(null, null).size());
427 databaseProvider.close();
431 public void testDeletePolicyDeployedInSubgroup() throws PfModelException {
432 List<ToscaPolicyIdentifier> policies = new ArrayList<>();
434 policies.add(new ToscaPolicyIdentifier("p0", "0.0.1"));
435 policies.add(new ToscaPolicyIdentifier("p1", "0.0.1"));
437 List<ToscaPolicyTypeIdentifier> supportedPolicyTypes = new ArrayList<>();
438 supportedPolicyTypes.add(new ToscaPolicyTypeIdentifier("pt2", "0.0.1"));
440 PdpSubGroup subGroup = new PdpSubGroup();
441 subGroup.setPdpType("pdpType");
442 subGroup.setSupportedPolicyTypes(supportedPolicyTypes);
443 subGroup.setPolicies(policies);
445 List<PdpSubGroup> pdpSubgroups = new ArrayList<>();
446 pdpSubgroups.add(subGroup);
448 PdpGroup pdpGroup = new PdpGroup();
449 pdpGroup.setName("pdpGroup");
450 pdpGroup.setPdpGroupState(PdpState.PASSIVE);
451 pdpGroup.setPdpSubgroups(pdpSubgroups);
453 List<PdpGroup> pdpGroups = new ArrayList<>();
454 pdpGroups.add(pdpGroup);
456 PolicyModelsProvider databaseProvider =
457 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
459 databaseProvider.createPdpGroups(pdpGroups);
461 assertThatThrownBy(() -> databaseProvider.deletePolicy("p0", "0.0.1"))
462 .hasMessageContaining("policy is in use, it is deployed in PDP group pdpGroup subgroup pdpType");
464 assertThatThrownBy(() -> databaseProvider.deletePolicy("p3", "0.0.1"))
465 .hasMessageContaining("service template not found in database");
467 databaseProvider.close();
471 public void testDeletePolicyTypeSupportedInSubgroup() throws PfModelException {
472 List<ToscaPolicyTypeIdentifier> supportedPolicyTypes = new ArrayList<>();
473 supportedPolicyTypes.add(new ToscaPolicyTypeIdentifier("pt1", "0.0.1"));
474 supportedPolicyTypes.add(new ToscaPolicyTypeIdentifier("pt2", "0.0.1"));
476 PdpSubGroup subGroup = new PdpSubGroup();
477 subGroup.setPdpType("pdpType");
478 subGroup.setSupportedPolicyTypes(supportedPolicyTypes);
480 List<PdpSubGroup> pdpSubgroups = new ArrayList<>();
481 pdpSubgroups.add(subGroup);
483 PdpGroup pdpGroup = new PdpGroup();
484 pdpGroup.setName("pdpGroup");
485 pdpGroup.setPdpGroupState(PdpState.PASSIVE);
486 pdpGroup.setPdpSubgroups(pdpSubgroups);
488 List<PdpGroup> pdpGroups = new ArrayList<>();
489 pdpGroups.add(pdpGroup);
491 PolicyModelsProvider databaseProvider =
492 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
494 databaseProvider.createPdpGroups(pdpGroups);
496 assertThatThrownBy(() -> databaseProvider.deletePolicyType("pt2", "0.0.1"))
497 .hasMessageContaining("policy type is in use, it is referenced in PDP group pdpGroup subgroup pdpType");
499 assertThatThrownBy(() -> databaseProvider.deletePolicyType("pt0", "0.0.1"))
500 .hasMessageContaining("service template not found in database");
502 databaseProvider.close();