diff options
author | 2017-09-14 12:31:02 -0500 | |
---|---|---|
committer | 2017-09-21 14:57:24 -0500 | |
commit | 4c53995dd9917f05b9558bb81aa33caf9e8f0f97 (patch) | |
tree | 7ce7b788de60e03d1bac2d3c79fa38c4f515f784 /feature-active-standby-management/src/main/java/org/onap/policy/drools/activestandby/ActiveStandbyFeature.java | |
parent | fbed3c9c7b816b9fa4dd96dc218a0603b1d1c544 (diff) |
Addition of Active-Standby Feature
Patch 1: Adds the active-standby feature to drools-pdp.
This feature provides the state control of the
drools-pdp nodes controlling failover with a site
and across sites. Patch 2: Resolve merge conflict in
packages/install/pom.xml and pom.xml. Patch 3: Resolved
comments from Pamela Dragosh and Jorge Hernandez.
Issue-ID: POLICY-156
Change-Id: I922b3d5d8a464006e9675924bcbc7409d68c08d5
Signed-off-by: Kevin McKiou <km097d@att.com>
Diffstat (limited to 'feature-active-standby-management/src/main/java/org/onap/policy/drools/activestandby/ActiveStandbyFeature.java')
-rw-r--r-- | feature-active-standby-management/src/main/java/org/onap/policy/drools/activestandby/ActiveStandbyFeature.java | 240 |
1 files changed, 240 insertions, 0 deletions
diff --git a/feature-active-standby-management/src/main/java/org/onap/policy/drools/activestandby/ActiveStandbyFeature.java b/feature-active-standby-management/src/main/java/org/onap/policy/drools/activestandby/ActiveStandbyFeature.java new file mode 100644 index 00000000..d40a9e0f --- /dev/null +++ b/feature-active-standby-management/src/main/java/org/onap/policy/drools/activestandby/ActiveStandbyFeature.java @@ -0,0 +1,240 @@ +/*- + * ============LICENSE_START======================================================= + * feature-active-standby-management + * ================================================================================ + * Copyright (C) 2017 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. + * 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. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.drools.activestandby; + +import java.io.IOException; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.onap.policy.drools.core.PolicySessionFeatureAPI; +import org.onap.policy.drools.features.PolicyEngineFeatureAPI; +import org.onap.policy.drools.statemanagement.StateManagementFeatureAPI; +import org.onap.policy.drools.system.PolicyEngine; +import org.onap.policy.drools.utils.PropertyUtil; + +/** + * If this feature is supported, there is a single instance of it. + * It adds persistence to Drools sessions, but it is also intertwined with + * active/standby state management and IntegrityMonitor. For now, they are + * all treated as a single feature, but it would be nice to separate them. + * + * The bulk of the code here was once in other classes, such as + * 'PolicyContainer' and 'Main'. It was moved here as part of making this + * a separate optional feature. + */ +public class ActiveStandbyFeature implements ActiveStandbyFeatureAPI, + PolicySessionFeatureAPI, PolicyEngineFeatureAPI +{ + // get an instance of logger + private static final Logger logger = + LoggerFactory.getLogger(ActiveStandbyFeature.class); + + private static DroolsPdp myPdp; + private static Object myPdpSync = new Object(); + private static DroolsPdpsElectionHandler electionHandler; + + private StateManagementFeatureAPI stateManagementFeature; + + public static final int SEQ_NUM = 1; + + + /**************************/ + /* 'FeatureAPI' interface */ + /**************************/ + + /** + * {@inheritDoc} + */ + @Override + public int getSequenceNumber() + { + return(SEQ_NUM); + } + + /** + * {@inheritDoc} + */ + @Override + public void globalInit(String args[], String configDir) + { + // This must come first since it initializes myPdp + initializePersistence(configDir); + + for (StateManagementFeatureAPI feature : StateManagementFeatureAPI.impl.getList()) + { + if (feature.getResourceName().equals(myPdp.getPdpId())) + { + if(logger.isDebugEnabled()){ + logger.debug("ActiveStandbyFeature.globalInit: Found StateManagementFeature" + + " with resourceName: {}", myPdp.getPdpId()); + } + stateManagementFeature = feature; + break; + } + } + if(stateManagementFeature == null){ + if(logger.isDebugEnabled()){ + logger.debug("ActiveStandbyFeature failed to initialize. " + + "Unable to get instance of StateManagementFeatureAPI " + + "with resourceID: {}", myPdp.getPdpId()); + } + logger.error("ActiveStandbyFeature failed to initialize. " + + "Unable to get instance of StateManagementFeatureAPI " + + "with resourceID: {}", myPdp.getPdpId()); + } + + + + //Create an instance of the Observer + PMStandbyStateChangeNotifier pmNotifier = new PMStandbyStateChangeNotifier(); + + //Register the PMStandbyStateChangeNotifier Observer + stateManagementFeature.addObserver(pmNotifier); + if(logger.isDebugEnabled()){ + logger.debug("ActiveStandbyFeature.globalInit() exit"); + } + } + + + /** + * {@inheritDoc} + */ + @Override + public boolean afterStart(PolicyEngine engine) + { + // ASSERTION: engine == PolicyEngine.manager + PolicyEngine.manager.lock(); + return false; + } + + /** + * Read in the persistence properties, determine whether persistence is + * enabled or disabled, and initialize persistence if enabled. + */ + private static void initializePersistence(String configDir) + { + //Get the Active Standby properties + try { + Properties activeStandbyProperties = + PropertyUtil.getProperties(configDir + "/feature-active-standby-management.properties"); + ActiveStandbyProperties.initProperties(activeStandbyProperties); + logger.info("initializePersistence: ActiveStandbyProperties success"); + } catch (IOException e) { + logger.error("ActiveStandbyFeature: initializePersistence ActiveStandbyProperties", e); + } + + DroolsPdpsConnector conn = getDroolsPdpsConnector("activeStandbyPU"); + String resourceName = ActiveStandbyProperties.getProperty(ActiveStandbyProperties.NODE_NAME); + if(resourceName == null){ + throw new NullPointerException(); + } + + /* + * In a JUnit test environment, one or more PDPs may already have been + * inserted in the DB, so we need to check for this. + */ + DroolsPdp existingPdp = conn.getPdp(resourceName); + if (existingPdp != null) { + System.out.println("Found existing PDP record, pdpId=" + + existingPdp.getPdpId() + ", isDesignated=" + + existingPdp.isDesignated() + ", updatedDate=" + + existingPdp.getUpdatedDate()); + myPdp = existingPdp; + } + + synchronized(myPdpSync){ + if(myPdp == null){ + + myPdp = new DroolsPdpImpl(resourceName,false,4,new Date()); + } + if(myPdp != null){ + String site_name = ActiveStandbyProperties.getProperty(ActiveStandbyProperties.SITE_NAME); + if (site_name == null) { + site_name = ""; + }else{ + site_name = site_name.trim(); + } + myPdp.setSiteName(site_name); + } + if(electionHandler == null){ + electionHandler = new DroolsPdpsElectionHandler(conn,myPdp); + } + } + System.out.println("\n\nThis controller is a standby, waiting to be chosen as primary...\n\n"); + logger.info("\n\nThis controller is a standby, waiting to be chosen as primary...\n\n"); + } + + + /* + * Moved code to instantiate a JpaDroolsPdpsConnector object from main() to + * this method, so it can also be accessed from StandbyStateChangeNotifier + * class. + */ + public static DroolsPdpsConnector getDroolsPdpsConnector(String pu) { + + Map<String, Object> propMap = new HashMap<String, Object>(); + propMap.put("javax.persistence.jdbc.driver", ActiveStandbyProperties + .getProperty(ActiveStandbyProperties.DB_DRIVER)); + propMap.put("javax.persistence.jdbc.url", + ActiveStandbyProperties.getProperty(ActiveStandbyProperties.DB_URL)); + propMap.put("javax.persistence.jdbc.user", ActiveStandbyProperties + .getProperty(ActiveStandbyProperties.DB_USER)); + propMap.put("javax.persistence.jdbc.password", + ActiveStandbyProperties.getProperty(ActiveStandbyProperties.DB_PWD)); + + EntityManagerFactory emf = Persistence.createEntityManagerFactory( + pu, propMap); + DroolsPdpsConnector conn = new JpaDroolsPdpsConnector(emf); + + return conn; + } + + /** + * {@inheritDoc} + */ + @Override + public String getPdpdNowActive(){ + return electionHandler.getPdpdNowActive(); + } + + /** + * {@inheritDoc} + */ + @Override + public String getPdpdLastActive(){ + return electionHandler.getPdpdLastActive(); + } + + /** + * {@inheritDoc} + */ + @Override + public String getResourceName() { + return myPdp.getPdpId(); + } +} |