Merge "Apply policy/models native drools policies changes"
[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,
109                 Collections.emptyList(), Collections.emptyList());
110         ParameterService.register(apiParamGroup, true);
111         guardPolicyProvider = new LegacyGuardPolicyProvider();
112         policyTypeProvider = new PolicyTypeProvider();
113     }
114
115     /**
116      * Closes up DB connections and deregisters API parameter group.
117      *
118      * @throws PfModelException the PfModel parsing exception
119      */
120     @After
121     public void tearDown() throws PfModelException {
122         guardPolicyProvider.close();
123         policyTypeProvider.close();
124         ParameterService.deregister(apiParamGroup);
125     }
126
127     @Test
128     public void testFetchGuardPolicy() {
129
130         assertThatThrownBy(() -> {
131             guardPolicyProvider.fetchGuardPolicy("dummy", null);
132         }).hasMessage("no policy found for policy: dummy:null");
133
134         assertThatThrownBy(() -> {
135             guardPolicyProvider.fetchGuardPolicy("dummy", "dummy");
136         }).hasMessageContaining("parameter \"version\": value \"dummy.0.0\", does not match regular expression");
137
138         assertThatCode(() -> {
139             ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder
140                     .decode(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
141             policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
142
143             String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_VER1);
144             LegacyGuardPolicyInput policyToCreate = standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
145             Map<String, LegacyGuardPolicyOutput> createdPolicy = guardPolicyProvider.createGuardPolicy(policyToCreate);
146             assertNotNull(createdPolicy);
147             assertFalse(createdPolicy.isEmpty());
148
149             policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_VER2);
150             policyToCreate = standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
151             createdPolicy = guardPolicyProvider.createGuardPolicy(policyToCreate);
152             assertNotNull(createdPolicy);
153             assertFalse(createdPolicy.isEmpty());
154
155             Map<String, LegacyGuardPolicyOutput> firstVersion =
156                     guardPolicyProvider.fetchGuardPolicy("guard.frequency.scaleout", "1");
157             assertNotNull(firstVersion);
158             assertEquals("1",
159                     firstVersion.get("guard.frequency.scaleout").getMetadata().get("policy-version").toString());
160
161             Map<String, LegacyGuardPolicyOutput> latestVersion =
162                     guardPolicyProvider.fetchGuardPolicy("guard.frequency.scaleout", null);
163             assertNotNull(latestVersion);
164             assertEquals("2",
165                     latestVersion.get("guard.frequency.scaleout").getMetadata().get("policy-version").toString());
166         }).doesNotThrowAnyException();
167
168         assertThatThrownBy(() -> {
169             guardPolicyProvider.fetchGuardPolicy("guard.frequency.scaleout", "1.0.0");
170         }).hasMessageContaining("parameter \"version\": value \"1.0.0.0.0\", does not match regular expression");
171
172         assertThatThrownBy(() -> {
173             guardPolicyProvider.fetchGuardPolicy("guard.frequency.scaleout", "latest");
174         }).hasMessageContaining("parameter \"version\": value \"latest.0.0\", does not match regular expression");
175
176         assertThatCode(() -> {
177             guardPolicyProvider.deleteGuardPolicy("guard.frequency.scaleout", "1");
178             guardPolicyProvider.deleteGuardPolicy("guard.frequency.scaleout", "2");
179             policyTypeProvider.deletePolicyType("onap.policies.controlloop.guard.FrequencyLimiter", "1.0.0");
180         }).doesNotThrowAnyException();
181     }
182
183     @Test
184     public void testFetchDeployedGuardPolicies() {
185
186         assertThatThrownBy(() -> {
187             guardPolicyProvider.fetchDeployedGuardPolicies("dummy");
188         }).hasMessage("No policy type defined for dummy");
189
190         try (PolicyModelsProvider databaseProvider =
191                 new PolicyModelsProviderFactory().createPolicyModelsProvider(providerParams)) {
192             assertEquals(0, databaseProvider.getPdpGroups("name").size());
193             assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
194
195             assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
196             assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
197
198             PdpGroup pdpGroup = new PdpGroup();
199             pdpGroup.setName("group");
200             pdpGroup.setVersion("1.2.3");
201             pdpGroup.setPdpGroupState(PdpState.ACTIVE);
202             pdpGroup.setPdpSubgroups(new ArrayList<>());
203             List<PdpGroup> groupList = new ArrayList<>();
204             groupList.add(pdpGroup);
205
206             PdpSubGroup pdpSubGroup = new PdpSubGroup();
207             pdpSubGroup.setPdpType("type");
208             pdpSubGroup.setDesiredInstanceCount(123);
209             pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
210             pdpSubGroup.getSupportedPolicyTypes()
211                     .add(new ToscaPolicyTypeIdentifier(POLICY_TYPE_NAME, POLICY_TYPE_VERSION));
212             pdpGroup.getPdpSubgroups().add(pdpSubGroup);
213
214             Pdp pdp = new Pdp();
215             pdp.setInstanceId("type-0");
216             pdp.setMessage("Hello");
217             pdp.setPdpState(PdpState.ACTIVE);
218             pdp.setHealthy(PdpHealthStatus.UNKNOWN);
219             pdpSubGroup.setPdpInstances(new ArrayList<>());
220             pdpSubGroup.getPdpInstances().add(pdp);
221
222             // Create Pdp Groups
223             assertEquals(123, databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0)
224                     .getDesiredInstanceCount());
225             assertEquals(1, databaseProvider.getPdpGroups("group").size());
226
227             // Create Policy Type
228             assertThatCode(() -> {
229                 ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder
230                         .decode(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
231                 policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
232             }).doesNotThrowAnyException();
233
234             // Create Policy
235             assertThatCode(() -> {
236                 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
237                 LegacyGuardPolicyInput policyToCreate =
238                         standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
239                 Map<String, LegacyGuardPolicyOutput> policyCreated =
240                         guardPolicyProvider.createGuardPolicy(policyToCreate);
241                 assertFalse(policyCreated.isEmpty());
242             }).doesNotThrowAnyException();
243
244             // Test fetchDeployedPolicies (deployedPolicyMap.isEmpty())==true
245             assertThatThrownBy(() -> {
246                 guardPolicyProvider.fetchDeployedGuardPolicies(POLICY_NAME);
247             }).hasMessage("could not find policy with ID " + POLICY_NAME + " and type " + POLICY_TYPE_ID
248                     + " deployed in any pdp group");
249
250             // Update pdpSubGroup
251             pdpSubGroup.setPolicies(new ArrayList<>());
252             pdpSubGroup.getPolicies()
253                     .add(new ToscaPolicyIdentifier(POLICY_NAME, POLICY_VERSION + LEGACY_MINOR_PATCH_SUFFIX));
254             assertEquals(1,
255                     databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getPolicies().size());
256
257             // Test fetchDeployedPolicies
258             assertThatCode(() -> {
259                 guardPolicyProvider.fetchDeployedGuardPolicies(POLICY_NAME);
260             }).doesNotThrowAnyException();
261
262             // Test validateDeleteEligibility exception path(!pdpGroups.isEmpty())
263             assertThatThrownBy(() -> {
264                 guardPolicyProvider.deleteGuardPolicy(POLICY_NAME, POLICY_VERSION);
265             }).hasMessageContaining("policy is in use, it is deployed in PDP group group subgroup type");
266         } catch (Exception exc) {
267             fail("Test should not throw an exception");
268         }
269     }
270
271     @Test
272     public void testCreateGuardPolicy() throws Exception {
273         assertThatThrownBy(() -> {
274             String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
275             LegacyGuardPolicyInput policyToCreate = standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
276             guardPolicyProvider.createGuardPolicy(policyToCreate);
277         }).hasMessageContaining(
278                 "no policy types are defined on the service template for the policies in the topology template");
279
280         ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder
281                 .decode(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
282         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
283
284         String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
285         LegacyGuardPolicyInput policyToCreate = standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
286         Map<String, LegacyGuardPolicyOutput> createdPolicy = guardPolicyProvider.createGuardPolicy(policyToCreate);
287         assertNotNull(createdPolicy);
288         assertFalse(createdPolicy.isEmpty());
289         assertTrue(createdPolicy.containsKey("guard.frequency.scaleout"));
290         assertEquals("onap.policies.controlloop.guard.FrequencyLimiter",
291                 createdPolicy.get("guard.frequency.scaleout").getType());
292         assertEquals("1.0.0", createdPolicy.get("guard.frequency.scaleout").getVersion());
293
294         String defaultPolicyVersionString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_NO_VERSION);
295         LegacyGuardPolicyInput defaultVersionPolicy =
296                 standardCoder.decode(defaultPolicyVersionString, LegacyGuardPolicyInput.class);
297         createdPolicy = guardPolicyProvider.createGuardPolicy(defaultVersionPolicy);
298         assertEquals("1.0.0", createdPolicy.get("guard.frequency.scaleout.noversion").getVersion());
299
300         assertThatCode(() -> {
301             String duplicatePolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
302             LegacyGuardPolicyInput duplicatePolicyToCreate =
303                     standardCoder.decode(duplicatePolicyString, LegacyGuardPolicyInput.class);
304             guardPolicyProvider.createGuardPolicy(duplicatePolicyToCreate);
305         }).doesNotThrowAnyException();
306
307         assertThatThrownBy(() -> {
308             String duplicatePolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
309             LegacyGuardPolicyInput duplicatePolicyToCreate =
310                     standardCoder.decode(duplicatePolicyString, LegacyGuardPolicyInput.class);
311             duplicatePolicyToCreate.setContent(new LegacyGuardPolicyContent());
312             guardPolicyProvider.createGuardPolicy(duplicatePolicyToCreate);
313         }).hasMessageContaining("INVALID:entity in incoming fragment does not equal existing entity");
314     }
315
316     @Test
317     public void testDeleteGuardPolicyException() {
318         String policyId = "guard.frequency.scaleout";
319         String policyVersion = "1";
320         String policyTypeVersion = "1.0.0";
321         String policyTypeId = "onap.policies.controlloop.guard.FrequencyLimiter";
322         String legacyMinorPatchSuffix = ".0.0";
323
324         try (PolicyModelsProvider databaseProvider =
325                 new PolicyModelsProviderFactory().createPolicyModelsProvider(providerParams)) {
326             assertEquals(0, databaseProvider.getPdpGroups("name").size());
327             assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
328
329             assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
330             assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
331
332             PdpGroup pdpGroup = new PdpGroup();
333             pdpGroup.setName("group");
334             pdpGroup.setVersion("1.2.3");
335             pdpGroup.setPdpGroupState(PdpState.ACTIVE);
336             pdpGroup.setPdpSubgroups(new ArrayList<>());
337             List<PdpGroup> groupList = new ArrayList<>();
338             groupList.add(pdpGroup);
339
340             PdpSubGroup pdpSubGroup = new PdpSubGroup();
341             pdpSubGroup.setPdpType("type");
342             pdpSubGroup.setDesiredInstanceCount(123);
343             pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
344             pdpSubGroup.getSupportedPolicyTypes().add(new ToscaPolicyTypeIdentifier(policyTypeId, policyTypeVersion));
345             pdpGroup.getPdpSubgroups().add(pdpSubGroup);
346
347             Pdp pdp = new Pdp();
348             pdp.setInstanceId("type-0");
349             pdp.setMessage("Hello");
350             pdp.setPdpState(PdpState.ACTIVE);
351             pdp.setHealthy(PdpHealthStatus.UNKNOWN);
352             pdpSubGroup.setPdpInstances(new ArrayList<>());
353             pdpSubGroup.getPdpInstances().add(pdp);
354
355             // Create Pdp Groups
356             assertEquals(123, databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0)
357                     .getDesiredInstanceCount());
358             assertEquals(1, databaseProvider.getPdpGroups("group").size());
359
360             // Create Policy Type
361             assertThatCode(() -> {
362                 ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder
363                         .decode(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
364                 policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
365             }).doesNotThrowAnyException();
366
367             // Create Policy
368             assertThatCode(() -> {
369                 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
370                 LegacyGuardPolicyInput policyToCreate =
371                         standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
372                 Map<String, LegacyGuardPolicyOutput> createdPolicy =
373                         guardPolicyProvider.createGuardPolicy(policyToCreate);
374                 assertNotNull(createdPolicy);
375                 assertFalse(createdPolicy.isEmpty());
376             }).doesNotThrowAnyException();
377
378             // Update pdpSubGroup
379             pdpSubGroup.setPolicies(new ArrayList<>());
380             pdpSubGroup.getPolicies().add(new ToscaPolicyIdentifier(policyId, policyVersion + legacyMinorPatchSuffix));
381             assertEquals(1,
382                     databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getPolicies().size());
383             assertThatThrownBy(() -> {
384                 guardPolicyProvider.deleteGuardPolicy("guard.frequency.scaleout", "1");
385             }).hasMessageContaining("policy is in use, it is deployed in PDP group group subgroup type");
386         } catch (Exception exc) {
387             fail("Test should not throw an exception");
388         }
389     }
390
391     @Test
392     public void testDeleteGuardPolicy() {
393         assertThatThrownBy(() -> {
394             guardPolicyProvider.deleteGuardPolicy("dummy", null);
395         }).hasMessageMatching("^policyVersion is marked .*on.*ull but is null$");
396
397         assertThatThrownBy(() -> {
398             guardPolicyProvider.deleteGuardPolicy("dummy", "1.0.0");
399         }).hasMessageContaining("parameter \"version\": value \"1.0.0.0.0\", does not match regular expression");
400
401         assertThatCode(() -> {
402             ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder
403                     .decode(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
404             policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
405
406             String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
407             LegacyGuardPolicyInput policyToCreate = standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
408             Map<String, LegacyGuardPolicyOutput> createdPolicy = guardPolicyProvider.createGuardPolicy(policyToCreate);
409             assertNotNull(createdPolicy);
410             assertFalse(createdPolicy.isEmpty());
411
412             Map<String, LegacyGuardPolicyOutput> deletedPolicy =
413                     guardPolicyProvider.deleteGuardPolicy("guard.frequency.scaleout", "1");
414             assertNotNull(deletedPolicy);
415             assertFalse(deletedPolicy.isEmpty());
416             assertTrue(deletedPolicy.containsKey("guard.frequency.scaleout"));
417             assertEquals("onap.policies.controlloop.guard.FrequencyLimiter",
418                     deletedPolicy.get("guard.frequency.scaleout").getType());
419             assertEquals("1",
420                     deletedPolicy.get("guard.frequency.scaleout").getMetadata().get("policy-version").toString());
421
422         }).doesNotThrowAnyException();
423
424         assertThatThrownBy(() -> {
425             guardPolicyProvider.deleteGuardPolicy("guard.frequency.scaleout", "1");
426         }).hasMessage("no policy found for policy: guard.frequency.scaleout:1");
427
428         assertThatCode(() -> {
429             policyTypeProvider.deletePolicyType("onap.policies.controlloop.guard.FrequencyLimiter", "1.0.0");
430         }).doesNotThrowAnyException();
431     }
432 }