Policy API JUnit Tests
[policy/api.git] / main / src / test / java / org / onap / policy / api / main / rest / provider / TestLegacyGuardPolicyProvider.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP Policy API
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
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
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.
18  *
19  * SPDX-License-Identifier: Apache-2.0
20  * ============LICENSE_END=========================================================
21  */
22
23 package org.onap.policy.api.main.rest.provider;
24
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;
32
33 import java.util.ArrayList;
34 import java.util.Base64;
35 import java.util.List;
36 import java.util.Map;
37
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;
60
61 /**
62  * This class performs unit test of {@link LegacyGuardPolicyProvider}
63  *
64  * @author Chenfei Gao (cgao@research.att.com)
65  */
66 public class TestLegacyGuardPolicyProvider {
67
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;
73
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";
81
82     /**
83      * Initializes parameters.
84      *
85      * @throws PfModelException the PfModel parsing exception
86      */
87     @Before
88     public void setupParameters() throws PfModelException {
89
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();
101     }
102
103     /**
104      * Closes up DB connections and deregisters API parameter group.
105      *
106      * @throws PfModelException the PfModel parsing exception
107      */
108     @After
109     public void tearDown() throws PfModelException {
110
111         guardPolicyProvider.close();
112         policyTypeProvider.close();
113         ParameterService.deregister(apiParamGroup);
114     }
115
116
117     @Test
118     public void testFetchGuardPolicy() {
119
120         assertThatThrownBy(() -> {
121             guardPolicyProvider.fetchGuardPolicy("dummy", null);
122         }).hasMessage("no policy found for policy: dummy:null");
123
124         assertThatThrownBy(() -> {
125             guardPolicyProvider.fetchGuardPolicy("dummy", "dummy");
126         }).hasMessage("legacy policy version is not an integer");
127
128         assertThatCode(() -> {
129             String policyTypeString = ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE);
130             ToscaServiceTemplate policyTypeServiceTemplate =
131                     standardCoder.decode(policyTypeString, ToscaServiceTemplate.class);
132             policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
133
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());
139
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());
145
146             Map<String, LegacyGuardPolicyOutput> firstVersion =
147                     guardPolicyProvider.fetchGuardPolicy("guard.frequency.scaleout", "1");
148             assertNotNull(firstVersion);
149             assertEquals("1",
150                     firstVersion.get("guard.frequency.scaleout").getMetadata().get("policy-version").toString());
151
152             Map<String, LegacyGuardPolicyOutput> latestVersion =
153                     guardPolicyProvider.fetchGuardPolicy("guard.frequency.scaleout", null);
154             assertNotNull(latestVersion);
155             assertEquals("2",
156                     latestVersion.get("guard.frequency.scaleout").getMetadata().get("policy-version").toString());
157         }).doesNotThrowAnyException();
158
159         assertThatThrownBy(() -> {
160             guardPolicyProvider.fetchGuardPolicy("guard.frequency.scaleout", "1.0.0");
161         }).hasMessage("legacy policy version is not an integer");
162
163         assertThatThrownBy(() -> {
164             guardPolicyProvider.fetchGuardPolicy("guard.frequency.scaleout", "latest");
165         }).hasMessage("legacy policy version is not an integer");
166
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();
172     }
173
174     @Test
175     public void testCreateGuardPolicy() {
176
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");
182
183         assertThatCode(() -> {
184             String policyTypeString = ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE);
185             ToscaServiceTemplate policyTypeServiceTemplate =
186                     standardCoder.decode(policyTypeString, ToscaServiceTemplate.class);
187             policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
188
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();
199     }
200
201     @Test
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";
208
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());
213
214             assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
215             assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
216
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);
224
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);
232
233             Pdp pdp = new Pdp();
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);
240
241             // Create Pdp Groups
242             assertEquals(123, databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0)
243                     .getDesiredInstanceCount());
244             assertEquals(1, databaseProvider.getPdpGroups("group").size());
245
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();
253
254             // Create Policy
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();
264
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(() -> {
271                 guardPolicyProvider
272                         .deleteGuardPolicy("guard.frequency.scaleout", "1");
273             }).hasMessageContaining("cannot be deleted as it is deployed in pdp groups");
274         }
275         catch (Exception exc) {
276             fail("Test should not throw an exception");
277         }
278     }
279
280     @Test
281     public void testDeleteGuardPolicy() {
282         assertThatThrownBy(() -> {
283             guardPolicyProvider.deleteGuardPolicy("dummy", null);
284         }).hasMessage("legacy policy version is not an integer");
285
286         assertThatThrownBy(() -> {
287             guardPolicyProvider.deleteGuardPolicy("dummy", "1.0.0");
288         }).hasMessage("legacy policy version is not an integer");
289
290         assertThatCode(() -> {
291             String policyTypeString = ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE);
292             ToscaServiceTemplate policyTypeServiceTemplate =
293                     standardCoder.decode(policyTypeString, ToscaServiceTemplate.class);
294             policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
295
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());
301
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());
309             assertEquals("1",
310                     deletedPolicy.get("guard.frequency.scaleout").getMetadata().get("policy-version").toString());
311
312         }).doesNotThrowAnyException();
313
314         assertThatThrownBy(() -> {
315             guardPolicyProvider.deleteGuardPolicy("guard.frequency.scaleout", "1");
316         }).hasMessage("no policy found for policy: guard.frequency.scaleout:1");
317
318         assertThatCode(() -> {
319             policyTypeProvider.deletePolicyType("onap.policies.controlloop.guard.FrequencyLimiter", "1.0.0");
320         }).doesNotThrowAnyException();
321     }
322 }