Support optional cluster name in policy engine 38/131538/5
authorjhh <jorge.hernandez-herrero@att.com>
Tue, 18 Oct 2022 17:08:45 +0000 (12:08 -0500)
committerjhh <jorge.hernandez-herrero@att.com>
Wed, 19 Oct 2022 13:31:02 +0000 (08:31 -0500)
This allows also for correlation with running pod hostnames
in the case of multiple drools pdp flavors coexist.

Issue-ID: POLICY-4403
Signed-off-by: jhh <jorge.hernandez-herrero@att.com>
Change-Id: I81affeeec622e6c0e9627651bf34c0775a796827
Signed-off-by: jhh <jorge.hernandez-herrero@att.com>
24 files changed:
feature-distributed-locking/src/main/feature/db/pooling/sql/1804-distributedlocking.upgrade.sql
feature-distributed-locking/src/main/feature/db/pooling/sql/1811-distributedlocking.upgrade.sql
feature-distributed-locking/src/main/java/org/onap/policy/distributed/locking/DistributedLockManager.java
feature-distributed-locking/src/test/java/org/onap/policy/distributed/locking/DistributedLockManagerTest.java
feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/LifecycleFsm.java
feature-lifecycle/src/main/java/org/onap/policy/drools/server/restful/RestLifecycleManager.java
feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleFsmTest.java
feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleFsmUpdateTest.java
feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateActivePoliciesTest.java
feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateActiveTest.java
feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStatePassiveTest.java
feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateRunningTest.java
feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateTerminatedTest.java
feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/PolicyTypeNativeDroolsControllerTest.java
packages/install/src/files/base.conf
policy-management/src/main/java/org/onap/policy/drools/system/PolicyEngine.java
policy-management/src/main/java/org/onap/policy/drools/system/PolicyEngineConstants.java
policy-management/src/main/java/org/onap/policy/drools/system/PolicyEngineManager.java
policy-management/src/main/server/config/engine.properties
policy-management/src/test/java/org/onap/policy/drools/system/PolicyEngineManagerTest.java
policy-management/src/test/java/org/onap/policy/drools/system/PolicyEngineTest.java
policy-management/src/test/resources/org/onap/policy/drools/system/PolicyEngineManagerTest.json
policy-management/src/test/resources/org/onap/policy/drools/system/PolicyEngineTestAdd.json
policy-management/src/test/resources/org/onap/policy/drools/system/PolicyEngineTestConfig.json

index be56d35..07b3073 100644 (file)
@@ -1,7 +1,7 @@
 #  ============LICENSE_START=======================================================
 #  feature-distributed-locking
 # ================================================================================
-#  Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+#  Copyright (C) 2018, 2022 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.
 #  limitations under the License.
 #  ============LICENSE_END=========================================================
 
- set foreign_key_checks=0; 
- CREATE TABLE if not exists pooling.locks (resourceId VARCHAR(128), host VARCHAR(128), owner VARCHAR(128), expirationTime BIGINT, PRIMARY KEY (resourceId), INDEX idx_expirationTime(expirationTime), INDEX idx_host(host));
+SET foreign_key_checks=0;
 
- set foreign_key_checks=1;
\ No newline at end of file
+CREATE TABLE if NOT EXISTS pooling.locks(
+    resourceId VARCHAR(128),
+    host VARCHAR(128),
+    owner VARCHAR(128),
+    expirationTime BIGINT,
+    PRIMARY KEY (resourceId),
+    INDEX idx_expirationTime(expirationTime),
+    INDEX idx_host(host));
+
+SET foreign_key_checks=1;
\ No newline at end of file
index 847c44a..0cdad5b 100644 (file)
@@ -16,8 +16,8 @@
 #  limitations under the License.
 #  ============LICENSE_END=========================================================
 
- set foreign_key_checks=0;
+SET foreign_key_checks=0;
 
- ALTER TABLE pooling.locks modify expirationTime timestamp default '1971-01-01 00:00:00.000000';
+ALTER TABLE pooling.locks MODIFY expirationTime TIMESTAMP DEFAULT '1971-01-01 00:00:00.000000';
 
- set foreign_key_checks=1;
+SET foreign_key_checks=1;
index 04138ee..198b330 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP
  * ================================================================================
- * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019-2022 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.
@@ -87,17 +87,16 @@ public class DistributedLockManager extends LockManager<DistributedLockManager.D
     @Setter(AccessLevel.PROTECTED)
     private static DistributedLockManager latestInstance = null;
 
-
     /**
      * Name of the host on which this JVM is running.
      */
-    @Getter
-    private final String pdpName;
+    @Getter(AccessLevel.PUBLIC)
+    private String pdpName;
 
     /**
      * UUID of this object.
      */
-    @Getter
+    @Getter(AccessLevel.PUBLIC)
     private final String uuidString = UUID.randomUUID().toString();
 
     /**
@@ -133,7 +132,6 @@ public class DistributedLockManager extends LockManager<DistributedLockManager.D
      * Constructs the object.
      */
     public DistributedLockManager() {
-        this.pdpName = PolicyEngineConstants.PDP_NAME;
         this.resource2lock = getResource2lock();
     }
 
@@ -146,6 +144,7 @@ public class DistributedLockManager extends LockManager<DistributedLockManager.D
     public PolicyResourceLockManager beforeCreateLockManager(PolicyEngine engine, Properties properties) {
 
         try {
+            this.pdpName = PolicyEngineConstants.getManager().getPdpName();
             this.featProps = new DistributedLockProperties(getProperties(CONFIGURATION_PROPERTIES_NAME));
             this.dataSource = makeDataSource();
 
@@ -256,8 +255,9 @@ public class DistributedLockManager extends LockManager<DistributedLockManager.D
      */
     private void checkExpired() {
         try {
-            logger.info("checking for expired locks");
             Set<String> expiredIds = new HashSet<>(resource2lock.keySet());
+            logger.info("checking for expired locks: {}", this);
+
             identifyDbLocks(expiredIds);
             expireLocks(expiredIds);
 
@@ -337,7 +337,7 @@ public class DistributedLockManager extends LockManager<DistributedLockManager.D
 
             DistributedLock lock = lockref.get();
             if (lock != null) {
-                logger.debug("removed lock from map {}", lock);
+                logger.info("lost lock: removed lock from map {}", lock);
                 lock.deny(FeatureLockImpl.LOCK_LOST_MSG);
             }
         }
@@ -704,7 +704,7 @@ public class DistributedLockManager extends LockManager<DistributedLockManager.D
          * @throws SQLException if a DB error occurs
          */
         protected boolean doDbInsert(Connection conn) throws SQLException {
-            logger.debug("insert lock record {}", this);
+            logger.info("insert lock record {}", this);
             try (var stmt = conn.prepareStatement("INSERT INTO pooling.locks (resourceId, host, owner, expirationTime) "
                                             + "values (?, ?, ?, timestampadd(second, ?, now()))")) {
 
@@ -731,7 +731,7 @@ public class DistributedLockManager extends LockManager<DistributedLockManager.D
          * @throws SQLException if a DB error occurs
          */
         protected boolean doDbUpdate(Connection conn) throws SQLException {
-            logger.debug("update lock record {}", this);
+            logger.info("update lock record {}", this);
             try (var stmt = conn.prepareStatement("UPDATE pooling.locks SET resourceId=?, host=?, owner=?,"
                                             + " expirationTime=timestampadd(second, ?, now()) WHERE resourceId=?"
                                             + " AND ((host=? AND owner=?) OR expirationTime < now())")) {
@@ -763,7 +763,7 @@ public class DistributedLockManager extends LockManager<DistributedLockManager.D
          * @throws SQLException if a DB error occurs
          */
         protected void doDbDelete(Connection conn) throws SQLException {
-            logger.debug("delete lock record {}", this);
+            logger.info("delete lock record {}", this);
             try (var stmt = conn
                             .prepareStatement("DELETE FROM pooling.locks WHERE resourceId=? AND host=? AND owner=?")) {
 
@@ -780,7 +780,7 @@ public class DistributedLockManager extends LockManager<DistributedLockManager.D
          * thread.
          */
         private void removeFromMap() {
-            logger.debug("remove lock from map {}", this);
+            logger.info("remove lock from map {}", this);
             feature.resource2lock.remove(getResourceId(), this);
 
             synchronized (this) {
@@ -799,10 +799,16 @@ public class DistributedLockManager extends LockManager<DistributedLockManager.D
     }
 
     @FunctionalInterface
-    private static interface RunnableWithEx {
+    private interface RunnableWithEx {
         void run() throws SQLException;
     }
 
+    @Override
+    public String toString() {
+        return "DistributedLockManager [" + "pdpName=" + pdpName + ", uuidString=" + uuidString
+            + ", resource2lock=" + resource2lock + "]";
+    }
+
     // these may be overridden by junit tests
 
     protected Properties getProperties(String fileName) {
index 2fbdb26..082a619 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP
  * ================================================================================
- * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019-2022 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.
@@ -156,6 +156,7 @@ public class DistributedLockManagerTest {
     @BeforeClass
     public static void setUpBeforeClass() throws SQLException {
         SystemPersistenceConstants.getManager().setConfigurationDir("src/test/resources");
+        PolicyEngineConstants.getManager().configure(new Properties());
 
         conn = DriverManager.getConnection(DB_CONNECTION, DB_USER, DB_PASSWORD);
 
@@ -311,10 +312,9 @@ public class DistributedLockManagerTest {
     /**
      * Tests deleteExpiredDbLocks(), when getConnection() throws an exception.
      *
-     * @throws SQLException if an error occurs
      */
     @Test
-    public void testDeleteExpiredDbLocksEx() throws SQLException {
+    public void testDeleteExpiredDbLocksEx() {
         feature = new InvalidDbLockingFeature(TRANSIENT);
 
         // get the clean-up function and execute it
@@ -342,16 +342,15 @@ public class DistributedLockManagerTest {
     /**
      * Tests afterStop(), when the data source throws an exception when close() is called.
      *
-     * @throws SQLException if an error occurs
      */
     @Test
-    public void testAfterStopEx() throws SQLException {
+    public void testAfterStopEx() {
         shutdownFeature();
 
         // use a data source that throws an exception when closed
         feature = new InvalidDbLockingFeature(TRANSIENT);
 
-        assertThatCode(() -> shutdownFeature()).doesNotThrowAnyException();
+        assertThatCode(this::shutdownFeature).doesNotThrowAnyException();
     }
 
     @Test
@@ -877,7 +876,7 @@ public class DistributedLockManagerTest {
     }
 
     @Test
-    public void testDistributedLockRescheduleRequest() throws SQLException {
+    public void testDistributedLockRescheduleRequest() {
         // use a data source that throws an exception when getConnection() is called
         InvalidDbLockingFeature invfeat = new InvalidDbLockingFeature(TRANSIENT);
         feature = invfeat;
@@ -937,7 +936,7 @@ public class DistributedLockManagerTest {
     }
 
     @Test
-    public void testDistributedLockDoRequest() throws SQLException {
+    public void testDistributedLockDoRequest() {
         lock = getLock(RESOURCE, OWNER_KEY, HOLD_SEC, callback, false);
 
         assertTrue(lock.isWaiting());
@@ -1019,7 +1018,7 @@ public class DistributedLockManagerTest {
         // use a data source that throws an exception when getConnection() is called
         feature = new MyLockingFeature(true) {
             @Override
-            protected BasicDataSource makeDataSource() throws Exception {
+            protected BasicDataSource makeDataSource() {
                 return datasrc;
             }
         };
@@ -1052,7 +1051,7 @@ public class DistributedLockManagerTest {
         // use a data source that throws an exception when getConnection() is called
         feature = new MyLockingFeature(true) {
             @Override
-            protected BasicDataSource makeDataSource() throws Exception {
+            protected BasicDataSource makeDataSource() {
                 return datasrc;
             }
         };
@@ -1232,10 +1231,9 @@ public class DistributedLockManagerTest {
     /**
      * Tests doUnlock() when a DB exception is thrown.
      *
-     * @throws SQLException if an error occurs
      */
     @Test
-    public void testDistributedLockDoUnlockEx() throws SQLException {
+    public void testDistributedLockDoUnlockEx() {
         feature = new InvalidDbLockingFeature(PERMANENT);
 
         lock = getLock(RESOURCE, OWNER_KEY, HOLD_SEC, callback, false);
@@ -1338,10 +1336,9 @@ public class DistributedLockManagerTest {
     /**
      * Tests doExtend() when both update and insert fail.
      *
-     * @throws SQLException if an error occurs
      */
     @Test
-    public void testDistributedLockDoExtendNeitherSucceeds() throws SQLException {
+    public void testDistributedLockDoExtendNeitherSucceeds() {
         /*
          * this feature will create a lock that returns false when doDbUpdate() is
          * invoked, or when doDbInsert() is invoked a second time
@@ -1441,7 +1438,7 @@ public class DistributedLockManagerTest {
         feature.beforeCreateLockManager(engine, new Properties());
         feature.afterStart(engine);
 
-        assertThatCode(() -> shutdownFeature()).doesNotThrowAnyException();
+        assertThatCode(this::shutdownFeature).doesNotThrowAnyException();
     }
 
     /**
index 611ac24..09dcab0 100644 (file)
@@ -39,6 +39,7 @@ import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
+import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.NonNull;
 import lombok.Setter;
@@ -153,6 +154,8 @@ public class LifecycleFsm implements Startable {
     @Setter
     protected String pdpType;
 
+    protected volatile String pdpName;
+
     @Getter
     protected Set<String> mandatoryPolicyTypes = new HashSet<>();
 
@@ -186,12 +189,6 @@ public class LifecycleFsm implements Startable {
 
         logger.info("The mandatory Policy Types are {}. Compliance is {}",
                 mandatoryPolicyTypes, isMandatoryPolicyTypesCompliant());
-
-        stats.setPdpInstanceId(PolicyEngineConstants.PDP_NAME);
-    }
-
-    public String getName() {
-        return PolicyEngineConstants.PDP_NAME;
     }
 
     @GsonJsonIgnore
@@ -204,6 +201,18 @@ public class LifecycleFsm implements Startable {
         return client != null && client.getSink().isAlive();
     }
 
+    /**
+     * Returns the PDP Name.
+     */
+    public String getPdpName() {
+        if (this.pdpName == null) {
+            this.pdpName = PolicyEngineConstants.getManager().getPdpName();
+            this.stats.setPdpInstanceId(pdpName);
+        }
+
+        return this.pdpName;
+    }
+
     /**
      * Current state.
      */
@@ -231,6 +240,8 @@ public class LifecycleFsm implements Startable {
 
     @Override
     public synchronized boolean start() {
+        this.pdpName = PolicyEngineConstants.getManager().getPdpName();
+        stats.setPdpInstanceId(pdpName);
         logger.info("lifecycle event: start engine");
         return state.start();
     }
@@ -651,7 +662,7 @@ public class LifecycleFsm implements Startable {
 
     protected PdpStatus statusPayload(@NonNull PdpState state) {
         var status = new PdpStatus();
-        status.setName(getName());
+        status.setName(getPdpName());
         status.setPdpGroup(group);
         status.setPdpSubgroup(subGroup);
         status.setState(state);
@@ -711,7 +722,7 @@ public class LifecycleFsm implements Startable {
     }
 
     protected boolean isItMe(String name, String group, String subgroup) {
-        if (Objects.equals(name, getName())) {
+        if (Objects.equals(name, getPdpName())) {
             return true;
         }
 
index 494c708..5a53463 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019-2022 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2021 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -155,7 +155,7 @@ public class RestLifecycleManager {
         change.setPdpGroup(LifecycleFeature.getFsm().getGroup());
         change.setPdpSubgroup(LifecycleFeature.getFsm().getSubGroup());
         change.setState(PdpState.valueOf(state));
-        change.setName(LifecycleFeature.getFsm().getName());
+        change.setName(LifecycleFeature.getFsm().getPdpName());
 
         return Response.status(Response.Status.OK).entity(LifecycleFeature.getFsm().stateChange(change)).build();
     }
@@ -442,7 +442,7 @@ public class RestLifecycleManager {
 
     private PdpUpdate getPolicyUpdate() {
         var update = new PdpUpdate();
-        update.setName(LifecycleFeature.getFsm().getName());
+        update.setName(LifecycleFeature.getFsm().getPdpName());
         update.setPdpGroup(LifecycleFeature.getFsm().getGroup());
         update.setPdpSubgroup(LifecycleFeature.getFsm().getSubGroup());
         return update;
index 0ad776c..8c3aeef 100644 (file)
@@ -30,6 +30,7 @@ import java.nio.file.Paths;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Properties;
 import java.util.Set;
 import java.util.concurrent.ScheduledExecutorService;
 import org.junit.AfterClass;
@@ -106,6 +107,7 @@ public class LifecycleFsmTest {
         LoggerUtils.setLevel("org.onap.policy.common.endpoints", "WARN");
         LoggerUtils.setLevel("org.onap.policy.drools", "INFO");
         SystemPersistenceConstants.getManager().setConfigurationDir("target/test-classes");
+        PolicyEngineConstants.getManager().configure(new Properties());
 
         fsm = new LifecycleFsm() {
             @Override
@@ -240,7 +242,7 @@ public class LifecycleFsmTest {
 
         assertEquals(fsm.getGroup(), status.getStatistics().getPdpGroupName());
         assertEquals(fsm.getSubGroup(), status.getStatistics().getPdpSubGroupName());
-        assertEquals(PolicyEngineConstants.PDP_NAME, status.getStatistics().getPdpInstanceId());
+        assertEquals(PolicyEngineConstants.getManager().getPdpName(), status.getStatistics().getPdpInstanceId());
         assertEquals(6, status.getStatistics().getPolicyDeploySuccessCount());
         assertEquals(2, status.getStatistics().getPolicyDeployFailCount());
         assertEquals(8, status.getStatistics().getPolicyDeployCount());
index c97133b..5d56143 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ============LICENSE_START=======================================================
- * Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2021-2022 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2021 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -160,7 +160,7 @@ public class LifecycleFsmUpdateTest {
             Files.deleteIfExists(Paths.get(SystemPersistenceConstants.getManager().getConfigurationPath().toString(),
                     "foo-controller.properties.bak"));
         } catch (IOException ignored) { // NOSONAR
-            // checkstyle
+            // checkstyle
         }
 
         ControllerSupport.setStaticField(LifecycleFeature.class, "fsm", savedFsm);
@@ -186,7 +186,7 @@ public class LifecycleFsmUpdateTest {
         change.setPdpGroup("A");
         change.setPdpSubgroup("a");
         change.setState(PdpState.ACTIVE);
-        change.setName(fsm.getName());
+        change.setName(fsm.getPdpName());
 
         fsm.setSubGroup("a");
         fsm.source.offer(new StandardCoder().encode(change));
@@ -359,7 +359,7 @@ public class LifecycleFsmUpdateTest {
 
     protected PdpUpdate getPdpUpdate(List<ToscaPolicy> policiesToDeploy, List<ToscaPolicy> policiesToUndeploy) {
         PdpUpdate update = new PdpUpdate();
-        update.setName(PolicyEngineConstants.PDP_NAME);
+        update.setName(PolicyEngineConstants.getManager().getPdpName());
         update.setPdpGroup("A");
         update.setPdpSubgroup("a");
         update.setPoliciesToBeDeployed(policiesToDeploy);
index f37e8ef..67efa72 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ============LICENSE_START=======================================================
- * Copyright (C) 2020-2021 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2020-2022 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2021 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -77,7 +77,7 @@ public class LifecycleStateActivePoliciesTest extends LifecycleStateRunningTest
         change.setPdpGroup("A");
         change.setPdpSubgroup("a");
         change.setState(PdpState.ACTIVE);
-        change.setName(fsm.getName());
+        change.setName(fsm.getPdpName());
 
         fsm.setSubGroup("a");
         fsm.source.offer(new StandardCoder().encode(change));
@@ -116,7 +116,7 @@ public class LifecycleStateActivePoliciesTest extends LifecycleStateRunningTest
             getPolicyFromFile(EXAMPLE_NATIVE_DROOLS_POLICY_JSON, EXAMPLE_NATIVE_DROOLS_CONTROLLER_POLICY_NAME);
 
         PdpUpdate update = new PdpUpdate();
-        update.setName(PolicyEngineConstants.PDP_NAME);
+        update.setName(PolicyEngineConstants.getManager().getPdpName());
         update.setPdpGroup("W");
         update.setPdpSubgroup("w");
         update.setPoliciesToBeDeployed(List.of(policyNativeController));
index f4c3314..d00c8a4 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ============LICENSE_START=======================================================
- * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019-2022 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2021 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -75,7 +75,7 @@ public class LifecycleStateActiveTest extends LifecycleStateRunningTest {
         change.setPdpGroup("A");
         change.setPdpSubgroup("a");
         change.setState(PdpState.ACTIVE);
-        change.setName(fsm.getName());
+        change.setName(fsm.getPdpName());
 
         fsm.setSubGroup("a");
         fsm.source.offer(new StandardCoder().encode(change));
@@ -161,7 +161,7 @@ public class LifecycleStateActiveTest extends LifecycleStateRunningTest {
         assertEquals(LifecycleFsm.DEFAULT_PDP_GROUP, fsm.getGroup());
         assertNotEquals("b", fsm.getSubGroup());
 
-        change.setName(fsm.getName());
+        change.setName(fsm.getPdpName());
         fsm.source.offer(new StandardCoder().encode(change));
         assertEquals(PdpState.ACTIVE, fsm.state());
         assertEquals(LifecycleFsm.DEFAULT_PDP_GROUP, fsm.getGroup());
@@ -189,7 +189,7 @@ public class LifecycleStateActiveTest extends LifecycleStateRunningTest {
         // TODO: extract repeated similar assertion blocks into their own helper methods
 
         PdpUpdate update = new PdpUpdate();
-        update.setName(PolicyEngineConstants.PDP_NAME);
+        update.setName(PolicyEngineConstants.getManager().getPdpName());
         update.setPdpGroup("W");
         update.setPdpSubgroup("w");
 
index d99f011..d6c9499 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP
  * ================================================================================
- * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019-2022 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2021 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -143,7 +143,7 @@ public class LifecycleStatePassiveTest extends LifecycleStateRunningTest {
         assertEquals(0, controllerSupport.getController().getDrools().factCount("junits"));
 
         PdpUpdate update = new PdpUpdate();
-        update.setName(PolicyEngineConstants.PDP_NAME);
+        update.setName(PolicyEngineConstants.getManager().getPdpName());
         update.setPdpGroup("Z");
         update.setPdpSubgroup("z");
 
@@ -269,7 +269,7 @@ public class LifecycleStatePassiveTest extends LifecycleStateRunningTest {
         assertNull(fsm.getSubGroup());
 
         PdpUpdate update = new PdpUpdate();
-        update.setName(PolicyEngineConstants.PDP_NAME);
+        update.setName(PolicyEngineConstants.getManager().getPdpName());
         update.setPdpGroup("A");
         update.setPdpSubgroup("a");
 
@@ -294,7 +294,7 @@ public class LifecycleStatePassiveTest extends LifecycleStateRunningTest {
         assertEquals(0, controllerSupport.getController().getDrools().factCount("junits"));
 
         /* correct name */
-        change.setName(fsm.getName());
+        change.setName(fsm.getPdpName());
         fsm.source.offer(new StandardCoder().encode(change));
 
         assertEquals(PdpState.ACTIVE, fsm.state());
@@ -330,8 +330,8 @@ public class LifecycleStatePassiveTest extends LifecycleStateRunningTest {
         assertEquals("foo", status.getPdpType());
         assertEquals(PdpState.TERMINATED, status.getState());
         assertEquals(PdpHealthStatus.HEALTHY, status.getHealthy());
-        assertEquals(PolicyEngineConstants.PDP_NAME, status.getName());
-        assertEquals(fsm.getName(), status.getName());
+        assertEquals(PolicyEngineConstants.getManager().getPdpName(), status.getName());
+        assertEquals(fsm.getPdpName(), status.getName());
         assertEquals(PdpMessageType.PDP_STATUS, status.getMessageName());
     }
 
index eeac888..7b210db 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ============LICENSE_START=======================================================
- * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019-2022 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.
@@ -75,8 +75,8 @@ public abstract class LifecycleStateRunningTest {
         try {
             Files.deleteIfExists(Paths.get(SystemPersistenceConstants.getManager().getConfigurationPath().toString(),
                                      CONTROLLER_NAME + "-controller.properties.bak"));
-        } catch (IOException e) {
-            ;
+        } catch (IOException ignored) {
+            // ignored
         }
         SystemPersistenceConstants.getManager().setConfigurationDir(null);
     }
index 3d8d08b..2364330 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP
  * ================================================================================
- * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019-2022 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2021 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -139,7 +139,7 @@ public class LifecycleStateTerminatedTest {
     @Test
     public void testUpdate() {
         PdpUpdate update = new PdpUpdate();
-        update.setName(PolicyEngineConstants.PDP_NAME);
+        update.setName(PolicyEngineConstants.getManager().getPdpName());
         update.setPdpGroup("A");
         update.setPdpSubgroup("a");
         update.setPoliciesToBeDeployed(Collections.emptyList());
index 2d8b868..b6f354e 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ============LICENSE_START=======================================================
- * Copyright (C) 2020-2021 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2020-2022 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.
@@ -50,7 +50,7 @@ public class PolicyTypeNativeDroolsControllerTest extends LifecycleStateRunningT
      * Test initialization.
      */
     @Before
-    public void init() throws IOException, CoderException {
+    public void init() {
         fsm = makeFsmWithPseudoTime();
     }
 
index ecd9e22..24d95a7 100644 (file)
@@ -43,6 +43,9 @@ TRUSTSTORE_PASSWD=Pol1cy_0nap
 #http_proxy=
 #https_proxy=
 
+# Cluster Identifier if any
+CLUSTER_NAME=
+
 # Telemetry credentials
 TELEMETRY_PORT=9696
 TELEMETRY_HOST=0.0.0.0
index 10623c5..75e7c74 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP
  * ================================================================================
- * Copyright (C) 2017-2021 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2022 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.
@@ -121,6 +121,25 @@ public interface PolicyEngine extends Startable, Lockable, TopicListener {
      */
     String setEnvironmentProperty(String key, String value);
 
+    /**
+     * Gets the hostname used by this PDP-D.
+     */
+    String getHostName();
+
+    /**
+     * Gets the cluster name as configured in $CLUSTER_NAME,
+     * otherwise it will assume an UUID as the cluster name.
+     */
+    String getClusterName();
+
+    /**
+     * Gets the PDP Name from hostname and $CLUSTER_NAME,
+     * otherwise if CLUSTER_NAME is not set, the PdpName
+     * will be the concatenation of the hostname and a
+     * UUID.
+     */
+    String getPdpName();
+
     /**
      * registers a new Policy Controller with the Policy Engine initialized per properties.
      *
index 23fc247..ffd0c85 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * policy-management
  * ================================================================================
- * Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019, 2021-2022 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.
@@ -43,11 +43,6 @@ public final class PolicyEngineConstants {
      */
     public static final String TELEMETRY_SERVER_DEFAULT_NAME = "TELEMETRY";
 
-    /**
-     * Unique name of this drools-pdp JVM.
-     */
-    public static final String PDP_NAME = NetworkUtil.genUniqueName("drools");
-
     /**
      * Policy Engine Manager.
      */
index ea4094f..19aec79 100644 (file)
@@ -31,6 +31,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 import java.util.Properties;
+import java.util.UUID;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.atomic.AtomicReference;
@@ -41,6 +42,8 @@ import java.util.stream.Stream;
 import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.NonNull;
+import lombok.Setter;
+import lombok.Synchronized;
 import lombok.ToString;
 import org.apache.commons.lang3.StringUtils;
 import org.onap.policy.common.endpoints.event.comm.Topic;
@@ -59,6 +62,7 @@ import org.onap.policy.common.endpoints.properties.PolicyEndPointProperties;
 import org.onap.policy.common.gson.annotation.GsonJsonIgnore;
 import org.onap.policy.common.gson.annotation.GsonJsonProperty;
 import org.onap.policy.common.utils.logging.LoggerUtils;
+import org.onap.policy.common.utils.network.NetworkUtil;
 import org.onap.policy.common.utils.resources.PrometheusUtils;
 import org.onap.policy.common.utils.services.FeatureApiUtils;
 import org.onap.policy.drools.controller.DroolsControllerConstants;
@@ -107,6 +111,8 @@ class PolicyEngineManager implements PolicyEngine {
     public static final String EXECUTOR_THREAD_PROP = "executor.threads";
     protected static final int DEFAULT_EXECUTOR_THREADS = 5;
 
+    public static final String CLUSTER_NAME_PROP = "engine.cluster";
+
     /**
      * logger.
      */
@@ -170,6 +176,18 @@ class PolicyEngineManager implements PolicyEngine {
     @Getter
     private final PolicyStatsManager stats = new PolicyStatsManager();
 
+    @Getter(onMethod_ = {@Synchronized}, value = AccessLevel.PUBLIC)
+    @Setter(onMethod_ = {@Synchronized}, value = AccessLevel.PUBLIC)
+    private String clusterName = UUID.randomUUID().toString();
+
+    @Getter(onMethod_ = {@Synchronized}, value = AccessLevel.PUBLIC)
+    @Setter(onMethod_ = {@Synchronized}, value = AccessLevel.PUBLIC)
+    private String hostName = NetworkUtil.getHostname();
+
+    @Getter(onMethod_ = {@Synchronized}, value = AccessLevel.PUBLIC)
+    @Setter(onMethod_ = {@Synchronized}, value = AccessLevel.PUBLIC)
+    private String pdpName;
+
     /**
      * gson parser to decode configuration requests.
      */
@@ -368,6 +386,10 @@ class PolicyEngineManager implements PolicyEngine {
         }
 
         this.properties = properties;
+        if (!StringUtils.isBlank(this.properties.getProperty(CLUSTER_NAME_PROP))) {
+            this.clusterName = this.properties.getProperty(CLUSTER_NAME_PROP, this.clusterName);
+        }
+        this.pdpName = hostName + "." + this.clusterName;
 
         try {
             this.sources = getTopicEndpointManager().addTopicSources(properties);
@@ -438,7 +460,6 @@ class PolicyEngineManager implements PolicyEngine {
 
     @Override
     public synchronized PolicyController createPolicyController(String name, Properties properties) {
-
         String tempName = name;
         // check if a PROPERTY_CONTROLLER_NAME property is present
         // if so, override the given name
index 89a749c..e30682f 100644 (file)
@@ -2,7 +2,7 @@
 # ============LICENSE_START=======================================================
 # ONAP
 # ================================================================================
-# Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved.
+# Copyright (C) 2019, 2021-2022 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.
@@ -36,3 +36,5 @@ http.server.services.CONFIG.serialization.provider=org.onap.policy.common.gson.J
 
 aaf.namespace=${envd:AAF_NAMESPACE:false}
 aaf.root.permission=${envd:AAF_NAMESPACE:org.onap.policy}.pdpd
+
+engine.cluster=${envd:CLUSTER_NAME}
index 82c2869..fe307f2 100644 (file)
@@ -23,6 +23,7 @@ package org.onap.policy.drools.system;
 import static org.assertj.core.api.Assertions.assertThatCode;
 import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
 import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
+import static org.assertj.core.api.Assertions.assertThatNoException;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -46,6 +47,7 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Properties;
+import java.util.UUID;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.function.BiConsumer;
 import java.util.function.Consumer;
@@ -330,6 +332,8 @@ public class PolicyEngineManagerTest {
 
     @Test
     public void testSerialize() {
+        mgr.setHostName("foo");
+        mgr.setClusterName("bar");
         mgr.configure(properties);
         assertThatCode(() -> gson.compareGson(mgr, PolicyEngineManagerTest.class)).doesNotThrowAnyException();
     }
@@ -443,6 +447,35 @@ public class PolicyEngineManagerTest {
         assertFalse(config.isEmpty());
     }
 
+    @Test
+    public void testGetPdpName() {
+        properties.setProperty(PolicyEngineManager.CLUSTER_NAME_PROP, "east1");
+        mgr.configure(properties);
+
+        var pdpName = mgr.getPdpName();
+        assertEquals("east1", extractCluster(pdpName));
+        assertEquals(mgr.getClusterName(), extractCluster(pdpName));
+        assertEquals(mgr.getHostName(), extractHostname(pdpName));
+
+        mgr.setHostName("foo");
+        mgr.setClusterName("bar");
+        mgr.setPdpName("foo.bar");
+
+        pdpName = mgr.getPdpName();
+        assertEquals("bar", extractCluster(pdpName));
+        assertEquals(mgr.getClusterName(), extractCluster(pdpName));
+        assertEquals("foo", extractHostname(pdpName));
+        assertEquals(mgr.getHostName(), extractHostname(pdpName));
+    }
+
+    private String extractCluster(String name) {
+        return name.substring(name.lastIndexOf(".") + 1);
+    }
+
+    private String extractHostname(String name) {
+        return name.substring(0, name.lastIndexOf("."));
+    }
+
     /**
      * Tests that makeExecutorService() uses the value from the thread
      * property.
index 0fdc00a..2054d91 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP
  * ================================================================================
- * Copyright (C) 2017-2021 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2022 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.
@@ -155,17 +155,18 @@ public class PolicyEngineTest {
 
     @Test
     public void test100Configure() {
-        logger.info("enter");
-
-        final Properties engineProps = PolicyEngineConstants.getManager().defaultTelemetryConfig();
+        var manager = (PolicyEngineManager) PolicyEngineConstants.getManager();
+        var engineProps = manager.defaultTelemetryConfig();
 
         /* override default port */
         engineProps.put(PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES + "."
                         + PolicyEngineConstants.TELEMETRY_SERVER_DEFAULT_NAME
                         + PolicyEndPointProperties.PROPERTY_HTTP_PORT_SUFFIX, "" + DEFAULT_TELEMETRY_PORT);
 
-        assertFalse(PolicyEngineConstants.getManager().isAlive());
-        PolicyEngineConstants.getManager().configure(engineProps);
+        assertFalse(manager.isAlive());
+        manager.setHostName("foo");
+        manager.setClusterName("0");
+        manager.configure(engineProps);
         assertFalse(PolicyEngineConstants.getManager().isAlive());
 
         logger.info("engine {} has configuration {}", PolicyEngineConstants.getManager(), engineProps);
index d2d2075..4c7e1f0 100644 (file)
@@ -13,6 +13,9 @@
         { "port": 1002 }
     ],
     "locked": false,
+    "hostName": "foo",
+    "clusterName": "bar",
+    "pdpName": "foo.bar",
     "sinks": [
         { "name": "sink1-topic" },
         { "name": "sink2-topic" }
index 555f361..35afaff 100644 (file)
@@ -1,6 +1,9 @@
 {
     "alive": true,
     "locked": false,
+    "hostName": "foo",
+    "clusterName": "0",
+    "pdpName": "foo.0",
     "sources": [],
     "sinks": [],
     "httpServers": [
index 0e01032..9053c90 100644 (file)
@@ -14,6 +14,9 @@
             "prometheus": false
         }
     ],
+    "clusterName": "0",
+    "hostName": "foo",
+    "pdpName": "foo.0",
     "features": [],
     "controllers": [],
     "stats": {