2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2019-2022 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 parameters.setDatabaseUrl("jdbc://www.acmecorp.nonexist");
115 databaseProvider.close();
116 databaseProvider.init();
118 databaseProvider.close();
120 parameters.setDatabaseUrl("jdbc:h2:mem:DatabasePolicyModelsProviderTest");
122 parameters.setPersistenceUnit("WileECoyote");
124 assertThatThrownBy(databaseProvider::init).hasMessageContaining("could not create Data Access Object (DAO)");
126 parameters.setPersistenceUnit("ToscaConceptTest");
128 databaseProvider.init();
129 databaseProvider.close();
131 assertThatThrownBy(() -> {
132 databaseProvider.init();
133 databaseProvider.init();
134 }).hasMessage("provider is already initialized");
136 databaseProvider.close();
138 databaseProvider.close();
142 public void testProviderMethodsNull() throws Exception {
144 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
146 assertThatThrownBy(() -> {
147 databaseProvider.getFilteredPolicyTypes(null);
148 }).hasMessageMatching(FILTER_IS_NULL);
150 assertThatThrownBy(() -> {
151 databaseProvider.getFilteredPolicyTypeList(null);
152 }).hasMessageMatching(FILTER_IS_NULL);
154 assertThatThrownBy(() -> {
155 databaseProvider.createPolicyTypes(null);
156 }).hasMessageMatching(TEMPLATE_IS_NULL);
158 assertThatThrownBy(() -> {
159 databaseProvider.updatePolicyTypes(null);
160 }).hasMessageMatching(TEMPLATE_IS_NULL);
162 assertThatThrownBy(() -> {
163 databaseProvider.deletePolicyType(null, null);
164 }).hasMessageMatching(NAME_IS_NULL);
166 assertThatThrownBy(() -> {
167 databaseProvider.deletePolicyType("aaa", null);
168 }).hasMessageMatching("^version is marked .*on.*ull but is null$");
170 assertThatThrownBy(() -> {
171 databaseProvider.deletePolicyType(null, "aaa");
172 }).hasMessageMatching(NAME_IS_NULL);
174 assertThatThrownBy(() -> {
175 databaseProvider.getFilteredPolicies(null);
176 }).hasMessageMatching(FILTER_IS_NULL);
178 assertThatThrownBy(() -> {
179 databaseProvider.getFilteredPolicyList(null);
180 }).hasMessageMatching(FILTER_IS_NULL);
182 assertThatThrownBy(() -> {
183 databaseProvider.createPolicies(null);
184 }).hasMessageMatching(TEMPLATE_IS_NULL);
186 assertThatThrownBy(() -> {
187 databaseProvider.updatePolicies(null);
188 }).hasMessageMatching(TEMPLATE_IS_NULL);
190 assertThatThrownBy(() -> {
191 databaseProvider.deletePolicy(null, null);
192 }).hasMessageMatching(NAME_IS_NULL);
194 assertThatThrownBy(() -> {
195 databaseProvider.deletePolicy(null, "aaa");
196 }).hasMessageMatching(NAME_IS_NULL);
198 assertThatThrownBy(() -> {
199 databaseProvider.deletePolicy("aaa", null);
200 }).hasMessageMatching("^version is marked .*on.*ull but is null$");
204 public void testProviderMethodsNullGroup() throws Exception {
206 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
208 assertThatThrownBy(() -> {
209 databaseProvider.getFilteredPdpGroups(null);
210 }).hasMessageMatching(FILTER_IS_NULL);
212 assertThatThrownBy(() -> {
213 databaseProvider.createPdpGroups(null);
214 }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
216 assertThatThrownBy(() -> {
217 databaseProvider.updatePdpGroups(null);
218 }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
220 assertThatThrownBy(() -> {
221 databaseProvider.updatePdpSubGroup(null, null);
222 }).hasMessageMatching(GROUP_IS_NULL);
224 assertThatThrownBy(() -> {
225 databaseProvider.updatePdpSubGroup(null, new PdpSubGroup());
226 }).hasMessageMatching(GROUP_IS_NULL);
228 assertThatThrownBy(() -> {
229 databaseProvider.updatePdpSubGroup(NAME, null);
230 }).hasMessageMatching(SUBGROUP_IS_NULL);
232 assertThatThrownBy(() -> {
233 databaseProvider.updatePdpSubGroup(NAME, new PdpSubGroup());
234 }).hasMessage("parameter \"localName\" is null");
236 assertThatThrownBy(() -> {
237 databaseProvider.updatePdp(null, null, null);
238 }).hasMessageMatching(GROUP_IS_NULL);
240 assertThatThrownBy(() -> {
241 databaseProvider.updatePdp(null, null, new Pdp());
242 }).hasMessageMatching(GROUP_IS_NULL);
244 assertThatThrownBy(() -> {
245 databaseProvider.updatePdp(null, "sub", null);
246 }).hasMessageMatching(GROUP_IS_NULL);
248 assertThatThrownBy(() -> {
249 databaseProvider.updatePdp(null, "sub", new Pdp());
250 }).hasMessageMatching(GROUP_IS_NULL);
252 assertThatThrownBy(() -> {
253 databaseProvider.updatePdp(NAME, null, null);
254 }).hasMessageMatching(SUBGROUP_IS_NULL);
256 assertThatThrownBy(() -> {
257 databaseProvider.updatePdp(NAME, null, new Pdp());
258 }).hasMessageMatching(SUBGROUP_IS_NULL);
260 assertThatThrownBy(() -> {
261 databaseProvider.updatePdp(NAME, "sub", null);
262 }).hasMessageMatching("^pdp is marked .*on.*ull but is null$");
264 assertThatThrownBy(() -> {
265 databaseProvider.updatePdp(NAME, "sub", new Pdp());
266 }).hasMessage("parameter \"localName\" is null");
268 assertThatThrownBy(() -> {
269 databaseProvider.deletePdpGroup(null);
270 }).hasMessageMatching(NAME_IS_NULL);
272 databaseProvider.close();
276 public void testProviderMethodsNotInit() throws Exception {
277 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
279 databaseProvider.close();
281 assertThatThrownBy(() -> {
282 databaseProvider.getPolicyTypes(NAME, "version");
283 }).hasMessage("policy models provider is not initilaized");
287 public void testProviderMethods() throws PfModelException {
288 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
290 assertThatThrownBy(() -> databaseProvider.getPolicyTypes(NAME, VERSION_100))
291 .hasMessage("service template not found in database");
293 assertTrue(databaseProvider.getPolicyTypeList(NAME, VERSION_100).isEmpty());
296 () -> databaseProvider.getFilteredPolicyTypes(ToscaEntityFilter.<ToscaPolicyType>builder().build()))
297 .hasMessage("service template not found in database");
299 assertTrue(databaseProvider.getFilteredPolicyTypeList(ToscaEntityFilter.<ToscaPolicyType>builder().build())
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());
319 () -> databaseProvider.getFilteredPolicies(ToscaTypedEntityFilter.<ToscaPolicy>builder().build()))
320 .hasMessage("service template not found in database");
322 assertTrue(databaseProvider.getFilteredPolicyList(ToscaTypedEntityFilter.<ToscaPolicy>builder().build())
325 assertThatThrownBy(() -> {
326 databaseProvider.createPolicies(new ToscaServiceTemplate());
327 }).hasMessage("topology template not specified on service template");
329 assertThatThrownBy(() -> {
330 databaseProvider.updatePolicies(new ToscaServiceTemplate());
331 }).hasMessage("topology template not specified on service template");
333 assertThatThrownBy(() -> databaseProvider.deletePolicy("Policy", "0.0.0").getToscaTopologyTemplate())
334 .hasMessage("service template not found in database");
336 assertEquals(0, databaseProvider.getPdpGroups(NAME).size());
337 assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
339 assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
340 assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
344 public void testProviderMethodsInGroups() throws PfModelException {
345 PdpGroup pdpGroup = new PdpGroup();
346 pdpGroup.setName(GROUP);
347 pdpGroup.setVersion("1.2.3");
348 pdpGroup.setPdpGroupState(PdpState.ACTIVE);
349 pdpGroup.setPdpSubgroups(new ArrayList<>());
350 List<PdpGroup> groupList = new ArrayList<>();
351 groupList.add(pdpGroup);
353 PdpSubGroup pdpSubGroup = new PdpSubGroup();
354 pdpSubGroup.setPdpType("type");
355 pdpSubGroup.setDesiredInstanceCount(123);
356 pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
357 pdpSubGroup.getSupportedPolicyTypes().add(new ToscaConceptIdentifier("type", "7.8.9"));
358 pdpGroup.getPdpSubgroups().add(pdpSubGroup);
361 pdp.setInstanceId("type-0");
362 pdp.setMessage("Hello");
363 pdp.setPdpState(PdpState.ACTIVE);
364 pdp.setHealthy(PdpHealthStatus.UNKNOWN);
365 pdpSubGroup.setPdpInstances(new ArrayList<>());
366 pdpSubGroup.getPdpInstances().add(pdp);
368 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
371 databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getDesiredInstanceCount());
372 assertEquals(1, databaseProvider.getPdpGroups(GROUP).size());
374 pdpSubGroup.setDesiredInstanceCount(234);
375 databaseProvider.updatePdpSubGroup(GROUP, pdpSubGroup);
377 databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getDesiredInstanceCount());
379 assertEquals("Hello", databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getPdpInstances()
380 .get(0).getMessage());
381 pdp.setMessage("Howdy");
382 databaseProvider.updatePdp(GROUP, "type", pdp);
383 assertEquals("Howdy", databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getPdpInstances()
384 .get(0).getMessage());
386 assertThatThrownBy(() -> {
387 databaseProvider.deletePdpGroup(NAME);
388 }).hasMessage("delete of PDP group \"name:0.0.0\" failed, PDP group does not exist");
390 assertEquals(pdpGroup.getName(), databaseProvider.deletePdpGroup(GROUP).getName());
394 public void testDeletePolicyDeployedInSubgroup() throws PfModelException {
395 List<ToscaConceptIdentifier> policies = new ArrayList<>();
397 policies.add(new ToscaConceptIdentifier("p0", "0.0.1"));
398 policies.add(new ToscaConceptIdentifier("p1", "0.0.1"));
400 List<ToscaConceptIdentifier> supportedPolicyTypes = new ArrayList<>();
401 supportedPolicyTypes.add(new ToscaConceptIdentifier("pt2", "0.0.1"));
403 PdpSubGroup subGroup = new PdpSubGroup();
404 subGroup.setPdpType("pdpType");
405 subGroup.setSupportedPolicyTypes(supportedPolicyTypes);
406 subGroup.setPolicies(policies);
408 List<PdpSubGroup> pdpSubgroups = new ArrayList<>();
409 pdpSubgroups.add(subGroup);
411 PdpGroup pdpGroup = new PdpGroup();
412 pdpGroup.setName("pdpGroup");
413 pdpGroup.setPdpGroupState(PdpState.PASSIVE);
414 pdpGroup.setPdpSubgroups(pdpSubgroups);
416 List<PdpGroup> pdpGroups = new ArrayList<>();
417 pdpGroups.add(pdpGroup);
419 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
421 databaseProvider.createPdpGroups(pdpGroups);
423 assertThatThrownBy(() -> databaseProvider.deletePolicy("p0", "0.0.1"))
424 .hasMessageContaining("policy is in use, it is deployed in PDP group pdpGroup subgroup pdpType");
426 assertThatThrownBy(() -> databaseProvider.deletePolicy("p3", "0.0.1"))
427 .hasMessageContaining("service template not found in database");
429 databaseProvider.close();
433 public void testDeletePolicyTypeSupportedInSubgroup() throws PfModelException {
434 List<ToscaConceptIdentifier> supportedPolicyTypes = new ArrayList<>();
435 supportedPolicyTypes.add(new ToscaConceptIdentifier("pt1", "0.0.1"));
436 supportedPolicyTypes.add(new ToscaConceptIdentifier("pt2", "0.0.1"));
438 PdpSubGroup subGroup = new PdpSubGroup();
439 subGroup.setPdpType("pdpType");
440 subGroup.setSupportedPolicyTypes(supportedPolicyTypes);
442 List<PdpSubGroup> pdpSubgroups = new ArrayList<>();
443 pdpSubgroups.add(subGroup);
445 PdpGroup pdpGroup = new PdpGroup();
446 pdpGroup.setName("pdpGroup");
447 pdpGroup.setPdpGroupState(PdpState.PASSIVE);
448 pdpGroup.setPdpSubgroups(pdpSubgroups);
450 List<PdpGroup> pdpGroups = new ArrayList<>();
451 pdpGroups.add(pdpGroup);
453 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
455 databaseProvider.createPdpGroups(pdpGroups);
457 assertThatThrownBy(() -> databaseProvider.deletePolicyType("pt2", "0.0.1"))
458 .hasMessageContaining("policy type is in use, it is referenced in PDP group pdpGroup subgroup pdpType");
460 assertThatThrownBy(() -> databaseProvider.deletePolicyType("pt0", "0.0.1"))
461 .hasMessageContaining("service template not found in database");
463 databaseProvider.close();
467 public void testToscaNodeTemplateHandling() throws PfModelException {
468 databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
470 ToscaServiceTemplate serviceTemplate = makeNodeTemplate();
472 assertEquals("1.0.1",
473 databaseProvider.createToscaNodeTemplates(serviceTemplate).getToscaTopologyTemplate().getNodeTemplates()
474 .get("metadataSet1").getVersion());
475 assertEquals(1, databaseProvider.getNodeTemplateMetadataSets(null, null).size());
477 ToscaNodeTemplate nodeTemplate1 = serviceTemplate.getToscaTopologyTemplate().getNodeTemplates()
478 .get("metadataSet1");
479 nodeTemplate1.setMetadata(Map.of("dummyKey", "updatedValue"));
480 serviceTemplate.getToscaTopologyTemplate().setNodeTemplates(Map.of("metadataSet1:1.0.1", nodeTemplate1));
481 assertEquals("updatedValue", databaseProvider.updateToscaNodeTemplates(serviceTemplate)
482 .getToscaTopologyTemplate().getNodeTemplates().get("metadataSet1").getMetadata().get("dummyKey"));
484 assertThatThrownBy(() -> {
485 databaseProvider.deleteToscaNodeTemplate("invalidName", "1.0.1");
486 }).hasMessage("node template invalidName:1.0.1 not found");
488 databaseProvider.close();
491 private ToscaServiceTemplate makeNodeTemplate() {
492 ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
493 serviceTemplate.setToscaDefinitionsVersion("sample:1.1.0");
494 serviceTemplate.setToscaTopologyTemplate(new ToscaTopologyTemplate());
495 serviceTemplate.setNodeTypes(Map.of("org.onap.policy.metadataSet:1.0.0", new ToscaNodeType()));
496 ToscaNodeTemplate nodeTemplate1 = new ToscaNodeTemplate();
497 nodeTemplate1.setName("metadataSet1");
498 nodeTemplate1.setVersion("1.0.1");
499 nodeTemplate1.setType("org.onap.policy.metadataSet");
500 nodeTemplate1.setTypeVersion("1.0.0");
501 nodeTemplate1.setMetadata(Map.of("dummyKey", "dummyValue"));
503 serviceTemplate.getToscaTopologyTemplate().setNodeTemplates(Map.of("metadataSet1", nodeTemplate1));
505 return serviceTemplate;