be9b5838b825cd1237d331b4318857fd50e2473f
[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,
111                 Collections.emptyList(), Collections.emptyList());
112         ParameterService.register(apiParamGroup, true);
113         policyTypeProvider = new PolicyTypeProvider();
114         policyProvider = new PolicyProvider();
115     }
116
117     /**
118      * Closes up DB connections and deregisters API parameter group.
119      *
120      * @throws PfModelException the PfModel parsing exception
121      */
122     @After
123     public void tearDown() throws PfModelException {
124
125         policyTypeProvider.close();
126         policyProvider.close();
127         ParameterService.deregister(apiParamGroup);
128     }
129
130     @Test
131     public void testFetchPolicies() {
132
133         assertThatThrownBy(() -> {
134             policyProvider.fetchPolicies("dummy", "1.0.0", null, null);
135         }).hasMessage("service template not found in database");
136
137         assertThatThrownBy(() -> {
138             policyProvider.fetchPolicies("dummy", "1.0.0", "dummy", null);
139         }).hasMessage("service template not found in database");
140
141         assertThatThrownBy(() -> {
142             policyProvider.fetchPolicies("dummy", "1.0.0", "dummy", "1.0.0");
143         }).hasMessage("service template not found in database");
144     }
145
146     @Test
147     public void testFetchLatestPolicies() {
148
149         assertThatThrownBy(() -> {
150             policyProvider.fetchLatestPolicies("dummy", "dummy", "dummy");
151         }).hasMessage("service template not found in database");
152     }
153
154     @Test
155     public void testFetchDeployedPolicies() {
156         String policyId = "onap.restart.tca";
157         String policyVersion = "1.0.0";
158         String policyTypeVersion = "1.0.0";
159         String policyTypeId = "onap.policies.monitoring.cdap.tca.hi.lo.app";
160
161         // Basic Exception Throw
162         assertThatThrownBy(() -> {
163             policyProvider.fetchDeployedPolicies("dummy", "1.0.0", "dummy");
164         }).hasMessage("could not find policy with ID dummy and type dummy:1.0.0 deployed in any pdp group");
165
166         try (PolicyModelsProvider databaseProvider =
167                 new PolicyModelsProviderFactory().createPolicyModelsProvider(providerParams)) {
168             assertEquals(0, databaseProvider.getPdpGroups("name").size());
169             assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
170
171             assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
172             assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
173
174             PdpGroup pdpGroup = new PdpGroup();
175             pdpGroup.setName("group");
176             pdpGroup.setVersion("1.2.3");
177             pdpGroup.setPdpGroupState(PdpState.ACTIVE);
178             pdpGroup.setPdpSubgroups(new ArrayList<>());
179             List<PdpGroup> groupList = new ArrayList<>();
180             groupList.add(pdpGroup);
181
182             PdpSubGroup pdpSubGroup = new PdpSubGroup();
183             pdpSubGroup.setPdpType("type");
184             pdpSubGroup.setDesiredInstanceCount(123);
185             pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
186             pdpSubGroup.getSupportedPolicyTypes().add(new ToscaPolicyTypeIdentifier(policyTypeId, policyTypeVersion));
187             pdpGroup.getPdpSubgroups().add(pdpSubGroup);
188
189             Pdp pdp = new Pdp();
190             pdp.setInstanceId("type-0");
191             pdp.setMessage("Hello");
192             pdp.setPdpState(PdpState.ACTIVE);
193             pdp.setHealthy(PdpHealthStatus.UNKNOWN);
194             pdpSubGroup.setPdpInstances(new ArrayList<>());
195             pdpSubGroup.getPdpInstances().add(pdp);
196
197             // Create Pdp Groups
198             assertEquals(123, databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0)
199                     .getDesiredInstanceCount());
200             assertEquals(1, databaseProvider.getPdpGroups("group").size());
201
202             // Create Policy Type
203             assertThatCode(() -> {
204                 ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder
205                         .decode(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
206                 policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
207             }).doesNotThrowAnyException();
208
209             // Create Policy
210             assertThatCode(() -> {
211                 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
212                 ToscaServiceTemplate policyServiceTemplate =
213                         standardCoder.decode(policyString, ToscaServiceTemplate.class);
214                 ToscaServiceTemplate serviceTemplate =
215                         policyProvider.createPolicy(policyTypeId, policyTypeVersion, policyServiceTemplate);
216                 assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
217             }).doesNotThrowAnyException();
218
219             // Test fetchDeployedPolicies (deployedPolicyMap.isEmpty())==true
220             assertThatThrownBy(() -> {
221                 policyProvider.fetchDeployedPolicies(policyTypeId, policyTypeVersion, policyId);
222             }).hasMessage("could not find policy with ID " + policyId + " and type " + policyTypeId + ":"
223                     + policyTypeVersion + " deployed in any pdp group");
224
225             // Update pdpSubGroup
226             pdpSubGroup.setPolicies(new ArrayList<>());
227             pdpSubGroup.getPolicies().add(new ToscaPolicyIdentifier(policyId, policyVersion));
228             assertEquals(1,
229                     databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getPolicies().size());
230
231             // Test fetchDeployedPolicies
232             assertThatCode(() -> {
233                 policyProvider.fetchDeployedPolicies(policyTypeId, policyTypeVersion, policyId);
234             }).doesNotThrowAnyException();
235
236             // Test validateDeleteEligibility exception path(!pdpGroups.isEmpty())
237             assertThatThrownBy(() -> {
238                 policyProvider.deletePolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", "onap.restart.tca",
239                         "1.0.0");
240             }).hasMessageContaining("policy is in use, it is deployed in PDP group group subgroup type");
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("no policies found");
434     }
435 }