bfd126ea04248004a4bbf9376887ed1c2f035dda
[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  * 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
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
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.
19  *
20  * SPDX-License-Identifier: Apache-2.0
21  * ============LICENSE_END=========================================================
22  */
23
24 package org.onap.policy.api.main.rest.provider;
25
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;
33
34 import java.util.ArrayList;
35 import java.util.Base64;
36 import java.util.List;
37 import java.util.Map;
38
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;
62
63 /**
64  * This class performs unit test of {@link LegacyGuardPolicyProvider}.
65  *
66  * @author Chenfei Gao (cgao@research.att.com)
67  */
68 public class TestLegacyGuardPolicyProvider {
69
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;
75
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";
88
89     /**
90      * Initializes parameters.
91      *
92      * @throws PfModelException the PfModel parsing exception
93      */
94     @Before
95     public void setupParameters() throws PfModelException {
96
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();
108     }
109
110     /**
111      * Closes up DB connections and deregisters API parameter group.
112      *
113      * @throws PfModelException the PfModel parsing exception
114      */
115     @After
116     public void tearDown() throws PfModelException {
117
118         guardPolicyProvider.close();
119         policyTypeProvider.close();
120         ParameterService.deregister(apiParamGroup);
121     }
122
123
124     @Test
125     public void testFetchGuardPolicy() {
126
127         assertThatThrownBy(() -> {
128             guardPolicyProvider.fetchGuardPolicy("dummy", null);
129         }).hasMessage("no policy found for policy: dummy:null");
130
131         assertThatThrownBy(() -> {
132             guardPolicyProvider.fetchGuardPolicy("dummy", "dummy");
133         }).hasMessage("legacy policy version is not an integer");
134
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);
141
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());
147
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());
153
154             Map<String, LegacyGuardPolicyOutput> firstVersion =
155                     guardPolicyProvider.fetchGuardPolicy("guard.frequency.scaleout", "1");
156             assertNotNull(firstVersion);
157             assertEquals("1",
158                     firstVersion.get("guard.frequency.scaleout").getMetadata().get("policy-version").toString());
159
160             Map<String, LegacyGuardPolicyOutput> latestVersion =
161                     guardPolicyProvider.fetchGuardPolicy("guard.frequency.scaleout", null);
162             assertNotNull(latestVersion);
163             assertEquals("2",
164                     latestVersion.get("guard.frequency.scaleout").getMetadata().get("policy-version").toString());
165         }).doesNotThrowAnyException();
166
167         assertThatThrownBy(() -> {
168             guardPolicyProvider.fetchGuardPolicy("guard.frequency.scaleout", "1.0.0");
169         }).hasMessage("legacy policy version is not an integer");
170
171         assertThatThrownBy(() -> {
172             guardPolicyProvider.fetchGuardPolicy("guard.frequency.scaleout", "latest");
173         }).hasMessage("legacy policy version is not an integer");
174
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();
180     }
181
182     @Test
183     public void testFetchDeployedGuardPolicies() {
184
185         assertThatThrownBy(() -> {
186             guardPolicyProvider.fetchDeployedGuardPolicies("dummy");
187         }).hasMessage("No policy type defined for dummy");
188
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());
193
194             assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
195             assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
196
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);
204
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);
212
213             Pdp pdp = new Pdp();
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);
220
221             // Create Pdp Groups
222             assertEquals(123, databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0)
223                     .getDesiredInstanceCount());
224             assertEquals(1, databaseProvider.getPdpGroups("group").size());
225
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();
234
235             // Create Policy
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();
244
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");
250
251
252             // Update pdpSubGroup
253             pdpSubGroup.setPolicies(new ArrayList<>());
254             pdpSubGroup.getPolicies()
255                     .add(new ToscaPolicyIdentifier(POLICY_NAME, POLICY_VERSION + LEGACY_MINOR_PATCH_SUFFIX));
256             assertEquals(1,
257                     databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getPolicies().size());
258
259             // Test fetchDeployedPolicies
260             assertThatCode(() -> {
261                 guardPolicyProvider.fetchDeployedGuardPolicies(POLICY_NAME);
262             }).doesNotThrowAnyException();
263
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");
271         }
272     }
273
274     @Test
275     public void testCreateGuardPolicy() {
276
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");
282
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);
289
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();
300     }
301
302     @Test
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";
309
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());
314
315             assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
316             assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
317
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);
325
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);
332
333             Pdp pdp = new Pdp();
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);
340
341             // Create Pdp Groups
342             assertEquals(123, databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0)
343                     .getDesiredInstanceCount());
344             assertEquals(1, databaseProvider.getPdpGroups("group").size());
345
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();
354
355             // Create Policy
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();
365
366             // Update pdpSubGroup
367             pdpSubGroup.setPolicies(new ArrayList<>());
368             pdpSubGroup.getPolicies().add(new ToscaPolicyIdentifier(policyId, policyVersion + legacyMinorPatchSuffix));
369             assertEquals(1,
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");
376         }
377     }
378
379     @Test
380     public void testDeleteGuardPolicy() {
381         assertThatThrownBy(() -> {
382             guardPolicyProvider.deleteGuardPolicy("dummy", null);
383         }).hasMessage("legacy policy version is not an integer");
384
385         assertThatThrownBy(() -> {
386             guardPolicyProvider.deleteGuardPolicy("dummy", "1.0.0");
387         }).hasMessage("legacy policy version is not an integer");
388
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);
395
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());
401
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());
409             assertEquals("1",
410                     deletedPolicy.get("guard.frequency.scaleout").getMetadata().get("policy-version").toString());
411
412         }).doesNotThrowAnyException();
413
414         assertThatThrownBy(() -> {
415             guardPolicyProvider.deleteGuardPolicy("guard.frequency.scaleout", "1");
416         }).hasMessage("no policy found for policy: guard.frequency.scaleout:1");
417
418         assertThatCode(() -> {
419             policyTypeProvider.deletePolicyType("onap.policies.controlloop.guard.FrequencyLimiter", "1.0.0");
420         }).doesNotThrowAnyException();
421     }
422 }