2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2019 AT&T Intellectual Property. 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.api.main.rest.provider;
25 import static org.assertj.core.api.Assertions.assertThatCode;
26 import static org.assertj.core.api.Assertions.assertThatThrownBy;
27 import static org.junit.Assert.assertEquals;
28 import static org.junit.Assert.assertFalse;
29 import static org.junit.Assert.assertNotNull;
30 import static org.junit.Assert.assertTrue;
31 import static org.junit.Assert.fail;
33 import java.util.ArrayList;
34 import java.util.Base64;
35 import java.util.List;
37 import org.junit.After;
38 import org.junit.Before;
39 import org.junit.Test;
40 import org.onap.policy.api.main.parameters.ApiParameterGroup;
41 import org.onap.policy.common.parameters.ParameterService;
42 import org.onap.policy.common.utils.coder.StandardCoder;
43 import org.onap.policy.common.utils.resources.ResourceUtils;
44 import org.onap.policy.models.base.PfModelException;
45 import org.onap.policy.models.pdp.concepts.Pdp;
46 import org.onap.policy.models.pdp.concepts.PdpGroup;
47 import org.onap.policy.models.pdp.concepts.PdpGroupFilter;
48 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
49 import org.onap.policy.models.pdp.enums.PdpHealthStatus;
50 import org.onap.policy.models.pdp.enums.PdpState;
51 import org.onap.policy.models.provider.PolicyModelsProvider;
52 import org.onap.policy.models.provider.PolicyModelsProviderFactory;
53 import org.onap.policy.models.provider.PolicyModelsProviderParameters;
54 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifier;
55 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier;
56 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
57 import org.onap.policy.models.tosca.legacy.concepts.LegacyOperationalPolicy;
60 * This class performs unit test of {@link LegacyOperationalPolicyProvider}
62 * @author Chenfei Gao (cgao@research.att.com)
64 public class TestLegacyOperationalPolicyProvider {
66 private static LegacyOperationalPolicyProvider operationalPolicyProvider;
67 private static PolicyTypeProvider policyTypeProvider;
68 private static PolicyModelsProviderParameters providerParams;
69 private static ApiParameterGroup apiParamGroup;
70 private static StandardCoder standardCoder;
72 private static final String POLICY_RESOURCE = "policies/vCPE.policy.operational.input.json";
73 private static final String POLICY_TYPE_RESOURCE = "policytypes/onap.policies.controlloop.Operational.json";
74 private static final String POLICY_TYPE_ID = "onap.policies.controlloop.Operational:1.0.0";
75 private static final String POLICY_ID = "operational.restart:1.0.0";
76 private static final String POLICY_NAME = "operational.restart";
77 private static final String POLICY_VERSION = "1";
78 private static final String POLICY_TYPE_NAME = "onap.policies.controlloop.Operational";
79 private static final String POLICY_TYPE_VERSION = "1.0.0";
80 private static final String LEGACY_MINOR_PATCH_SUFFIX = ".0.0";
83 * Initializes parameters.
85 * @throws PfModelException the PfModel parsing exception
88 public void setupParameters() throws PfModelException {
90 standardCoder = new StandardCoder();
91 providerParams = new PolicyModelsProviderParameters();
92 providerParams.setDatabaseDriver("org.h2.Driver");
93 providerParams.setDatabaseUrl("jdbc:h2:mem:testdb");
94 providerParams.setDatabaseUser("policy");
95 providerParams.setDatabasePassword(Base64.getEncoder().encodeToString("P01icY".getBytes()));
96 providerParams.setPersistenceUnit("ToscaConceptTest");
97 apiParamGroup = new ApiParameterGroup("ApiGroup", null, providerParams);
98 ParameterService.register(apiParamGroup, true);
99 operationalPolicyProvider = new LegacyOperationalPolicyProvider();
100 policyTypeProvider = new PolicyTypeProvider();
104 * Closes up DB connections and deregisters API parameter group.
106 * @throws PfModelException the PfModel parsing exception
109 public void tearDown() throws PfModelException {
111 operationalPolicyProvider.close();
112 policyTypeProvider.close();
113 ParameterService.deregister(apiParamGroup);
117 public void testFetchOperationalPolicy() {
119 assertThatThrownBy(() -> {
120 operationalPolicyProvider.fetchOperationalPolicy("dummy", null);
121 }).hasMessage("no policy found for policy: dummy:null");
123 assertThatThrownBy(() -> {
124 operationalPolicyProvider.fetchOperationalPolicy("dummy", "dummy");
125 }).hasMessage("legacy policy version is not an integer");
127 assertThatCode(() -> {
128 String policyTypeString = ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE);
129 ToscaServiceTemplate policyTypeServiceTemplate =
130 standardCoder.decode(policyTypeString, ToscaServiceTemplate.class);
131 policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
133 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
134 LegacyOperationalPolicy policyToCreate = standardCoder.decode(policyString, LegacyOperationalPolicy.class);
135 LegacyOperationalPolicy createdPolicy = operationalPolicyProvider.createOperationalPolicy(policyToCreate);
136 assertNotNull(createdPolicy);
138 policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
139 policyToCreate = standardCoder.decode(policyString, LegacyOperationalPolicy.class);
140 createdPolicy = operationalPolicyProvider.createOperationalPolicy(policyToCreate);
141 assertNotNull(createdPolicy);
143 LegacyOperationalPolicy firstVersion =
144 operationalPolicyProvider.fetchOperationalPolicy("operational.restart", "1");
145 assertNotNull(firstVersion);
147 firstVersion.getPolicyVersion());
149 LegacyOperationalPolicy latestVersion =
150 operationalPolicyProvider.fetchOperationalPolicy("operational.restart", null);
151 assertNotNull(latestVersion);
153 latestVersion.getPolicyVersion());
154 }).doesNotThrowAnyException();
156 assertThatThrownBy(() -> {
157 operationalPolicyProvider.fetchOperationalPolicy("operational.restart", "1.0.0");
158 }).hasMessage("legacy policy version is not an integer");
160 assertThatThrownBy(() -> {
161 operationalPolicyProvider.fetchOperationalPolicy("operational.restart", "latest");;
162 }).hasMessage("legacy policy version is not an integer");
164 assertThatCode(() -> {
165 operationalPolicyProvider.deleteOperationalPolicy("operational.restart", "1");
166 operationalPolicyProvider.deleteOperationalPolicy("operational.restart", "2");
167 policyTypeProvider.deletePolicyType("onap.policies.controlloop.Operational", "1.0.0");
168 }).doesNotThrowAnyException();
172 public void testFetchDeployedOperationalPolicies() {
174 assertThatThrownBy(() -> {
175 operationalPolicyProvider.fetchDeployedOperationalPolicies("dummy");
176 }).hasMessage("could not find policy with ID dummy and type " + POLICY_TYPE_ID + " deployed in any pdp group");
178 try (PolicyModelsProvider databaseProvider =
179 new PolicyModelsProviderFactory().createPolicyModelsProvider(providerParams)) {
180 assertEquals(0, databaseProvider.getPdpGroups("name").size());
181 assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
183 assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
184 assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
186 PdpGroup pdpGroup = new PdpGroup();
187 pdpGroup.setName("group");
188 pdpGroup.setVersion("1.2.3");
189 pdpGroup.setPdpGroupState(PdpState.ACTIVE);
190 pdpGroup.setPdpSubgroups(new ArrayList<>());
191 List<PdpGroup> groupList = new ArrayList<>();
192 groupList.add(pdpGroup);
194 PdpSubGroup pdpSubGroup = new PdpSubGroup();
195 pdpSubGroup.setPdpType("type");
196 pdpSubGroup.setDesiredInstanceCount(123);
197 pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
198 pdpSubGroup.getSupportedPolicyTypes().add(new ToscaPolicyTypeIdentifier(
199 POLICY_TYPE_NAME, POLICY_TYPE_VERSION));
200 pdpGroup.getPdpSubgroups().add(pdpSubGroup);
203 pdp.setInstanceId("type-0");
204 pdp.setMessage("Hello");
205 pdp.setPdpState(PdpState.ACTIVE);
206 pdp.setHealthy(PdpHealthStatus.UNKNOWN);
207 pdpSubGroup.setPdpInstances(new ArrayList<>());
208 pdpSubGroup.getPdpInstances().add(pdp);
211 assertEquals(123, databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0)
212 .getDesiredInstanceCount());
213 assertEquals(1, databaseProvider.getPdpGroups("group").size());
215 // Create Policy Type
216 assertThatCode(() -> {
217 String policyTypeString = ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE);
218 ToscaServiceTemplate policyTypeServiceTemplate =
219 standardCoder.decode(policyTypeString, ToscaServiceTemplate.class);
220 policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
221 }).doesNotThrowAnyException();
224 assertThatCode(() -> {
225 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
226 LegacyOperationalPolicy policyToCreate =
227 standardCoder.decode(policyString, LegacyOperationalPolicy.class);
228 LegacyOperationalPolicy policyCreated = operationalPolicyProvider
229 .createOperationalPolicy(policyToCreate);
230 assertEquals("operational.restart", policyCreated.getPolicyId());
231 assertEquals("1", policyCreated.getPolicyVersion());
232 assertFalse(policyCreated.getContent() == null);
233 }).doesNotThrowAnyException();
235 // Test fetchDeployedPolicies (deployedPolicyMap.isEmpty())==true
238 operationalPolicyProvider.fetchDeployedOperationalPolicies(POLICY_NAME);
239 }).hasMessage("could not find policy with ID " + POLICY_NAME + " and type "
240 + POLICY_TYPE_ID + " deployed in any pdp group");
243 // Update pdpSubGroup
244 pdpSubGroup.setPolicies(new ArrayList<>());
245 pdpSubGroup.getPolicies().add(
246 new ToscaPolicyIdentifier(POLICY_NAME, POLICY_VERSION + LEGACY_MINOR_PATCH_SUFFIX));
247 assertEquals(1, databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0)
248 .getPolicies().size());
250 // Test fetchDeployedPolicies
253 operationalPolicyProvider.fetchDeployedOperationalPolicies(POLICY_NAME);
254 }).doesNotThrowAnyException();
256 // Test validateDeleteEligibility exception path(!pdpGroups.isEmpty())
259 operationalPolicyProvider.deleteOperationalPolicy(
260 POLICY_NAME, POLICY_VERSION);
261 }).hasMessageContaining("policy with ID " + POLICY_NAME + ":" + POLICY_VERSION
262 + " cannot be deleted as it is deployed in pdp groups");
264 catch (Exception exc) {
265 fail("Test should not throw an exception");
270 public void testCreateOperationalPolicy() {
272 assertThatThrownBy(() -> {
273 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
274 LegacyOperationalPolicy policyToCreate = standardCoder.decode(policyString, LegacyOperationalPolicy.class);
275 operationalPolicyProvider.createOperationalPolicy(policyToCreate);
276 }).hasMessage("policy type " + POLICY_TYPE_ID + " for policy " + POLICY_ID + " does not exist");
278 assertThatCode(() -> {
279 String policyTypeString = ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE);
280 ToscaServiceTemplate policyTypeServiceTemplate =
281 standardCoder.decode(policyTypeString, ToscaServiceTemplate.class);
282 policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
284 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
285 LegacyOperationalPolicy policyToCreate = standardCoder.decode(policyString, LegacyOperationalPolicy.class);
286 LegacyOperationalPolicy createdPolicy = operationalPolicyProvider.createOperationalPolicy(policyToCreate);
287 assertNotNull(createdPolicy);
288 assertEquals("operational.restart", createdPolicy.getPolicyId());
289 assertTrue(createdPolicy.getContent()
290 .startsWith("controlLoop%3A%0A%20%20version%3A%202.0.0%0A%20%20"));
291 }).doesNotThrowAnyException();
295 public void testDeleteOperationalPolicyException() {
296 String policyId = "operational.restart";
297 String policyVersion = "1";
298 String policyTypeVersion = "1.0.0";
299 String policyTypeId = "onap.policies.controlloop.Operational";
300 String legacyMinorPatchSuffix = ".0.0";
302 try (PolicyModelsProvider databaseProvider =
303 new PolicyModelsProviderFactory().createPolicyModelsProvider(providerParams)) {
304 assertEquals(0, databaseProvider.getPdpGroups("name").size());
305 assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
307 assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
308 assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
310 PdpGroup pdpGroup = new PdpGroup();
311 pdpGroup.setName("group");
312 pdpGroup.setVersion("1.2.3");
313 pdpGroup.setPdpGroupState(PdpState.ACTIVE);
314 pdpGroup.setPdpSubgroups(new ArrayList<>());
315 List<PdpGroup> groupList = new ArrayList<>();
316 groupList.add(pdpGroup);
318 PdpSubGroup pdpSubGroup = new PdpSubGroup();
319 pdpSubGroup.setPdpType("type");
320 pdpSubGroup.setDesiredInstanceCount(123);
321 pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
322 pdpSubGroup.getSupportedPolicyTypes().add(new ToscaPolicyTypeIdentifier(
323 policyTypeId, policyTypeVersion));
324 pdpGroup.getPdpSubgroups().add(pdpSubGroup);
327 pdp.setInstanceId("type-0");
328 pdp.setMessage("Hello");
329 pdp.setPdpState(PdpState.ACTIVE);
330 pdp.setHealthy(PdpHealthStatus.UNKNOWN);
331 pdpSubGroup.setPdpInstances(new ArrayList<>());
332 pdpSubGroup.getPdpInstances().add(pdp);
335 assertEquals(123, databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0)
336 .getDesiredInstanceCount());
337 assertEquals(1, databaseProvider.getPdpGroups("group").size());
339 // Create Policy Type
340 assertThatCode(() -> {
341 String policyTypeString = ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE);
342 ToscaServiceTemplate policyTypeServiceTemplate =
343 standardCoder.decode(policyTypeString, ToscaServiceTemplate.class);
344 policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
345 }).doesNotThrowAnyException();
348 assertThatCode(() -> {
349 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
350 LegacyOperationalPolicy policyToCreate =
351 standardCoder.decode(policyString, LegacyOperationalPolicy.class);
352 LegacyOperationalPolicy createdPolicy =
353 operationalPolicyProvider.createOperationalPolicy(policyToCreate);
354 assertNotNull(createdPolicy);
355 }).doesNotThrowAnyException();
357 // Update pdpSubGroup
358 pdpSubGroup.setPolicies(new ArrayList<>());
359 pdpSubGroup.getPolicies().add(new ToscaPolicyIdentifier(policyId, policyVersion + legacyMinorPatchSuffix));
360 assertEquals(1, databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0)
361 .getPolicies().size());
362 assertThatThrownBy(() -> {
363 operationalPolicyProvider.deleteOperationalPolicy(policyId, policyVersion);
364 }).hasMessageContaining("cannot be deleted as it is deployed in pdp groups");
366 catch (Exception exc) {
367 fail("Test should not throw an exception");
372 public void testDeleteOperationalPolicy() {
374 assertThatThrownBy(() -> {
375 operationalPolicyProvider.deleteOperationalPolicy("dummy", null);
376 }).hasMessage("legacy policy version is not an integer");
378 assertThatThrownBy(() -> {
379 operationalPolicyProvider.deleteOperationalPolicy("dummy", "dummy");
380 }).hasMessage("legacy policy version is not an integer");
382 assertThatCode(() -> {
383 String policyTypeString = ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE);
384 ToscaServiceTemplate policyTypeServiceTemplate =
385 standardCoder.decode(policyTypeString, ToscaServiceTemplate.class);
386 policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
388 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
389 LegacyOperationalPolicy policyToCreate = standardCoder.decode(policyString, LegacyOperationalPolicy.class);
390 LegacyOperationalPolicy createdPolicy = operationalPolicyProvider.createOperationalPolicy(policyToCreate);
391 assertNotNull(createdPolicy);
393 LegacyOperationalPolicy deletedPolicy = operationalPolicyProvider
394 .deleteOperationalPolicy("operational.restart", "1");
395 assertNotNull(deletedPolicy);
396 assertEquals("operational.restart", deletedPolicy.getPolicyId());
397 assertTrue(deletedPolicy.getContent()
398 .startsWith("controlLoop%3A%0A%20%20version%3A%202.0.0%0A%20%20"));
399 }).doesNotThrowAnyException();
401 assertThatThrownBy(() -> {
402 operationalPolicyProvider.deleteOperationalPolicy("operational.restart", "1");
403 }).hasMessage("no policy found for policy: operational.restart:1");
405 assertThatCode(() -> {
406 policyTypeProvider.deletePolicyType("onap.policies.controlloop.Operational", "1.0.0");
407 }).doesNotThrowAnyException();