<dependency>
<groupId>com.att.research.xacml</groupId>
<artifactId>xacml-pdp</artifactId>
- <version>2.1.0</version>
+ <version>2.2.0</version>
</dependency>
</dependencies>
</project>
public static final String TOSCA_TYPE_LIST = "list";
public static final String TOSCA_TYPE_MAP = "map";
+ //@formatter:off
private static final Map<String, Function<ToscaProperty, MatchablePropertyTypeBase<?>>>
mapPrimitivesProperty = Map.of(
TOSCA_PRIMITIVE_STRING, MatchablePropertyTypeString::new,
TOSCA_PRIMITIVE_BOOLEAN, MatchablePropertyTypeBoolean::new,
TOSCA_PRIMITIVE_TIMESTAMP, MatchablePropertyTypeTimestamp::new
);
+ //@formatter:on
ToscaPolicyIdentifier policyId;
Map<String, MatchableProperty> matchables = new HashMap<>();
Function<ToscaEntrySchema, MatchablePropertyTypeBase<?>> function =
mapPrimitivesSchema.get(toscaSchema.getType());
if (function != null) {
- return new MatchableProperty(property, function.apply(toscaSchema)); // compilation err wants ToscaProperty
+ return new MatchableProperty(property, function.apply(toscaSchema));
}
throw new IllegalArgumentException("Not a primitive " + toscaSchema.getType());
}
package org.onap.policy.pdp.xacml.application.common.matchable;
import com.att.research.xacml.api.Identifier;
-import java.util.Collection;
import java.util.Collections;
import java.util.List;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.AnyOfType;
@SuppressWarnings("unchecked")
@Override
public List<MatchablePropertyType<?>> validate(Object value) throws ToscaPolicyConversionException {
- if (value instanceof Collection) {
+ if (value instanceof List) {
return (List<MatchablePropertyType<?>>) value;
}
return Collections.emptyList();
*/
@Override
public PIPResponse getAttributes(PIPRequest pipRequest, PIPFinder pipFinder) throws PIPException {
+ if (this.shutdown) {
+ throw new PIPException("Engine is shutdown");
+ }
logger.debug("getAttributes requesting attribute {} of type {} for issuer {}",
pipRequest.getAttributeId(), pipRequest.getDataTypeId(), pipRequest.getIssuer());
//
*/
@Override
public PIPResponse getAttributes(PIPRequest pipRequest, PIPFinder pipFinder) throws PIPException {
+ if (this.shutdown) {
+ throw new PIPException("Engine is shutdown");
+ }
logger.debug("getAttributes requesting attribute {} of type {} for issuer {}",
pipRequest.getAttributeId(), pipRequest.getDataTypeId(), pipRequest.getIssuer());
//
protected Properties properties;
protected EntityManager em;
protected String issuer;
+ protected boolean shutdown = false;
public StdOnapPip() {
super();
}
@Override
- public void configure(String id, Properties properties) throws PIPException {
+ public synchronized void configure(String id, Properties properties) throws PIPException {
+ //
+ // This most likely will never get called since configure is called
+ // upon startup.
+ //
+ if (this.shutdown) {
+ throw new PIPException("Engine is shutdown.");
+ }
super.configure(id, properties);
logger.info("Configuring historyDb PIP {}", properties);
this.properties = properties;
}
}
+ @Override
+ public synchronized void shutdown() {
+ if (this.em != null) {
+ this.em.close();
+ this.em = null;
+ }
+ this.shutdown = true;
+ }
+
protected String getAttribute(PIPFinder pipFinder, PIPRequest pipRequest) {
//
// Get the actor value
PDPEngineFactory factory = getPdpEngineFactory();
PDPEngine engine = factory.newEngine(properties);
if (engine != null) {
+ //
+ // If there is a previous engine have it shutdown.
+ //
+ this.destroyEngine();
+ //
+ // Save it off
+ //
this.pdpEngine = engine;
}
} catch (FactoryException e) {
}
}
+ protected synchronized void destroyEngine() {
+ if (this.pdpEngine == null) {
+ return;
+ }
+ try {
+ this.pdpEngine.shutdown();
+ } catch (Exception e) {
+ LOGGER.warn("Exception thrown when destroying XACML PDP engine.", e);
+ }
+ this.pdpEngine = null;
+ }
+
/**
* Make a decision call.
*
package org.onap.policy.pdp.xacml.application.common.operationshistory;
import static org.assertj.core.api.Assertions.assertThatCode;
+import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
assertEquals(StdPIPResponse.PIP_RESPONSE_EMPTY, pipEngine.getAttributes(pipRequest, pipFinder));
}
+ @Test
+ public void testShutdown() {
+ pipEngine.shutdown();
+ assertThatExceptionOfType(PIPException.class).isThrownBy(() -> pipEngine.getAttributes(pipRequest, pipFinder))
+ .withMessageContaining("Engine is shutdown");
+ }
+
@Test
public void testGetCountFromDb() throws Exception {
//
package org.onap.policy.pdp.xacml.application.common.operationshistory;
+import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatCode;
+import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.when;
+import com.att.research.xacml.api.Status;
import com.att.research.xacml.api.pip.PIPException;
import com.att.research.xacml.api.pip.PIPFinder;
import com.att.research.xacml.api.pip.PIPRequest;
+import com.att.research.xacml.api.pip.PIPResponse;
import com.att.research.xacml.std.pip.StdPIPResponse;
import java.io.FileInputStream;
import java.lang.reflect.Method;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.onap.policy.pdp.xacml.application.common.ToscaDictionary;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Mock
private PIPFinder pipFinder;
+ @Mock
+ private PIPResponse resp1;
+
+ @Mock
+ private Status okStatus;
+
/**
* Create an instance of our engine and also the persistence
* factory.
pipEngine.configure("issuer", properties);
LOGGER.info("PIP configured now creating our entity manager");
LOGGER.info("properties {}", properties);
-
}
@Test
assertEquals(StdPIPResponse.PIP_RESPONSE_EMPTY, pipEngine.getAttributes(pipRequest, pipFinder));
}
+ @Test
+ public void testGetAttributes() throws Exception {
+ //
+ //
+ //
+ when(pipRequest.getIssuer()).thenReturn(ToscaDictionary.GUARD_ISSUER_PREFIX + "clname:clfoo");
+ when(pipFinder.getMatchingAttributes(any(), eq(pipEngine))).thenReturn(resp1);
+ when(resp1.getStatus()).thenReturn(okStatus);
+ when(okStatus.isOk()).thenReturn(true);
+
+ assertNotEquals(StdPIPResponse.PIP_RESPONSE_EMPTY, pipEngine.getAttributes(pipRequest, pipFinder));
+
+ pipEngine.shutdown();
+
+ assertThatExceptionOfType(PIPException.class).isThrownBy(() -> pipEngine.getAttributes(pipRequest, pipFinder))
+ .withMessageContaining("Engine is shutdown");
+ }
+
@Test
public void testGetOutcomeFromDb() throws Exception {
//
String.class);
method.setAccessible(true);
//
+ // Test pipEngine
+ //
+ String outcome = (String) method.invoke(pipEngine, "testcl1", "testtarget1");
+ assertThat(outcome).isNull();
+ //
// Insert entry
//
insertEntry("testcl1", "testtarget1", "1");
//
// Test pipEngine
//
- String outcome = (String) method.invoke(pipEngine, "testcl1", "testtarget1");
+ outcome = (String) method.invoke(pipEngine, "testcl1", "testtarget1");
//
// outcome should be "1"
//
outcome = (String) method.invoke(pipEngine, "testcl1", "testtarget2");
assertEquals("4", outcome);
+
+ //
+ // Shut it down
+ //
+ pipEngine.shutdown();
+
+ assertThat(method.invoke(pipEngine, "testcl1", "testtarget2")).isNull();
}
private void insertEntry(String cl, String target, String outcome) {
/*-
* ============LICENSE_START=======================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
package org.onap.policy.pdp.xacml.application.common.std;
+import static org.assertj.core.api.Assertions.assertThatCode;
+import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
assertEquals(0, resp.getAttributes().size());
}
+ @Test
+ public void testShutdown() {
+ assertThatCode(() -> pip.shutdown()).doesNotThrowAnyException();
+ assertThatExceptionOfType(PIPException.class).isThrownBy(() -> pip.configure("foo", new Properties()))
+ .withMessageContaining("Engine is shutdown");
+ }
+
private class MyPip extends StdOnapPip {
@Override