2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 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.guard;
25 import static org.assertj.core.api.Assertions.assertThat;
27 import com.att.research.xacml.api.Response;
29 import java.io.IOException;
31 import java.time.Instant;
32 import java.util.Iterator;
34 import java.util.Properties;
35 import java.util.ServiceLoader;
36 import java.util.UUID;
38 import javax.persistence.EntityManager;
39 import javax.persistence.Persistence;
41 import org.apache.commons.lang3.tuple.Pair;
42 import org.junit.AfterClass;
43 import org.junit.Before;
44 import org.junit.BeforeClass;
45 import org.junit.ClassRule;
46 import org.junit.FixMethodOrder;
47 import org.junit.Test;
48 import org.junit.rules.TemporaryFolder;
49 import org.junit.runners.MethodSorters;
50 import org.onap.policy.common.endpoints.parameters.RestServerParameters;
51 import org.onap.policy.common.utils.coder.CoderException;
52 import org.onap.policy.common.utils.coder.StandardCoder;
53 import org.onap.policy.common.utils.resources.TextFileUtils;
54 import org.onap.policy.models.decisions.concepts.DecisionRequest;
55 import org.onap.policy.models.decisions.concepts.DecisionResponse;
56 import org.onap.policy.pdp.xacml.application.common.XacmlApplicationException;
57 import org.onap.policy.pdp.xacml.application.common.XacmlApplicationServiceProvider;
58 import org.onap.policy.pdp.xacml.application.common.XacmlPolicyUtils;
59 import org.onap.policy.pdp.xacml.application.common.operationshistory.CountRecentOperationsPip;
60 import org.onap.policy.pdp.xacml.application.common.operationshistory.Dbao;
61 import org.onap.policy.pdp.xacml.xacmltest.TestUtils;
62 import org.slf4j.Logger;
63 import org.slf4j.LoggerFactory;
65 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
66 public class SonCoordinationTest {
68 private static final Logger LOGGER = LoggerFactory.getLogger(CoordinationTest.class);
69 private static Properties properties = new Properties();
70 private static File propertiesFile;
71 private static RestServerParameters clientParams = new RestServerParameters();
72 private static XacmlApplicationServiceProvider service;
73 private static DecisionRequest requestVpciNode1;
74 private static DecisionRequest requestVsonhNode1;
75 private static StandardCoder gson = new StandardCoder();
76 private static EntityManager em;
77 private static final String DENY = "Deny";
78 private static final String PERMIT = "Permit";
79 private static final String OPEN = "Success";
80 private static final String CLOSE = "Closed";
83 public static final TemporaryFolder policyFolder = new TemporaryFolder();
86 * Copies the xacml.properties and policies files into
87 * temporary folder and loads the service provider saving
88 * instance of provider off for other tests to use.
91 public static void setup() throws Exception {
92 LOGGER.info("Setting up class");
94 // Setup our temporary folder
96 XacmlPolicyUtils.FileCreator myCreator =
97 (String filename) -> policyFolder.newFile(filename);
98 propertiesFile = XacmlPolicyUtils.copyXacmlPropertiesContents(
99 "src/test/resources/xacml.properties", properties, myCreator);
103 ServiceLoader<XacmlApplicationServiceProvider> applicationLoader =
104 ServiceLoader.load(XacmlApplicationServiceProvider.class);
106 // Find the guard service application and save for use in all the tests
108 StringBuilder strDump =
109 new StringBuilder("Loaded applications:" + XacmlPolicyUtils.LINE_SEPARATOR);
110 Iterator<XacmlApplicationServiceProvider> iterator = applicationLoader.iterator();
111 while (iterator.hasNext()) {
112 XacmlApplicationServiceProvider application = iterator.next();
114 // Is it our service?
116 if (application instanceof GuardPdpApplication) {
118 // Should be the first and only one
120 assertThat(service).isNull();
121 service = application;
123 strDump.append(application.applicationName());
124 strDump.append(" supports ");
125 strDump.append(application.supportedPolicyTypes());
126 strDump.append(XacmlPolicyUtils.LINE_SEPARATOR);
128 LOGGER.info("{}", strDump);
130 // Tell it to initialize based on the properties file
131 // we just built for it.
133 service.initialize(propertiesFile.toPath().getParent(), clientParams);
135 // Load Decision Requests
137 requestVpciNode1 = gson.decode(
138 TextFileUtils.getTextFileAsString(
139 "src/test/resources/requests/coordination.cl.vPci.node.1.json"),
140 DecisionRequest.class);
141 requestVsonhNode1 = gson.decode(
142 TextFileUtils.getTextFileAsString(
143 "src/test/resources/requests/coordination.cl.vSonh.node.1.json"),
144 DecisionRequest.class);
145 String persistenceUnit = CountRecentOperationsPip.ISSUER_NAME + ".persistenceunit";
147 .createEntityManagerFactory(SonCoordinationTest.properties.getProperty(persistenceUnit),
149 .createEntityManager();
153 * Clears the database before each test.
157 public void startClean() throws Exception {
158 em.getTransaction().begin();
159 em.createQuery("DELETE FROM Dbao").executeUpdate();
160 em.getTransaction().commit();
164 * Close the entity manager.
167 public static void cleanup() throws Exception {
174 * Check that decision matches expectation.
176 * @param expected from the response
177 * @param response received
180 public void checkDecision(String expected, DecisionResponse response) throws CoderException {
181 LOGGER.info("Looking for {} Decision", expected);
182 assertThat(response).isNotNull();
183 assertThat(response.getStatus()).isNotNull();
184 assertThat(response.getStatus()).isEqualTo(expected);
186 // Dump it out as Json
188 LOGGER.info(gson.encode(response));
192 * Request a decision and check that it matches expectation.
194 * @param request to send to Xacml PDP
195 * @param expected from the response
198 public void requestAndCheckDecision(DecisionRequest request, String expected)
199 throws CoderException {
202 // Ask for a decision
204 Pair<DecisionResponse, Response> decision = service.makeDecision(request, null);
208 checkDecision(expected, decision.getKey());
212 public void test1() throws CoderException, IOException, XacmlApplicationException {
213 LOGGER.info("**************** Running vPci and vSonh Control Loops ****************");
215 // Now load the test coordination policy - make sure
216 // the pdp can support it and have it load
219 TestUtils.loadPolicies(
220 "src/test/resources/test.policy.guard.coordination.vPciBlocksVsonh.tosca.yaml",
222 TestUtils.loadPolicies(
223 "src/test/resources/test.policy.guard.coordination.vSonhBlocksVpci.tosca.yaml",
226 // vSonh doesn't have open action: vPci should get permit
228 requestAndCheckDecision(requestVpciNode1, PERMIT);
230 // vPci doesn't have open action: vSonh should get permit
232 requestAndCheckDecision(requestVsonhNode1, PERMIT);
234 // Open vSonh on node1
236 insertOperationEvent(requestVsonhNode1, OPEN);
238 // Under current coordination policy vPci should get a deny
240 requestAndCheckDecision(requestVpciNode1, DENY);
242 // Open vPci on node1
244 insertOperationEvent(requestVpciNode1, OPEN);
246 // Under current coordination policy vSonh should get a deny
248 requestAndCheckDecision(requestVsonhNode1, DENY);
250 // Close vSonh on node1
252 insertOperationEvent(requestVsonhNode1, CLOSE);
254 // With vSonh closed on node 1, vPci now should get a permit
256 requestAndCheckDecision(requestVpciNode1, PERMIT);
258 // Close cl1 on node1
260 insertOperationEvent(requestVpciNode1, CLOSE);
262 // With vPci closed on node 1, vSonh now should get a permit
264 requestAndCheckDecision(requestVsonhNode1, PERMIT);
267 @SuppressWarnings("unchecked")
268 private void insertOperationEvent(DecisionRequest request, String outcome) {
270 // Get the properties
272 Map<String, Object> properties = (Map<String, Object>) request.getResource().get("guard");
276 Dbao newEntry = new Dbao();
277 newEntry.setActor(properties.get("actor").toString());
278 newEntry.setOperation(properties.get("operation").toString());
279 newEntry.setClosedLoopName(properties.get("clname").toString());
280 newEntry.setOutcome(outcome);
281 newEntry.setStarttime(Date.from(Instant.now().minusMillis(20000)));
282 newEntry.setEndtime(Date.from(Instant.now()));
283 newEntry.setRequestId(UUID.randomUUID().toString());
284 newEntry.setTarget(properties.get("target").toString());
285 em.getTransaction().begin();
286 em.persist(newEntry);
287 em.getTransaction().commit();