Created a new simplified API for creating policies
[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.List;
36
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.StandardCoder;
43 import org.onap.policy.common.utils.coder.StandardYamlCoder;
44 import org.onap.policy.common.utils.resources.ResourceUtils;
45 import org.onap.policy.models.base.PfModelException;
46 import org.onap.policy.models.pdp.concepts.Pdp;
47 import org.onap.policy.models.pdp.concepts.PdpGroup;
48 import org.onap.policy.models.pdp.concepts.PdpGroupFilter;
49 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
50 import org.onap.policy.models.pdp.enums.PdpHealthStatus;
51 import org.onap.policy.models.pdp.enums.PdpState;
52 import org.onap.policy.models.provider.PolicyModelsProvider;
53 import org.onap.policy.models.provider.PolicyModelsProviderFactory;
54 import org.onap.policy.models.provider.PolicyModelsProviderParameters;
55 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifier;
56 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier;
57 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
58
59 /**
60  * This class performs unit test of {@link PolicyProvider}.
61  *
62  * @author Chenfei Gao (cgao@research.att.com)
63  */
64 public class TestPolicyProvider {
65
66     private static PolicyProvider policyProvider;
67     private static PolicyTypeProvider policyTypeProvider;
68     private static PolicyModelsProviderParameters providerParams;
69     private static ApiParameterGroup apiParamGroup;
70     private static StandardCoder standardCoder;
71     private static StandardYamlCoder standardYamlCoder;
72
73     private static final String POLICY_RESOURCE = "policies/vCPE.policy.monitoring.input.tosca.json";
74     private static final String POLICY_TYPE_RESOURCE = "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app.yaml";
75     private static final String POLICY_RESOURCE_WITH_BAD_POLICYTYPE_ID = "policies/vCPE.policy.bad.policytypeid.json";
76     private static final String POLICY_RESOURCE_WITH_BAD_POLICYTYPE_VERSION =
77             "policies/vCPE.policy.bad.policytypeversion.json";
78     private static final String MULTIPLE_POLICIES_RESOURCE = "policies/vCPE.policies.optimization.input.tosca.json";
79
80     // @formatter:off
81     private String[] toscaPolicyTypeResourceNames = {
82         "policytypes/onap.policies.optimization.AffinityPolicy.yaml",
83         "policytypes/onap.policies.optimization.DistancePolicy.yaml",
84         "policytypes/onap.policies.optimization.HpaPolicy.yaml",
85         "policytypes/onap.policies.optimization.QueryPolicy.yaml",
86         "policytypes/onap.policies.optimization.SubscriberPolicy.yaml",
87         "policytypes/onap.policies.optimization.Vim_fit.yaml",
88         "policytypes/onap.policies.optimization.VnfPolicy.yaml"
89     };
90     // @formatter:on
91
92     /**
93      * Initializes parameters.
94      *
95      * @throws PfModelException the PfModel parsing exception
96      */
97     @Before
98     public void setupParameters() throws PfModelException {
99
100         standardCoder = new StandardCoder();
101         standardYamlCoder = new StandardYamlCoder();
102         providerParams = new PolicyModelsProviderParameters();
103         providerParams.setDatabaseDriver("org.h2.Driver");
104         providerParams.setDatabaseUrl("jdbc:h2:mem:testdb");
105         providerParams.setDatabaseUser("policy");
106         providerParams.setDatabasePassword(Base64.getEncoder().encodeToString("P01icY".getBytes()));
107         providerParams.setPersistenceUnit("ToscaConceptTest");
108         apiParamGroup = new ApiParameterGroup("ApiGroup", null, providerParams);
109         ParameterService.register(apiParamGroup, true);
110         policyTypeProvider = new PolicyTypeProvider();
111         policyProvider = new PolicyProvider();
112     }
113
114     /**
115      * Closes up DB connections and deregisters API parameter group.
116      *
117      * @throws PfModelException the PfModel parsing exception
118      */
119     @After
120     public void tearDown() throws PfModelException {
121
122         policyTypeProvider.close();
123         policyProvider.close();
124         ParameterService.deregister(apiParamGroup);
125     }
126
127     @Test
128     public void testFetchPolicies() {
129
130         assertThatThrownBy(() -> {
131             policyProvider.fetchPolicies("dummy", "1.0.0", null, null);
132         }).hasMessage("policy with ID null:null and type dummy:1.0.0 does not exist");
133
134         assertThatThrownBy(() -> {
135             policyProvider.fetchPolicies("dummy", "1.0.0", "dummy", null);
136         }).hasMessage("policy with ID dummy:null and type dummy:1.0.0 does not exist");
137
138         assertThatThrownBy(() -> {
139             policyProvider.fetchPolicies("dummy", "1.0.0", "dummy", "1.0.0");
140         }).hasMessage("policy with ID dummy:1.0.0 and type dummy:1.0.0 does not exist");
141     }
142
143     @Test
144     public void testFetchLatestPolicies() {
145
146         assertThatThrownBy(() -> {
147             policyProvider.fetchLatestPolicies("dummy", "dummy", "dummy");
148         }).hasMessage("policy with ID dummy:null and type dummy:dummy does not exist");
149     }
150
151
152     @Test
153     public void testFetchDeployedPolicies() {
154         String policyId = "onap.restart.tca";
155         String policyVersion = "1.0.0";
156         String policyTypeVersion = "1.0.0";
157         String policyTypeId = "onap.policies.monitoring.cdap.tca.hi.lo.app";
158
159         // Basic Exception Throw
160         assertThatThrownBy(() -> {
161             policyProvider.fetchDeployedPolicies("dummy", "1.0.0", "dummy");
162         }).hasMessage("could not find policy with ID dummy and type dummy:1.0.0 deployed in any pdp group");
163
164         try (PolicyModelsProvider databaseProvider =
165                 new PolicyModelsProviderFactory().createPolicyModelsProvider(providerParams)) {
166             assertEquals(0, databaseProvider.getPdpGroups("name").size());
167             assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
168
169             assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
170             assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
171
172             PdpGroup pdpGroup = new PdpGroup();
173             pdpGroup.setName("group");
174             pdpGroup.setVersion("1.2.3");
175             pdpGroup.setPdpGroupState(PdpState.ACTIVE);
176             pdpGroup.setPdpSubgroups(new ArrayList<>());
177             List<PdpGroup> groupList = new ArrayList<>();
178             groupList.add(pdpGroup);
179
180             PdpSubGroup pdpSubGroup = new PdpSubGroup();
181             pdpSubGroup.setPdpType("type");
182             pdpSubGroup.setDesiredInstanceCount(123);
183             pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
184             pdpSubGroup.getSupportedPolicyTypes().add(new ToscaPolicyTypeIdentifier(policyTypeId, policyTypeVersion));
185             pdpGroup.getPdpSubgroups().add(pdpSubGroup);
186
187             Pdp pdp = new Pdp();
188             pdp.setInstanceId("type-0");
189             pdp.setMessage("Hello");
190             pdp.setPdpState(PdpState.ACTIVE);
191             pdp.setHealthy(PdpHealthStatus.UNKNOWN);
192             pdpSubGroup.setPdpInstances(new ArrayList<>());
193             pdpSubGroup.getPdpInstances().add(pdp);
194
195             // Create Pdp Groups
196             assertEquals(123, databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0)
197                     .getDesiredInstanceCount());
198             assertEquals(1, databaseProvider.getPdpGroups("group").size());
199
200             // Create Policy Type
201             assertThatCode(() -> {
202                 ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
203                         ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
204                 policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
205             }).doesNotThrowAnyException();
206
207             // Create Policy
208             assertThatCode(() -> {
209                 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
210                 ToscaServiceTemplate policyServiceTemplate =
211                         standardCoder.decode(policyString, ToscaServiceTemplate.class);
212                 ToscaServiceTemplate serviceTemplate =
213                         policyProvider.createPolicy(policyTypeId, policyTypeVersion, policyServiceTemplate);
214                 assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
215             }).doesNotThrowAnyException();
216
217             // Test fetchDeployedPolicies (deployedPolicyMap.isEmpty())==true
218             assertThatThrownBy(() -> {
219                 policyProvider.fetchDeployedPolicies(policyTypeId, policyTypeVersion, policyId);
220             })  .hasMessage("could not find policy with ID " + policyId + " and type " + policyTypeId + ":"
221                     + policyTypeVersion + " deployed in any pdp group");
222
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 with ID " + policyId + ":" + policyVersion
240                     + " cannot be deleted as it is deployed in pdp groups");
241         } catch (Exception exc) {
242             fail("Test should not throw an exception");
243         }
244     }
245
246     @Test
247     public void testCreatePolicy() {
248
249         assertThatThrownBy(() -> {
250             policyProvider.createPolicy("dummy", "1.0.0", new ToscaServiceTemplate());
251         }).hasMessage("policy type with ID dummy:1.0.0 does not exist");
252
253         assertThatCode(() -> {
254             ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
255                     ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
256             policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
257         }).doesNotThrowAnyException();
258
259         assertThatThrownBy(() -> {
260             String badPolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_BAD_POLICYTYPE_ID);
261             ToscaServiceTemplate badPolicyServiceTemplate =
262                     standardCoder.decode(badPolicyString, ToscaServiceTemplate.class);
263             policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0",
264                     badPolicyServiceTemplate);
265         }).hasMessage("policy type id does not match");
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         }).hasMessage("policy type version does not match");
274
275         assertThatCode(() -> {
276             String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
277             ToscaServiceTemplate policyServiceTemplate = standardCoder.decode(policyString, ToscaServiceTemplate.class);
278             ToscaServiceTemplate serviceTemplate = policyProvider
279                     .createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", policyServiceTemplate);
280             assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
281         }).doesNotThrowAnyException();
282     }
283
284     @Test
285     public void testSimpleCreatePolicy() throws Exception {
286
287         String errorMessage = "policy type onap.policies.optimization.AffinityPolicy:0.0.0 for "
288             + "policy OSDF_CASABLANCA.Affinity_vCPE_1:1.0.0 does not exist";
289         assertThatThrownBy(() -> {
290             String multiPoliciesString = ResourceUtils.getResourceAsString(MULTIPLE_POLICIES_RESOURCE);
291             ToscaServiceTemplate multiPoliciesServiceTemplate =
292                     standardCoder.decode(multiPoliciesString, ToscaServiceTemplate.class);
293             policyProvider.createPolicies(multiPoliciesServiceTemplate);
294         }).hasMessage(errorMessage);
295
296         // Create required policy types
297         for (String policyTypeName : toscaPolicyTypeResourceNames) {
298             ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
299                     ResourceUtils.getResourceAsString(policyTypeName), ToscaServiceTemplate.class);
300             policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
301         }
302
303         // Create multiple policies in one call
304         String multiPoliciesString = ResourceUtils.getResourceAsString(MULTIPLE_POLICIES_RESOURCE);
305         ToscaServiceTemplate multiPoliciesServiceTemplate =
306                 standardCoder.decode(multiPoliciesString, ToscaServiceTemplate.class);
307         policyProvider.createPolicies(multiPoliciesServiceTemplate);
308     }
309
310     @Test
311     public void testDeletePolicy() {
312
313         assertThatThrownBy(() -> {
314             policyProvider.deletePolicy("dummy", "1.0.0", "dummy", "1.0.0");
315         }).hasMessage("policy with ID dummy:1.0.0 and type dummy:1.0.0 does not exist");
316
317         assertThatCode(() -> {
318             ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
319                     ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
320             policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
321         }).doesNotThrowAnyException();
322
323         assertThatCode(() -> {
324             String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
325             ToscaServiceTemplate policyServiceTemplate = standardCoder.decode(policyString, ToscaServiceTemplate.class);
326             ToscaServiceTemplate serviceTemplate = policyProvider
327                     .createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", policyServiceTemplate);
328             assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
329         }).doesNotThrowAnyException();
330
331         assertThatCode(() -> {
332             ToscaServiceTemplate serviceTemplate = policyProvider
333                     .deletePolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", "onap.restart.tca", "1.0.0");
334             assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
335         }).doesNotThrowAnyException();
336
337         String exceptionMessage = "policy with ID onap.restart.tca:1.0.0 and type "
338                 + "onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist";
339         assertThatThrownBy(() -> {
340             policyProvider.deletePolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", "onap.restart.tca",
341                     "1.0.0");
342         }).hasMessage(exceptionMessage);
343     }
344
345 }