d9b01fdb2c3a0574a03593f9b877e51d413cc371
[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 is in use, it is deployed in PDP group group subgroup type");
240         } catch (Exception exc) {
241             fail("Test should not throw an exception");
242         }
243     }
244
245     @Test
246     public void testCreatePolicy() throws Exception {
247
248         assertThatThrownBy(() -> {
249             policyProvider.createPolicy("dummy", "1.0.0", new ToscaServiceTemplate());
250         }).hasMessage("topology template not specified on service template");
251
252         ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder
253                 .decode(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
254         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
255
256         assertThatCode(() -> policyTypeProvider.createPolicyType(policyTypeServiceTemplate)).doesNotThrowAnyException();
257
258         assertThatThrownBy(() -> {
259             String badPolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_BAD_POLICYTYPE_ID);
260             ToscaServiceTemplate badPolicyServiceTemplate =
261                     standardCoder.decode(badPolicyString, ToscaServiceTemplate.class);
262             policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0",
263                     badPolicyServiceTemplate);
264         }).hasMessageContaining(
265                 "policy type onap.policies.monitoring.cdap.tca.hi.lo.appxxx:0.0.0 referenced in policy not found");
266
267         assertThatThrownBy(() -> {
268             String badPolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_BAD_POLICYTYPE_VERSION);
269             ToscaServiceTemplate badPolicyServiceTemplate =
270                     standardCoder.decode(badPolicyString, ToscaServiceTemplate.class);
271             policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0",
272                     badPolicyServiceTemplate);
273         }).hasMessageContaining(
274                 "policy type onap.policies.monitoring.cdap.tca.hi.lo.app:2.0.0 referenced in policy not found");
275
276         assertThatThrownBy(() -> {
277             String badPolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_NO_POLICY_VERSION);
278             ToscaServiceTemplate badPolicyServiceTemplate =
279                     standardCoder.decode(badPolicyString, ToscaServiceTemplate.class);
280             policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0",
281                     badPolicyServiceTemplate);
282         }).hasMessageContaining("key version is a null version");
283
284         String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
285         ToscaServiceTemplate policyServiceTemplate = standardCoder.decode(policyString, ToscaServiceTemplate.class);
286         ToscaServiceTemplate serviceTemplate = policyProvider
287                 .createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", policyServiceTemplate);
288         assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
289
290         assertThatThrownBy(() -> {
291             String badPolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_DIFFERENT_FIELDS);
292             ToscaServiceTemplate badPolicyServiceTemplate =
293                     standardCoder.decode(badPolicyString, ToscaServiceTemplate.class);
294             policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0",
295                     badPolicyServiceTemplate);
296         }).hasMessageContaining("entity in incoming fragment does not equal existing entity");
297     }
298
299     @Test
300     public void testCreateOperationalDroolsPolicy() throws CoderException, PfModelException {
301         ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
302                 ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE_OPERATIONAL), ToscaServiceTemplate.class);
303
304         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
305         policyTypeServiceTemplate = standardYamlCoder.decode(
306                 ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE_OPERATIONAL_COMMON), ToscaServiceTemplate.class);
307
308         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
309
310         policyTypeServiceTemplate = standardYamlCoder.decode(
311                 ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE_OPERATIONAL_DROOLS), ToscaServiceTemplate.class);
312         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
313
314         String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_OPERATIONAL);
315         ToscaServiceTemplate policyServiceTemplate = standardCoder.decode(policyString, ToscaServiceTemplate.class);
316         ToscaServiceTemplate serviceTemplate =
317                 policyProvider.createPolicy(POLICY_TYPE_OPERATIONAL_DROOLS, "1.0.0", policyServiceTemplate);
318         assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
319     }
320
321     @Test
322     public void testSimpleCreatePolicy() throws Exception {
323
324         assertThatThrownBy(() -> {
325             String multiPoliciesString = ResourceUtils.getResourceAsString(MULTIPLE_POLICIES_RESOURCE);
326             ToscaServiceTemplate multiPoliciesServiceTemplate =
327                     standardCoder.decode(multiPoliciesString, ToscaServiceTemplate.class);
328             policyProvider.createPolicies(multiPoliciesServiceTemplate);
329         }).hasMessageContaining(
330                 "no policy types are defined on the service template for the policies in the topology template");
331
332         // Create required policy types
333         ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
334                 ResourceUtils.getResourceAsString("policytypes/onap.policies.Optimization.yaml"),
335                 ToscaServiceTemplate.class);
336         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
337
338         policyTypeServiceTemplate = standardYamlCoder.decode(
339                 ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.Resource.yaml"),
340                 ToscaServiceTemplate.class);
341         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
342
343         policyTypeServiceTemplate = standardYamlCoder.decode(
344                 ResourceUtils
345                         .getResourceAsString("policytypes/onap.policies.optimization.resource.AffinityPolicy.yaml"),
346                 ToscaServiceTemplate.class);
347         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
348
349         policyTypeServiceTemplate = standardYamlCoder.decode(
350                 ResourceUtils
351                         .getResourceAsString("policytypes/onap.policies.optimization.resource.DistancePolicy.yaml"),
352                 ToscaServiceTemplate.class);
353         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
354
355         policyTypeServiceTemplate = standardYamlCoder.decode(
356                 ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.resource.Vim_fit.yaml"),
357                 ToscaServiceTemplate.class);
358         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
359
360         policyTypeServiceTemplate = standardYamlCoder.decode(
361                 ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.resource.HpaPolicy.yaml"),
362                 ToscaServiceTemplate.class);
363         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
364
365         policyTypeServiceTemplate = standardYamlCoder.decode(
366                 ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.resource.VnfPolicy.yaml"),
367                 ToscaServiceTemplate.class);
368         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
369
370         policyTypeServiceTemplate = standardYamlCoder.decode(
371                 ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.Service.yaml"),
372                 ToscaServiceTemplate.class);
373         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
374
375         policyTypeServiceTemplate = standardYamlCoder.decode(
376                 ResourceUtils
377                         .getResourceAsString("policytypes/onap.policies.optimization.service.SubscriberPolicy.yaml"),
378                 ToscaServiceTemplate.class);
379         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
380
381         policyTypeServiceTemplate = standardYamlCoder.decode(
382                 ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.service.QueryPolicy.yaml"),
383                 ToscaServiceTemplate.class);
384         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
385
386         policyTypeServiceTemplate = standardYamlCoder.decode(
387                 ResourceUtils.getResourceAsString("policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app.yaml"),
388                 ToscaServiceTemplate.class);
389         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
390
391         // Create multiple policies in one call
392         String multiPoliciesString = ResourceUtils.getResourceAsString(MULTIPLE_POLICIES_RESOURCE);
393         ToscaServiceTemplate multiPoliciesServiceTemplate =
394                 standardCoder.decode(multiPoliciesString, ToscaServiceTemplate.class);
395
396         assertThatCode(() -> {
397             policyProvider.createPolicies(multiPoliciesServiceTemplate);
398             policyProvider.createPolicies(multiPoliciesServiceTemplate);
399         }).doesNotThrowAnyException();
400     }
401
402     @Test
403     public void testDeletePolicy() {
404
405         assertThatThrownBy(() -> {
406             policyProvider.deletePolicy("dummy", "1.0.0", "dummy", "1.0.0");
407         }).hasMessage("service template not found in database");
408
409         assertThatCode(() -> {
410             ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder
411                     .decode(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
412             policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
413         }).doesNotThrowAnyException();
414
415         assertThatCode(() -> {
416             String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
417             ToscaServiceTemplate policyServiceTemplate = standardCoder.decode(policyString, ToscaServiceTemplate.class);
418             ToscaServiceTemplate serviceTemplate = policyProvider
419                     .createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", policyServiceTemplate);
420             assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
421         }).doesNotThrowAnyException();
422
423         assertThatCode(() -> {
424             ToscaServiceTemplate serviceTemplate = policyProvider
425                     .deletePolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", "onap.restart.tca", "1.0.0");
426             assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
427         }).doesNotThrowAnyException();
428
429         assertThatThrownBy(() -> {
430             policyProvider.deletePolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", "onap.restart.tca",
431                     "1.0.0");
432         }).hasMessageContaining("no policies found");
433     }
434 }