31be84a966d5794757d6e1167d644cbb6b329ed3
[policy/api.git] / main / src / test / java / org / onap / policy / api / main / rest / provider / TestPolicyProvider.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP Policy API
4  * ================================================================================
5  * Copyright (C) 2019-2020 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.fail;
32
33 import java.util.ArrayList;
34 import java.util.Base64;
35 import java.util.Collections;
36 import java.util.List;
37
38 import org.junit.After;
39 import org.junit.Before;
40 import org.junit.Test;
41 import org.onap.policy.api.main.parameters.ApiParameterGroup;
42 import org.onap.policy.common.parameters.ParameterService;
43 import org.onap.policy.common.utils.coder.CoderException;
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
61 /**
62  * This class performs unit test of {@link PolicyProvider}.
63  *
64  * @author Chenfei Gao (cgao@research.att.com)
65  */
66 public class TestPolicyProvider {
67
68     private static PolicyProvider policyProvider;
69     private static PolicyTypeProvider policyTypeProvider;
70     private static PolicyModelsProviderParameters providerParams;
71     private static ApiParameterGroup apiParamGroup;
72     private static StandardCoder standardCoder;
73     private static StandardYamlCoder standardYamlCoder;
74
75     private static final String POLICY_RESOURCE = "policies/vCPE.policy.monitoring.input.tosca.json";
76     private static final String POLICY_TYPE_RESOURCE = "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app.yaml";
77     private static final String POLICY_RESOURCE_WITH_BAD_POLICYTYPE_ID = "policies/vCPE.policy.bad.policytypeid.json";
78     private static final String POLICY_RESOURCE_WITH_BAD_POLICYTYPE_VERSION =
79             "policies/vCPE.policy.bad.policytypeversion.json";
80     private static final String POLICY_RESOURCE_WITH_NO_POLICY_VERSION = "policies/vCPE.policy.no.policyversion.json";
81     private static final String POLICY_RESOURCE_WITH_DIFFERENT_FIELDS =
82             "policies/vCPE.policy.different.policy.fields.json";
83     private static final String MULTIPLE_POLICIES_RESOURCE = "policies/vCPE.policies.optimization.input.tosca.json";
84
85     public static final String POLICY_TYPE_RESOURCE_OPERATIONAL =
86             "policytypes/onap.policies.controlloop.Operational.yaml";
87     public static final String POLICY_TYPE_RESOURCE_OPERATIONAL_COMMON =
88             "policytypes/onap.policies.controlloop.operational.Common.yaml";
89     public static final String POLICY_TYPE_RESOURCE_OPERATIONAL_DROOLS =
90             "policytypes/onap.policies.controlloop.operational.common.Drools.yaml";
91     private static final String POLICY_RESOURCE_OPERATIONAL = "policies/vCPE.policy.operational.input.tosca.json";
92     public static final String POLICY_TYPE_OPERATIONAL_DROOLS = "onap.policies.controlloop.operational.common.Drools";
93
94     /**
95      * Initializes parameters.
96      *
97      * @throws PfModelException the PfModel parsing exception
98      */
99     @Before
100     public void setupParameters() throws PfModelException {
101
102         standardCoder = new StandardCoder();
103         standardYamlCoder = new StandardYamlCoder();
104         providerParams = new PolicyModelsProviderParameters();
105         providerParams.setDatabaseDriver("org.h2.Driver");
106         providerParams.setDatabaseUrl("jdbc:h2:mem:testdb");
107         providerParams.setDatabaseUser("policy");
108         providerParams.setDatabasePassword(Base64.getEncoder().encodeToString("P01icY".getBytes()));
109         providerParams.setPersistenceUnit("ToscaConceptTest");
110         apiParamGroup = new ApiParameterGroup("ApiGroup", null, providerParams, Collections.emptyList());
111         ParameterService.register(apiParamGroup, true);
112         policyTypeProvider = new PolicyTypeProvider();
113         policyProvider = new PolicyProvider();
114     }
115
116     /**
117      * Closes up DB connections and deregisters API parameter group.
118      *
119      * @throws PfModelException the PfModel parsing exception
120      */
121     @After
122     public void tearDown() throws PfModelException {
123
124         policyTypeProvider.close();
125         policyProvider.close();
126         ParameterService.deregister(apiParamGroup);
127     }
128
129     @Test
130     public void testFetchPolicies() {
131
132         assertThatThrownBy(() -> {
133             policyProvider.fetchPolicies("dummy", "1.0.0", null, null);
134         }).hasMessage("service template not found in database");
135
136         assertThatThrownBy(() -> {
137             policyProvider.fetchPolicies("dummy", "1.0.0", "dummy", null);
138         }).hasMessage("service template not found in database");
139
140         assertThatThrownBy(() -> {
141             policyProvider.fetchPolicies("dummy", "1.0.0", "dummy", "1.0.0");
142         }).hasMessage("service template not found in database");
143     }
144
145     @Test
146     public void testFetchLatestPolicies() {
147
148         assertThatThrownBy(() -> {
149             policyProvider.fetchLatestPolicies("dummy", "dummy", "dummy");
150         }).hasMessage("service template not found in database");
151     }
152
153     @Test
154     public void testFetchDeployedPolicies() {
155         String policyId = "onap.restart.tca";
156         String policyVersion = "1.0.0";
157         String policyTypeVersion = "1.0.0";
158         String policyTypeId = "onap.policies.monitoring.cdap.tca.hi.lo.app";
159
160         // Basic Exception Throw
161         assertThatThrownBy(() -> {
162             policyProvider.fetchDeployedPolicies("dummy", "1.0.0", "dummy");
163         }).hasMessage("could not find policy with ID dummy and type dummy:1.0.0 deployed in any pdp group");
164
165         try (PolicyModelsProvider databaseProvider =
166                 new PolicyModelsProviderFactory().createPolicyModelsProvider(providerParams)) {
167             assertEquals(0, databaseProvider.getPdpGroups("name").size());
168             assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
169
170             assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
171             assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
172
173             PdpGroup pdpGroup = new PdpGroup();
174             pdpGroup.setName("group");
175             pdpGroup.setVersion("1.2.3");
176             pdpGroup.setPdpGroupState(PdpState.ACTIVE);
177             pdpGroup.setPdpSubgroups(new ArrayList<>());
178             List<PdpGroup> groupList = new ArrayList<>();
179             groupList.add(pdpGroup);
180
181             PdpSubGroup pdpSubGroup = new PdpSubGroup();
182             pdpSubGroup.setPdpType("type");
183             pdpSubGroup.setDesiredInstanceCount(123);
184             pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
185             pdpSubGroup.getSupportedPolicyTypes().add(new ToscaPolicyTypeIdentifier(policyTypeId, policyTypeVersion));
186             pdpGroup.getPdpSubgroups().add(pdpSubGroup);
187
188             Pdp pdp = new Pdp();
189             pdp.setInstanceId("type-0");
190             pdp.setMessage("Hello");
191             pdp.setPdpState(PdpState.ACTIVE);
192             pdp.setHealthy(PdpHealthStatus.UNKNOWN);
193             pdpSubGroup.setPdpInstances(new ArrayList<>());
194             pdpSubGroup.getPdpInstances().add(pdp);
195
196             // Create Pdp Groups
197             assertEquals(123, databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0)
198                     .getDesiredInstanceCount());
199             assertEquals(1, databaseProvider.getPdpGroups("group").size());
200
201             // Create Policy Type
202             assertThatCode(() -> {
203                 ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder
204                         .decode(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
205                 policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
206             }).doesNotThrowAnyException();
207
208             // Create Policy
209             assertThatCode(() -> {
210                 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
211                 ToscaServiceTemplate policyServiceTemplate =
212                         standardCoder.decode(policyString, ToscaServiceTemplate.class);
213                 ToscaServiceTemplate serviceTemplate =
214                         policyProvider.createPolicy(policyTypeId, policyTypeVersion, policyServiceTemplate);
215                 assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
216             }).doesNotThrowAnyException();
217
218             // Test fetchDeployedPolicies (deployedPolicyMap.isEmpty())==true
219             assertThatThrownBy(() -> {
220                 policyProvider.fetchDeployedPolicies(policyTypeId, policyTypeVersion, policyId);
221             }).hasMessage("could not find policy with ID " + policyId + " and type " + policyTypeId + ":"
222                     + policyTypeVersion + " deployed in any pdp group");
223
224             // Update pdpSubGroup
225             pdpSubGroup.setPolicies(new ArrayList<>());
226             pdpSubGroup.getPolicies().add(new ToscaPolicyIdentifier(policyId, policyVersion));
227             assertEquals(1,
228                     databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getPolicies().size());
229
230             // Test fetchDeployedPolicies
231             assertThatCode(() -> {
232                 policyProvider.fetchDeployedPolicies(policyTypeId, policyTypeVersion, policyId);
233             }).doesNotThrowAnyException();
234
235             // Test validateDeleteEligibility exception path(!pdpGroups.isEmpty())
236             assertThatThrownBy(() -> {
237                 policyProvider.deletePolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", "onap.restart.tca",
238                         "1.0.0");
239             }).hasMessageContaining("policy with ID " + policyId + ":" + policyVersion
240                     + " cannot be deleted as it is deployed in pdp groups");
241         } catch (Exception exc) {
242             fail("Test should not throw an exception");
243         }
244     }
245
246     @Test
247     public void testCreatePolicy() throws Exception {
248
249         assertThatThrownBy(() -> {
250             policyProvider.createPolicy("dummy", "1.0.0", new ToscaServiceTemplate());
251         }).hasMessage("topology template not specified on service template");
252
253         ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder
254                 .decode(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
255         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
256
257         assertThatCode(() -> policyTypeProvider.createPolicyType(policyTypeServiceTemplate)).doesNotThrowAnyException();
258
259         assertThatThrownBy(() -> {
260             String badPolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_BAD_POLICYTYPE_ID);
261             ToscaServiceTemplate badPolicyServiceTemplate =
262                     standardCoder.decode(badPolicyString, ToscaServiceTemplate.class);
263             policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0",
264                     badPolicyServiceTemplate);
265         }).hasMessageContaining(
266                 "policy type onap.policies.monitoring.cdap.tca.hi.lo.appxxx:0.0.0 referenced in policy not found");
267
268         assertThatThrownBy(() -> {
269             String badPolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_BAD_POLICYTYPE_VERSION);
270             ToscaServiceTemplate badPolicyServiceTemplate =
271                     standardCoder.decode(badPolicyString, ToscaServiceTemplate.class);
272             policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0",
273                     badPolicyServiceTemplate);
274         }).hasMessageContaining(
275                 "policy type onap.policies.monitoring.cdap.tca.hi.lo.app:2.0.0 referenced in policy not found");
276
277         assertThatThrownBy(() -> {
278             String badPolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_NO_POLICY_VERSION);
279             ToscaServiceTemplate badPolicyServiceTemplate =
280                     standardCoder.decode(badPolicyString, ToscaServiceTemplate.class);
281             policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0",
282                     badPolicyServiceTemplate);
283         }).hasMessageContaining("key version is a null version");
284
285         String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
286         ToscaServiceTemplate policyServiceTemplate = standardCoder.decode(policyString, ToscaServiceTemplate.class);
287         ToscaServiceTemplate serviceTemplate = policyProvider
288                 .createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", policyServiceTemplate);
289         assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
290
291         assertThatThrownBy(() -> {
292             String badPolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_DIFFERENT_FIELDS);
293             ToscaServiceTemplate badPolicyServiceTemplate =
294                     standardCoder.decode(badPolicyString, ToscaServiceTemplate.class);
295             policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0",
296                     badPolicyServiceTemplate);
297         }).hasMessageContaining("entity in incoming fragment does not equal existing entity");
298     }
299
300     @Test
301     public void testCreateOperationalDroolsPolicy() throws CoderException, PfModelException {
302         ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
303                 ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE_OPERATIONAL), ToscaServiceTemplate.class);
304
305         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
306         policyTypeServiceTemplate = standardYamlCoder.decode(
307                 ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE_OPERATIONAL_COMMON), ToscaServiceTemplate.class);
308
309         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
310
311         policyTypeServiceTemplate = standardYamlCoder.decode(
312                 ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE_OPERATIONAL_DROOLS), ToscaServiceTemplate.class);
313         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
314
315         String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_OPERATIONAL);
316         ToscaServiceTemplate policyServiceTemplate = standardCoder.decode(policyString, ToscaServiceTemplate.class);
317         ToscaServiceTemplate serviceTemplate =
318                 policyProvider.createPolicy(POLICY_TYPE_OPERATIONAL_DROOLS, "1.0.0", policyServiceTemplate);
319         assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
320     }
321
322     @Test
323     public void testSimpleCreatePolicy() throws Exception {
324
325         assertThatThrownBy(() -> {
326             String multiPoliciesString = ResourceUtils.getResourceAsString(MULTIPLE_POLICIES_RESOURCE);
327             ToscaServiceTemplate multiPoliciesServiceTemplate =
328                     standardCoder.decode(multiPoliciesString, ToscaServiceTemplate.class);
329             policyProvider.createPolicies(multiPoliciesServiceTemplate);
330         }).hasMessageContaining(
331                 "no policy types are defined on the service template for the policies in the topology template");
332
333         // Create required policy types
334         ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
335                 ResourceUtils.getResourceAsString("policytypes/onap.policies.Optimization.yaml"),
336                 ToscaServiceTemplate.class);
337         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
338
339         policyTypeServiceTemplate = standardYamlCoder.decode(
340                 ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.Resource.yaml"),
341                 ToscaServiceTemplate.class);
342         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
343
344         policyTypeServiceTemplate = standardYamlCoder.decode(
345                 ResourceUtils
346                         .getResourceAsString("policytypes/onap.policies.optimization.resource.AffinityPolicy.yaml"),
347                 ToscaServiceTemplate.class);
348         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
349
350         policyTypeServiceTemplate = standardYamlCoder.decode(
351                 ResourceUtils
352                         .getResourceAsString("policytypes/onap.policies.optimization.resource.DistancePolicy.yaml"),
353                 ToscaServiceTemplate.class);
354         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
355
356         policyTypeServiceTemplate = standardYamlCoder.decode(
357                 ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.resource.Vim_fit.yaml"),
358                 ToscaServiceTemplate.class);
359         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
360
361         policyTypeServiceTemplate = standardYamlCoder.decode(
362                 ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.resource.HpaPolicy.yaml"),
363                 ToscaServiceTemplate.class);
364         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
365
366         policyTypeServiceTemplate = standardYamlCoder.decode(
367                 ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.resource.VnfPolicy.yaml"),
368                 ToscaServiceTemplate.class);
369         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
370
371         policyTypeServiceTemplate = standardYamlCoder.decode(
372                 ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.Service.yaml"),
373                 ToscaServiceTemplate.class);
374         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
375
376         policyTypeServiceTemplate = standardYamlCoder.decode(
377                 ResourceUtils
378                         .getResourceAsString("policytypes/onap.policies.optimization.service.SubscriberPolicy.yaml"),
379                 ToscaServiceTemplate.class);
380         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
381
382         policyTypeServiceTemplate = standardYamlCoder.decode(
383                 ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.service.QueryPolicy.yaml"),
384                 ToscaServiceTemplate.class);
385         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
386
387         policyTypeServiceTemplate = standardYamlCoder.decode(
388                 ResourceUtils.getResourceAsString("policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app.yaml"),
389                 ToscaServiceTemplate.class);
390         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
391
392         // Create multiple policies in one call
393         String multiPoliciesString = ResourceUtils.getResourceAsString(MULTIPLE_POLICIES_RESOURCE);
394         ToscaServiceTemplate multiPoliciesServiceTemplate =
395                 standardCoder.decode(multiPoliciesString, ToscaServiceTemplate.class);
396
397         assertThatCode(() -> {
398             policyProvider.createPolicies(multiPoliciesServiceTemplate);
399             policyProvider.createPolicies(multiPoliciesServiceTemplate);
400         }).doesNotThrowAnyException();
401     }
402
403     @Test
404     public void testDeletePolicy() {
405
406         assertThatThrownBy(() -> {
407             policyProvider.deletePolicy("dummy", "1.0.0", "dummy", "1.0.0");
408         }).hasMessage("service template not found in database");
409
410         assertThatCode(() -> {
411             ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder
412                     .decode(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
413             policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
414         }).doesNotThrowAnyException();
415
416         assertThatCode(() -> {
417             String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
418             ToscaServiceTemplate policyServiceTemplate = standardCoder.decode(policyString, ToscaServiceTemplate.class);
419             ToscaServiceTemplate serviceTemplate = policyProvider
420                     .createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", policyServiceTemplate);
421             assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
422         }).doesNotThrowAnyException();
423
424         assertThatCode(() -> {
425             ToscaServiceTemplate serviceTemplate = policyProvider
426                     .deletePolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", "onap.restart.tca", "1.0.0");
427             assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
428         }).doesNotThrowAnyException();
429
430         assertThatThrownBy(() -> {
431             policyProvider.deletePolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", "onap.restart.tca",
432                     "1.0.0");
433         }).hasMessageContaining("policies for onap.restart.tca:1.0.0 do not exist");
434     }
435 }