f83acce74aba2e8ecb395df809ad709ddcf5e705
[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.parameters.ApiParameterGroup;
43 import org.onap.policy.common.parameters.ParameterService;
44 import org.onap.policy.common.utils.coder.StandardCoder;
45 import org.onap.policy.common.utils.coder.StandardYamlCoder;
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     private static StandardYamlCoder standardYamlCoder;
76
77     private static final String POLICY_RESOURCE = "policies/vDNS.policy.guard.frequency.input.json";
78     private static final String POLICY_RESOURCE_VER1 = "policies/vDNS.policy.guard.frequency.input.ver1.json";
79     private static final String POLICY_RESOURCE_VER2 = "policies/vDNS.policy.guard.frequency.input.ver2.json";
80     private static final String POLICY_TYPE_RESOURCE =
81             "policytypes/onap.policies.controlloop.guard.FrequencyLimiter.yaml";
82     private static final String POLICY_TYPE_ID = "onap.policies.controlloop.guard.FrequencyLimiter:1.0.0";
83     private static final String POLICY_TYPE_NAME = "onap.policies.controlloop.guard.FrequencyLimiter";
84     private static final String POLICY_TYPE_VERSION = "1.0.0";
85     private static final String POLICY_ID = "guard.frequency.scaleout:1.0.0";
86     private static final String POLICY_NAME = "guard.frequency.scaleout";
87     private static final String POLICY_VERSION = "1";
88     private static final String LEGACY_MINOR_PATCH_SUFFIX = ".0.0";
89
90     /**
91      * Initializes parameters.
92      *
93      * @throws PfModelException the PfModel parsing exception
94      */
95     @Before
96     public void setupParameters() throws PfModelException {
97
98         standardCoder = new StandardCoder();
99         standardYamlCoder = new StandardYamlCoder();
100         providerParams = new PolicyModelsProviderParameters();
101         providerParams.setDatabaseDriver("org.h2.Driver");
102         providerParams.setDatabaseUrl("jdbc:h2:mem:testdb");
103         providerParams.setDatabaseUser("policy");
104         providerParams.setDatabasePassword(Base64.getEncoder().encodeToString("P01icY".getBytes()));
105         providerParams.setPersistenceUnit("ToscaConceptTest");
106         apiParamGroup = new ApiParameterGroup("ApiGroup", null, providerParams);
107         ParameterService.register(apiParamGroup, true);
108         guardPolicyProvider = new LegacyGuardPolicyProvider();
109         policyTypeProvider = new PolicyTypeProvider();
110     }
111
112     /**
113      * Closes up DB connections and deregisters API parameter group.
114      *
115      * @throws PfModelException the PfModel parsing exception
116      */
117     @After
118     public void tearDown() throws PfModelException {
119
120         guardPolicyProvider.close();
121         policyTypeProvider.close();
122         ParameterService.deregister(apiParamGroup);
123     }
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         }).hasMessage("legacy policy version is not an integer");
136
137         assertThatCode(() -> {
138             ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
139                     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         }).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                 ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
229                         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
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 with ID " + POLICY_NAME + ":" + POLICY_VERSION
266                     + " cannot be deleted as it is deployed in pdp groups");
267         } catch (Exception exc) {
268             fail("Test should not throw an exception");
269         }
270     }
271
272     @Test
273     public void testCreateGuardPolicy() {
274
275         assertThatThrownBy(() -> {
276             String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
277             LegacyGuardPolicyInput policyToCreate = standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
278             guardPolicyProvider.createGuardPolicy(policyToCreate);
279         }).hasMessage("policy type " + POLICY_TYPE_ID + " for policy " + POLICY_ID + " does not exist");
280
281         assertThatCode(() -> {
282             ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
283                     ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
284             policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
285
286             String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
287             LegacyGuardPolicyInput policyToCreate = standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
288             Map<String, LegacyGuardPolicyOutput> createdPolicy = guardPolicyProvider.createGuardPolicy(policyToCreate);
289             assertNotNull(createdPolicy);
290             assertFalse(createdPolicy.isEmpty());
291             assertTrue(createdPolicy.containsKey("guard.frequency.scaleout"));
292             assertEquals("onap.policies.controlloop.guard.FrequencyLimiter",
293                     createdPolicy.get("guard.frequency.scaleout").getType());
294             assertEquals("1.0.0", createdPolicy.get("guard.frequency.scaleout").getVersion());
295         }).doesNotThrowAnyException();
296     }
297
298     @Test
299     public void testDeleteGuardPolicyException() {
300         String policyId = "guard.frequency.scaleout";
301         String policyVersion = "1";
302         String policyTypeVersion = "1.0.0";
303         String policyTypeId = "onap.policies.controlloop.guard.FrequencyLimiter";
304         String legacyMinorPatchSuffix = ".0.0";
305
306         try (PolicyModelsProvider databaseProvider =
307                 new PolicyModelsProviderFactory().createPolicyModelsProvider(providerParams)) {
308             assertEquals(0, databaseProvider.getPdpGroups("name").size());
309             assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
310
311             assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
312             assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
313
314             PdpGroup pdpGroup = new PdpGroup();
315             pdpGroup.setName("group");
316             pdpGroup.setVersion("1.2.3");
317             pdpGroup.setPdpGroupState(PdpState.ACTIVE);
318             pdpGroup.setPdpSubgroups(new ArrayList<>());
319             List<PdpGroup> groupList = new ArrayList<>();
320             groupList.add(pdpGroup);
321
322             PdpSubGroup pdpSubGroup = new PdpSubGroup();
323             pdpSubGroup.setPdpType("type");
324             pdpSubGroup.setDesiredInstanceCount(123);
325             pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
326             pdpSubGroup.getSupportedPolicyTypes().add(new ToscaPolicyTypeIdentifier(policyTypeId, policyTypeVersion));
327             pdpGroup.getPdpSubgroups().add(pdpSubGroup);
328
329             Pdp pdp = new Pdp();
330             pdp.setInstanceId("type-0");
331             pdp.setMessage("Hello");
332             pdp.setPdpState(PdpState.ACTIVE);
333             pdp.setHealthy(PdpHealthStatus.UNKNOWN);
334             pdpSubGroup.setPdpInstances(new ArrayList<>());
335             pdpSubGroup.getPdpInstances().add(pdp);
336
337             // Create Pdp Groups
338             assertEquals(123, databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0)
339                     .getDesiredInstanceCount());
340             assertEquals(1, databaseProvider.getPdpGroups("group").size());
341
342             // Create Policy Type
343             assertThatCode(() -> {
344                 ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
345                         ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
346                 policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
347             }).doesNotThrowAnyException();
348
349             // Create Policy
350             assertThatCode(() -> {
351                 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
352                 LegacyGuardPolicyInput policyToCreate =
353                         standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
354                 Map<String, LegacyGuardPolicyOutput> createdPolicy =
355                         guardPolicyProvider.createGuardPolicy(policyToCreate);
356                 assertNotNull(createdPolicy);
357                 assertFalse(createdPolicy.isEmpty());
358             }).doesNotThrowAnyException();
359
360             // Update pdpSubGroup
361             pdpSubGroup.setPolicies(new ArrayList<>());
362             pdpSubGroup.getPolicies().add(new ToscaPolicyIdentifier(policyId, policyVersion + legacyMinorPatchSuffix));
363             assertEquals(1,
364                     databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getPolicies().size());
365             assertThatThrownBy(() -> {
366                 guardPolicyProvider.deleteGuardPolicy("guard.frequency.scaleout", "1");
367             }).hasMessageContaining("cannot be deleted as it is deployed in pdp groups");
368         } catch (Exception exc) {
369             fail("Test should not throw an exception");
370         }
371     }
372
373     @Test
374     public void testDeleteGuardPolicy() {
375         assertThatThrownBy(() -> {
376             guardPolicyProvider.deleteGuardPolicy("dummy", null);
377         }).hasMessage("legacy policy version is not an integer");
378
379         assertThatThrownBy(() -> {
380             guardPolicyProvider.deleteGuardPolicy("dummy", "1.0.0");
381         }).hasMessage("legacy policy version is not an integer");
382
383         assertThatCode(() -> {
384             ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
385                     ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
386             policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
387
388             String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
389             LegacyGuardPolicyInput policyToCreate = standardCoder.decode(policyString, LegacyGuardPolicyInput.class);
390             Map<String, LegacyGuardPolicyOutput> createdPolicy = guardPolicyProvider.createGuardPolicy(policyToCreate);
391             assertNotNull(createdPolicy);
392             assertFalse(createdPolicy.isEmpty());
393
394             Map<String, LegacyGuardPolicyOutput> deletedPolicy =
395                     guardPolicyProvider.deleteGuardPolicy("guard.frequency.scaleout", "1");
396             assertNotNull(deletedPolicy);
397             assertFalse(deletedPolicy.isEmpty());
398             assertTrue(deletedPolicy.containsKey("guard.frequency.scaleout"));
399             assertEquals("onap.policies.controlloop.guard.FrequencyLimiter",
400                     deletedPolicy.get("guard.frequency.scaleout").getType());
401             assertEquals("1",
402                     deletedPolicy.get("guard.frequency.scaleout").getMetadata().get("policy-version").toString());
403
404         }).doesNotThrowAnyException();
405
406         assertThatThrownBy(() -> {
407             guardPolicyProvider.deleteGuardPolicy("guard.frequency.scaleout", "1");
408         }).hasMessage("no policy found for policy: guard.frequency.scaleout:1");
409
410         assertThatCode(() -> {
411             policyTypeProvider.deletePolicyType("onap.policies.controlloop.guard.FrequencyLimiter", "1.0.0");
412         }).doesNotThrowAnyException();
413     }
414 }