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