342d17b1964b04a0dff0434929d4d01a09bef059
[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-2020 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.Collections;
37 import java.util.List;
38 import java.util.Map;
39
40 import org.junit.After;
41 import org.junit.Before;
42 import org.junit.Test;
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.coder.StandardYamlCoder;
47 import org.onap.policy.common.utils.resources.ResourceUtils;
48 import org.onap.policy.models.base.PfModelException;
49 import org.onap.policy.models.pdp.concepts.Pdp;
50 import org.onap.policy.models.pdp.concepts.PdpGroup;
51 import org.onap.policy.models.pdp.concepts.PdpGroupFilter;
52 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
53 import org.onap.policy.models.pdp.enums.PdpHealthStatus;
54 import org.onap.policy.models.pdp.enums.PdpState;
55 import org.onap.policy.models.provider.PolicyModelsProvider;
56 import org.onap.policy.models.provider.PolicyModelsProviderFactory;
57 import org.onap.policy.models.provider.PolicyModelsProviderParameters;
58 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifier;
59 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier;
60 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
61 import org.onap.policy.models.tosca.legacy.concepts.LegacyGuardPolicyContent;
62 import org.onap.policy.models.tosca.legacy.concepts.LegacyGuardPolicyInput;
63 import org.onap.policy.models.tosca.legacy.concepts.LegacyGuardPolicyOutput;
64
65 /**
66  * This class performs unit test of {@link LegacyGuardPolicyProvider}.
67  *
68  * @author Chenfei Gao (cgao@research.att.com)
69  */
70 public class TestLegacyGuardPolicyProvider {
71
72     private static LegacyGuardPolicyProvider guardPolicyProvider;
73     private static PolicyTypeProvider policyTypeProvider;
74     private static PolicyModelsProviderParameters providerParams;
75     private static ApiParameterGroup apiParamGroup;
76     private static StandardCoder standardCoder;
77     private static StandardYamlCoder standardYamlCoder;
78
79     private static final String POLICY_RESOURCE = "policies/vDNS.policy.guard.frequency.input.json";
80     private static final String POLICY_RESOURCE_VER1 = "policies/vDNS.policy.guard.frequency.input.ver1.json";
81     private static final String POLICY_RESOURCE_VER2 = "policies/vDNS.policy.guard.frequency.input.ver2.json";
82     private static final String POLICY_RESOURCE_WITH_NO_VERSION =
83             "policies/vDNS.policy.guard.frequency.no.policyversion.json";
84     private static final String POLICY_TYPE_RESOURCE =
85             "policytypes/onap.policies.controlloop.guard.FrequencyLimiter.yaml";
86     private static final String POLICY_TYPE_ID = "onap.policies.controlloop.guard.FrequencyLimiter:1.0.0";
87     private static final String POLICY_TYPE_NAME = "onap.policies.controlloop.guard.FrequencyLimiter";
88     private static final String POLICY_TYPE_VERSION = "1.0.0";
89     private static final String POLICY_NAME = "guard.frequency.scaleout";
90     private static final String POLICY_VERSION = "1";
91     private static final String LEGACY_MINOR_PATCH_SUFFIX = ".0.0";
92
93     /**
94      * Initializes parameters.
95      *
96      * @throws PfModelException the PfModel parsing exception
97      */
98     @Before
99     public void setupParameters() throws PfModelException {
100         standardCoder = new StandardCoder();
101         standardYamlCoder = new StandardYamlCoder();
102         providerParams = new PolicyModelsProviderParameters();
103         providerParams.setDatabaseDriver("org.h2.Driver");
104         providerParams.setDatabaseUrl("jdbc:h2:mem:testdb");
105         providerParams.setDatabaseUser("policy");
106         providerParams.setDatabasePassword(Base64.getEncoder().encodeToString("P01icY".getBytes()));
107         providerParams.setPersistenceUnit("ToscaConceptTest");
108         apiParamGroup = new ApiParameterGroup("ApiGroup", null, providerParams, Collections.emptyList());
109         ParameterService.register(apiParamGroup, true);
110         guardPolicyProvider = new LegacyGuardPolicyProvider();
111         policyTypeProvider = new PolicyTypeProvider();
112     }
113
114     /**
115      * Closes up DB connections and deregisters API parameter group.
116      *
117      * @throws PfModelException the PfModel parsing exception
118      */
119     @After
120     public void tearDown() throws PfModelException {
121         guardPolicyProvider.close();
122         policyTypeProvider.close();
123         ParameterService.deregister(apiParamGroup);
124     }
125
126     @Test
127     public void testFetchGuardPolicy() {
128
129         assertThatThrownBy(() -> {
130             guardPolicyProvider.fetchGuardPolicy("dummy", null);
131         }).hasMessage("no policy found for policy: dummy:null");
132
133         assertThatThrownBy(() -> {
134             guardPolicyProvider.fetchGuardPolicy("dummy", "dummy");
135         }).hasMessageContaining("parameter \"version\": value \"dummy.0.0\", does not match regular expression");
136
137         assertThatCode(() -> {
138             ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder
139                     .decode(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), 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         }).hasMessageContaining("parameter \"version\": value \"1.0.0.0.0\", does not match regular expression");
170
171         assertThatThrownBy(() -> {
172             guardPolicyProvider.fetchGuardPolicy("guard.frequency.scaleout", "latest");
173         }).hasMessageContaining("parameter \"version\": value \"latest.0.0\", does not match regular expression");
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                 ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder
229                         .decode(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
230                 policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
231             }).doesNotThrowAnyException();
232
233             // Create Policy
234             assertThatCode(() -> {
235                 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
236                 LegacyGuardPolicyInput policyToCreate =
237                         standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
238                 Map<String, LegacyGuardPolicyOutput> policyCreated =
239                         guardPolicyProvider.createGuardPolicy(policyToCreate);
240                 assertFalse(policyCreated.isEmpty());
241             }).doesNotThrowAnyException();
242
243             // Test fetchDeployedPolicies (deployedPolicyMap.isEmpty())==true
244             assertThatThrownBy(() -> {
245                 guardPolicyProvider.fetchDeployedGuardPolicies(POLICY_NAME);
246             }).hasMessage("could not find policy with ID " + POLICY_NAME + " and type " + POLICY_TYPE_ID
247                     + " deployed in any pdp group");
248
249             // Update pdpSubGroup
250             pdpSubGroup.setPolicies(new ArrayList<>());
251             pdpSubGroup.getPolicies()
252                     .add(new ToscaPolicyIdentifier(POLICY_NAME, POLICY_VERSION + LEGACY_MINOR_PATCH_SUFFIX));
253             assertEquals(1,
254                     databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getPolicies().size());
255
256             // Test fetchDeployedPolicies
257             assertThatCode(() -> {
258                 guardPolicyProvider.fetchDeployedGuardPolicies(POLICY_NAME);
259             }).doesNotThrowAnyException();
260
261             // Test validateDeleteEligibility exception path(!pdpGroups.isEmpty())
262             assertThatThrownBy(() -> {
263                 guardPolicyProvider.deleteGuardPolicy(POLICY_NAME, POLICY_VERSION);
264             }).hasMessageContaining("policy is in use, it is deployed in PDP group group subgroup type");
265         } catch (Exception exc) {
266             fail("Test should not throw an exception");
267         }
268     }
269
270     @Test
271     public void testCreateGuardPolicy() throws Exception {
272         assertThatThrownBy(() -> {
273             String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
274             LegacyGuardPolicyInput policyToCreate = standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
275             guardPolicyProvider.createGuardPolicy(policyToCreate);
276         }).hasMessageContaining(
277                 "no policy types are defined on the service template for the policies in the topology template");
278
279         ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder
280                 .decode(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
281         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
282
283         String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
284         LegacyGuardPolicyInput policyToCreate = standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
285         Map<String, LegacyGuardPolicyOutput> createdPolicy = guardPolicyProvider.createGuardPolicy(policyToCreate);
286         assertNotNull(createdPolicy);
287         assertFalse(createdPolicy.isEmpty());
288         assertTrue(createdPolicy.containsKey("guard.frequency.scaleout"));
289         assertEquals("onap.policies.controlloop.guard.FrequencyLimiter",
290                 createdPolicy.get("guard.frequency.scaleout").getType());
291         assertEquals("1.0.0", createdPolicy.get("guard.frequency.scaleout").getVersion());
292
293         String defaultPolicyVersionString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_NO_VERSION);
294         LegacyGuardPolicyInput defaultVersionPolicy =
295                 standardCoder.decode(defaultPolicyVersionString, LegacyGuardPolicyInput.class);
296         createdPolicy = guardPolicyProvider.createGuardPolicy(defaultVersionPolicy);
297         assertEquals("1.0.0", createdPolicy.get("guard.frequency.scaleout.noversion").getVersion());
298
299         assertThatCode(() -> {
300             String duplicatePolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
301             LegacyGuardPolicyInput duplicatePolicyToCreate =
302                     standardCoder.decode(duplicatePolicyString, LegacyGuardPolicyInput.class);
303             guardPolicyProvider.createGuardPolicy(duplicatePolicyToCreate);
304         }).doesNotThrowAnyException();
305
306         assertThatThrownBy(() -> {
307             String duplicatePolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
308             LegacyGuardPolicyInput duplicatePolicyToCreate =
309                     standardCoder.decode(duplicatePolicyString, LegacyGuardPolicyInput.class);
310             duplicatePolicyToCreate.setContent(new LegacyGuardPolicyContent());
311             guardPolicyProvider.createGuardPolicy(duplicatePolicyToCreate);
312         }).hasMessageContaining("INVALID:entity in incoming fragment does not equal existing entity");
313     }
314
315     @Test
316     public void testDeleteGuardPolicyException() {
317         String policyId = "guard.frequency.scaleout";
318         String policyVersion = "1";
319         String policyTypeVersion = "1.0.0";
320         String policyTypeId = "onap.policies.controlloop.guard.FrequencyLimiter";
321         String legacyMinorPatchSuffix = ".0.0";
322
323         try (PolicyModelsProvider databaseProvider =
324                 new PolicyModelsProviderFactory().createPolicyModelsProvider(providerParams)) {
325             assertEquals(0, databaseProvider.getPdpGroups("name").size());
326             assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
327
328             assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
329             assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
330
331             PdpGroup pdpGroup = new PdpGroup();
332             pdpGroup.setName("group");
333             pdpGroup.setVersion("1.2.3");
334             pdpGroup.setPdpGroupState(PdpState.ACTIVE);
335             pdpGroup.setPdpSubgroups(new ArrayList<>());
336             List<PdpGroup> groupList = new ArrayList<>();
337             groupList.add(pdpGroup);
338
339             PdpSubGroup pdpSubGroup = new PdpSubGroup();
340             pdpSubGroup.setPdpType("type");
341             pdpSubGroup.setDesiredInstanceCount(123);
342             pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
343             pdpSubGroup.getSupportedPolicyTypes().add(new ToscaPolicyTypeIdentifier(policyTypeId, policyTypeVersion));
344             pdpGroup.getPdpSubgroups().add(pdpSubGroup);
345
346             Pdp pdp = new Pdp();
347             pdp.setInstanceId("type-0");
348             pdp.setMessage("Hello");
349             pdp.setPdpState(PdpState.ACTIVE);
350             pdp.setHealthy(PdpHealthStatus.UNKNOWN);
351             pdpSubGroup.setPdpInstances(new ArrayList<>());
352             pdpSubGroup.getPdpInstances().add(pdp);
353
354             // Create Pdp Groups
355             assertEquals(123, databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0)
356                     .getDesiredInstanceCount());
357             assertEquals(1, databaseProvider.getPdpGroups("group").size());
358
359             // Create Policy Type
360             assertThatCode(() -> {
361                 ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder
362                         .decode(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
363                 policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
364             }).doesNotThrowAnyException();
365
366             // Create Policy
367             assertThatCode(() -> {
368                 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
369                 LegacyGuardPolicyInput policyToCreate =
370                         standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
371                 Map<String, LegacyGuardPolicyOutput> createdPolicy =
372                         guardPolicyProvider.createGuardPolicy(policyToCreate);
373                 assertNotNull(createdPolicy);
374                 assertFalse(createdPolicy.isEmpty());
375             }).doesNotThrowAnyException();
376
377             // Update pdpSubGroup
378             pdpSubGroup.setPolicies(new ArrayList<>());
379             pdpSubGroup.getPolicies().add(new ToscaPolicyIdentifier(policyId, policyVersion + legacyMinorPatchSuffix));
380             assertEquals(1,
381                     databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getPolicies().size());
382             assertThatThrownBy(() -> {
383                 guardPolicyProvider.deleteGuardPolicy("guard.frequency.scaleout", "1");
384             }).hasMessageContaining("policy is in use, it is deployed in PDP group group subgroup type");
385         } catch (Exception exc) {
386             fail("Test should not throw an exception");
387         }
388     }
389
390     @Test
391     public void testDeleteGuardPolicy() {
392         assertThatThrownBy(() -> {
393             guardPolicyProvider.deleteGuardPolicy("dummy", null);
394         }).hasMessageMatching("^policyVersion is marked .*on.*ull but is null$");
395
396         assertThatThrownBy(() -> {
397             guardPolicyProvider.deleteGuardPolicy("dummy", "1.0.0");
398         }).hasMessageContaining("parameter \"version\": value \"1.0.0.0.0\", does not match regular expression");
399
400         assertThatCode(() -> {
401             ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder
402                     .decode(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
403             policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
404
405             String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
406             LegacyGuardPolicyInput policyToCreate = standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
407             Map<String, LegacyGuardPolicyOutput> createdPolicy = guardPolicyProvider.createGuardPolicy(policyToCreate);
408             assertNotNull(createdPolicy);
409             assertFalse(createdPolicy.isEmpty());
410
411             Map<String, LegacyGuardPolicyOutput> deletedPolicy =
412                     guardPolicyProvider.deleteGuardPolicy("guard.frequency.scaleout", "1");
413             assertNotNull(deletedPolicy);
414             assertFalse(deletedPolicy.isEmpty());
415             assertTrue(deletedPolicy.containsKey("guard.frequency.scaleout"));
416             assertEquals("onap.policies.controlloop.guard.FrequencyLimiter",
417                     deletedPolicy.get("guard.frequency.scaleout").getType());
418             assertEquals("1",
419                     deletedPolicy.get("guard.frequency.scaleout").getMetadata().get("policy-version").toString());
420
421         }).doesNotThrowAnyException();
422
423         assertThatThrownBy(() -> {
424             guardPolicyProvider.deleteGuardPolicy("guard.frequency.scaleout", "1");
425         }).hasMessage("no policy found for policy: guard.frequency.scaleout:1");
426
427         assertThatCode(() -> {
428             policyTypeProvider.deletePolicyType("onap.policies.controlloop.guard.FrequencyLimiter", "1.0.0");
429         }).doesNotThrowAnyException();
430     }
431 }