Update API for changes in TOSCA provider
[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.Common.yaml";
87     private static final String POLICY_RESOURCE_OPERATIONAL = "policies/vCPE.policy.operational.input.tosca.json";
88     public static final String POLICY_TYPE_OPERATIONAL_DROOLS = "onap.policies.controlloop.operational.common.Drools";
89
90     /**
91      * Initializes parameters.
92      *
93      * @throws PfModelException the PfModel parsing exception
94      */
95     @Before
96     public void setupParameters() throws PfModelException {
97
98         standardCoder = new StandardCoder();
99         standardYamlCoder = new StandardYamlCoder();
100         providerParams = new PolicyModelsProviderParameters();
101         providerParams.setDatabaseDriver("org.h2.Driver");
102         providerParams.setDatabaseUrl("jdbc:h2:mem:testdb");
103         providerParams.setDatabaseUser("policy");
104         providerParams.setDatabasePassword(Base64.getEncoder().encodeToString("P01icY".getBytes()));
105         providerParams.setPersistenceUnit("ToscaConceptTest");
106         apiParamGroup = new ApiParameterGroup("ApiGroup", null, providerParams, Collections.emptyList());
107         ParameterService.register(apiParamGroup, true);
108         policyTypeProvider = new PolicyTypeProvider();
109         policyProvider = new PolicyProvider();
110     }
111
112     /**
113      * Closes up DB connections and deregisters API parameter group.
114      *
115      * @throws PfModelException the PfModel parsing exception
116      */
117     @After
118     public void tearDown() throws PfModelException {
119
120         policyTypeProvider.close();
121         policyProvider.close();
122         ParameterService.deregister(apiParamGroup);
123     }
124
125     @Test
126     public void testFetchPolicies() {
127
128         assertThatThrownBy(() -> {
129             policyProvider.fetchPolicies("dummy", "1.0.0", null, null);
130         }).hasMessage("service template not found in database");
131
132         assertThatThrownBy(() -> {
133             policyProvider.fetchPolicies("dummy", "1.0.0", "dummy", null);
134         }).hasMessage("service template not found in database");
135
136         assertThatThrownBy(() -> {
137             policyProvider.fetchPolicies("dummy", "1.0.0", "dummy", "1.0.0");
138         }).hasMessage("service template not found in database");
139     }
140
141     @Test
142     public void testFetchLatestPolicies() {
143
144         assertThatThrownBy(() -> {
145             policyProvider.fetchLatestPolicies("dummy", "dummy", "dummy");
146         }).hasMessage("service template not found in database");
147     }
148
149     @Test
150     public void testFetchDeployedPolicies() {
151         String policyId = "onap.restart.tca";
152         String policyVersion = "1.0.0";
153         String policyTypeVersion = "1.0.0";
154         String policyTypeId = "onap.policies.monitoring.cdap.tca.hi.lo.app";
155
156         // Basic Exception Throw
157         assertThatThrownBy(() -> {
158             policyProvider.fetchDeployedPolicies("dummy", "1.0.0", "dummy");
159         }).hasMessage("could not find policy with ID dummy and type dummy:1.0.0 deployed in any pdp group");
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, databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0)
194                     .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             // Test fetchDeployedPolicies (deployedPolicyMap.isEmpty())==true
215             assertThatThrownBy(() -> {
216                 policyProvider.fetchDeployedPolicies(policyTypeId, policyTypeVersion, policyId);
217             }).hasMessage("could not find policy with ID " + policyId + " and type " + policyTypeId + ":"
218                     + policyTypeVersion + " deployed in any pdp group");
219
220             // Update pdpSubGroup
221             pdpSubGroup.setPolicies(new ArrayList<>());
222             pdpSubGroup.getPolicies().add(new ToscaPolicyIdentifier(policyId, policyVersion));
223             assertEquals(1,
224                     databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getPolicies().size());
225
226             // Test fetchDeployedPolicies
227             assertThatCode(() -> {
228                 policyProvider.fetchDeployedPolicies(policyTypeId, policyTypeVersion, policyId);
229             }).doesNotThrowAnyException();
230
231             // Test validateDeleteEligibility exception path(!pdpGroups.isEmpty())
232             assertThatThrownBy(() -> {
233                 policyProvider.deletePolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", "onap.restart.tca",
234                         "1.0.0");
235             }).hasMessageContaining("policy with ID " + policyId + ":" + policyVersion
236                     + " cannot be deleted as it is deployed in pdp groups");
237         } catch (Exception exc) {
238             fail("Test should not throw an exception");
239         }
240     }
241
242     @Test
243     public void testCreatePolicy() throws Exception {
244
245         assertThatThrownBy(() -> {
246             policyProvider.createPolicy("dummy", "1.0.0", new ToscaServiceTemplate());
247         }).hasMessage("topology template not specified on service template");
248
249         ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder
250                 .decode(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
251         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
252
253         assertThatCode(() -> policyTypeProvider.createPolicyType(policyTypeServiceTemplate)).doesNotThrowAnyException();
254
255         assertThatThrownBy(() -> {
256             String badPolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_BAD_POLICYTYPE_ID);
257             ToscaServiceTemplate badPolicyServiceTemplate =
258                     standardCoder.decode(badPolicyString, ToscaServiceTemplate.class);
259             policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0",
260                     badPolicyServiceTemplate);
261         }).hasMessageContaining(
262                 "policy type onap.policies.monitoring.cdap.tca.hi.lo.appxxx:0.0.0 referenced in policy not found");
263
264         assertThatThrownBy(() -> {
265             String badPolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_BAD_POLICYTYPE_VERSION);
266             ToscaServiceTemplate badPolicyServiceTemplate =
267                     standardCoder.decode(badPolicyString, ToscaServiceTemplate.class);
268             policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0",
269                     badPolicyServiceTemplate);
270         }).hasMessageContaining(
271                 "policy type onap.policies.monitoring.cdap.tca.hi.lo.app:2.0.0 referenced in policy not found");
272
273         assertThatThrownBy(() -> {
274             String badPolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_NO_POLICY_VERSION);
275             ToscaServiceTemplate badPolicyServiceTemplate =
276                     standardCoder.decode(badPolicyString, ToscaServiceTemplate.class);
277             policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0",
278                     badPolicyServiceTemplate);
279         }).hasMessageContaining("key version is a null version");
280
281         String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
282         ToscaServiceTemplate policyServiceTemplate = standardCoder.decode(policyString, ToscaServiceTemplate.class);
283         ToscaServiceTemplate serviceTemplate = policyProvider
284                 .createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", policyServiceTemplate);
285         assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
286
287         assertThatThrownBy(() -> {
288             String badPolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_DIFFERENT_FIELDS);
289             ToscaServiceTemplate badPolicyServiceTemplate =
290                     standardCoder.decode(badPolicyString, ToscaServiceTemplate.class);
291             policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0",
292                     badPolicyServiceTemplate);
293         }).hasMessageContaining("entity in incoming fragment does not equal existing entity");
294     }
295
296     @Test
297     public void testCreateOperationalDroolsPolicy() throws CoderException, PfModelException {
298         ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
299                 ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE_OPERATIONAL), ToscaServiceTemplate.class);
300         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
301
302         String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_OPERATIONAL);
303         ToscaServiceTemplate policyServiceTemplate = standardCoder.decode(policyString, ToscaServiceTemplate.class);
304         ToscaServiceTemplate serviceTemplate =
305                 policyProvider.createPolicy(POLICY_TYPE_OPERATIONAL_DROOLS, "1.0.0", policyServiceTemplate);
306         assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
307     }
308
309     @Test
310     public void testSimpleCreatePolicy() throws Exception {
311
312         assertThatThrownBy(() -> {
313             String multiPoliciesString = ResourceUtils.getResourceAsString(MULTIPLE_POLICIES_RESOURCE);
314             ToscaServiceTemplate multiPoliciesServiceTemplate =
315                     standardCoder.decode(multiPoliciesString, ToscaServiceTemplate.class);
316             policyProvider.createPolicies(multiPoliciesServiceTemplate);
317         }).hasMessageContaining(
318                 "no policy types are defined on the service template for the policies in the topology template");
319
320         // Create required policy types
321         ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
322                 ResourceUtils.getResourceAsString("policytypes/onap.policies.Optimization.yaml"),
323                 ToscaServiceTemplate.class);
324         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
325
326         policyTypeServiceTemplate = standardYamlCoder.decode(
327                 ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.Resource.yaml"),
328                 ToscaServiceTemplate.class);
329         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
330
331         policyTypeServiceTemplate = standardYamlCoder.decode(
332                 ResourceUtils
333                         .getResourceAsString("policytypes/onap.policies.optimization.resource.AffinityPolicy.yaml"),
334                 ToscaServiceTemplate.class);
335         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
336
337         policyTypeServiceTemplate = standardYamlCoder.decode(
338                 ResourceUtils
339                         .getResourceAsString("policytypes/onap.policies.optimization.resource.DistancePolicy.yaml"),
340                 ToscaServiceTemplate.class);
341         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
342
343         policyTypeServiceTemplate = standardYamlCoder.decode(
344                 ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.resource.Vim_fit.yaml"),
345                 ToscaServiceTemplate.class);
346         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
347
348         policyTypeServiceTemplate = standardYamlCoder.decode(
349                 ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.resource.HpaPolicy.yaml"),
350                 ToscaServiceTemplate.class);
351         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
352
353         policyTypeServiceTemplate = standardYamlCoder.decode(
354                 ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.resource.VnfPolicy.yaml"),
355                 ToscaServiceTemplate.class);
356         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
357
358         policyTypeServiceTemplate = standardYamlCoder.decode(
359                 ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.Service.yaml"),
360                 ToscaServiceTemplate.class);
361         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
362
363         policyTypeServiceTemplate = standardYamlCoder.decode(
364                 ResourceUtils
365                         .getResourceAsString("policytypes/onap.policies.optimization.service.SubscriberPolicy.yaml"),
366                 ToscaServiceTemplate.class);
367         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
368
369         policyTypeServiceTemplate = standardYamlCoder.decode(
370                 ResourceUtils.getResourceAsString("policytypes/onap.policies.optimization.service.QueryPolicy.yaml"),
371                 ToscaServiceTemplate.class);
372         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
373
374         policyTypeServiceTemplate = standardYamlCoder.decode(
375                 ResourceUtils.getResourceAsString("policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app.yaml"),
376                 ToscaServiceTemplate.class);
377         policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
378
379         // Create multiple policies in one call
380         String multiPoliciesString = ResourceUtils.getResourceAsString(MULTIPLE_POLICIES_RESOURCE);
381         ToscaServiceTemplate multiPoliciesServiceTemplate =
382                 standardCoder.decode(multiPoliciesString, ToscaServiceTemplate.class);
383
384         assertThatCode(() -> {
385             policyProvider.createPolicies(multiPoliciesServiceTemplate);
386             policyProvider.createPolicies(multiPoliciesServiceTemplate);
387         }).doesNotThrowAnyException();
388     }
389
390     @Test
391     public void testDeletePolicy() {
392
393         assertThatThrownBy(() -> {
394             policyProvider.deletePolicy("dummy", "1.0.0", "dummy", "1.0.0");
395         }).hasMessage("service template not found in database");
396
397         assertThatCode(() -> {
398             ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder
399                     .decode(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
400             policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
401         }).doesNotThrowAnyException();
402
403         assertThatCode(() -> {
404             String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
405             ToscaServiceTemplate policyServiceTemplate = standardCoder.decode(policyString, ToscaServiceTemplate.class);
406             ToscaServiceTemplate serviceTemplate = policyProvider
407                     .createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", policyServiceTemplate);
408             assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
409         }).doesNotThrowAnyException();
410
411         assertThatCode(() -> {
412             ToscaServiceTemplate serviceTemplate = policyProvider
413                     .deletePolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", "onap.restart.tca", "1.0.0");
414             assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
415         }).doesNotThrowAnyException();
416
417         assertThatThrownBy(() -> {
418             policyProvider.deletePolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", "onap.restart.tca",
419                     "1.0.0");
420         }).hasMessageContaining("policies for onap.restart.tca:1.0.0 do not exist");
421     }
422 }