Add changes to support application/yaml in api
[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
79     /**
80      * Initializes parameters.
81      *
82      * @throws PfModelException the PfModel parsing exception
83      */
84     @Before
85     public void setupParameters() throws PfModelException {
86
87         standardCoder = new StandardCoder();
88         standardYamlCoder = new StandardYamlCoder();
89         providerParams = new PolicyModelsProviderParameters();
90         providerParams.setDatabaseDriver("org.h2.Driver");
91         providerParams.setDatabaseUrl("jdbc:h2:mem:testdb");
92         providerParams.setDatabaseUser("policy");
93         providerParams.setDatabasePassword(Base64.getEncoder().encodeToString("P01icY".getBytes()));
94         providerParams.setPersistenceUnit("ToscaConceptTest");
95         apiParamGroup = new ApiParameterGroup("ApiGroup", null, providerParams);
96         ParameterService.register(apiParamGroup, true);
97         policyTypeProvider = new PolicyTypeProvider();
98         policyProvider = new PolicyProvider();
99     }
100
101     /**
102      * Closes up DB connections and deregisters API parameter group.
103      *
104      * @throws PfModelException the PfModel parsing exception
105      */
106     @After
107     public void tearDown() throws PfModelException {
108
109         policyTypeProvider.close();
110         policyProvider.close();
111         ParameterService.deregister(apiParamGroup);
112     }
113
114     @Test
115     public void testFetchPolicies() {
116
117         assertThatThrownBy(() -> {
118             policyProvider.fetchPolicies("dummy", "1.0.0", null, null);
119         }).hasMessage("policy with ID null:null and type dummy:1.0.0 does not exist");
120
121         assertThatThrownBy(() -> {
122             policyProvider.fetchPolicies("dummy", "1.0.0", "dummy", null);
123         }).hasMessage("policy with ID dummy:null and type dummy:1.0.0 does not exist");
124
125         assertThatThrownBy(() -> {
126             policyProvider.fetchPolicies("dummy", "1.0.0", "dummy", "1.0.0");
127         }).hasMessage("policy with ID dummy:1.0.0 and type dummy:1.0.0 does not exist");
128     }
129
130     @Test
131     public void testFetchLatestPolicies() {
132
133         assertThatThrownBy(() -> {
134             policyProvider.fetchLatestPolicies("dummy", "dummy", "dummy");
135         }).hasMessage("policy with ID dummy:null and type dummy:dummy does not exist");
136     }
137
138
139     @Test
140     public void testFetchDeployedPolicies() {
141         String policyId = "onap.restart.tca";
142         String policyVersion = "1.0.0";
143         String policyTypeVersion = "1.0.0";
144         String policyTypeId = "onap.policies.monitoring.cdap.tca.hi.lo.app";
145
146         // Basic Exception Throw
147         assertThatThrownBy(() -> {
148             policyProvider.fetchDeployedPolicies("dummy", "1.0.0", "dummy");
149         }).hasMessage("could not find policy with ID dummy and type dummy:1.0.0 deployed in any pdp group");
150
151         try (PolicyModelsProvider databaseProvider =
152                 new PolicyModelsProviderFactory().createPolicyModelsProvider(providerParams)) {
153             assertEquals(0, databaseProvider.getPdpGroups("name").size());
154             assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
155
156             assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
157             assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
158
159             PdpGroup pdpGroup = new PdpGroup();
160             pdpGroup.setName("group");
161             pdpGroup.setVersion("1.2.3");
162             pdpGroup.setPdpGroupState(PdpState.ACTIVE);
163             pdpGroup.setPdpSubgroups(new ArrayList<>());
164             List<PdpGroup> groupList = new ArrayList<>();
165             groupList.add(pdpGroup);
166
167             PdpSubGroup pdpSubGroup = new PdpSubGroup();
168             pdpSubGroup.setPdpType("type");
169             pdpSubGroup.setDesiredInstanceCount(123);
170             pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
171             pdpSubGroup.getSupportedPolicyTypes().add(new ToscaPolicyTypeIdentifier(policyTypeId, policyTypeVersion));
172             pdpGroup.getPdpSubgroups().add(pdpSubGroup);
173
174             Pdp pdp = new Pdp();
175             pdp.setInstanceId("type-0");
176             pdp.setMessage("Hello");
177             pdp.setPdpState(PdpState.ACTIVE);
178             pdp.setHealthy(PdpHealthStatus.UNKNOWN);
179             pdpSubGroup.setPdpInstances(new ArrayList<>());
180             pdpSubGroup.getPdpInstances().add(pdp);
181
182             // Create Pdp Groups
183             assertEquals(123, databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0)
184                     .getDesiredInstanceCount());
185             assertEquals(1, databaseProvider.getPdpGroups("group").size());
186
187             // Create Policy Type
188             assertThatCode(() -> {
189                 ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
190                         ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), 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             ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
242                     ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
243             policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
244         }).doesNotThrowAnyException();
245
246         assertThatThrownBy(() -> {
247             String badPolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_BAD_POLICYTYPE_ID);
248             ToscaServiceTemplate badPolicyServiceTemplate =
249                     standardCoder.decode(badPolicyString, ToscaServiceTemplate.class);
250             policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0",
251                     badPolicyServiceTemplate);
252         }).hasMessage("policy type id does not match");
253
254         assertThatThrownBy(() -> {
255             String badPolicyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE_WITH_BAD_POLICYTYPE_VERSION);
256             ToscaServiceTemplate badPolicyServiceTemplate =
257                     standardCoder.decode(badPolicyString, ToscaServiceTemplate.class);
258             policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0",
259                     badPolicyServiceTemplate);
260         }).hasMessage("policy type version does not match");
261
262         assertThatCode(() -> {
263             String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
264             ToscaServiceTemplate policyServiceTemplate = standardCoder.decode(policyString, ToscaServiceTemplate.class);
265             ToscaServiceTemplate serviceTemplate = policyProvider
266                     .createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", policyServiceTemplate);
267             assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
268         }).doesNotThrowAnyException();
269     }
270
271     @Test
272     public void testDeletePolicy() {
273
274         assertThatThrownBy(() -> {
275             policyProvider.deletePolicy("dummy", "1.0.0", "dummy", "1.0.0");
276         }).hasMessage("policy with ID dummy:1.0.0 and type dummy:1.0.0 does not exist");
277
278         assertThatCode(() -> {
279             ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
280                     ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
281             policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
282         }).doesNotThrowAnyException();
283
284         assertThatCode(() -> {
285             String policyString = ResourceUtils.getResourceAsString(POLICY_RESOURCE);
286             ToscaServiceTemplate policyServiceTemplate = standardCoder.decode(policyString, ToscaServiceTemplate.class);
287             ToscaServiceTemplate serviceTemplate = policyProvider
288                     .createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", policyServiceTemplate);
289             assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
290         }).doesNotThrowAnyException();
291
292         assertThatCode(() -> {
293             ToscaServiceTemplate serviceTemplate = policyProvider
294                     .deletePolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", "onap.restart.tca", "1.0.0");
295             assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
296         }).doesNotThrowAnyException();
297
298         String exceptionMessage = "policy with ID onap.restart.tca:1.0.0 and type "
299                 + "onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist";
300         assertThatThrownBy(() -> {
301             policyProvider.deletePolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", "onap.restart.tca",
302                     "1.0.0");
303         }).hasMessage(exceptionMessage);
304     }
305
306 }