2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
6 * Modifications Copyright (C) 2019 Nordix Foundation.
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
20 * SPDX-License-Identifier: Apache-2.0
21 * ============LICENSE_END=========================================================
24 package org.onap.policy.api.main.rest.provider;
26 import static org.assertj.core.api.Assertions.assertThatCode;
27 import static org.assertj.core.api.Assertions.assertThatThrownBy;
28 import static org.junit.Assert.assertEquals;
29 import static org.junit.Assert.assertFalse;
30 import static org.junit.Assert.assertNotNull;
31 import static org.junit.Assert.assertTrue;
32 import static org.junit.Assert.fail;
34 import java.util.ArrayList;
35 import java.util.Base64;
36 import java.util.List;
39 import org.junit.After;
40 import org.junit.Before;
41 import org.junit.Test;
42 import org.onap.policy.api.main.ApiTestSupportUtilities;
43 import org.onap.policy.api.main.parameters.ApiParameterGroup;
44 import org.onap.policy.common.parameters.ParameterService;
45 import org.onap.policy.common.utils.coder.StandardCoder;
46 import org.onap.policy.common.utils.resources.ResourceUtils;
47 import org.onap.policy.models.base.PfModelException;
48 import org.onap.policy.models.pdp.concepts.Pdp;
49 import org.onap.policy.models.pdp.concepts.PdpGroup;
50 import org.onap.policy.models.pdp.concepts.PdpGroupFilter;
51 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
52 import org.onap.policy.models.pdp.enums.PdpHealthStatus;
53 import org.onap.policy.models.pdp.enums.PdpState;
54 import org.onap.policy.models.provider.PolicyModelsProvider;
55 import org.onap.policy.models.provider.PolicyModelsProviderFactory;
56 import org.onap.policy.models.provider.PolicyModelsProviderParameters;
57 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifier;
58 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier;
59 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
60 import org.onap.policy.models.tosca.legacy.concepts.LegacyGuardPolicyInput;
61 import org.onap.policy.models.tosca.legacy.concepts.LegacyGuardPolicyOutput;
64 * This class performs unit test of {@link LegacyGuardPolicyProvider}.
66 * @author Chenfei Gao (cgao@research.att.com)
68 public class TestLegacyGuardPolicyProvider {
70 private static LegacyGuardPolicyProvider guardPolicyProvider;
71 private static PolicyTypeProvider policyTypeProvider;
72 private static PolicyModelsProviderParameters providerParams;
73 private static ApiParameterGroup apiParamGroup;
74 private static StandardCoder standardCoder;
76 private static final String POLICY_RESOURCE = "policies/vDNS.policy.guard.frequency.input.json";
77 private static final String POLICY_RESOURCE_VER1 = "policies/vDNS.policy.guard.frequency.input.ver1.json";
78 private static final String POLICY_RESOURCE_VER2 = "policies/vDNS.policy.guard.frequency.input.ver2.json";
79 private static final String POLICY_TYPE_RESOURCE =
80 "policytypes/onap.policies.controlloop.guard.FrequencyLimiter.yaml";
81 private static final String POLICY_TYPE_ID = "onap.policies.controlloop.guard.FrequencyLimiter:1.0.0";
82 private static final String POLICY_TYPE_NAME = "onap.policies.controlloop.guard.FrequencyLimiter";
83 private static final String POLICY_TYPE_VERSION = "1.0.0";
84 private static final String POLICY_ID = "guard.frequency.scaleout:1.0.0";
85 private static final String POLICY_NAME = "guard.frequency.scaleout";
86 private static final String POLICY_VERSION = "1";
87 private static final String LEGACY_MINOR_PATCH_SUFFIX = ".0.0";
90 * Initializes parameters.
92 * @throws PfModelException the PfModel parsing exception
95 public void setupParameters() throws PfModelException {
97 standardCoder = new StandardCoder();
98 providerParams = new PolicyModelsProviderParameters();
99 providerParams.setDatabaseDriver("org.h2.Driver");
100 providerParams.setDatabaseUrl("jdbc:h2:mem:testdb");
101 providerParams.setDatabaseUser("policy");
102 providerParams.setDatabasePassword(Base64.getEncoder().encodeToString("P01icY".getBytes()));
103 providerParams.setPersistenceUnit("ToscaConceptTest");
104 apiParamGroup = new ApiParameterGroup("ApiGroup", null, providerParams);
105 ParameterService.register(apiParamGroup, true);
106 guardPolicyProvider = new LegacyGuardPolicyProvider();
107 policyTypeProvider = new PolicyTypeProvider();
111 * Closes up DB connections and deregisters API parameter group.
113 * @throws PfModelException the PfModel parsing exception
116 public void tearDown() throws PfModelException {
118 guardPolicyProvider.close();
119 policyTypeProvider.close();
120 ParameterService.deregister(apiParamGroup);
125 public void testFetchGuardPolicy() {
127 assertThatThrownBy(() -> {
128 guardPolicyProvider.fetchGuardPolicy("dummy", null);
129 }).hasMessage("no policy found for policy: dummy:null");
131 assertThatThrownBy(() -> {
132 guardPolicyProvider.fetchGuardPolicy("dummy", "dummy");
133 }).hasMessage("legacy policy version is not an integer");
135 assertThatCode(() -> {
136 String policyTypeString =
137 ApiTestSupportUtilities.yaml2Json(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE));
138 ToscaServiceTemplate policyTypeServiceTemplate =
139 standardCoder.decode(policyTypeString, ToscaServiceTemplate.class);
140 policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
142 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_VER1);
143 LegacyGuardPolicyInput policyToCreate = standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
144 Map<String, LegacyGuardPolicyOutput> createdPolicy = guardPolicyProvider.createGuardPolicy(policyToCreate);
145 assertNotNull(createdPolicy);
146 assertFalse(createdPolicy.isEmpty());
148 policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_VER2);
149 policyToCreate = standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
150 createdPolicy = guardPolicyProvider.createGuardPolicy(policyToCreate);
151 assertNotNull(createdPolicy);
152 assertFalse(createdPolicy.isEmpty());
154 Map<String, LegacyGuardPolicyOutput> firstVersion =
155 guardPolicyProvider.fetchGuardPolicy("guard.frequency.scaleout", "1");
156 assertNotNull(firstVersion);
158 firstVersion.get("guard.frequency.scaleout").getMetadata().get("policy-version").toString());
160 Map<String, LegacyGuardPolicyOutput> latestVersion =
161 guardPolicyProvider.fetchGuardPolicy("guard.frequency.scaleout", null);
162 assertNotNull(latestVersion);
164 latestVersion.get("guard.frequency.scaleout").getMetadata().get("policy-version").toString());
165 }).doesNotThrowAnyException();
167 assertThatThrownBy(() -> {
168 guardPolicyProvider.fetchGuardPolicy("guard.frequency.scaleout", "1.0.0");
169 }).hasMessage("legacy policy version is not an integer");
171 assertThatThrownBy(() -> {
172 guardPolicyProvider.fetchGuardPolicy("guard.frequency.scaleout", "latest");
173 }).hasMessage("legacy policy version is not an integer");
175 assertThatCode(() -> {
176 guardPolicyProvider.deleteGuardPolicy("guard.frequency.scaleout", "1");
177 guardPolicyProvider.deleteGuardPolicy("guard.frequency.scaleout", "2");
178 policyTypeProvider.deletePolicyType("onap.policies.controlloop.guard.FrequencyLimiter", "1.0.0");
179 }).doesNotThrowAnyException();
183 public void testFetchDeployedGuardPolicies() {
185 assertThatThrownBy(() -> {
186 guardPolicyProvider.fetchDeployedGuardPolicies("dummy");
187 }).hasMessage("No policy type defined for dummy");
189 try (PolicyModelsProvider databaseProvider =
190 new PolicyModelsProviderFactory().createPolicyModelsProvider(providerParams)) {
191 assertEquals(0, databaseProvider.getPdpGroups("name").size());
192 assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
194 assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
195 assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
197 PdpGroup pdpGroup = new PdpGroup();
198 pdpGroup.setName("group");
199 pdpGroup.setVersion("1.2.3");
200 pdpGroup.setPdpGroupState(PdpState.ACTIVE);
201 pdpGroup.setPdpSubgroups(new ArrayList<>());
202 List<PdpGroup> groupList = new ArrayList<>();
203 groupList.add(pdpGroup);
205 PdpSubGroup pdpSubGroup = new PdpSubGroup();
206 pdpSubGroup.setPdpType("type");
207 pdpSubGroup.setDesiredInstanceCount(123);
208 pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
209 pdpSubGroup.getSupportedPolicyTypes()
210 .add(new ToscaPolicyTypeIdentifier(POLICY_TYPE_NAME, POLICY_TYPE_VERSION));
211 pdpGroup.getPdpSubgroups().add(pdpSubGroup);
214 pdp.setInstanceId("type-0");
215 pdp.setMessage("Hello");
216 pdp.setPdpState(PdpState.ACTIVE);
217 pdp.setHealthy(PdpHealthStatus.UNKNOWN);
218 pdpSubGroup.setPdpInstances(new ArrayList<>());
219 pdpSubGroup.getPdpInstances().add(pdp);
222 assertEquals(123, databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0)
223 .getDesiredInstanceCount());
224 assertEquals(1, databaseProvider.getPdpGroups("group").size());
226 // Create Policy Type
227 assertThatCode(() -> {
228 String policyTypeString =
229 ApiTestSupportUtilities.yaml2Json(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE));
230 ToscaServiceTemplate policyTypeServiceTemplate =
231 standardCoder.decode(policyTypeString, ToscaServiceTemplate.class);
232 policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
233 }).doesNotThrowAnyException();
236 assertThatCode(() -> {
237 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
238 LegacyGuardPolicyInput policyToCreate =
239 standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
240 Map<String, LegacyGuardPolicyOutput> policyCreated =
241 guardPolicyProvider.createGuardPolicy(policyToCreate);
242 assertFalse(policyCreated.isEmpty());
243 }).doesNotThrowAnyException();
245 // Test fetchDeployedPolicies (deployedPolicyMap.isEmpty())==true
246 assertThatThrownBy(() -> {
247 guardPolicyProvider.fetchDeployedGuardPolicies(POLICY_NAME);
248 }) .hasMessage("could not find policy with ID " + POLICY_NAME + " and type " + POLICY_TYPE_ID
249 + " deployed in any pdp group");
252 // Update pdpSubGroup
253 pdpSubGroup.setPolicies(new ArrayList<>());
254 pdpSubGroup.getPolicies()
255 .add(new ToscaPolicyIdentifier(POLICY_NAME, POLICY_VERSION + LEGACY_MINOR_PATCH_SUFFIX));
257 databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getPolicies().size());
259 // Test fetchDeployedPolicies
260 assertThatCode(() -> {
261 guardPolicyProvider.fetchDeployedGuardPolicies(POLICY_NAME);
262 }).doesNotThrowAnyException();
264 // Test validateDeleteEligibility exception path(!pdpGroups.isEmpty())
265 assertThatThrownBy(() -> {
266 guardPolicyProvider.deleteGuardPolicy(POLICY_NAME, POLICY_VERSION);
267 }) .hasMessageContaining("policy with ID " + POLICY_NAME + ":" + POLICY_VERSION
268 + " cannot be deleted as it is deployed in pdp groups");
269 } catch (Exception exc) {
270 fail("Test should not throw an exception");
275 public void testCreateGuardPolicy() {
277 assertThatThrownBy(() -> {
278 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
279 LegacyGuardPolicyInput policyToCreate = standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
280 guardPolicyProvider.createGuardPolicy(policyToCreate);
281 }).hasMessage("policy type " + POLICY_TYPE_ID + " for policy " + POLICY_ID + " does not exist");
283 assertThatCode(() -> {
284 String policyTypeString =
285 ApiTestSupportUtilities.yaml2Json(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE));
286 ToscaServiceTemplate policyTypeServiceTemplate =
287 standardCoder.decode(policyTypeString, ToscaServiceTemplate.class);
288 policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
290 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
291 LegacyGuardPolicyInput policyToCreate = standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
292 Map<String, LegacyGuardPolicyOutput> createdPolicy = guardPolicyProvider.createGuardPolicy(policyToCreate);
293 assertNotNull(createdPolicy);
294 assertFalse(createdPolicy.isEmpty());
295 assertTrue(createdPolicy.containsKey("guard.frequency.scaleout"));
296 assertEquals("onap.policies.controlloop.guard.FrequencyLimiter",
297 createdPolicy.get("guard.frequency.scaleout").getType());
298 assertEquals("1.0.0", createdPolicy.get("guard.frequency.scaleout").getVersion());
299 }).doesNotThrowAnyException();
303 public void testDeleteGuardPolicyException() {
304 String policyId = "guard.frequency.scaleout";
305 String policyVersion = "1";
306 String policyTypeVersion = "1.0.0";
307 String policyTypeId = "onap.policies.controlloop.guard.FrequencyLimiter";
308 String legacyMinorPatchSuffix = ".0.0";
310 try (PolicyModelsProvider databaseProvider =
311 new PolicyModelsProviderFactory().createPolicyModelsProvider(providerParams)) {
312 assertEquals(0, databaseProvider.getPdpGroups("name").size());
313 assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
315 assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
316 assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
318 PdpGroup pdpGroup = new PdpGroup();
319 pdpGroup.setName("group");
320 pdpGroup.setVersion("1.2.3");
321 pdpGroup.setPdpGroupState(PdpState.ACTIVE);
322 pdpGroup.setPdpSubgroups(new ArrayList<>());
323 List<PdpGroup> groupList = new ArrayList<>();
324 groupList.add(pdpGroup);
326 PdpSubGroup pdpSubGroup = new PdpSubGroup();
327 pdpSubGroup.setPdpType("type");
328 pdpSubGroup.setDesiredInstanceCount(123);
329 pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
330 pdpSubGroup.getSupportedPolicyTypes().add(new ToscaPolicyTypeIdentifier(policyTypeId, policyTypeVersion));
331 pdpGroup.getPdpSubgroups().add(pdpSubGroup);
334 pdp.setInstanceId("type-0");
335 pdp.setMessage("Hello");
336 pdp.setPdpState(PdpState.ACTIVE);
337 pdp.setHealthy(PdpHealthStatus.UNKNOWN);
338 pdpSubGroup.setPdpInstances(new ArrayList<>());
339 pdpSubGroup.getPdpInstances().add(pdp);
342 assertEquals(123, databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0)
343 .getDesiredInstanceCount());
344 assertEquals(1, databaseProvider.getPdpGroups("group").size());
346 // Create Policy Type
347 assertThatCode(() -> {
348 String policyTypeString =
349 ApiTestSupportUtilities.yaml2Json(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE));
350 ToscaServiceTemplate policyTypeServiceTemplate =
351 standardCoder.decode(policyTypeString, ToscaServiceTemplate.class);
352 policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
353 }).doesNotThrowAnyException();
356 assertThatCode(() -> {
357 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
358 LegacyGuardPolicyInput policyToCreate =
359 standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
360 Map<String, LegacyGuardPolicyOutput> createdPolicy =
361 guardPolicyProvider.createGuardPolicy(policyToCreate);
362 assertNotNull(createdPolicy);
363 assertFalse(createdPolicy.isEmpty());
364 }).doesNotThrowAnyException();
366 // Update pdpSubGroup
367 pdpSubGroup.setPolicies(new ArrayList<>());
368 pdpSubGroup.getPolicies().add(new ToscaPolicyIdentifier(policyId, policyVersion + legacyMinorPatchSuffix));
370 databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getPolicies().size());
371 assertThatThrownBy(() -> {
372 guardPolicyProvider.deleteGuardPolicy("guard.frequency.scaleout", "1");
373 }).hasMessageContaining("cannot be deleted as it is deployed in pdp groups");
374 } catch (Exception exc) {
375 fail("Test should not throw an exception");
380 public void testDeleteGuardPolicy() {
381 assertThatThrownBy(() -> {
382 guardPolicyProvider.deleteGuardPolicy("dummy", null);
383 }).hasMessage("legacy policy version is not an integer");
385 assertThatThrownBy(() -> {
386 guardPolicyProvider.deleteGuardPolicy("dummy", "1.0.0");
387 }).hasMessage("legacy policy version is not an integer");
389 assertThatCode(() -> {
390 String policyTypeString =
391 ApiTestSupportUtilities.yaml2Json(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE));
392 ToscaServiceTemplate policyTypeServiceTemplate =
393 standardCoder.decode(policyTypeString, ToscaServiceTemplate.class);
394 policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
396 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
397 LegacyGuardPolicyInput policyToCreate = standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
398 Map<String, LegacyGuardPolicyOutput> createdPolicy = guardPolicyProvider.createGuardPolicy(policyToCreate);
399 assertNotNull(createdPolicy);
400 assertFalse(createdPolicy.isEmpty());
402 Map<String, LegacyGuardPolicyOutput> deletedPolicy =
403 guardPolicyProvider.deleteGuardPolicy("guard.frequency.scaleout", "1");
404 assertNotNull(deletedPolicy);
405 assertFalse(deletedPolicy.isEmpty());
406 assertTrue(deletedPolicy.containsKey("guard.frequency.scaleout"));
407 assertEquals("onap.policies.controlloop.guard.FrequencyLimiter",
408 deletedPolicy.get("guard.frequency.scaleout").getType());
410 deletedPolicy.get("guard.frequency.scaleout").getMetadata().get("policy-version").toString());
412 }).doesNotThrowAnyException();
414 assertThatThrownBy(() -> {
415 guardPolicyProvider.deleteGuardPolicy("guard.frequency.scaleout", "1");
416 }).hasMessage("no policy found for policy: guard.frequency.scaleout:1");
418 assertThatCode(() -> {
419 policyTypeProvider.deletePolicyType("onap.policies.controlloop.guard.FrequencyLimiter", "1.0.0");
420 }).doesNotThrowAnyException();