Add BARE and REFERENCED mode to policy fetches
[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 =
111             new ApiParameterGroup("ApiGroup", null, providerParams, 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, null);
135         }).hasMessage("service template not found in database");
136
137         assertThatThrownBy(() -> {
138             policyProvider.fetchPolicies("dummy", "1.0.0", "dummy", null, null);
139         }).hasMessage("service template not found in database");
140
141         assertThatThrownBy(() -> {
142             policyProvider.fetchPolicies("dummy", "1.0.0", "dummy", "1.0.0", null);
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", null);
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         try (PolicyModelsProvider databaseProvider =
162             new PolicyModelsProviderFactory().createPolicyModelsProvider(providerParams)) {
163             assertEquals(0, databaseProvider.getPdpGroups("name").size());
164             assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
165
166             assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
167             assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
168
169             PdpGroup pdpGroup = new PdpGroup();
170             pdpGroup.setName("group");
171             pdpGroup.setVersion("1.2.3");
172             pdpGroup.setPdpGroupState(PdpState.ACTIVE);
173             pdpGroup.setPdpSubgroups(new ArrayList<>());
174             List<PdpGroup> groupList = new ArrayList<>();
175             groupList.add(pdpGroup);
176
177             PdpSubGroup pdpSubGroup = new PdpSubGroup();
178             pdpSubGroup.setPdpType("type");
179             pdpSubGroup.setDesiredInstanceCount(123);
180             pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
181             pdpSubGroup.getSupportedPolicyTypes().add(new ToscaPolicyTypeIdentifier(policyTypeId, policyTypeVersion));
182             pdpGroup.getPdpSubgroups().add(pdpSubGroup);
183
184             Pdp pdp = new Pdp();
185             pdp.setInstanceId("type-0");
186             pdp.setMessage("Hello");
187             pdp.setPdpState(PdpState.ACTIVE);
188             pdp.setHealthy(PdpHealthStatus.UNKNOWN);
189             pdpSubGroup.setPdpInstances(new ArrayList<>());
190             pdpSubGroup.getPdpInstances().add(pdp);
191
192             // Create Pdp Groups
193             assertEquals(123,
194                 databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getDesiredInstanceCount());
195             assertEquals(1, databaseProvider.getPdpGroups("group").size());
196
197             // Create Policy Type
198             assertThatCode(() -> {
199                 ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder
200                     .decode(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
201                 policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
202             }).doesNotThrowAnyException();
203
204             // Create Policy
205             assertThatCode(() -> {
206                 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
207                 ToscaServiceTemplate policyServiceTemplate =
208                     standardCoder.decode(policyString, ToscaServiceTemplate.class);
209                 ToscaServiceTemplate serviceTemplate =
210                     policyProvider.createPolicy(policyTypeId, policyTypeVersion, policyServiceTemplate);
211                 assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
212             }).doesNotThrowAnyException();
213
214             // Update pdpSubGroup
215             pdpSubGroup.setPolicies(new ArrayList<>());
216             pdpSubGroup.getPolicies().add(new ToscaPolicyIdentifier(policyId, policyVersion));
217             assertEquals(1,
218                 databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getPolicies().size());
219
220             // Test validateDeleteEligibility exception path(!pdpGroups.isEmpty())
221             assertThatThrownBy(() -> {
222                 policyProvider.deletePolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", "onap.restart.tca",
223                     "1.0.0");
224             }).hasMessageContaining("policy is in use, it is deployed in PDP group group subgroup type");
225         } catch (Exception exc) {
226             fail("Test should not throw an exception");
227         }
228     }
229
230     @Test
231     public void testCreatePolicy() throws Exception {
232
233         assertThatThrownBy(() -> {
234             policyProvider.createPolicy("dummy", "1.0.0", new ToscaServiceTemplate());
235         }).hasMessage("topology template not specified on service template");
236
237         ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder
238             .decode(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
239         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
240
241         assertThatCode(() -> policyTypeProvider.createPolicyType(policyTypeServiceTemplate)).doesNotThrowAnyException();
242
243         assertThatThrownBy(() -> {
244             String badPolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_BAD_POLICYTYPE_ID);
245             ToscaServiceTemplate badPolicyServiceTemplate =
246                 standardCoder.decode(badPolicyString, ToscaServiceTemplate.class);
247             policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0",
248                 badPolicyServiceTemplate);
249         }).hasMessageContaining(
250             "policy type onap.policies.monitoring.cdap.tca.hi.lo.appxxx:0.0.0 referenced in policy not found");
251
252         assertThatThrownBy(() -> {
253             String badPolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_BAD_POLICYTYPE_VERSION);
254             ToscaServiceTemplate badPolicyServiceTemplate =
255                 standardCoder.decode(badPolicyString, ToscaServiceTemplate.class);
256             policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0",
257                 badPolicyServiceTemplate);
258         }).hasMessageContaining(
259             "policy type onap.policies.monitoring.cdap.tca.hi.lo.app:2.0.0 referenced in policy not found");
260
261         assertThatThrownBy(() -> {
262             String badPolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_NO_POLICY_VERSION);
263             ToscaServiceTemplate badPolicyServiceTemplate =
264                 standardCoder.decode(badPolicyString, ToscaServiceTemplate.class);
265             policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0",
266                 badPolicyServiceTemplate);
267         }).hasMessageContaining("key version is a null version");
268
269         String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
270         ToscaServiceTemplate policyServiceTemplate = standardCoder.decode(policyString, ToscaServiceTemplate.class);
271         ToscaServiceTemplate serviceTemplate =
272             policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", policyServiceTemplate);
273         assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
274
275         assertThatThrownBy(() -> {
276             String badPolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_DIFFERENT_FIELDS);
277             ToscaServiceTemplate badPolicyServiceTemplate =
278                 standardCoder.decode(badPolicyString, ToscaServiceTemplate.class);
279             policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0",
280                 badPolicyServiceTemplate);
281         }).hasMessageContaining("entity in incoming fragment does not equal existing entity");
282     }
283
284     @Test
285     public void testCreateOperationalDroolsPolicy() throws CoderException, PfModelException {
286         ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder
287             .decode(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE_OPERATIONAL), ToscaServiceTemplate.class);
288
289         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
290         policyTypeServiceTemplate = standardYamlCoder.decode(
291             ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE_OPERATIONAL_COMMON), ToscaServiceTemplate.class);
292
293         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
294
295         policyTypeServiceTemplate = standardYamlCoder.decode(
296             ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE_OPERATIONAL_DROOLS), ToscaServiceTemplate.class);
297         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
298
299         String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_OPERATIONAL);
300         ToscaServiceTemplate policyServiceTemplate = standardCoder.decode(policyString, ToscaServiceTemplate.class);
301         ToscaServiceTemplate serviceTemplate =
302             policyProvider.createPolicy(POLICY_TYPE_OPERATIONAL_DROOLS, "1.0.0", policyServiceTemplate);
303         assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
304     }
305
306     @Test
307     public void testSimpleCreatePolicy() throws Exception {
308
309         assertThatThrownBy(() -> {
310             String multiPoliciesString = ResourceUtils.getResourceAsString(MULTIPLE_POLICIES_RESOURCE);
311             ToscaServiceTemplate multiPoliciesServiceTemplate =
312                 standardCoder.decode(multiPoliciesString, ToscaServiceTemplate.class);
313             policyProvider.createPolicies(multiPoliciesServiceTemplate);
314         }).hasMessageContaining(
315             "no policy types are defined on the service template for the policies in the topology template");
316
317         // Create required policy types
318         ToscaServiceTemplate policyTypeServiceTemplate =
319             standardYamlCoder.decode(ResourceUtils.getResourceAsString("policytypes/onap.policies.Optimization.yaml"),
320                 ToscaServiceTemplate.class);
321         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
322
323         policyTypeServiceTemplate = standardYamlCoder.decode(
324             ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.Resource.yaml"),
325             ToscaServiceTemplate.class);
326         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
327
328         policyTypeServiceTemplate = standardYamlCoder.decode(
329             ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.resource.AffinityPolicy.yaml"),
330             ToscaServiceTemplate.class);
331         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
332
333         policyTypeServiceTemplate = standardYamlCoder.decode(
334             ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.resource.DistancePolicy.yaml"),
335             ToscaServiceTemplate.class);
336         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
337
338         policyTypeServiceTemplate = standardYamlCoder.decode(
339             ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.resource.Vim_fit.yaml"),
340             ToscaServiceTemplate.class);
341         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
342
343         policyTypeServiceTemplate = standardYamlCoder.decode(
344             ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.resource.HpaPolicy.yaml"),
345             ToscaServiceTemplate.class);
346         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
347
348         policyTypeServiceTemplate = standardYamlCoder.decode(
349             ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.resource.VnfPolicy.yaml"),
350             ToscaServiceTemplate.class);
351         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
352
353         policyTypeServiceTemplate = standardYamlCoder.decode(
354             ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.Service.yaml"),
355             ToscaServiceTemplate.class);
356         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
357
358         policyTypeServiceTemplate = standardYamlCoder.decode(
359             ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.service.SubscriberPolicy.yaml"),
360             ToscaServiceTemplate.class);
361         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
362
363         policyTypeServiceTemplate = standardYamlCoder.decode(
364             ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.service.QueryPolicy.yaml"),
365             ToscaServiceTemplate.class);
366         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
367
368         policyTypeServiceTemplate = standardYamlCoder.decode(
369             ResourceUtils.getResourceAsString("policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app.yaml"),
370             ToscaServiceTemplate.class);
371         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
372
373         // Create multiple policies in one call
374         String multiPoliciesString = ResourceUtils.getResourceAsString(MULTIPLE_POLICIES_RESOURCE);
375         ToscaServiceTemplate multiPoliciesServiceTemplate =
376             standardCoder.decode(multiPoliciesString, ToscaServiceTemplate.class);
377
378         assertThatCode(() -> {
379             policyProvider.createPolicies(multiPoliciesServiceTemplate);
380             policyProvider.createPolicies(multiPoliciesServiceTemplate);
381         }).doesNotThrowAnyException();
382     }
383
384     @Test
385     public void testDeletePolicy() {
386
387         assertThatThrownBy(() -> {
388             policyProvider.deletePolicy("dummy", "1.0.0", "dummy", "1.0.0");
389         }).hasMessage("service template not found in database");
390
391         assertThatCode(() -> {
392             ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder
393                 .decode(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
394             policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
395         }).doesNotThrowAnyException();
396
397         assertThatCode(() -> {
398             String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
399             ToscaServiceTemplate policyServiceTemplate = standardCoder.decode(policyString, ToscaServiceTemplate.class);
400             ToscaServiceTemplate serviceTemplate = policyProvider
401                 .createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", policyServiceTemplate);
402             assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
403         }).doesNotThrowAnyException();
404
405         assertThatCode(() -> {
406             ToscaServiceTemplate serviceTemplate = policyProvider
407                 .deletePolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", "onap.restart.tca", "1.0.0");
408             assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
409         }).doesNotThrowAnyException();
410
411         assertThatThrownBy(() -> {
412             policyProvider.deletePolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", "onap.restart.tca",
413                 "1.0.0");
414         }).hasMessageContaining("no policies found");
415     }
416 }