282f8a089aee0ef362d91557832351832188965b
[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.ApiTestSupportUtilities;
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.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
72     private static final String POLICY_RESOURCE = "policies/vCPE.policy.monitoring.input.tosca.json";
73     private static final String POLICY_TYPE_RESOURCE = "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app.yaml";
74     private static final String POLICY_RESOURCE_WITH_BAD_POLICYTYPE_ID = "policies/vCPE.policy.bad.policytypeid.json";
75     private static final String POLICY_RESOURCE_WITH_BAD_POLICYTYPE_VERSION =
76             "policies/vCPE.policy.bad.policytypeversion.json";
77
78     /**
79      * Initializes parameters.
80      *
81      * @throws PfModelException the PfModel parsing exception
82      */
83     @Before
84     public void setupParameters() throws PfModelException {
85
86         standardCoder = new StandardCoder();
87         providerParams = new PolicyModelsProviderParameters();
88         providerParams.setDatabaseDriver("org.h2.Driver");
89         providerParams.setDatabaseUrl("jdbc:h2:mem:testdb");
90         providerParams.setDatabaseUser("policy");
91         providerParams.setDatabasePassword(Base64.getEncoder().encodeToString("P01icY".getBytes()));
92         providerParams.setPersistenceUnit("ToscaConceptTest");
93         apiParamGroup = new ApiParameterGroup("ApiGroup", null, providerParams);
94         ParameterService.register(apiParamGroup, true);
95         policyTypeProvider = new PolicyTypeProvider();
96         policyProvider = new PolicyProvider();
97     }
98
99     /**
100      * Closes up DB connections and deregisters API parameter group.
101      *
102      * @throws PfModelException the PfModel parsing exception
103      */
104     @After
105     public void tearDown() throws PfModelException {
106
107         policyTypeProvider.close();
108         policyProvider.close();
109         ParameterService.deregister(apiParamGroup);
110     }
111
112     @Test
113     public void testFetchPolicies() {
114
115         assertThatThrownBy(() -> {
116             policyProvider.fetchPolicies("dummy", "1.0.0", null, null);
117         }).hasMessage("policy with ID null:null and type dummy:1.0.0 does not exist");
118
119         assertThatThrownBy(() -> {
120             policyProvider.fetchPolicies("dummy", "1.0.0", "dummy", null);
121         }).hasMessage("policy with ID dummy:null and type dummy:1.0.0 does not exist");
122
123         assertThatThrownBy(() -> {
124             policyProvider.fetchPolicies("dummy", "1.0.0", "dummy", "1.0.0");
125         }).hasMessage("policy with ID dummy:1.0.0 and type dummy:1.0.0 does not exist");
126     }
127
128     @Test
129     public void testFetchLatestPolicies() {
130
131         assertThatThrownBy(() -> {
132             policyProvider.fetchLatestPolicies("dummy", "dummy", "dummy");
133         }).hasMessage("policy with ID dummy:null and type dummy:dummy does not exist");
134     }
135
136
137     @Test
138     public void testFetchDeployedPolicies() {
139         String policyId = "onap.restart.tca";
140         String policyVersion = "1.0.0";
141         String policyTypeVersion = "1.0.0";
142         String policyTypeId = "onap.policies.monitoring.cdap.tca.hi.lo.app";
143
144         // Basic Exception Throw
145         assertThatThrownBy(() -> {
146             policyProvider.fetchDeployedPolicies("dummy", "1.0.0", "dummy");
147         }).hasMessage("could not find policy with ID dummy and type dummy:1.0.0 deployed in any pdp group");
148
149         try (PolicyModelsProvider databaseProvider =
150                 new PolicyModelsProviderFactory().createPolicyModelsProvider(providerParams)) {
151             assertEquals(0, databaseProvider.getPdpGroups("name").size());
152             assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
153
154             assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
155             assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
156
157             PdpGroup pdpGroup = new PdpGroup();
158             pdpGroup.setName("group");
159             pdpGroup.setVersion("1.2.3");
160             pdpGroup.setPdpGroupState(PdpState.ACTIVE);
161             pdpGroup.setPdpSubgroups(new ArrayList<>());
162             List<PdpGroup> groupList = new ArrayList<>();
163             groupList.add(pdpGroup);
164
165             PdpSubGroup pdpSubGroup = new PdpSubGroup();
166             pdpSubGroup.setPdpType("type");
167             pdpSubGroup.setDesiredInstanceCount(123);
168             pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
169             pdpSubGroup.getSupportedPolicyTypes().add(new ToscaPolicyTypeIdentifier(policyTypeId, policyTypeVersion));
170             pdpGroup.getPdpSubgroups().add(pdpSubGroup);
171
172             Pdp pdp = new Pdp();
173             pdp.setInstanceId("type-0");
174             pdp.setMessage("Hello");
175             pdp.setPdpState(PdpState.ACTIVE);
176             pdp.setHealthy(PdpHealthStatus.UNKNOWN);
177             pdpSubGroup.setPdpInstances(new ArrayList<>());
178             pdpSubGroup.getPdpInstances().add(pdp);
179
180             // Create Pdp Groups
181             assertEquals(123, databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0)
182                     .getDesiredInstanceCount());
183             assertEquals(1, databaseProvider.getPdpGroups("group").size());
184
185             // Create Policy Type
186             assertThatCode(() -> {
187                 String policyTypeString =
188                         ApiTestSupportUtilities.yaml2Json(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE));
189                 ToscaServiceTemplate policyTypeServiceTemplate =
190                         standardCoder.decode(policyTypeString, ToscaServiceTemplate.class);
191                 policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
192             }).doesNotThrowAnyException();
193
194             // Create Policy
195             assertThatCode(() -> {
196                 String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
197                 ToscaServiceTemplate policyServiceTemplate =
198                         standardCoder.decode(policyString, ToscaServiceTemplate.class);
199                 ToscaServiceTemplate serviceTemplate =
200                         policyProvider.createPolicy(policyTypeId, policyTypeVersion, policyServiceTemplate);
201                 assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
202             }).doesNotThrowAnyException();
203
204             // Test fetchDeployedPolicies (deployedPolicyMap.isEmpty())==true
205             assertThatThrownBy(() -> {
206                 policyProvider.fetchDeployedPolicies(policyTypeId, policyTypeVersion, policyId);
207             })  .hasMessage("could not find policy with ID " + policyId + " and type " + policyTypeId + ":"
208                     + policyTypeVersion + " deployed in any pdp group");
209
210
211             // Update pdpSubGroup
212             pdpSubGroup.setPolicies(new ArrayList<>());
213             pdpSubGroup.getPolicies().add(new ToscaPolicyIdentifier(policyId, policyVersion));
214             assertEquals(1,
215                     databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getPolicies().size());
216
217             // Test fetchDeployedPolicies
218             assertThatCode(() -> {
219                 policyProvider.fetchDeployedPolicies(policyTypeId, policyTypeVersion, policyId);
220             }).doesNotThrowAnyException();
221
222             // Test validateDeleteEligibility exception path(!pdpGroups.isEmpty())
223             assertThatThrownBy(() -> {
224                 policyProvider.deletePolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", "onap.restart.tca",
225                         "1.0.0");
226             })  .hasMessageContaining("policy with ID " + policyId + ":" + policyVersion
227                     + " cannot be deleted as it is deployed in pdp groups");
228         } catch (Exception exc) {
229             fail("Test should not throw an exception");
230         }
231     }
232
233     @Test
234     public void testCreatePolicy() {
235
236         assertThatThrownBy(() -> {
237             policyProvider.createPolicy("dummy", "1.0.0", new ToscaServiceTemplate());
238         }).hasMessage("policy type with ID dummy:1.0.0 does not exist");
239
240         assertThatCode(() -> {
241             String policyTypeString =
242                     ApiTestSupportUtilities.yaml2Json(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE));
243             ToscaServiceTemplate policyTypeServiceTemplate =
244                     standardCoder.decode(policyTypeString, ToscaServiceTemplate.class);
245             policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
246         }).doesNotThrowAnyException();
247
248         assertThatThrownBy(() -> {
249             String badPolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_BAD_POLICYTYPE_ID);
250             ToscaServiceTemplate badPolicyServiceTemplate =
251                     standardCoder.decode(badPolicyString, ToscaServiceTemplate.class);
252             policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0",
253                     badPolicyServiceTemplate);
254         }).hasMessage("policy type id does not match");
255
256         assertThatThrownBy(() -> {
257             String badPolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_BAD_POLICYTYPE_VERSION);
258             ToscaServiceTemplate badPolicyServiceTemplate =
259                     standardCoder.decode(badPolicyString, ToscaServiceTemplate.class);
260             policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0",
261                     badPolicyServiceTemplate);
262         }).hasMessage("policy type version does not match");
263
264         assertThatCode(() -> {
265             String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
266             ToscaServiceTemplate policyServiceTemplate = standardCoder.decode(policyString, ToscaServiceTemplate.class);
267             ToscaServiceTemplate serviceTemplate = policyProvider
268                     .createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", policyServiceTemplate);
269             assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
270         }).doesNotThrowAnyException();
271     }
272
273     @Test
274     public void testDeletePolicy() {
275
276         assertThatThrownBy(() -> {
277             policyProvider.deletePolicy("dummy", "1.0.0", "dummy", "1.0.0");
278         }).hasMessage("policy with ID dummy:1.0.0 and type dummy:1.0.0 does not exist");
279
280         assertThatCode(() -> {
281             String policyTypeString =
282                     ApiTestSupportUtilities.yaml2Json(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE));
283             ToscaServiceTemplate policyTypeServiceTemplate =
284                     standardCoder.decode(policyTypeString, ToscaServiceTemplate.class);
285             policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
286         }).doesNotThrowAnyException();
287
288         assertThatCode(() -> {
289             String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
290             ToscaServiceTemplate policyServiceTemplate = standardCoder.decode(policyString, ToscaServiceTemplate.class);
291             ToscaServiceTemplate serviceTemplate = policyProvider
292                     .createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", policyServiceTemplate);
293             assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
294         }).doesNotThrowAnyException();
295
296         assertThatCode(() -> {
297             ToscaServiceTemplate serviceTemplate = policyProvider
298                     .deletePolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", "onap.restart.tca", "1.0.0");
299             assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
300         }).doesNotThrowAnyException();
301
302         String exceptionMessage = "policy with ID onap.restart.tca:1.0.0 and type "
303                 + "onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist";
304         assertThatThrownBy(() -> {
305             policyProvider.deletePolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", "onap.restart.tca",
306                     "1.0.0");
307         }).hasMessage(exceptionMessage);
308     }
309
310 }