f458013d1fa9ff082fdfd0a082d47546e8723b11
[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 import org.junit.After;
38 import org.junit.Before;
39 import org.junit.Test;
40 import org.onap.policy.api.main.parameters.ApiParameterGroup;
41 import org.onap.policy.common.parameters.ParameterService;
42 import org.onap.policy.common.utils.coder.CoderException;
43 import org.onap.policy.common.utils.coder.StandardCoder;
44 import org.onap.policy.common.utils.coder.StandardYamlCoder;
45 import org.onap.policy.common.utils.resources.ResourceUtils;
46 import org.onap.policy.models.base.PfModelException;
47 import org.onap.policy.models.pdp.concepts.Pdp;
48 import org.onap.policy.models.pdp.concepts.PdpGroup;
49 import org.onap.policy.models.pdp.concepts.PdpGroupFilter;
50 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
51 import org.onap.policy.models.pdp.enums.PdpHealthStatus;
52 import org.onap.policy.models.pdp.enums.PdpState;
53 import org.onap.policy.models.provider.PolicyModelsProvider;
54 import org.onap.policy.models.provider.PolicyModelsProviderFactory;
55 import org.onap.policy.models.provider.PolicyModelsProviderParameters;
56 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifier;
57 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier;
58 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
59
60 /**
61  * This class performs unit test of {@link PolicyProvider}.
62  *
63  * @author Chenfei Gao (cgao@research.att.com)
64  */
65 public class TestPolicyProvider {
66
67     private static PolicyProvider policyProvider;
68     private static PolicyTypeProvider policyTypeProvider;
69     private static PolicyModelsProviderParameters providerParams;
70     private static ApiParameterGroup apiParamGroup;
71     private static StandardCoder standardCoder;
72     private static StandardYamlCoder standardYamlCoder;
73
74     private static final String POLICY_RESOURCE = "policies/vCPE.policy.monitoring.input.tosca.json";
75     private static final String POLICY_TYPE_RESOURCE = "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app.yaml";
76     private static final String POLICY_RESOURCE_WITH_BAD_POLICYTYPE_ID = "policies/vCPE.policy.bad.policytypeid.json";
77     private static final String POLICY_RESOURCE_WITH_BAD_POLICYTYPE_VERSION =
78             "policies/vCPE.policy.bad.policytypeversion.json";
79     private static final String POLICY_RESOURCE_WITH_NO_POLICY_VERSION = "policies/vCPE.policy.no.policyversion.json";
80     private static final String POLICY_RESOURCE_WITH_DIFFERENT_FIELDS =
81             "policies/vCPE.policy.different.policy.fields.json";
82     private static final String MULTIPLE_POLICIES_RESOURCE = "policies/vCPE.policies.optimization.input.tosca.json";
83
84     public static final String POLICY_TYPE_RESOURCE_OPERATIONAL =
85             "policytypes/onap.policies.controlloop.Operational.yaml";
86     public static final String POLICY_TYPE_RESOURCE_OPERATIONAL_COMMON =
87             "policytypes/onap.policies.controlloop.operational.Common.yaml";
88     public static final String POLICY_TYPE_RESOURCE_OPERATIONAL_DROOLS =
89             "policytypes/onap.policies.controlloop.operational.common.Drools.yaml";
90     private static final String POLICY_RESOURCE_OPERATIONAL = "policies/vCPE.policy.operational.input.tosca.json";
91     public static final String POLICY_TYPE_OPERATIONAL_DROOLS = "onap.policies.controlloop.operational.common.Drools";
92
93     /**
94      * Initializes parameters.
95      *
96      * @throws PfModelException the PfModel parsing exception
97      */
98     @Before
99     public void setupParameters() throws PfModelException {
100
101         standardCoder = new StandardCoder();
102         standardYamlCoder = new StandardYamlCoder();
103         providerParams = new PolicyModelsProviderParameters();
104         providerParams.setDatabaseDriver("org.h2.Driver");
105         providerParams.setDatabaseUrl("jdbc:h2:mem:testdb");
106         providerParams.setDatabaseUser("policy");
107         providerParams.setDatabasePassword(Base64.getEncoder().encodeToString("P01icY".getBytes()));
108         providerParams.setPersistenceUnit("ToscaConceptTest");
109         apiParamGroup = new ApiParameterGroup("ApiGroup", null, providerParams,
110                 Collections.emptyList(), 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         try (PolicyModelsProvider databaseProvider =
161                 new PolicyModelsProviderFactory().createPolicyModelsProvider(providerParams)) {
162             assertEquals(0, databaseProvider.getPdpGroups("name").size());
163             assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
164
165             assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
166             assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
167
168             PdpGroup pdpGroup = new PdpGroup();
169             pdpGroup.setName("group");
170             pdpGroup.setVersion("1.2.3");
171             pdpGroup.setPdpGroupState(PdpState.ACTIVE);
172             pdpGroup.setPdpSubgroups(new ArrayList<>());
173             List<PdpGroup> groupList = new ArrayList<>();
174             groupList.add(pdpGroup);
175
176             PdpSubGroup pdpSubGroup = new PdpSubGroup();
177             pdpSubGroup.setPdpType("type");
178             pdpSubGroup.setDesiredInstanceCount(123);
179             pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
180             pdpSubGroup.getSupportedPolicyTypes().add(new ToscaPolicyTypeIdentifier(policyTypeId, policyTypeVersion));
181             pdpGroup.getPdpSubgroups().add(pdpSubGroup);
182
183             Pdp pdp = new Pdp();
184             pdp.setInstanceId("type-0");
185             pdp.setMessage("Hello");
186             pdp.setPdpState(PdpState.ACTIVE);
187             pdp.setHealthy(PdpHealthStatus.UNKNOWN);
188             pdpSubGroup.setPdpInstances(new ArrayList<>());
189             pdpSubGroup.getPdpInstances().add(pdp);
190
191             // Create Pdp Groups
192             assertEquals(123, databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0)
193                     .getDesiredInstanceCount());
194             assertEquals(1, databaseProvider.getPdpGroups("group").size());
195
196             // Create Policy Type
197             assertThatCode(() -> {
198                 ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder
199                         .decode(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
200                 policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
201             }).doesNotThrowAnyException();
202
203             // Create Policy
204             assertThatCode(() -> {
205                 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
206                 ToscaServiceTemplate policyServiceTemplate =
207                         standardCoder.decode(policyString, ToscaServiceTemplate.class);
208                 ToscaServiceTemplate serviceTemplate =
209                         policyProvider.createPolicy(policyTypeId, policyTypeVersion, policyServiceTemplate);
210                 assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
211             }).doesNotThrowAnyException();
212
213             // Update pdpSubGroup
214             pdpSubGroup.setPolicies(new ArrayList<>());
215             pdpSubGroup.getPolicies().add(new ToscaPolicyIdentifier(policyId, policyVersion));
216             assertEquals(1,
217                     databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getPolicies().size());
218
219             // Test validateDeleteEligibility exception path(!pdpGroups.isEmpty())
220             assertThatThrownBy(() -> {
221                 policyProvider.deletePolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", "onap.restart.tca",
222                         "1.0.0");
223             }).hasMessageContaining("policy is in use, it is deployed in PDP group group subgroup type");
224         } catch (Exception exc) {
225             fail("Test should not throw an exception");
226         }
227     }
228
229     @Test
230     public void testCreatePolicy() throws Exception {
231
232         assertThatThrownBy(() -> {
233             policyProvider.createPolicy("dummy", "1.0.0", new ToscaServiceTemplate());
234         }).hasMessage("topology template not specified on service template");
235
236         ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder
237                 .decode(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
238         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
239
240         assertThatCode(() -> policyTypeProvider.createPolicyType(policyTypeServiceTemplate)).doesNotThrowAnyException();
241
242         assertThatThrownBy(() -> {
243             String badPolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_BAD_POLICYTYPE_ID);
244             ToscaServiceTemplate badPolicyServiceTemplate =
245                     standardCoder.decode(badPolicyString, ToscaServiceTemplate.class);
246             policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0",
247                     badPolicyServiceTemplate);
248         }).hasMessageContaining(
249                 "policy type onap.policies.monitoring.cdap.tca.hi.lo.appxxx:0.0.0 referenced in policy not found");
250
251         assertThatThrownBy(() -> {
252             String badPolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_BAD_POLICYTYPE_VERSION);
253             ToscaServiceTemplate badPolicyServiceTemplate =
254                     standardCoder.decode(badPolicyString, ToscaServiceTemplate.class);
255             policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0",
256                     badPolicyServiceTemplate);
257         }).hasMessageContaining(
258                 "policy type onap.policies.monitoring.cdap.tca.hi.lo.app:2.0.0 referenced in policy not found");
259
260         assertThatThrownBy(() -> {
261             String badPolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_NO_POLICY_VERSION);
262             ToscaServiceTemplate badPolicyServiceTemplate =
263                     standardCoder.decode(badPolicyString, ToscaServiceTemplate.class);
264             policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0",
265                     badPolicyServiceTemplate);
266         }).hasMessageContaining("key version is a null version");
267
268         String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
269         ToscaServiceTemplate policyServiceTemplate = standardCoder.decode(policyString, ToscaServiceTemplate.class);
270         ToscaServiceTemplate serviceTemplate = policyProvider
271                 .createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", policyServiceTemplate);
272         assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
273
274         assertThatThrownBy(() -> {
275             String badPolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_DIFFERENT_FIELDS);
276             ToscaServiceTemplate badPolicyServiceTemplate =
277                     standardCoder.decode(badPolicyString, ToscaServiceTemplate.class);
278             policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0",
279                     badPolicyServiceTemplate);
280         }).hasMessageContaining("entity in incoming fragment does not equal existing entity");
281     }
282
283     @Test
284     public void testCreateOperationalDroolsPolicy() throws CoderException, PfModelException {
285         ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
286                 ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE_OPERATIONAL), ToscaServiceTemplate.class);
287
288         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
289         policyTypeServiceTemplate = standardYamlCoder.decode(
290                 ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE_OPERATIONAL_COMMON), ToscaServiceTemplate.class);
291
292         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
293
294         policyTypeServiceTemplate = standardYamlCoder.decode(
295                 ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE_OPERATIONAL_DROOLS), ToscaServiceTemplate.class);
296         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
297
298         String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_OPERATIONAL);
299         ToscaServiceTemplate policyServiceTemplate = standardCoder.decode(policyString, ToscaServiceTemplate.class);
300         ToscaServiceTemplate serviceTemplate =
301                 policyProvider.createPolicy(POLICY_TYPE_OPERATIONAL_DROOLS, "1.0.0", policyServiceTemplate);
302         assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
303     }
304
305     @Test
306     public void testSimpleCreatePolicy() throws Exception {
307
308         assertThatThrownBy(() -> {
309             String multiPoliciesString = ResourceUtils.getResourceAsString(MULTIPLE_POLICIES_RESOURCE);
310             ToscaServiceTemplate multiPoliciesServiceTemplate =
311                     standardCoder.decode(multiPoliciesString, ToscaServiceTemplate.class);
312             policyProvider.createPolicies(multiPoliciesServiceTemplate);
313         }).hasMessageContaining(
314                 "no policy types are defined on the service template for the policies in the topology template");
315
316         // Create required policy types
317         ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
318                 ResourceUtils.getResourceAsString("policytypes/onap.policies.Optimization.yaml"),
319                 ToscaServiceTemplate.class);
320         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
321
322         policyTypeServiceTemplate = standardYamlCoder.decode(
323                 ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.Resource.yaml"),
324                 ToscaServiceTemplate.class);
325         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
326
327         policyTypeServiceTemplate = standardYamlCoder.decode(
328                 ResourceUtils
329                         .getResourceAsString("policytypes/onap.policies.optimization.resource.AffinityPolicy.yaml"),
330                 ToscaServiceTemplate.class);
331         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
332
333         policyTypeServiceTemplate = standardYamlCoder.decode(
334                 ResourceUtils
335                         .getResourceAsString("policytypes/onap.policies.optimization.resource.DistancePolicy.yaml"),
336                 ToscaServiceTemplate.class);
337         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
338
339         policyTypeServiceTemplate = standardYamlCoder.decode(
340                 ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.resource.Vim_fit.yaml"),
341                 ToscaServiceTemplate.class);
342         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
343
344         policyTypeServiceTemplate = standardYamlCoder.decode(
345                 ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.resource.HpaPolicy.yaml"),
346                 ToscaServiceTemplate.class);
347         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
348
349         policyTypeServiceTemplate = standardYamlCoder.decode(
350                 ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.resource.VnfPolicy.yaml"),
351                 ToscaServiceTemplate.class);
352         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
353
354         policyTypeServiceTemplate = standardYamlCoder.decode(
355                 ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.Service.yaml"),
356                 ToscaServiceTemplate.class);
357         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
358
359         policyTypeServiceTemplate = standardYamlCoder.decode(
360                 ResourceUtils
361                         .getResourceAsString("policytypes/onap.policies.optimization.service.SubscriberPolicy.yaml"),
362                 ToscaServiceTemplate.class);
363         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
364
365         policyTypeServiceTemplate = standardYamlCoder.decode(
366                 ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.service.QueryPolicy.yaml"),
367                 ToscaServiceTemplate.class);
368         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
369
370         policyTypeServiceTemplate = standardYamlCoder.decode(
371                 ResourceUtils.getResourceAsString("policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app.yaml"),
372                 ToscaServiceTemplate.class);
373         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
374
375         // Create multiple policies in one call
376         String multiPoliciesString = ResourceUtils.getResourceAsString(MULTIPLE_POLICIES_RESOURCE);
377         ToscaServiceTemplate multiPoliciesServiceTemplate =
378                 standardCoder.decode(multiPoliciesString, ToscaServiceTemplate.class);
379
380         assertThatCode(() -> {
381             policyProvider.createPolicies(multiPoliciesServiceTemplate);
382             policyProvider.createPolicies(multiPoliciesServiceTemplate);
383         }).doesNotThrowAnyException();
384     }
385
386     @Test
387     public void testDeletePolicy() {
388
389         assertThatThrownBy(() -> {
390             policyProvider.deletePolicy("dummy", "1.0.0", "dummy", "1.0.0");
391         }).hasMessage("service template not found in database");
392
393         assertThatCode(() -> {
394             ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder
395                     .decode(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
396             policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
397         }).doesNotThrowAnyException();
398
399         assertThatCode(() -> {
400             String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
401             ToscaServiceTemplate policyServiceTemplate = standardCoder.decode(policyString, ToscaServiceTemplate.class);
402             ToscaServiceTemplate serviceTemplate = policyProvider
403                     .createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", policyServiceTemplate);
404             assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
405         }).doesNotThrowAnyException();
406
407         assertThatCode(() -> {
408             ToscaServiceTemplate serviceTemplate = policyProvider
409                     .deletePolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", "onap.restart.tca", "1.0.0");
410             assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
411         }).doesNotThrowAnyException();
412
413         assertThatThrownBy(() -> {
414             policyProvider.deletePolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", "onap.restart.tca",
415                     "1.0.0");
416         }).hasMessageContaining("no policies found");
417     }
418 }