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;
38 import org.junit.After;
39 import org.junit.Before;
40 import org.junit.Test;
41 import org.onap.policy.api.main.parameters.ApiParameterGroup;
42 import org.onap.policy.common.parameters.ParameterService;
43 import org.onap.policy.common.utils.coder.StandardCoder;
44 import org.onap.policy.common.utils.resources.ResourceUtils;
45 import org.onap.policy.models.base.PfModelException;
46 import org.onap.policy.models.pdp.concepts.Pdp;
47 import org.onap.policy.models.pdp.concepts.PdpGroup;
48 import org.onap.policy.models.pdp.concepts.PdpGroupFilter;
49 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
50 import org.onap.policy.models.pdp.enums.PdpHealthStatus;
51 import org.onap.policy.models.pdp.enums.PdpState;
52 import org.onap.policy.models.provider.PolicyModelsProvider;
53 import org.onap.policy.models.provider.PolicyModelsProviderFactory;
54 import org.onap.policy.models.provider.PolicyModelsProviderParameters;
55 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifier;
56 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier;
57 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
58 import org.onap.policy.models.tosca.legacy.concepts.LegacyGuardPolicyInput;
59 import org.onap.policy.models.tosca.legacy.concepts.LegacyGuardPolicyOutput;
62 * This class performs unit test of {@link LegacyGuardPolicyProvider}
64 * @author Chenfei Gao (cgao@research.att.com)
66 public class TestLegacyGuardPolicyProvider {
68 private static LegacyGuardPolicyProvider guardPolicyProvider;
69 private static PolicyTypeProvider policyTypeProvider;
70 private static PolicyModelsProviderParameters providerParams;
71 private static ApiParameterGroup apiParamGroup;
72 private static StandardCoder standardCoder;
74 private static final String POLICY_RESOURCE = "policies/vDNS.policy.guard.frequency.input.json";
75 private static final String POLICY_RESOURCE_VER1 = "policies/vDNS.policy.guard.frequency.input.ver1.json";
76 private static final String POLICY_RESOURCE_VER2 = "policies/vDNS.policy.guard.frequency.input.ver2.json";
77 private static final String POLICY_TYPE_RESOURCE =
78 "policytypes/onap.policies.controlloop.guard.FrequencyLimiter.json";
79 private static final String POLICY_TYPE_ID = "onap.policies.controlloop.guard.FrequencyLimiter:1.0.0";
80 private static final String POLICY_ID = "guard.frequency.scaleout:1.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 guardPolicyProvider = new LegacyGuardPolicyProvider();
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 guardPolicyProvider.close();
112 policyTypeProvider.close();
113 ParameterService.deregister(apiParamGroup);
118 public void testFetchGuardPolicy() {
120 assertThatThrownBy(() -> {
121 guardPolicyProvider.fetchGuardPolicy("dummy", null);
122 }).hasMessage("no policy found for policy: dummy:null");
124 assertThatThrownBy(() -> {
125 guardPolicyProvider.fetchGuardPolicy("dummy", "dummy");
126 }).hasMessage("legacy policy version is not an integer");
128 assertThatCode(() -> {
129 String policyTypeString = ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE);
130 ToscaServiceTemplate policyTypeServiceTemplate =
131 standardCoder.decode(policyTypeString, ToscaServiceTemplate.class);
132 policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
134 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_VER1);
135 LegacyGuardPolicyInput policyToCreate = standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
136 Map<String, LegacyGuardPolicyOutput> createdPolicy = guardPolicyProvider.createGuardPolicy(policyToCreate);
137 assertNotNull(createdPolicy);
138 assertFalse(createdPolicy.isEmpty());
140 policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_VER2);
141 policyToCreate = standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
142 createdPolicy = guardPolicyProvider.createGuardPolicy(policyToCreate);
143 assertNotNull(createdPolicy);
144 assertFalse(createdPolicy.isEmpty());
146 Map<String, LegacyGuardPolicyOutput> firstVersion =
147 guardPolicyProvider.fetchGuardPolicy("guard.frequency.scaleout", "1");
148 assertNotNull(firstVersion);
150 firstVersion.get("guard.frequency.scaleout").getMetadata().get("policy-version").toString());
152 Map<String, LegacyGuardPolicyOutput> latestVersion =
153 guardPolicyProvider.fetchGuardPolicy("guard.frequency.scaleout", null);
154 assertNotNull(latestVersion);
156 latestVersion.get("guard.frequency.scaleout").getMetadata().get("policy-version").toString());
157 }).doesNotThrowAnyException();
159 assertThatThrownBy(() -> {
160 guardPolicyProvider.fetchGuardPolicy("guard.frequency.scaleout", "1.0.0");
161 }).hasMessage("legacy policy version is not an integer");
163 assertThatThrownBy(() -> {
164 guardPolicyProvider.fetchGuardPolicy("guard.frequency.scaleout", "latest");
165 }).hasMessage("legacy policy version is not an integer");
167 assertThatCode(() -> {
168 guardPolicyProvider.deleteGuardPolicy("guard.frequency.scaleout", "1");
169 guardPolicyProvider.deleteGuardPolicy("guard.frequency.scaleout", "2");
170 policyTypeProvider.deletePolicyType("onap.policies.controlloop.guard.FrequencyLimiter", "1.0.0");
171 }).doesNotThrowAnyException();
175 public void testCreateGuardPolicy() {
177 assertThatThrownBy(() -> {
178 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
179 LegacyGuardPolicyInput policyToCreate = standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
180 guardPolicyProvider.createGuardPolicy(policyToCreate);
181 }).hasMessage("policy type " + POLICY_TYPE_ID + " for policy " + POLICY_ID + " does not exist");
183 assertThatCode(() -> {
184 String policyTypeString = ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE);
185 ToscaServiceTemplate policyTypeServiceTemplate =
186 standardCoder.decode(policyTypeString, ToscaServiceTemplate.class);
187 policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
189 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
190 LegacyGuardPolicyInput policyToCreate = standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
191 Map<String, LegacyGuardPolicyOutput> createdPolicy = guardPolicyProvider.createGuardPolicy(policyToCreate);
192 assertNotNull(createdPolicy);
193 assertFalse(createdPolicy.isEmpty());
194 assertTrue(createdPolicy.containsKey("guard.frequency.scaleout"));
195 assertEquals("onap.policies.controlloop.guard.FrequencyLimiter",
196 createdPolicy.get("guard.frequency.scaleout").getType());
197 assertEquals("1.0.0", createdPolicy.get("guard.frequency.scaleout").getVersion());
198 }).doesNotThrowAnyException();
202 public void testDeleteGuardPolicyException() {
203 String policyId = "guard.frequency.scaleout";
204 String policyVersion = "1";
205 String policyTypeVersion = "1.0.0";
206 String policyTypeId = "onap.policies.controlloop.guard.FrequencyLimiter";
207 String legacyMinorPatchSuffix = ".0.0";
209 try (PolicyModelsProvider databaseProvider =
210 new PolicyModelsProviderFactory().createPolicyModelsProvider(providerParams)) {
211 assertEquals(0, databaseProvider.getPdpGroups("name").size());
212 assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
214 assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
215 assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
217 PdpGroup pdpGroup = new PdpGroup();
218 pdpGroup.setName("group");
219 pdpGroup.setVersion("1.2.3");
220 pdpGroup.setPdpGroupState(PdpState.ACTIVE);
221 pdpGroup.setPdpSubgroups(new ArrayList<>());
222 List<PdpGroup> groupList = new ArrayList<>();
223 groupList.add(pdpGroup);
225 PdpSubGroup pdpSubGroup = new PdpSubGroup();
226 pdpSubGroup.setPdpType("type");
227 pdpSubGroup.setDesiredInstanceCount(123);
228 pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
229 pdpSubGroup.getSupportedPolicyTypes().add(new ToscaPolicyTypeIdentifier(
230 policyTypeId, policyTypeVersion));
231 pdpGroup.getPdpSubgroups().add(pdpSubGroup);
234 pdp.setInstanceId("type-0");
235 pdp.setMessage("Hello");
236 pdp.setPdpState(PdpState.ACTIVE);
237 pdp.setHealthy(PdpHealthStatus.UNKNOWN);
238 pdpSubGroup.setPdpInstances(new ArrayList<>());
239 pdpSubGroup.getPdpInstances().add(pdp);
242 assertEquals(123, databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0)
243 .getDesiredInstanceCount());
244 assertEquals(1, databaseProvider.getPdpGroups("group").size());
246 // Create Policy Type
247 assertThatCode(() -> {
248 String policyTypeString = ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE);
249 ToscaServiceTemplate policyTypeServiceTemplate =
250 standardCoder.decode(policyTypeString, ToscaServiceTemplate.class);
251 policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
252 }).doesNotThrowAnyException();
255 assertThatCode(() -> {
256 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
257 LegacyGuardPolicyInput policyToCreate = standardCoder.decode(policyString,
258 LegacyGuardPolicyInput.class);
259 Map<String, LegacyGuardPolicyOutput> createdPolicy =
260 guardPolicyProvider.createGuardPolicy(policyToCreate);
261 assertNotNull(createdPolicy);
262 assertFalse(createdPolicy.isEmpty());
263 }).doesNotThrowAnyException();
265 // Update pdpSubGroup
266 pdpSubGroup.setPolicies(new ArrayList<>());
267 pdpSubGroup.getPolicies().add(new ToscaPolicyIdentifier(policyId, policyVersion + legacyMinorPatchSuffix));
268 assertEquals(1, databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0)
269 .getPolicies().size());
270 assertThatThrownBy(() -> {
272 .deleteGuardPolicy("guard.frequency.scaleout", "1");
273 }).hasMessageContaining("cannot be deleted as it is deployed in pdp groups");
275 catch (Exception exc) {
276 fail("Test should not throw an exception");
281 public void testDeleteGuardPolicy() {
282 assertThatThrownBy(() -> {
283 guardPolicyProvider.deleteGuardPolicy("dummy", null);
284 }).hasMessage("legacy policy version is not an integer");
286 assertThatThrownBy(() -> {
287 guardPolicyProvider.deleteGuardPolicy("dummy", "1.0.0");
288 }).hasMessage("legacy policy version is not an integer");
290 assertThatCode(() -> {
291 String policyTypeString = ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE);
292 ToscaServiceTemplate policyTypeServiceTemplate =
293 standardCoder.decode(policyTypeString, ToscaServiceTemplate.class);
294 policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
296 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
297 LegacyGuardPolicyInput policyToCreate = standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
298 Map<String, LegacyGuardPolicyOutput> createdPolicy = guardPolicyProvider.createGuardPolicy(policyToCreate);
299 assertNotNull(createdPolicy);
300 assertFalse(createdPolicy.isEmpty());
302 Map<String, LegacyGuardPolicyOutput> deletedPolicy = guardPolicyProvider
303 .deleteGuardPolicy("guard.frequency.scaleout", "1");
304 assertNotNull(deletedPolicy);
305 assertFalse(deletedPolicy.isEmpty());
306 assertTrue(deletedPolicy.containsKey("guard.frequency.scaleout"));
307 assertEquals("onap.policies.controlloop.guard.FrequencyLimiter",
308 deletedPolicy.get("guard.frequency.scaleout").getType());
310 deletedPolicy.get("guard.frequency.scaleout").getMetadata().get("policy-version").toString());
312 }).doesNotThrowAnyException();
314 assertThatThrownBy(() -> {
315 guardPolicyProvider.deleteGuardPolicy("guard.frequency.scaleout", "1");
316 }).hasMessage("no policy found for policy: guard.frequency.scaleout:1");
318 assertThatCode(() -> {
319 policyTypeProvider.deletePolicyType("onap.policies.controlloop.guard.FrequencyLimiter", "1.0.0");
320 }).doesNotThrowAnyException();