4221c670b33927323a089a0dc592a834165906f4
[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 AT&T Intellectual Property. All rights reserved.
6  * Modifications Copyright (C) 2019 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.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 MULTIPLE_POLICIES_RESOURCE = "policies/vCPE.policies.optimization.input.tosca.json";
80
81     // @formatter:off
82     private String[] toscaPolicyTypeResourceNames = {
83         "policytypes/onap.policies.optimization.resource.AffinityPolicy.yaml",
84         "policytypes/onap.policies.optimization.resource.DistancePolicy.yaml",
85         "policytypes/onap.policies.optimization.resource.HpaPolicy.yaml",
86         "policytypes/onap.policies.optimization.service.QueryPolicy.yaml",
87         "policytypes/onap.policies.optimization.service.SubscriberPolicy.yaml",
88         "policytypes/onap.policies.optimization.resource.Vim_fit.yaml",
89         "policytypes/onap.policies.optimization.resource.VnfPolicy.yaml"
90     };
91     // @formatter:on
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, Collections.emptyList());
110         ParameterService.register(apiParamGroup, true);
111         policyTypeProvider = new PolicyTypeProvider();
112         policyProvider = new PolicyProvider();
113     }
114
115     /**
116      * Closes up DB connections and deregisters API parameter group.
117      *
118      * @throws PfModelException the PfModel parsing exception
119      */
120     @After
121     public void tearDown() throws PfModelException {
122
123         policyTypeProvider.close();
124         policyProvider.close();
125         ParameterService.deregister(apiParamGroup);
126     }
127
128     @Test
129     public void testFetchPolicies() {
130
131         assertThatThrownBy(() -> {
132             policyProvider.fetchPolicies("dummy", "1.0.0", null, null);
133         }).hasMessage("policy with ID null:null and type dummy:1.0.0 does not exist");
134
135         assertThatThrownBy(() -> {
136             policyProvider.fetchPolicies("dummy", "1.0.0", "dummy", null);
137         }).hasMessage("policy with ID dummy:null and type dummy:1.0.0 does not exist");
138
139         assertThatThrownBy(() -> {
140             policyProvider.fetchPolicies("dummy", "1.0.0", "dummy", "1.0.0");
141         }).hasMessage("policy with ID dummy:1.0.0 and type dummy:1.0.0 does not exist");
142     }
143
144     @Test
145     public void testFetchLatestPolicies() {
146
147         assertThatThrownBy(() -> {
148             policyProvider.fetchLatestPolicies("dummy", "dummy", "dummy");
149         }).hasMessage("policy with ID dummy:null and type dummy:dummy does not exist");
150     }
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.decode(
204                         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
225             // Update pdpSubGroup
226             pdpSubGroup.setPolicies(new ArrayList<>());
227             pdpSubGroup.getPolicies().add(new ToscaPolicyIdentifier(policyId, policyVersion));
228             assertEquals(1,
229                     databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getPolicies().size());
230
231             // Test fetchDeployedPolicies
232             assertThatCode(() -> {
233                 policyProvider.fetchDeployedPolicies(policyTypeId, policyTypeVersion, policyId);
234             }).doesNotThrowAnyException();
235
236             // Test validateDeleteEligibility exception path(!pdpGroups.isEmpty())
237             assertThatThrownBy(() -> {
238                 policyProvider.deletePolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", "onap.restart.tca",
239                         "1.0.0");
240             })  .hasMessageContaining("policy with ID " + policyId + ":" + policyVersion
241                     + " cannot be deleted as it is deployed in pdp groups");
242         } catch (Exception exc) {
243             fail("Test should not throw an exception");
244         }
245     }
246
247     @Test
248     public void testCreatePolicy() {
249
250         assertThatThrownBy(() -> {
251             policyProvider.createPolicy("dummy", "1.0.0", new ToscaServiceTemplate());
252         }).hasMessage("policy type with ID dummy:1.0.0 does not exist");
253
254         assertThatCode(() -> {
255             ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
256                     ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
257             policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
258         }).doesNotThrowAnyException();
259
260         assertThatThrownBy(() -> {
261             String badPolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_BAD_POLICYTYPE_ID);
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         }).hasMessage("policy type id does not match");
267
268         assertThatThrownBy(() -> {
269             String badPolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_BAD_POLICYTYPE_VERSION);
270             ToscaServiceTemplate badPolicyServiceTemplate =
271                     standardCoder.decode(badPolicyString, ToscaServiceTemplate.class);
272             policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0",
273                     badPolicyServiceTemplate);
274         }).hasMessage("policy type version does not match");
275
276         assertThatCode(() -> {
277             String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
278             ToscaServiceTemplate policyServiceTemplate = standardCoder.decode(policyString, ToscaServiceTemplate.class);
279             ToscaServiceTemplate serviceTemplate = policyProvider
280                     .createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", policyServiceTemplate);
281             assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
282         }).doesNotThrowAnyException();
283     }
284
285     @Test
286     public void testSimpleCreatePolicy() throws Exception {
287
288         String errorMessage = "policy type onap.policies.optimization.resource.AffinityPolicy:1.0.0 for "
289             + "policy OSDF_CASABLANCA.Affinity_Default:1.0.0 does not exist";
290         assertThatThrownBy(() -> {
291             String multiPoliciesString = ResourceUtils.getResourceAsString(MULTIPLE_POLICIES_RESOURCE);
292             ToscaServiceTemplate multiPoliciesServiceTemplate =
293                     standardCoder.decode(multiPoliciesString, ToscaServiceTemplate.class);
294             policyProvider.createPolicies(multiPoliciesServiceTemplate);
295         }).hasMessage(errorMessage);
296
297         // Create required policy types
298         for (String policyTypeName : toscaPolicyTypeResourceNames) {
299             ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
300                     ResourceUtils.getResourceAsString(policyTypeName), ToscaServiceTemplate.class);
301             policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
302         }
303
304         // Create multiple policies in one call
305         String multiPoliciesString = ResourceUtils.getResourceAsString(MULTIPLE_POLICIES_RESOURCE);
306         ToscaServiceTemplate multiPoliciesServiceTemplate =
307                 standardCoder.decode(multiPoliciesString, ToscaServiceTemplate.class);
308         policyProvider.createPolicies(multiPoliciesServiceTemplate);
309     }
310
311     @Test
312     public void testDeletePolicy() {
313
314         assertThatThrownBy(() -> {
315             policyProvider.deletePolicy("dummy", "1.0.0", "dummy", "1.0.0");
316         }).hasMessage("policy with ID dummy:1.0.0 and type dummy:1.0.0 does not exist");
317
318         assertThatCode(() -> {
319             ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
320                     ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
321             policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
322         }).doesNotThrowAnyException();
323
324         assertThatCode(() -> {
325             String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
326             ToscaServiceTemplate policyServiceTemplate = standardCoder.decode(policyString, ToscaServiceTemplate.class);
327             ToscaServiceTemplate serviceTemplate = policyProvider
328                     .createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", policyServiceTemplate);
329             assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
330         }).doesNotThrowAnyException();
331
332         assertThatCode(() -> {
333             ToscaServiceTemplate serviceTemplate = policyProvider
334                     .deletePolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", "onap.restart.tca", "1.0.0");
335             assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
336         }).doesNotThrowAnyException();
337
338         String exceptionMessage = "policy with ID onap.restart.tca:1.0.0 and type "
339                 + "onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist";
340         assertThatThrownBy(() -> {
341             policyProvider.deletePolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", "onap.restart.tca",
342                     "1.0.0");
343         }).hasMessage(exceptionMessage);
344     }
345
346 }