Added support for 'Active' and 'Passive' states. 62/97962/3
authorAli Hockla <ah999m@att.com>
Tue, 5 Nov 2019 14:15:20 +0000 (08:15 -0600)
committerAli Hockla <ah999m@att.com>
Tue, 5 Nov 2019 19:46:33 +0000 (13:46 -0600)
Removed the rest server start/stop from the Activator because the engine
starts in PASSIVE state.
Added code to start/stop the rest server when a pdp state change occurs.

Issue-ID: POLICY-2154
Change-Id: Iec6fcc990dc3dde702a911eb4f90d29e25c395a2
Signed-off-by: Ali Hockla <ah999m@att.com>
main/src/main/java/org/onap/policy/pdpx/main/XacmlState.java
main/src/main/java/org/onap/policy/pdpx/main/startstop/XacmlPdpActivator.java
main/src/test/java/org/onap/policy/pdpx/main/CommonRest.java
main/src/test/java/org/onap/policy/pdpx/main/XacmlStateTest.java
main/src/test/java/org/onap/policy/pdpx/main/rest/TestAbbreviateDecisionResults.java
main/src/test/java/org/onap/policy/pdpx/main/rest/TestDecision.java
main/src/test/java/org/onap/policy/pdpx/main/startstop/TestXacmlPdpActivator.java

index b7aa231..3d96b4b 100644 (file)
@@ -32,11 +32,15 @@ import org.onap.policy.models.pdp.enums.PdpResponseStatus;
 import org.onap.policy.models.pdp.enums.PdpState;
 import org.onap.policy.pdpx.main.rest.XacmlPdpApplicationManager;
 import org.onap.policy.pdpx.main.startstop.XacmlPdpActivator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Current state of this XACML PDP.
  */
 public class XacmlState {
+    // The logger for this class
+    private static final Logger LOGGER = LoggerFactory.getLogger(XacmlState.class);
 
     /**
      * The application manager.
@@ -103,6 +107,9 @@ public class XacmlState {
 
         PdpStatus status2 = makeResponse(message);
 
+        // start/stop rest controller based on state change
+        handleXacmlRestController();
+
         // these fields aren't needed in the response, so clear them out to avoid sending
         status2.setPolicies(null);
 
@@ -149,4 +156,23 @@ public class XacmlState {
         status2.setResponse(resp);
         return status2;
     }
+
+    /**
+     * Manages the Xacml-Pdp rest controller based on the Xacml-Pdp State.
+     * Current supported states:
+     * ACTIVE  - rest service is running and handling requests
+     * PASSIVE - rest service is not running
+     */
+    private void handleXacmlRestController() {
+        if (status.getState() == PdpState.ACTIVE) {
+            LOGGER.info("State change: {} - Starting rest controller", status.getState());
+            XacmlPdpActivator.getCurrent().startXacmlRestController();
+        } else if (status.getState() == PdpState.PASSIVE) {
+            LOGGER.info("State change: {} - Stopping rest controller", status.getState());
+            XacmlPdpActivator.getCurrent().stopXacmlRestController();
+        } else {
+            // unsupported state
+            LOGGER.warn("Unsupported state: {}", status.getState());
+        }
+    }
 }
index 8d21395..396919d 100644 (file)
@@ -62,6 +62,7 @@ public class XacmlPdpActivator extends ServiceManagerContainer {
     @Getter
     @Setter
     private static XacmlPdpActivator current = null;
+    private final RestServer restServer;
 
     // The parameters of this policy xacml pdp activator
     private final XacmlPdpParameterGroup xacmlPdpParameterGroup;
@@ -85,7 +86,6 @@ public class XacmlPdpActivator extends ServiceManagerContainer {
         final XacmlPdpHearbeatPublisher heartbeat;
         final TopicSinkClient sinkClient;
         final XacmlState state;
-        final RestServer restServer;
 
         try {
             XacmlPdpApplicationManager appmgr =
@@ -145,10 +145,6 @@ public class XacmlPdpActivator extends ServiceManagerContainer {
             heartbeat::start,
             heartbeat::terminate);
 
-        addAction("REST server",
-            restServer::start,
-            restServer::stop);
-
         // @formatter:on
     }
 
@@ -204,4 +200,30 @@ public class XacmlPdpActivator extends ServiceManagerContainer {
             source.unregister(msgDispatcher);
         }
     }
+
+    /**
+     * Start the xacmlpdp rest controller.
+     */
+    public void startXacmlRestController() {
+        if (isXacmlRestControllerAlive()) {
+            LOGGER.info("Xacml rest controller already running");
+        } else {
+            restServer.start();
+        }
+    }
+
+    /**
+     * Stop the xacmlpdp rest controller.
+     */
+    public void stopXacmlRestController() {
+        if (isXacmlRestControllerAlive()) {
+            restServer.stop();
+        } else {
+            LOGGER.info("Xacml rest controller already stopped");
+        }
+    }
+
+    public boolean isXacmlRestControllerAlive() {
+        return restServer.isAlive();
+    }
 }
index a32bc6f..d2379e0 100644 (file)
@@ -120,6 +120,9 @@ public class CommonRest {
         final String[] xacmlPdpConfigParameters = {"-c", CommonRest.CONFIG_FILE};
         main = new Main(xacmlPdpConfigParameters);
 
+        // start xacml rest controller
+        XacmlPdpActivator.getCurrent().startXacmlRestController();
+
         if (!NetworkUtil.isTcpPortOpen("localhost", port, 20, 1000L)) {
             throw new IllegalStateException("server is not listening on port " + port);
         }
index 20136bf..eef1f1b 100644 (file)
@@ -24,6 +24,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import java.util.Arrays;
@@ -135,6 +136,16 @@ public class XacmlStateTest {
         // ensure info was saved
         status = state.genHeartbeat();
         assertEquals(PdpState.SAFE, status.getState());
+
+        req.setState(PdpState.ACTIVE);
+        status = state.updateInternalState(req);
+        assertEquals(PdpState.ACTIVE, status.getState());
+        verify(act).startXacmlRestController();
+
+        req.setState(PdpState.PASSIVE);
+        status = state.updateInternalState(req);
+        assertEquals(PdpState.PASSIVE, status.getState());
+        verify(act).stopXacmlRestController();
     }
 
     @Test
index 37a669d..d416cd3 100644 (file)
@@ -67,6 +67,7 @@ import org.onap.policy.pdpx.main.PolicyXacmlPdpException;
 import org.onap.policy.pdpx.main.parameters.CommonTestData;
 import org.onap.policy.pdpx.main.parameters.XacmlPdpParameterGroup;
 import org.onap.policy.pdpx.main.startstop.Main;
+import org.onap.policy.pdpx.main.startstop.XacmlPdpActivator;
 import org.onap.policy.xacml.pdp.application.monitoring.MonitoringPdpApplication;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -130,6 +131,7 @@ public class TestAbbreviateDecisionResults {
         // Start the service
         //
         main = startXacmlPdpService(fileParams);
+        XacmlPdpActivator.getCurrent().startXacmlRestController();
         //
         // Make sure it is running
         //
index 042180b..6c6e35b 100644 (file)
@@ -61,6 +61,7 @@ import org.onap.policy.pdpx.main.PolicyXacmlPdpException;
 import org.onap.policy.pdpx.main.parameters.CommonTestData;
 import org.onap.policy.pdpx.main.parameters.XacmlPdpParameterGroup;
 import org.onap.policy.pdpx.main.startstop.Main;
+import org.onap.policy.pdpx.main.startstop.XacmlPdpActivator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -116,6 +117,7 @@ public class TestDecision {
         // Start the service
         //
         main = startXacmlPdpService(fileParams);
+        XacmlPdpActivator.getCurrent().startXacmlRestController();
         //
         // Make sure it is running
         //
index cd4b78d..5223bcd 100644 (file)
@@ -64,6 +64,7 @@ public class TestXacmlPdpActivator extends CommonRest {
     /**
      * Creates the activator.
      */
+    @Override
     @Before
     public void setUp() {
         activator = new XacmlPdpActivator(parGroup);
@@ -72,11 +73,20 @@ public class TestXacmlPdpActivator extends CommonRest {
     @Test
     public void testXacmlPdpActivator() throws Exception {
         assertFalse(activator.isAlive());
+        assertFalse(activator.isXacmlRestControllerAlive());
         activator.start();
         assertTrue(activator.isAlive());
+
+        // XacmlPdp starts in PASSIVE state so the rest controller should not be alive
+        assertFalse(activator.isXacmlRestControllerAlive());
         assertTrue(activator.getParameterGroup().isValid());
         assertEquals(CommonTestData.PDPX_GROUP_NAME, activator.getParameterGroup().getName());
 
+        activator.startXacmlRestController();
+        assertTrue(activator.isXacmlRestControllerAlive());
+
+        activator.stopXacmlRestController();
+        assertFalse(activator.isXacmlRestControllerAlive());
     }
 
     @Test