2 * ============LICENSE_START=======================================================
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
12 * http://www.apache.org/licenses/LICENSE-2.0
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.
20 * SPDX-License-Identifier: Apache-2.0
21 * ============LICENSE_END=========================================================
24 package org.onap.policy.api.main.rest.provider;
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;
33 import java.util.ArrayList;
34 import java.util.Base64;
35 import java.util.List;
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;
60 * This class performs unit test of {@link PolicyProvider}.
62 * @author Chenfei Gao (cgao@research.att.com)
64 public class TestPolicyProvider {
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;
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";
80 * Initializes parameters.
82 * @throws PfModelException the PfModel parsing exception
85 public void setupParameters() throws PfModelException {
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();
102 * Closes up DB connections and deregisters API parameter group.
104 * @throws PfModelException the PfModel parsing exception
107 public void tearDown() throws PfModelException {
109 policyTypeProvider.close();
110 policyProvider.close();
111 ParameterService.deregister(apiParamGroup);
115 public void testFetchPolicies() {
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");
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");
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");
131 public void testFetchLatestPolicies() {
133 assertThatThrownBy(() -> {
134 policyProvider.fetchLatestPolicies("dummy", "dummy", "dummy");
135 }).hasMessage("policy with ID dummy:null and type dummy:dummy does not exist");
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";
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");
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());
156 assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
157 assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
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);
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);
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);
183 assertEquals(123, databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0)
184 .getDesiredInstanceCount());
185 assertEquals(1, databaseProvider.getPdpGroups("group").size());
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();
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();
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");
211 // Update pdpSubGroup
212 pdpSubGroup.setPolicies(new ArrayList<>());
213 pdpSubGroup.getPolicies().add(new ToscaPolicyIdentifier(policyId, policyVersion));
215 databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getPolicies().size());
217 // Test fetchDeployedPolicies
218 assertThatCode(() -> {
219 policyProvider.fetchDeployedPolicies(policyTypeId, policyTypeVersion, policyId);
220 }).doesNotThrowAnyException();
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",
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");
234 public void testCreatePolicy() {
236 assertThatThrownBy(() -> {
237 policyProvider.createPolicy("dummy", "1.0.0", new ToscaServiceTemplate());
238 }).hasMessage("policy type with ID dummy:1.0.0 does not exist");
240 assertThatCode(() -> {
241 ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
242 ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
243 policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
244 }).doesNotThrowAnyException();
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");
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");
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();
272 public void testDeletePolicy() {
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");
278 assertThatCode(() -> {
279 ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
280 ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
281 policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
282 }).doesNotThrowAnyException();
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();
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();
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",
303 }).hasMessage(exceptionMessage);