From 149df90bb72ece740accaf3ea037cf40defcd1bd Mon Sep 17 00:00:00 2001 From: jhh Date: Tue, 9 Mar 2021 10:01:17 -0600 Subject: add no locking feature It provides an interface to applications for locking purposes that always succeeds. It does not deny acquiring resource locks. Issue-ID: POLICY-3114 Signed-off-by: jhh Change-Id: I6aebb5f40e4176e0ff7b0e6c6d4042a79dd0b7a3 Signed-off-by: jhh --- feature-no-locking/pom.xml | 116 +++++++++++++++++++++ feature-no-locking/src/assembly/assemble_zip.xml | 76 ++++++++++++++ .../org/onap/policy/no/locking/NoLockManager.java | 96 +++++++++++++++++ ...p.policy.drools.features.PolicyEngineFeatureApi | 1 + .../onap/policy/no/locking/NoLockManagerTest.java | 96 +++++++++++++++++ packages/docker/src/main/docker/Dockerfile | 2 +- packages/install/pom.xml | 6 ++ policy-core/pom.xml | 4 +- .../policy/drools/core/lock/AlwaysSuccessLock.java | 64 ++++++++++++ .../drools/core/lock/AlwaysFailLockTest.java | 61 +---------- .../drools/core/lock/AlwaysLockBaseTest.java | 71 +++++++++++++ .../drools/core/lock/AlwaysSuccessLockTest.java | 69 ++++++++++++ .../policy/drools/system/PolicyEngineManager.java | 3 + pom.xml | 1 + 14 files changed, 606 insertions(+), 60 deletions(-) create mode 100644 feature-no-locking/pom.xml create mode 100644 feature-no-locking/src/assembly/assemble_zip.xml create mode 100644 feature-no-locking/src/main/java/org/onap/policy/no/locking/NoLockManager.java create mode 100644 feature-no-locking/src/main/resources/META-INF.services/org.onap.policy.drools.features.PolicyEngineFeatureApi create mode 100644 feature-no-locking/src/test/java/org/onap/policy/no/locking/NoLockManagerTest.java create mode 100644 policy-core/src/main/java/org/onap/policy/drools/core/lock/AlwaysSuccessLock.java create mode 100644 policy-core/src/test/java/org/onap/policy/drools/core/lock/AlwaysLockBaseTest.java create mode 100644 policy-core/src/test/java/org/onap/policy/drools/core/lock/AlwaysSuccessLockTest.java diff --git a/feature-no-locking/pom.xml b/feature-no-locking/pom.xml new file mode 100644 index 00000000..202f3c13 --- /dev/null +++ b/feature-no-locking/pom.xml @@ -0,0 +1,116 @@ + + + + + 4.0.0 + + + org.onap.policy.drools-pdp + drools-pdp + 1.8.1-SNAPSHOT + + + feature-no-locking + + feature-no-locking + Loadable module that provides no locking capability + + + + + maven-assembly-plugin + + + zipfile + + single + + package + + true + ${project.artifactId}-${project.version} + + src/assembly/assemble_zip.xml + + false + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + + copy-dependencies + + prepare-package + + ${project.build.directory}/assembly/lib + false + true + true + false + false + false + runtime + true + + + + + + + + + + org.onap.policy.drools-pdp + policy-core + ${project.version} + provided + + + org.onap.policy.drools-pdp + policy-management + ${project.version} + provided + + + junit + junit + test + + + org.assertj + assertj-core + test + + + org.powermock + powermock-api-mockito2 + test + + + + diff --git a/feature-no-locking/src/assembly/assemble_zip.xml b/feature-no-locking/src/assembly/assemble_zip.xml new file mode 100644 index 00000000..2c74fc00 --- /dev/null +++ b/feature-no-locking/src/assembly/assemble_zip.xml @@ -0,0 +1,76 @@ + + + + + + + feature-no-locking + + zip + + + false + + + + target + lib/feature + + feature-no-locking-${project.version}.jar + + + + target/assembly/lib + lib/dependencies + + *.jar + + + + src/main/feature/config + config + 0644 + + + + src/main/feature/bin + bin + 0744 + + + + src/main/feature/db + db + 0744 + + + + src/main/feature/install + install + 0744 + + + + + \ No newline at end of file diff --git a/feature-no-locking/src/main/java/org/onap/policy/no/locking/NoLockManager.java b/feature-no-locking/src/main/java/org/onap/policy/no/locking/NoLockManager.java new file mode 100644 index 00000000..1fa44391 --- /dev/null +++ b/feature-no-locking/src/main/java/org/onap/policy/no/locking/NoLockManager.java @@ -0,0 +1,96 @@ +/* + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2021 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.no.locking; + +import java.util.Properties; +import lombok.NoArgsConstructor; +import lombok.ToString; +import org.onap.policy.drools.core.lock.AlwaysSuccessLock; +import org.onap.policy.drools.core.lock.Lock; +import org.onap.policy.drools.core.lock.LockCallback; +import org.onap.policy.drools.core.lock.PolicyResourceLockManager; +import org.onap.policy.drools.features.PolicyEngineFeatureApi; +import org.onap.policy.drools.system.PolicyEngine; + +/** + * In contrast with other implementations the no-lock manager provides non-synchronized access + * to resources. + */ + +@NoArgsConstructor +@ToString +public class NoLockManager implements PolicyResourceLockManager, PolicyEngineFeatureApi { + + protected static final int SEQNO = 2000; + + @Override + public Lock createLock(String resourceId, String ownerKey, int holdSec, + LockCallback callback, boolean waitForLock) { + AlwaysSuccessLock successLock = new AlwaysSuccessLock(resourceId, ownerKey, holdSec, callback); + successLock.notifyAvailable(); + return successLock; + } + + @Override + public boolean lock() { + return true; + } + + @Override + public boolean unlock() { + return true; + } + + @Override + public boolean isLocked() { + return false; + } + + @Override + public boolean start() { + return true; + } + + @Override + public boolean stop() { + return true; + } + + @Override + public void shutdown() { + // nothing to do + } + + @Override + public boolean isAlive() { + return true; + } + + @Override + public int getSequenceNumber() { + return SEQNO; + } + + @Override + public PolicyResourceLockManager beforeCreateLockManager(PolicyEngine engine, Properties properties) { + return this; + } +} diff --git a/feature-no-locking/src/main/resources/META-INF.services/org.onap.policy.drools.features.PolicyEngineFeatureApi b/feature-no-locking/src/main/resources/META-INF.services/org.onap.policy.drools.features.PolicyEngineFeatureApi new file mode 100644 index 00000000..e8a5d79f --- /dev/null +++ b/feature-no-locking/src/main/resources/META-INF.services/org.onap.policy.drools.features.PolicyEngineFeatureApi @@ -0,0 +1 @@ +org.onap.policy.no.locking.NoLockManager \ No newline at end of file diff --git a/feature-no-locking/src/test/java/org/onap/policy/no/locking/NoLockManagerTest.java b/feature-no-locking/src/test/java/org/onap/policy/no/locking/NoLockManagerTest.java new file mode 100644 index 00000000..bae9d109 --- /dev/null +++ b/feature-no-locking/src/test/java/org/onap/policy/no/locking/NoLockManagerTest.java @@ -0,0 +1,96 @@ +/* + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2021 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.no.locking; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; + +import org.junit.Before; +import org.junit.Test; +import org.onap.policy.drools.core.lock.AlwaysSuccessLock; +import org.onap.policy.drools.core.lock.Lock; +import org.onap.policy.drools.core.lock.LockCallback; + +public class NoLockManagerTest { + + private NoLockManager nlm; + private LockCallback callback; + + @Before + public void setUp() { + callback = mock(LockCallback.class); + nlm = new NoLockManager(); + } + + @Test + public void testLock() { + assertTrue(nlm.lock()); + } + + @Test + public void testUnlock() { + assertTrue(nlm.unlock()); + } + + @Test + public void testIsLocked() { + assertFalse(nlm.isLocked()); + } + + @Test + public void testStart() { + assertTrue(nlm.start()); + } + + @Test + public void testStop() { + assertTrue(nlm.stop()); + } + + @Test + public void testIsAlive() { + assertTrue(nlm.isAlive()); + } + + @Test + public void testGetSeqNo() { + assertEquals(NoLockManager.SEQNO, nlm.getSequenceNumber()); + } + + @Test + public void testBeforeCreateLockManager() { + assertEquals(nlm, nlm.beforeCreateLockManager(null, null)); + } + + @Test + public void testCreateLock() { + Lock lock = nlm.createLock("x", "y", 1, callback, false); + assertTrue(lock.isActive()); + assertTrue(lock instanceof AlwaysSuccessLock); + verify(callback).lockAvailable(lock); + verify(callback, never()).lockUnavailable(any()); + } +} \ No newline at end of file diff --git a/packages/docker/src/main/docker/Dockerfile b/packages/docker/src/main/docker/Dockerfile index 2277bc77..39d9ff06 100644 --- a/packages/docker/src/main/docker/Dockerfile +++ b/packages/docker/src/main/docker/Dockerfile @@ -73,7 +73,7 @@ RUN unzip -o install-drools.zip && \ chmod 600 $POLICY_HOME/config/* && \ rm -f $POLICY_INSTALL/*.conf && \ . $POLICY_HOME/etc/profile.d/env.sh && \ - $POLICY_HOME/bin/features install healthcheck distributed-locking lifecycle && \ + $POLICY_HOME/bin/features install healthcheck distributed-locking lifecycle no-locking && \ $POLICY_HOME/bin/features enable lifecycle && \ find $HOME/.m2/ -name _maven.repositories -exec rm -v {} \; && \ find $HOME/.m2/ -name _remote.repositories -exec rm -v {} \; && \ diff --git a/packages/install/pom.xml b/packages/install/pom.xml index c16a9a56..e11718db 100644 --- a/packages/install/pom.xml +++ b/packages/install/pom.xml @@ -139,6 +139,12 @@ ${project.version} zip + + org.onap.policy.drools-pdp + feature-no-locking + ${project.version} + zip + diff --git a/policy-core/pom.xml b/policy-core/pom.xml index af01bc93..33a9e12b 100644 --- a/policy-core/pom.xml +++ b/policy-core/pom.xml @@ -1,7 +1,7 @@