2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 * SPDX-License-Identifier: Apache-2.0
20 * ============LICENSE_END=========================================================
23 package org.onap.policy.xacml.pdp.application.monitoring;
25 import static org.assertj.core.api.Assertions.assertThat;
27 import com.att.research.xacml.api.Response;
29 import java.io.IOException;
30 import java.util.HashMap;
31 import java.util.Iterator;
32 import java.util.List;
34 import java.util.Properties;
35 import java.util.ServiceLoader;
36 import org.apache.commons.lang3.tuple.Pair;
37 import org.junit.BeforeClass;
38 import org.junit.ClassRule;
39 import org.junit.FixMethodOrder;
40 import org.junit.Test;
41 import org.junit.rules.TemporaryFolder;
42 import org.junit.runners.MethodSorters;
43 import org.onap.policy.common.endpoints.parameters.RestServerParameters;
44 import org.onap.policy.common.utils.coder.CoderException;
45 import org.onap.policy.common.utils.coder.StandardCoder;
46 import org.onap.policy.common.utils.resources.TextFileUtils;
47 import org.onap.policy.models.decisions.concepts.DecisionRequest;
48 import org.onap.policy.models.decisions.concepts.DecisionResponse;
49 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
50 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier;
51 import org.onap.policy.pdp.xacml.application.common.XacmlApplicationException;
52 import org.onap.policy.pdp.xacml.application.common.XacmlApplicationServiceProvider;
53 import org.onap.policy.pdp.xacml.application.common.XacmlPolicyUtils;
54 import org.onap.policy.pdp.xacml.xacmltest.TestUtils;
55 import org.slf4j.Logger;
56 import org.slf4j.LoggerFactory;
58 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
59 public class MonitoringPdpApplicationTest {
61 private static final Logger LOGGER = LoggerFactory.getLogger(MonitoringPdpApplicationTest.class);
62 private static Properties properties = new Properties();
63 private static File propertiesFile;
64 private static XacmlApplicationServiceProvider service;
65 private static DecisionRequest requestSinglePolicy;
66 private static DecisionRequest requestPolicyType;
68 private static StandardCoder gson = new StandardCoder();
69 private static RestServerParameters clientParams = new RestServerParameters();
72 public static final TemporaryFolder policyFolder = new TemporaryFolder();
75 * Copies the xacml.properties and policies files into
76 * temporary folder and loads the service provider saving
77 * instance of provider off for other tests to use.
80 public static void setup() throws Exception {
82 // Load Single Decision Request
84 requestSinglePolicy = gson.decode(
86 .getTextFileAsString("../../main/src/test/resources/decisions/decision.single.input.json"),
87 DecisionRequest.class);
88 // Load Single Decision Request
90 requestPolicyType = gson.decode(
92 .getTextFileAsString("../../main/src/test/resources/decisions/decision.policytype.input.json"),
93 DecisionRequest.class);
95 // Setup our temporary folder
97 XacmlPolicyUtils.FileCreator myCreator = (String filename) -> policyFolder.newFile(filename);
98 propertiesFile = XacmlPolicyUtils.copyXacmlPropertiesContents("src/test/resources/xacml.properties",
99 properties, myCreator);
101 // Load XacmlApplicationServiceProvider service
103 ServiceLoader<XacmlApplicationServiceProvider> applicationLoader =
104 ServiceLoader.load(XacmlApplicationServiceProvider.class);
106 // Look for our class instance and save it
108 StringBuilder strDump = new StringBuilder("Loaded applications:" + XacmlPolicyUtils.LINE_SEPARATOR);
109 Iterator<XacmlApplicationServiceProvider> iterator = applicationLoader.iterator();
110 while (iterator.hasNext()) {
111 XacmlApplicationServiceProvider application = iterator.next();
113 // Is it our service?
115 if (application instanceof MonitoringPdpApplication) {
117 // Should be the first and only one
119 assertThat(service).isNull();
120 service = application;
122 strDump.append(application.applicationName());
123 strDump.append(" supports ");
124 strDump.append(application.supportedPolicyTypes());
125 strDump.append(XacmlPolicyUtils.LINE_SEPARATOR);
127 LOGGER.debug("{}", strDump);
129 // Tell it to initialize based on the properties file
130 // we just built for it.
132 service.initialize(propertiesFile.toPath().getParent(), clientParams);
136 public void test1Basics() {
138 // Make sure there's an application name
140 assertThat(service.applicationName()).isNotEmpty();
142 // Ensure it has the supported policy types and
143 // can support the correct policy types.
145 assertThat(service.canSupportPolicyType(
146 new ToscaPolicyTypeIdentifier("onap.policies.monitoring.tcagen2", "1.0.0"))).isTrue();
147 assertThat(service.canSupportPolicyType(
148 new ToscaPolicyTypeIdentifier(
149 "onap.policies.monitoring.foobar", "1.0.1"))).isTrue();
150 assertThat(service.canSupportPolicyType(
151 new ToscaPolicyTypeIdentifier("onap.foobar", "1.0.0"))).isFalse();
153 // Ensure it supports decisions
155 assertThat(service.actionDecisionsSupported()).contains("configure");
159 public void test2NoPolicies() {
161 // Ask for a decision
163 Pair<DecisionResponse, Response> decision = service.makeDecision(requestSinglePolicy, null);
164 LOGGER.info("Decision {}", decision);
166 assertThat(decision.getKey()).isNotNull();
167 assertThat(decision.getKey().getPolicies()).isEmpty();
169 // Test the branch for query params, and we have no policy anyway
171 Map<String, String[]> requestQueryParams = new HashMap<>();
172 decision = service.makeDecision(requestSinglePolicy, requestQueryParams);
173 LOGGER.info("Decision {}", decision);
175 assertThat(decision.getKey()).isNotNull();
176 assertThat(decision.getKey().getPolicies()).isEmpty();
178 // Test the branch for query params, and we have no policy anyway
180 requestQueryParams.put("abbrev", new String[] {"false"});
181 decision = service.makeDecision(requestSinglePolicy, requestQueryParams);
182 LOGGER.info("Decision {}", decision);
184 assertThat(decision.getKey()).isNotNull();
185 assertThat(decision.getKey().getPolicies()).isEmpty();
188 @SuppressWarnings("unchecked")
190 public void test3AddvDnsPolicy() throws IOException, CoderException, XacmlApplicationException {
192 // Now load the vDNS Policy - make sure
193 // the pdp can support it and have it load
197 // Now load the monitoring policies
199 final List<ToscaPolicy> loadedPolicies = TestUtils.loadPolicies("src/test/resources/vDNS.policy.input.yaml",
202 // Ask for a decision
204 Pair<DecisionResponse, Response> decision = service.makeDecision(requestSinglePolicy, null);
205 LOGGER.info("Decision {}", decision);
207 assertThat(decision.getKey()).isNotNull();
208 assertThat(decision.getKey().getPolicies()).hasSize(1);
210 // Dump it out as Json
212 LOGGER.info(gson.encode(decision.getKey()));
214 // Ask for a decision based on policy-type
216 decision = service.makeDecision(requestPolicyType, null);
217 LOGGER.info("Decision {}", decision);
219 assertThat(decision.getKey()).isNotNull();
220 assertThat(decision.getKey().getPolicies()).hasSize(1);
221 Map<String, Object> jsonPolicy = (Map<String, Object>) decision.getKey().getPolicies().get("onap.scaleout.tca");
222 assertThat(jsonPolicy).isNotNull();
223 assertThat(jsonPolicy.get("properties")).isNotNull();
225 // Dump it out as Json
227 LOGGER.info(gson.encode(decision.getKey()));
229 // Ask for abbreviated results
231 Map<String, String[]> requestQueryParams = new HashMap<>();
232 requestQueryParams.put("abbrev", new String[] {"true"});
233 decision = service.makeDecision(requestPolicyType, requestQueryParams);
234 LOGGER.info("Decision {}", decision);
236 assertThat(decision.getKey()).isNotNull();
237 assertThat(decision.getKey().getPolicies()).hasSize(1);
238 jsonPolicy = (Map<String, Object>) decision.getKey().getPolicies().get("onap.scaleout.tca");
239 assertThat(jsonPolicy).isNotNull().doesNotContainKey("properties");
241 // Don't Ask for abbreviated results
243 requestQueryParams = new HashMap<>();
244 requestQueryParams.put("abbrev", new String[] {"false"});
245 decision = service.makeDecision(requestPolicyType, requestQueryParams);
246 LOGGER.info("Decision {}", decision);
248 assertThat(decision.getKey()).isNotNull();
249 assertThat(decision.getKey().getPolicies()).hasSize(1);
250 jsonPolicy = (Map<String, Object>) decision.getKey().getPolicies().get("onap.scaleout.tca");
251 assertThat(jsonPolicy).isNotNull();
252 assertThat(jsonPolicy.get("properties")).isNotNull();
254 // Throw an unknown exception
256 requestQueryParams = new HashMap<>();
257 requestQueryParams.put("unknown", new String[] {"true"});
258 decision = service.makeDecision(requestPolicyType, requestQueryParams);
259 LOGGER.info("Decision {}", decision);
261 assertThat(decision.getKey()).isNotNull();
262 assertThat(decision.getKey().getPolicies()).hasSize(1);
263 jsonPolicy = (Map<String, Object>) decision.getKey().getPolicies().get("onap.scaleout.tca");
264 assertThat(jsonPolicy).isNotNull();
265 assertThat(jsonPolicy.get("properties")).isNotNull();
267 // Dump it out as Json
269 LOGGER.info(gson.encode(decision.getKey()));
273 LOGGER.info("Now testing unloading of policy");
274 for (ToscaPolicy policy : loadedPolicies) {
275 assertThat(service.unloadPolicy(policy)).isTrue();
278 // Ask for a decision
280 decision = service.makeDecision(requestSinglePolicy, null);
281 LOGGER.info("Decision {}", decision.getKey());
283 assertThat(decision.getKey()).isNotNull();
284 assertThat(decision.getKey().getPolicies()).isEmpty();