2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2019-2024 Nordix Foundation.
4 * Modifications Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved.
5 * Modifications Copyright (C) 2020, 2022 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.List;
33 import org.junit.After;
34 import org.junit.Before;
35 import org.junit.Test;
36 import org.onap.policy.models.base.PfModelException;
37 import org.onap.policy.models.pdp.concepts.Pdp;
38 import org.onap.policy.models.pdp.concepts.PdpGroup;
39 import org.onap.policy.models.pdp.concepts.PdpGroupFilter;
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.ToscaConceptIdentifier;
47 import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityFilter;
48 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
49 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeType;
50 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
51 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType;
52 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
53 import org.onap.policy.models.tosca.authorative.concepts.ToscaTopologyTemplate;
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 PolicyModelsProviderParameters parameters;
80 private PolicyModelsProvider databaseProvider;
83 * Initialize parameters.
86 public void setupParameters() {
87 parameters = new PolicyModelsProviderParameters();
88 parameters.setDatabaseDriver("org.h2.Driver");
89 parameters.setDatabaseUrl("jdbc:h2:mem:DatabasePolicyModelsProviderTest");
90 parameters.setDatabaseUser("policy");
91 parameters.setDatabasePassword("P01icY");
92 parameters.setPersistenceUnit("ToscaConceptTest");
99 public void tearDown() throws PfModelException {
100 if (databaseProvider != null) {
101 databaseProvider.close();
106 public void testInitAndClose() throws Exception {
107 assertThatThrownBy(() -> {
108 new DatabasePolicyModelsProviderImpl(null);
109 }).hasMessageMatching("^parameters is marked .*on.*ull but is null$");
111 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
113 final String savedDatabaseUrl = parameters.getDatabaseUrl();
114 parameters.setDatabaseUrl("jdbc://www.acmecorp.nonexist");
116 databaseProvider.close();
117 assertThatThrownBy(() -> {
118 databaseProvider.init();
119 }).hasMessageContaining("could not create Data Access Object (DAO)");
121 databaseProvider.close();
123 parameters.setDatabaseUrl(savedDatabaseUrl);
125 final String savedPersistenceUnit = parameters.getPersistenceUnit();
126 parameters.setPersistenceUnit("WileECoyote");
128 assertThatThrownBy(databaseProvider::init).hasMessageContaining("could not create Data Access Object (DAO)");
129 parameters.setPersistenceUnit(savedPersistenceUnit);
131 databaseProvider.init();
132 databaseProvider.close();
134 assertThatThrownBy(() -> {
135 databaseProvider.init();
136 databaseProvider.init();
137 }).hasMessage("provider is already initialized");
139 databaseProvider.close();
141 databaseProvider.close();
145 public void testProviderMethodsNull() throws Exception {
147 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
149 assertThatThrownBy(() -> {
150 databaseProvider.getFilteredPolicyTypes(null);
151 }).hasMessageMatching(FILTER_IS_NULL);
153 assertThatThrownBy(() -> {
154 databaseProvider.getFilteredPolicyTypeList(null);
155 }).hasMessageMatching(FILTER_IS_NULL);
157 assertThatThrownBy(() -> {
158 databaseProvider.createPolicyTypes(null);
159 }).hasMessageMatching(TEMPLATE_IS_NULL);
161 assertThatThrownBy(() -> {
162 databaseProvider.updatePolicyTypes(null);
163 }).hasMessageMatching(TEMPLATE_IS_NULL);
165 assertThatThrownBy(() -> {
166 databaseProvider.deletePolicyType(null, null);
167 }).hasMessageMatching(NAME_IS_NULL);
169 assertThatThrownBy(() -> {
170 databaseProvider.deletePolicyType("aaa", null);
171 }).hasMessageMatching("^version is marked .*on.*ull but is null$");
173 assertThatThrownBy(() -> {
174 databaseProvider.deletePolicyType(null, "aaa");
175 }).hasMessageMatching(NAME_IS_NULL);
177 assertThatThrownBy(() -> {
178 databaseProvider.getFilteredPolicies(null);
179 }).hasMessageMatching(FILTER_IS_NULL);
181 assertThatThrownBy(() -> {
182 databaseProvider.getFilteredPolicyList(null);
183 }).hasMessageMatching(FILTER_IS_NULL);
185 assertThatThrownBy(() -> {
186 databaseProvider.createPolicies(null);
187 }).hasMessageMatching(TEMPLATE_IS_NULL);
189 assertThatThrownBy(() -> {
190 databaseProvider.updatePolicies(null);
191 }).hasMessageMatching(TEMPLATE_IS_NULL);
193 assertThatThrownBy(() -> {
194 databaseProvider.deletePolicy(null, null);
195 }).hasMessageMatching(NAME_IS_NULL);
197 assertThatThrownBy(() -> {
198 databaseProvider.deletePolicy(null, "aaa");
199 }).hasMessageMatching(NAME_IS_NULL);
201 assertThatThrownBy(() -> {
202 databaseProvider.deletePolicy("aaa", null);
203 }).hasMessageMatching("^version is marked .*on.*ull but is null$");
207 public void testProviderMethodsNullGroup() throws Exception {
209 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
211 assertThatThrownBy(() -> {
212 databaseProvider.getFilteredPdpGroups(null);
213 }).hasMessageMatching(FILTER_IS_NULL);
215 assertThatThrownBy(() -> {
216 databaseProvider.createPdpGroups(null);
217 }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
219 assertThatThrownBy(() -> {
220 databaseProvider.updatePdpGroups(null);
221 }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
223 assertThatThrownBy(() -> {
224 databaseProvider.updatePdpSubGroup(null, null);
225 }).hasMessageMatching(GROUP_IS_NULL);
227 assertThatThrownBy(() -> {
228 databaseProvider.updatePdpSubGroup(null, new PdpSubGroup());
229 }).hasMessageMatching(GROUP_IS_NULL);
231 assertThatThrownBy(() -> {
232 databaseProvider.updatePdpSubGroup(NAME, null);
233 }).hasMessageMatching(SUBGROUP_IS_NULL);
235 assertThatThrownBy(() -> {
236 databaseProvider.updatePdpSubGroup(NAME, new PdpSubGroup());
237 }).hasMessage("parameter \"localName\" is null");
239 assertThatThrownBy(() -> {
240 databaseProvider.updatePdp(null, null, null);
241 }).hasMessageMatching(GROUP_IS_NULL);
243 assertThatThrownBy(() -> {
244 databaseProvider.updatePdp(null, null, new Pdp());
245 }).hasMessageMatching(GROUP_IS_NULL);
247 assertThatThrownBy(() -> {
248 databaseProvider.updatePdp(null, "sub", null);
249 }).hasMessageMatching(GROUP_IS_NULL);
251 assertThatThrownBy(() -> {
252 databaseProvider.updatePdp(null, "sub", new Pdp());
253 }).hasMessageMatching(GROUP_IS_NULL);
255 assertThatThrownBy(() -> {
256 databaseProvider.updatePdp(NAME, null, null);
257 }).hasMessageMatching(SUBGROUP_IS_NULL);
259 assertThatThrownBy(() -> {
260 databaseProvider.updatePdp(NAME, null, new Pdp());
261 }).hasMessageMatching(SUBGROUP_IS_NULL);
263 assertThatThrownBy(() -> {
264 databaseProvider.updatePdp(NAME, "sub", null);
265 }).hasMessageMatching("^pdp is marked .*on.*ull but is null$");
267 assertThatThrownBy(() -> {
268 databaseProvider.updatePdp(NAME, "sub", new Pdp());
269 }).hasMessage("parameter \"localName\" is null");
271 assertThatThrownBy(() -> {
272 databaseProvider.deletePdpGroup(null);
273 }).hasMessageMatching(NAME_IS_NULL);
275 databaseProvider.close();
279 public void testProviderMethodsNotInit() throws Exception {
280 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
282 databaseProvider.close();
284 assertThatThrownBy(() -> {
285 databaseProvider.getPolicyTypes(NAME, "version");
286 }).hasMessage("policy models provider is not initilaized");
290 public void testProviderMethods() throws PfModelException {
291 databaseProvider = 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());
299 () -> databaseProvider.getFilteredPolicyTypes(ToscaEntityFilter.<ToscaPolicyType>builder().build()))
300 .hasMessage("service template not found in database");
302 assertTrue(databaseProvider.getFilteredPolicyTypeList(ToscaEntityFilter.<ToscaPolicyType>builder().build())
305 assertThatThrownBy(() -> {
306 databaseProvider.createPolicyTypes(new ToscaServiceTemplate());
307 }).hasMessage("no policy types specified on service template");
309 assertThatThrownBy(() -> {
310 databaseProvider.updatePolicyTypes(new ToscaServiceTemplate());
311 }).hasMessage("no policy types specified on service template");
313 assertThatThrownBy(() -> databaseProvider.deletePolicyType(NAME, VERSION_100))
314 .hasMessage("service template not found in database");
316 assertThatThrownBy(() -> databaseProvider.getPolicies(NAME, VERSION_100))
317 .hasMessage("service template not found in database");
319 assertTrue(databaseProvider.getPolicyList(NAME, VERSION_100).isEmpty());
322 () -> databaseProvider.getFilteredPolicies(ToscaTypedEntityFilter.<ToscaPolicy>builder().build()))
323 .hasMessage("service template not found in database");
325 assertTrue(databaseProvider.getFilteredPolicyList(ToscaTypedEntityFilter.<ToscaPolicy>builder().build())
328 assertThatThrownBy(() -> {
329 databaseProvider.createPolicies(new ToscaServiceTemplate());
330 }).hasMessage("topology template not specified on service template");
332 assertThatThrownBy(() -> {
333 databaseProvider.updatePolicies(new ToscaServiceTemplate());
334 }).hasMessage("topology template not specified on service template");
336 assertThatThrownBy(() -> databaseProvider.deletePolicy("Policy", "0.0.0").getToscaTopologyTemplate())
337 .hasMessage("service template not found in database");
339 assertEquals(0, databaseProvider.getPdpGroups(NAME).size());
340 assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
342 assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
343 assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
347 public void testProviderMethodsInGroups() throws PfModelException {
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 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
374 databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getDesiredInstanceCount());
375 assertEquals(1, databaseProvider.getPdpGroups(GROUP).size());
377 pdpSubGroup.setDesiredInstanceCount(234);
378 databaseProvider.updatePdpSubGroup(GROUP, pdpSubGroup);
380 databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getDesiredInstanceCount());
382 assertEquals("Hello", databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getPdpInstances()
383 .get(0).getMessage());
384 pdp.setMessage("Howdy");
385 databaseProvider.updatePdp(GROUP, "type", pdp);
386 assertEquals("Howdy", databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getPdpInstances()
387 .get(0).getMessage());
389 assertThatThrownBy(() -> {
390 databaseProvider.deletePdpGroup(NAME);
391 }).hasMessage("delete of PDP group \"name:0.0.0\" failed, PDP group does not exist");
393 assertEquals(pdpGroup.getName(), databaseProvider.deletePdpGroup(GROUP).getName());
397 public void testDeletePolicyDeployedInSubgroup() throws PfModelException {
398 List<ToscaConceptIdentifier> policies = new ArrayList<>();
400 policies.add(new ToscaConceptIdentifier("p0", "0.0.1"));
401 policies.add(new ToscaConceptIdentifier("p1", "0.0.1"));
403 List<ToscaConceptIdentifier> supportedPolicyTypes = new ArrayList<>();
404 supportedPolicyTypes.add(new ToscaConceptIdentifier("pt2", "0.0.1"));
406 PdpSubGroup subGroup = new PdpSubGroup();
407 subGroup.setPdpType("pdpType");
408 subGroup.setSupportedPolicyTypes(supportedPolicyTypes);
409 subGroup.setPolicies(policies);
411 List<PdpSubGroup> pdpSubgroups = new ArrayList<>();
412 pdpSubgroups.add(subGroup);
414 PdpGroup pdpGroup = new PdpGroup();
415 pdpGroup.setName("pdpGroup");
416 pdpGroup.setPdpGroupState(PdpState.PASSIVE);
417 pdpGroup.setPdpSubgroups(pdpSubgroups);
419 List<PdpGroup> pdpGroups = new ArrayList<>();
420 pdpGroups.add(pdpGroup);
422 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
424 databaseProvider.createPdpGroups(pdpGroups);
426 assertThatThrownBy(() -> databaseProvider.deletePolicy("p0", "0.0.1"))
427 .hasMessageContaining("policy is in use, it is deployed in PDP group pdpGroup subgroup pdpType");
429 assertThatThrownBy(() -> databaseProvider.deletePolicy("p3", "0.0.1"))
430 .hasMessageContaining("service template not found in database");
432 databaseProvider.close();
436 public void testDeletePolicyTypeSupportedInSubgroup() throws PfModelException {
437 List<ToscaConceptIdentifier> supportedPolicyTypes = new ArrayList<>();
438 supportedPolicyTypes.add(new ToscaConceptIdentifier("pt1", "0.0.1"));
439 supportedPolicyTypes.add(new ToscaConceptIdentifier("pt2", "0.0.1"));
441 PdpSubGroup subGroup = new PdpSubGroup();
442 subGroup.setPdpType("pdpType");
443 subGroup.setSupportedPolicyTypes(supportedPolicyTypes);
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 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
458 databaseProvider.createPdpGroups(pdpGroups);
460 assertThatThrownBy(() -> databaseProvider.deletePolicyType("pt2", "0.0.1"))
461 .hasMessageContaining("policy type is in use, it is referenced in PDP group pdpGroup subgroup pdpType");
463 assertThatThrownBy(() -> databaseProvider.deletePolicyType("pt0", "0.0.1"))
464 .hasMessageContaining("service template not found in database");
466 databaseProvider.close();
470 public void testToscaNodeTemplateHandling() throws PfModelException {
471 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
473 ToscaServiceTemplate serviceTemplate = makeNodeTemplate();
475 assertEquals("1.0.1",
476 databaseProvider.createToscaNodeTemplates(serviceTemplate).getToscaTopologyTemplate().getNodeTemplates()
477 .get("metadataSet1").getVersion());
478 assertEquals(1, databaseProvider.getNodeTemplateMetadataSets(null, null).size());
480 ToscaNodeTemplate nodeTemplate1 = serviceTemplate.getToscaTopologyTemplate().getNodeTemplates()
481 .get("metadataSet1");
482 nodeTemplate1.setMetadata(Map.of("dummyKey", "updatedValue"));
483 serviceTemplate.getToscaTopologyTemplate().setNodeTemplates(Map.of("metadataSet1:1.0.1", nodeTemplate1));
484 assertEquals("updatedValue", databaseProvider.updateToscaNodeTemplates(serviceTemplate)
485 .getToscaTopologyTemplate().getNodeTemplates().get("metadataSet1").getMetadata().get("dummyKey"));
487 assertThatThrownBy(() -> {
488 databaseProvider.deleteToscaNodeTemplate("invalidName", "1.0.1");
489 }).hasMessage("node template invalidName:1.0.1 not found");
491 databaseProvider.close();
494 private ToscaServiceTemplate makeNodeTemplate() {
495 ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
496 serviceTemplate.setToscaDefinitionsVersion("sample:1.1.0");
497 serviceTemplate.setToscaTopologyTemplate(new ToscaTopologyTemplate());
498 serviceTemplate.setNodeTypes(Map.of("org.onap.policy.metadataSet:1.0.0", new ToscaNodeType()));
499 ToscaNodeTemplate nodeTemplate1 = new ToscaNodeTemplate();
500 nodeTemplate1.setName("metadataSet1");
501 nodeTemplate1.setVersion("1.0.1");
502 nodeTemplate1.setType("org.onap.policy.metadataSet");
503 nodeTemplate1.setTypeVersion("1.0.0");
504 nodeTemplate1.setMetadata(Map.of("dummyKey", "dummyValue"));
506 serviceTemplate.getToscaTopologyTemplate().setNodeTemplates(Map.of("metadataSet1", nodeTemplate1));
508 return serviceTemplate;