Change to fix PDP-A incorrectly going into ACTIVE state even during APEX engine failure 11/92911/2
authora.sreekumar <ajith.sreekumar@est.tech>
Thu, 8 Aug 2019 08:57:34 +0000 (08:57 +0000)
committera.sreekumar <ajith.sreekumar@est.tech>
Thu, 8 Aug 2019 08:57:34 +0000 (08:57 +0000)
PDP-A goes to ACTIVE state even when the APEX engine failed to start.
This is fixed.

Change-Id: Iad4b45abf257f68267dd2526a624dc6d882c84af
Issue-ID: POLICY-1980
Signed-off-by: a.sreekumar <ajith.sreekumar@est.tech>
services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexMain.java
services/services-onappf/src/main/java/org/onap/policy/apex/services/onappf/handler/ApexEngineHandler.java
services/services-onappf/src/main/java/org/onap/policy/apex/services/onappf/handler/PdpStateChangeMessageHandler.java
services/services-onappf/src/main/java/org/onap/policy/apex/services/onappf/handler/PdpUpdateMessageHandler.java

index 2c649c2..3bf842c 100644 (file)
@@ -1,19 +1,20 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ *  Modification Copyright (C) 2019 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
- * 
+ *
  * SPDX-License-Identifier: Apache-2.0
  * ============LICENSE_END=========================================================
  */
@@ -23,7 +24,8 @@ package org.onap.policy.apex.service.engine.main;
 import java.util.Arrays;
 import java.util.Base64;
 import java.util.Map.Entry;
-
+import lombok.Getter;
+import lombok.Setter;
 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
 import org.onap.policy.apex.service.parameters.ApexParameterHandler;
 import org.onap.policy.apex.service.parameters.ApexParameters;
@@ -45,6 +47,10 @@ public class ApexMain {
     // The parameters read in from JSON
     private ApexParameters parameters;
 
+    @Getter
+    @Setter(lombok.AccessLevel.PRIVATE)
+    private volatile boolean alive = false;
+
     /**
      * Instantiates the Apex service.
      *
@@ -101,6 +107,7 @@ public class ApexMain {
         // Start the activator
         try {
             activator.initialize();
+            setAlive(true);
         } catch (final ApexActivatorException e) {
             LOGGER.error("start of Apex service failed, used parameters are " + Arrays.toString(args), e);
             return;
@@ -129,6 +136,7 @@ public class ApexMain {
         if (activator != null) {
             activator.terminate();
         }
+        setAlive(false);
     }
 
     /**
@@ -144,6 +152,7 @@ public class ApexMain {
             try {
                 // Shutdown the Apex engine and wait for everything to stop
                 activator.terminate();
+                setAlive(false);
             } catch (final ApexException e) {
                 LOGGER.warn("error occured during shut down of the Apex service", e);
             }
index 699f26c..4f68b90 100644 (file)
@@ -96,7 +96,7 @@ public class ApexEngineHandler {
      * Method to check whether the apex engine is running or not.
      */
     public boolean isApexEngineRunning() {
-        return null != apexMain;
+        return null != apexMain && apexMain.isAlive();
     }
 
     /**
index 495bcec..8658150 100644 (file)
@@ -21,7 +21,6 @@
 package org.onap.policy.apex.services.onappf.handler;
 
 import java.util.List;
-
 import org.onap.policy.apex.services.onappf.ApexStarterConstants;
 import org.onap.policy.apex.services.onappf.comm.PdpStatusPublisher;
 import org.onap.policy.apex.services.onappf.exception.ApexStarterException;
@@ -99,9 +98,14 @@ public class PdpStateChangeMessageHandler {
                     final ApexEngineHandler apexEngineHandler =
                             new ApexEngineHandler(policies.get(0).getProperties().get("content"));
                     Registry.registerOrReplace(ApexStarterConstants.REG_APEX_ENGINE_HANDLER, apexEngineHandler);
-                    pdpResponseDetails = pdpMessageHandler.createPdpResonseDetails(pdpStateChangeMsg.getRequestId(),
+                    if (apexEngineHandler.isApexEngineRunning()) {
+                        pdpResponseDetails = pdpMessageHandler.createPdpResonseDetails(pdpStateChangeMsg.getRequestId(),
                             PdpResponseStatus.SUCCESS, "Apex engine started. State changed to active.");
-                    pdpStatusContext.setState(PdpState.ACTIVE);
+                        pdpStatusContext.setState(PdpState.ACTIVE);
+                    } else {
+                        pdpResponseDetails = pdpMessageHandler.createPdpResonseDetails(pdpStateChangeMsg.getRequestId(),
+                            PdpResponseStatus.FAIL, "Apex engine failed to start. State cannot be changed to active.");
+                    }
                 } catch (final ApexStarterException e) {
                     LOGGER.error("Pdp update failed as the policies couldn't be undeployed.", e);
                     pdpResponseDetails = pdpMessageHandler.createPdpResonseDetails(pdpStateChangeMsg.getRequestId(),
index 64d4657..d807dc5 100644 (file)
@@ -21,7 +21,6 @@
 package org.onap.policy.apex.services.onappf.handler;
 
 import java.util.List;
-
 import org.onap.policy.apex.services.onappf.ApexStarterConstants;
 import org.onap.policy.apex.services.onappf.comm.PdpStatusPublisher;
 import org.onap.policy.apex.services.onappf.exception.ApexStarterException;
@@ -106,30 +105,49 @@ public class PdpUpdateMessageHandler {
             LOGGER.debug("ApenEngineHandler not in registry.", e);
         }
         if (pdpUpdateMsg.getPolicies().isEmpty()) {
-            if (null != apexEngineHandler && apexEngineHandler.isApexEngineRunning()) {
-                try {
-                    apexEngineHandler.shutdown();
-                } catch (final ApexStarterException e) {
-                    LOGGER.error("Pdp update failed as the policies couldn't be undeployed.", e);
-                    pdpResponseDetails = pdpMessageHandler.createPdpResonseDetails(pdpUpdateMsg.getRequestId(),
-                            PdpResponseStatus.FAIL, "Pdp update failed as the policies couldn't be undeployed.");
-                }
-            }
+            pdpResponseDetails = stopApexEngineBasedOnPolicies(pdpUpdateMsg, pdpMessageHandler, apexEngineHandler);
         } else {
+            pdpResponseDetails = startApexEngineBasedOnPolicies(pdpUpdateMsg, pdpMessageHandler, apexEngineHandler);
+        }
+        return pdpResponseDetails;
+    }
+
+    private PdpResponseDetails stopApexEngineBasedOnPolicies(final PdpUpdate pdpUpdateMsg,
+        final PdpMessageHandler pdpMessageHandler, ApexEngineHandler apexEngineHandler) {
+        PdpResponseDetails pdpResponseDetails = null;
+        if (null != apexEngineHandler && apexEngineHandler.isApexEngineRunning()) {
             try {
-                if (null != apexEngineHandler && apexEngineHandler.isApexEngineRunning()) {
-                    apexEngineHandler.shutdown();
-                }
-                apexEngineHandler =
-                        new ApexEngineHandler(pdpUpdateMsg.getPolicies().get(0).getProperties().get("content"));
-                Registry.registerOrReplace(ApexStarterConstants.REG_APEX_ENGINE_HANDLER, apexEngineHandler);
-                pdpResponseDetails = pdpMessageHandler.createPdpResonseDetails(pdpUpdateMsg.getRequestId(),
-                        PdpResponseStatus.SUCCESS, "Apex engine started and policies are running.");
+                apexEngineHandler.shutdown();
             } catch (final ApexStarterException e) {
-                LOGGER.error("Apex engine service running failed. ", e);
+                LOGGER.error("Pdp update failed as the policies couldn't be undeployed.", e);
+                pdpResponseDetails = pdpMessageHandler.createPdpResonseDetails(pdpUpdateMsg.getRequestId(),
+                        PdpResponseStatus.FAIL, "Pdp update failed as the policies couldn't be undeployed.");
+            }
+        }
+        return pdpResponseDetails;
+    }
+
+    private PdpResponseDetails startApexEngineBasedOnPolicies(final PdpUpdate pdpUpdateMsg,
+        final PdpMessageHandler pdpMessageHandler, ApexEngineHandler apexEngineHandler) {
+        PdpResponseDetails pdpResponseDetails = null;
+        try {
+            if (null != apexEngineHandler && apexEngineHandler.isApexEngineRunning()) {
+                apexEngineHandler.shutdown();
+            }
+            apexEngineHandler =
+                    new ApexEngineHandler(pdpUpdateMsg.getPolicies().get(0).getProperties().get("content"));
+            Registry.registerOrReplace(ApexStarterConstants.REG_APEX_ENGINE_HANDLER, apexEngineHandler);
+            if (apexEngineHandler.isApexEngineRunning()) {
+                pdpResponseDetails = pdpMessageHandler.createPdpResonseDetails(pdpUpdateMsg.getRequestId(),
+                    PdpResponseStatus.SUCCESS, "Apex engine started and policies are running.");
+            } else {
                 pdpResponseDetails = pdpMessageHandler.createPdpResonseDetails(pdpUpdateMsg.getRequestId(),
-                        PdpResponseStatus.FAIL, "Apex engine service running failed. " + e.getMessage());
+                    PdpResponseStatus.FAIL, "Apex engine failed to start.");
             }
+        } catch (final ApexStarterException e) {
+            LOGGER.error("Apex engine service running failed. ", e);
+            pdpResponseDetails = pdpMessageHandler.createPdpResonseDetails(pdpUpdateMsg.getRequestId(),
+                    PdpResponseStatus.FAIL, "Apex engine service running failed. " + e.getMessage());
         }
         return pdpResponseDetails;
     }