177ff535f9dbf7f90830493e70d53f8262f0cc0a
[policy/api.git] / main / src / test / java / org / onap / policy / api / main / rest / provider / TestPolicyTypeProvider.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.assertThatThrownBy;
27 import static org.junit.Assert.assertFalse;
28 import static org.junit.Assert.assertNotNull;
29
30 import java.util.Base64;
31 import java.util.Collections;
32 import org.junit.AfterClass;
33 import org.junit.BeforeClass;
34 import org.junit.Test;
35 import org.onap.policy.api.main.parameters.ApiParameterGroup;
36 import org.onap.policy.common.parameters.ParameterService;
37 import org.onap.policy.common.utils.coder.CoderException;
38 import org.onap.policy.common.utils.coder.StandardYamlCoder;
39 import org.onap.policy.common.utils.resources.ResourceUtils;
40 import org.onap.policy.models.base.PfModelException;
41 import org.onap.policy.models.provider.PolicyModelsProviderParameters;
42 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
43
44 /**
45  * This class performs unit test of {@link PolicyTypeProvider}.
46  *
47  * @author Chenfei Gao (cgao@research.att.com)
48  */
49 public class TestPolicyTypeProvider {
50
51     private static PolicyTypeProvider policyTypeProvider;
52     private static PolicyProvider policyProvider;
53     private static PolicyModelsProviderParameters providerParams;
54     private static ApiParameterGroup apiParamGroup;
55     private static StandardYamlCoder standardYamlCoder;
56
57     private static final String POLICY_TYPE_VERSION = "1.0.0";
58
59     private static final String POLICY_RESOURCE_MONITORING = "policies/vCPE.policy.monitoring.input.tosca.yaml";
60     private static final String POLICY_TYPE_RESOURCE_MONITORING =
61             "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app.yaml";
62     private static final String POLICY_TYPE_RESOURCE_WITH_NO_VERSION =
63             "policytypes/onap.policies.optimization.Resource.no.version.yaml";
64     private static final String POLICY_TYPE_NAME_MONITORING = "onap.policies.monitoring.cdap.tca.hi.lo.app";
65
66     public static final String POLICY_TYPE_RESOURCE_OPERATIONAL =
67             "policytypes/onap.policies.controlloop.operational.Common.yaml";
68     public static final String POLICY_TYPE_RESOURCE_OPERATIONAL_APEX =
69         "policytypes/onap.policies.controlloop.operational.common.Apex.yaml";
70     public static final String POLICY_TYPE_OPERATIONAL_COMMON = "onap.policies.controlloop.operational.Common";
71     public static final String POLICY_TYPE_OPERATIONAL_APEX = "onap.policies.controlloop.operational.common.Apex";
72     public static final String POLICY_TYPE_OPERATIONAL_DROOLS = "onap.policies.controlloop.operational.common.Drools";
73
74     /**
75      * Initializes parameters.
76      *
77      * @throws PfModelException the PfModel parsing exception
78      */
79     @BeforeClass
80     public static void setupParameters() throws PfModelException {
81
82         standardYamlCoder = new StandardYamlCoder();
83         providerParams = new PolicyModelsProviderParameters();
84         providerParams.setDatabaseDriver("org.h2.Driver");
85         providerParams.setDatabaseUrl("jdbc:h2:mem:testdb");
86         providerParams.setDatabaseUser("policy");
87         providerParams.setDatabasePassword(Base64.getEncoder().encodeToString("P01icY".getBytes()));
88         providerParams.setPersistenceUnit("ToscaConceptTest");
89         apiParamGroup = new ApiParameterGroup("ApiGroup", null, providerParams, Collections.emptyList());
90         ParameterService.register(apiParamGroup, true);
91         policyTypeProvider = new PolicyTypeProvider();
92         policyProvider = new PolicyProvider();
93     }
94
95     /**
96      * Closes up DB connections and deregisters API parameter group.
97      *
98      * @throws PfModelException the PfModel parsing exception
99      */
100     @AfterClass
101     public static void tearDown() throws PfModelException {
102
103         policyTypeProvider.close();
104         policyProvider.close();
105         ParameterService.deregister(apiParamGroup);
106     }
107
108     @Test
109     public void testFetchPolicyTypes() throws Exception {
110
111         ToscaServiceTemplate serviceTemplate = policyTypeProvider.fetchPolicyTypes(null, null);
112         assertFalse(serviceTemplate.getPolicyTypes().isEmpty());
113
114         assertThatThrownBy(() -> {
115             policyTypeProvider.fetchPolicyTypes("dummy", null);
116         }).hasMessage("policy type with ID dummy:null does not exist");
117
118         assertThatThrownBy(() -> {
119             policyTypeProvider.fetchPolicyTypes("dummy", "dummy");
120         }).hasMessage("policy type with ID dummy:dummy does not exist");
121     }
122
123     @Test
124     public void testFetchLatestPolicyTypes() {
125
126         assertThatThrownBy(() -> {
127             policyTypeProvider.fetchLatestPolicyTypes("dummy");
128         }).hasMessage("policy type with ID dummy:null does not exist");
129     }
130
131     @Test
132     public void testCreatePolicyType() throws Exception {
133
134         ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
135                 ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE_MONITORING), ToscaServiceTemplate.class);
136         ToscaServiceTemplate serviceTemplate = policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
137         assertFalse(serviceTemplate.getPolicyTypes().isEmpty());
138
139         String errorMessage = "policy type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 already exists; "
140                 + "its latest version is 1.0.0";
141         assertThatThrownBy(() -> {
142             ToscaServiceTemplate duplicatePolicyType = standardYamlCoder.decode(
143                     ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE_MONITORING), ToscaServiceTemplate.class);
144             policyTypeProvider.createPolicyType(duplicatePolicyType);
145         }).hasMessage(errorMessage);
146
147         assertThatThrownBy(() -> {
148             ToscaServiceTemplate badPolicyType = standardYamlCoder.decode(ResourceUtils.getResourceAsString(
149                     POLICY_TYPE_RESOURCE_WITH_NO_VERSION), ToscaServiceTemplate.class);
150             policyTypeProvider.createPolicyType(badPolicyType);
151         }).hasMessage("mandatory 'version' field is missing in policy types: onap.policies.optimization.Resource");
152
153         policyTypeProvider.deletePolicyType(POLICY_TYPE_NAME_MONITORING, POLICY_TYPE_VERSION);
154     }
155
156     @Test
157     public void testCreateOperationalPolicyTypes() throws CoderException, PfModelException {
158         ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder
159             .decode(ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE_OPERATIONAL), ToscaServiceTemplate.class);
160         ToscaServiceTemplate serviceTemplate = policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
161
162         assertNotNull(serviceTemplate.getPolicyTypes().get(POLICY_TYPE_OPERATIONAL_COMMON));
163         assertNotNull(serviceTemplate.getPolicyTypes().get(POLICY_TYPE_OPERATIONAL_DROOLS));
164
165         policyTypeProvider.deletePolicyType(POLICY_TYPE_OPERATIONAL_COMMON, POLICY_TYPE_VERSION);
166         policyTypeProvider.deletePolicyType(POLICY_TYPE_OPERATIONAL_DROOLS, POLICY_TYPE_VERSION);
167     }
168
169     @Test
170     public void testCreateApexOperationalPolicyTypes() throws CoderException, PfModelException {
171         ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
172             ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE_OPERATIONAL_APEX), ToscaServiceTemplate.class);
173         ToscaServiceTemplate serviceTemplate = policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
174         assertNotNull(serviceTemplate.getPolicyTypes().get(POLICY_TYPE_OPERATIONAL_APEX));
175         policyTypeProvider.deletePolicyType(POLICY_TYPE_OPERATIONAL_APEX, POLICY_TYPE_VERSION);
176     }
177
178     @Test
179     public void testDeletePolicyType() throws Exception {
180
181         ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
182                 ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE_MONITORING), ToscaServiceTemplate.class);
183         ToscaServiceTemplate serviceTemplate = policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
184         assertFalse(serviceTemplate.getPolicyTypes().isEmpty());
185
186         ToscaServiceTemplate policyServiceTemplate = standardYamlCoder.decode(
187                 ResourceUtils.getResourceAsString(POLICY_RESOURCE_MONITORING), ToscaServiceTemplate.class);
188         policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", policyServiceTemplate);
189
190         String exceptionMessage = "policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 "
191                 + "cannot be deleted as it is parameterized by policies onap.restart.tca:1.0.0";
192         assertThatThrownBy(() -> {
193             policyTypeProvider.deletePolicyType("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0");
194         }).hasMessage(exceptionMessage);
195
196         serviceTemplate = policyProvider
197                 .deletePolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", "onap.restart.tca", "1.0.0");
198         assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
199
200         serviceTemplate =
201                 policyTypeProvider.deletePolicyType("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0");
202         assertFalse(serviceTemplate.getPolicyTypes().isEmpty());
203
204         assertThatThrownBy(() -> {
205             policyTypeProvider.deletePolicyType("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0");
206         }).hasMessage("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist");
207     }
208 }