2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2019-2023 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");
93 parameters.setDatabaseType("org.hibernate.dialect.H2Dialect");
100 public void tearDown() throws PfModelException {
101 if (databaseProvider != null) {
102 databaseProvider.close();
107 public void testInitAndClose() throws Exception {
108 assertThatThrownBy(() -> {
109 new DatabasePolicyModelsProviderImpl(null);
110 }).hasMessageMatching("^parameters is marked .*on.*ull but is null$");
112 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
114 final String savedDatabaseUrl = parameters.getDatabaseUrl();
115 parameters.setDatabaseUrl("jdbc://www.acmecorp.nonexist");
117 databaseProvider.close();
118 assertThatThrownBy(() -> {
119 databaseProvider.init();
120 }).hasMessageContaining("could not create Data Access Object (DAO)");
122 databaseProvider.close();
124 parameters.setDatabaseUrl(savedDatabaseUrl);
126 final String savedPersistenceUnit = parameters.getPersistenceUnit();
127 parameters.setPersistenceUnit("WileECoyote");
129 assertThatThrownBy(databaseProvider::init).hasMessageContaining("could not create Data Access Object (DAO)");
130 parameters.setPersistenceUnit(savedPersistenceUnit);
132 databaseProvider.init();
133 databaseProvider.close();
135 assertThatThrownBy(() -> {
136 databaseProvider.init();
137 databaseProvider.init();
138 }).hasMessage("provider is already initialized");
140 databaseProvider.close();
142 databaseProvider.close();
146 public void testProviderMethodsNull() throws Exception {
148 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
150 assertThatThrownBy(() -> {
151 databaseProvider.getFilteredPolicyTypes(null);
152 }).hasMessageMatching(FILTER_IS_NULL);
154 assertThatThrownBy(() -> {
155 databaseProvider.getFilteredPolicyTypeList(null);
156 }).hasMessageMatching(FILTER_IS_NULL);
158 assertThatThrownBy(() -> {
159 databaseProvider.createPolicyTypes(null);
160 }).hasMessageMatching(TEMPLATE_IS_NULL);
162 assertThatThrownBy(() -> {
163 databaseProvider.updatePolicyTypes(null);
164 }).hasMessageMatching(TEMPLATE_IS_NULL);
166 assertThatThrownBy(() -> {
167 databaseProvider.deletePolicyType(null, null);
168 }).hasMessageMatching(NAME_IS_NULL);
170 assertThatThrownBy(() -> {
171 databaseProvider.deletePolicyType("aaa", null);
172 }).hasMessageMatching("^version is marked .*on.*ull but is null$");
174 assertThatThrownBy(() -> {
175 databaseProvider.deletePolicyType(null, "aaa");
176 }).hasMessageMatching(NAME_IS_NULL);
178 assertThatThrownBy(() -> {
179 databaseProvider.getFilteredPolicies(null);
180 }).hasMessageMatching(FILTER_IS_NULL);
182 assertThatThrownBy(() -> {
183 databaseProvider.getFilteredPolicyList(null);
184 }).hasMessageMatching(FILTER_IS_NULL);
186 assertThatThrownBy(() -> {
187 databaseProvider.createPolicies(null);
188 }).hasMessageMatching(TEMPLATE_IS_NULL);
190 assertThatThrownBy(() -> {
191 databaseProvider.updatePolicies(null);
192 }).hasMessageMatching(TEMPLATE_IS_NULL);
194 assertThatThrownBy(() -> {
195 databaseProvider.deletePolicy(null, null);
196 }).hasMessageMatching(NAME_IS_NULL);
198 assertThatThrownBy(() -> {
199 databaseProvider.deletePolicy(null, "aaa");
200 }).hasMessageMatching(NAME_IS_NULL);
202 assertThatThrownBy(() -> {
203 databaseProvider.deletePolicy("aaa", null);
204 }).hasMessageMatching("^version is marked .*on.*ull but is null$");
208 public void testProviderMethodsNullGroup() throws Exception {
210 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
212 assertThatThrownBy(() -> {
213 databaseProvider.getFilteredPdpGroups(null);
214 }).hasMessageMatching(FILTER_IS_NULL);
216 assertThatThrownBy(() -> {
217 databaseProvider.createPdpGroups(null);
218 }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
220 assertThatThrownBy(() -> {
221 databaseProvider.updatePdpGroups(null);
222 }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
224 assertThatThrownBy(() -> {
225 databaseProvider.updatePdpSubGroup(null, null);
226 }).hasMessageMatching(GROUP_IS_NULL);
228 assertThatThrownBy(() -> {
229 databaseProvider.updatePdpSubGroup(null, new PdpSubGroup());
230 }).hasMessageMatching(GROUP_IS_NULL);
232 assertThatThrownBy(() -> {
233 databaseProvider.updatePdpSubGroup(NAME, null);
234 }).hasMessageMatching(SUBGROUP_IS_NULL);
236 assertThatThrownBy(() -> {
237 databaseProvider.updatePdpSubGroup(NAME, new PdpSubGroup());
238 }).hasMessage("parameter \"localName\" is null");
240 assertThatThrownBy(() -> {
241 databaseProvider.updatePdp(null, null, null);
242 }).hasMessageMatching(GROUP_IS_NULL);
244 assertThatThrownBy(() -> {
245 databaseProvider.updatePdp(null, null, new Pdp());
246 }).hasMessageMatching(GROUP_IS_NULL);
248 assertThatThrownBy(() -> {
249 databaseProvider.updatePdp(null, "sub", null);
250 }).hasMessageMatching(GROUP_IS_NULL);
252 assertThatThrownBy(() -> {
253 databaseProvider.updatePdp(null, "sub", new Pdp());
254 }).hasMessageMatching(GROUP_IS_NULL);
256 assertThatThrownBy(() -> {
257 databaseProvider.updatePdp(NAME, null, null);
258 }).hasMessageMatching(SUBGROUP_IS_NULL);
260 assertThatThrownBy(() -> {
261 databaseProvider.updatePdp(NAME, null, new Pdp());
262 }).hasMessageMatching(SUBGROUP_IS_NULL);
264 assertThatThrownBy(() -> {
265 databaseProvider.updatePdp(NAME, "sub", null);
266 }).hasMessageMatching("^pdp is marked .*on.*ull but is null$");
268 assertThatThrownBy(() -> {
269 databaseProvider.updatePdp(NAME, "sub", new Pdp());
270 }).hasMessage("parameter \"localName\" is null");
272 assertThatThrownBy(() -> {
273 databaseProvider.deletePdpGroup(null);
274 }).hasMessageMatching(NAME_IS_NULL);
276 databaseProvider.close();
280 public void testProviderMethodsNotInit() throws Exception {
281 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
283 databaseProvider.close();
285 assertThatThrownBy(() -> {
286 databaseProvider.getPolicyTypes(NAME, "version");
287 }).hasMessage("policy models provider is not initilaized");
291 public void testProviderMethods() throws PfModelException {
292 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
294 assertThatThrownBy(() -> databaseProvider.getPolicyTypes(NAME, VERSION_100))
295 .hasMessage("service template not found in database");
297 assertTrue(databaseProvider.getPolicyTypeList(NAME, VERSION_100).isEmpty());
300 () -> databaseProvider.getFilteredPolicyTypes(ToscaEntityFilter.<ToscaPolicyType>builder().build()))
301 .hasMessage("service template not found in database");
303 assertTrue(databaseProvider.getFilteredPolicyTypeList(ToscaEntityFilter.<ToscaPolicyType>builder().build())
306 assertThatThrownBy(() -> {
307 databaseProvider.createPolicyTypes(new ToscaServiceTemplate());
308 }).hasMessage("no policy types specified on service template");
310 assertThatThrownBy(() -> {
311 databaseProvider.updatePolicyTypes(new ToscaServiceTemplate());
312 }).hasMessage("no policy types specified on service template");
314 assertThatThrownBy(() -> databaseProvider.deletePolicyType(NAME, VERSION_100))
315 .hasMessage("service template not found in database");
317 assertThatThrownBy(() -> databaseProvider.getPolicies(NAME, VERSION_100))
318 .hasMessage("service template not found in database");
320 assertTrue(databaseProvider.getPolicyList(NAME, VERSION_100).isEmpty());
323 () -> databaseProvider.getFilteredPolicies(ToscaTypedEntityFilter.<ToscaPolicy>builder().build()))
324 .hasMessage("service template not found in database");
326 assertTrue(databaseProvider.getFilteredPolicyList(ToscaTypedEntityFilter.<ToscaPolicy>builder().build())
329 assertThatThrownBy(() -> {
330 databaseProvider.createPolicies(new ToscaServiceTemplate());
331 }).hasMessage("topology template not specified on service template");
333 assertThatThrownBy(() -> {
334 databaseProvider.updatePolicies(new ToscaServiceTemplate());
335 }).hasMessage("topology template not specified on service template");
337 assertThatThrownBy(() -> databaseProvider.deletePolicy("Policy", "0.0.0").getToscaTopologyTemplate())
338 .hasMessage("service template not found in database");
340 assertEquals(0, databaseProvider.getPdpGroups(NAME).size());
341 assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
343 assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
344 assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
348 public void testProviderMethodsInGroups() throws PfModelException {
349 PdpGroup pdpGroup = new PdpGroup();
350 pdpGroup.setName(GROUP);
351 pdpGroup.setVersion("1.2.3");
352 pdpGroup.setPdpGroupState(PdpState.ACTIVE);
353 pdpGroup.setPdpSubgroups(new ArrayList<>());
354 List<PdpGroup> groupList = new ArrayList<>();
355 groupList.add(pdpGroup);
357 PdpSubGroup pdpSubGroup = new PdpSubGroup();
358 pdpSubGroup.setPdpType("type");
359 pdpSubGroup.setDesiredInstanceCount(123);
360 pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
361 pdpSubGroup.getSupportedPolicyTypes().add(new ToscaConceptIdentifier("type", "7.8.9"));
362 pdpGroup.getPdpSubgroups().add(pdpSubGroup);
365 pdp.setInstanceId("type-0");
366 pdp.setMessage("Hello");
367 pdp.setPdpState(PdpState.ACTIVE);
368 pdp.setHealthy(PdpHealthStatus.UNKNOWN);
369 pdpSubGroup.setPdpInstances(new ArrayList<>());
370 pdpSubGroup.getPdpInstances().add(pdp);
372 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
375 databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getDesiredInstanceCount());
376 assertEquals(1, databaseProvider.getPdpGroups(GROUP).size());
378 pdpSubGroup.setDesiredInstanceCount(234);
379 databaseProvider.updatePdpSubGroup(GROUP, pdpSubGroup);
381 databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getDesiredInstanceCount());
383 assertEquals("Hello", databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getPdpInstances()
384 .get(0).getMessage());
385 pdp.setMessage("Howdy");
386 databaseProvider.updatePdp(GROUP, "type", pdp);
387 assertEquals("Howdy", databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getPdpInstances()
388 .get(0).getMessage());
390 assertThatThrownBy(() -> {
391 databaseProvider.deletePdpGroup(NAME);
392 }).hasMessage("delete of PDP group \"name:0.0.0\" failed, PDP group does not exist");
394 assertEquals(pdpGroup.getName(), databaseProvider.deletePdpGroup(GROUP).getName());
398 public void testDeletePolicyDeployedInSubgroup() throws PfModelException {
399 List<ToscaConceptIdentifier> policies = new ArrayList<>();
401 policies.add(new ToscaConceptIdentifier("p0", "0.0.1"));
402 policies.add(new ToscaConceptIdentifier("p1", "0.0.1"));
404 List<ToscaConceptIdentifier> supportedPolicyTypes = new ArrayList<>();
405 supportedPolicyTypes.add(new ToscaConceptIdentifier("pt2", "0.0.1"));
407 PdpSubGroup subGroup = new PdpSubGroup();
408 subGroup.setPdpType("pdpType");
409 subGroup.setSupportedPolicyTypes(supportedPolicyTypes);
410 subGroup.setPolicies(policies);
412 List<PdpSubGroup> pdpSubgroups = new ArrayList<>();
413 pdpSubgroups.add(subGroup);
415 PdpGroup pdpGroup = new PdpGroup();
416 pdpGroup.setName("pdpGroup");
417 pdpGroup.setPdpGroupState(PdpState.PASSIVE);
418 pdpGroup.setPdpSubgroups(pdpSubgroups);
420 List<PdpGroup> pdpGroups = new ArrayList<>();
421 pdpGroups.add(pdpGroup);
423 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
425 databaseProvider.createPdpGroups(pdpGroups);
427 assertThatThrownBy(() -> databaseProvider.deletePolicy("p0", "0.0.1"))
428 .hasMessageContaining("policy is in use, it is deployed in PDP group pdpGroup subgroup pdpType");
430 assertThatThrownBy(() -> databaseProvider.deletePolicy("p3", "0.0.1"))
431 .hasMessageContaining("service template not found in database");
433 databaseProvider.close();
437 public void testDeletePolicyTypeSupportedInSubgroup() throws PfModelException {
438 List<ToscaConceptIdentifier> supportedPolicyTypes = new ArrayList<>();
439 supportedPolicyTypes.add(new ToscaConceptIdentifier("pt1", "0.0.1"));
440 supportedPolicyTypes.add(new ToscaConceptIdentifier("pt2", "0.0.1"));
442 PdpSubGroup subGroup = new PdpSubGroup();
443 subGroup.setPdpType("pdpType");
444 subGroup.setSupportedPolicyTypes(supportedPolicyTypes);
446 List<PdpSubGroup> pdpSubgroups = new ArrayList<>();
447 pdpSubgroups.add(subGroup);
449 PdpGroup pdpGroup = new PdpGroup();
450 pdpGroup.setName("pdpGroup");
451 pdpGroup.setPdpGroupState(PdpState.PASSIVE);
452 pdpGroup.setPdpSubgroups(pdpSubgroups);
454 List<PdpGroup> pdpGroups = new ArrayList<>();
455 pdpGroups.add(pdpGroup);
457 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
459 databaseProvider.createPdpGroups(pdpGroups);
461 assertThatThrownBy(() -> databaseProvider.deletePolicyType("pt2", "0.0.1"))
462 .hasMessageContaining("policy type is in use, it is referenced in PDP group pdpGroup subgroup pdpType");
464 assertThatThrownBy(() -> databaseProvider.deletePolicyType("pt0", "0.0.1"))
465 .hasMessageContaining("service template not found in database");
467 databaseProvider.close();
471 public void testToscaNodeTemplateHandling() throws PfModelException {
472 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
474 ToscaServiceTemplate serviceTemplate = makeNodeTemplate();
476 assertEquals("1.0.1",
477 databaseProvider.createToscaNodeTemplates(serviceTemplate).getToscaTopologyTemplate().getNodeTemplates()
478 .get("metadataSet1").getVersion());
479 assertEquals(1, databaseProvider.getNodeTemplateMetadataSets(null, null).size());
481 ToscaNodeTemplate nodeTemplate1 = serviceTemplate.getToscaTopologyTemplate().getNodeTemplates()
482 .get("metadataSet1");
483 nodeTemplate1.setMetadata(Map.of("dummyKey", "updatedValue"));
484 serviceTemplate.getToscaTopologyTemplate().setNodeTemplates(Map.of("metadataSet1:1.0.1", nodeTemplate1));
485 assertEquals("updatedValue", databaseProvider.updateToscaNodeTemplates(serviceTemplate)
486 .getToscaTopologyTemplate().getNodeTemplates().get("metadataSet1").getMetadata().get("dummyKey"));
488 assertThatThrownBy(() -> {
489 databaseProvider.deleteToscaNodeTemplate("invalidName", "1.0.1");
490 }).hasMessage("node template invalidName:1.0.1 not found");
492 databaseProvider.close();
495 private ToscaServiceTemplate makeNodeTemplate() {
496 ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
497 serviceTemplate.setToscaDefinitionsVersion("sample:1.1.0");
498 serviceTemplate.setToscaTopologyTemplate(new ToscaTopologyTemplate());
499 serviceTemplate.setNodeTypes(Map.of("org.onap.policy.metadataSet:1.0.0", new ToscaNodeType()));
500 ToscaNodeTemplate nodeTemplate1 = new ToscaNodeTemplate();
501 nodeTemplate1.setName("metadataSet1");
502 nodeTemplate1.setVersion("1.0.1");
503 nodeTemplate1.setType("org.onap.policy.metadataSet");
504 nodeTemplate1.setTypeVersion("1.0.0");
505 nodeTemplate1.setMetadata(Map.of("dummyKey", "dummyValue"));
507 serviceTemplate.getToscaTopologyTemplate().setNodeTemplates(Map.of("metadataSet1", nodeTemplate1));
509 return serviceTemplate;