Fix db exception in frankfurt junit 11/104411/1
authorJim Hahn <jrh3@att.com>
Wed, 25 Mar 2020 19:24:41 +0000 (15:24 -0400)
committerJim Hahn <jrh3@att.com>
Wed, 25 Mar 2020 19:24:41 +0000 (15:24 -0400)
Frankfurt junits were generating the following output:

  Value too long for column "TARGET VARCHAR(50)":
    "'Target [type=VNF, resourceId=bbb3cefd-01c8-413c-9bdd-2b92f9ca3d38]'

The issue turned out to be caused by the fact that the rules for the
new actor were storing the "Target" instead of the "TargetEntity"
in the DB field.  Modified the code to store the target entity, as the
the usecases rules do.

Issue-ID: POLICY-2441
Signed-off-by: Jim Hahn <jrh3@att.com>
Change-Id: I91ee517ef073e3dc3fea4698c814b57a06d87095

controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager2.java
controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/ophistory/OperationHistoryDataManager.java
controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/ophistory/OperationHistoryDataManagerImpl.java
controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/ophistory/OperationHistoryDataManagerStub.java
controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager2Test.java
controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/ophistory/OperationHistoryDataManagerImplTest.java
controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/ophistory/OperationHistoryDataManagerStubTest.java

index 156dad7..a096522 100644 (file)
@@ -585,7 +585,7 @@ public class ControlLoopOperationManager2 implements Serializable {
      * Stores the latest operation in the DB.
      */
     private void storeOperationInDataBase() {
-        operContext.getDataManager().store(requestId, eventContext.getEvent(),
+        operContext.getDataManager().store(requestId, eventContext.getEvent(), targetEntity,
                         operationHistory.peekLast().getClOperation());
     }
 
index a1774ea..091c38e 100644 (file)
@@ -34,9 +34,10 @@ public interface OperationHistoryDataManager {
      *
      * @param requestId request ID
      * @param event event with which the operation is associated
+     * @param targetEntity target entity associated with the operation
      * @param operation operation to be stored
      */
-    void store(String requestId, VirtualControlLoopEvent event, ControlLoopOperation operation);
+    void store(String requestId, VirtualControlLoopEvent event, String targetEntity, ControlLoopOperation operation);
 
     /**
      * Starts the background thread.
index f7576f1..5de38a4 100644 (file)
@@ -110,6 +110,8 @@ public class OperationHistoryDataManagerImpl implements OperationHistoryDataMana
             return;
         }
 
+        logger.info("start operation history thread");
+
         thread = makeThread(emFactory, this::run);
         thread.setDaemon(true);
         thread.start();
@@ -117,6 +119,8 @@ public class OperationHistoryDataManagerImpl implements OperationHistoryDataMana
 
     @Override
     public synchronized void stop() {
+        logger.info("requesting stop of operation history thread");
+
         stopped = true;
 
         if (thread == null) {
@@ -130,7 +134,8 @@ public class OperationHistoryDataManagerImpl implements OperationHistoryDataMana
     }
 
     @Override
-    public synchronized void store(String requestId, VirtualControlLoopEvent event, ControlLoopOperation operation) {
+    public synchronized void store(String requestId, VirtualControlLoopEvent event, String targetEntity,
+                    ControlLoopOperation operation) {
 
         if (stopped) {
             logger.warn("operation history thread is stopped, discarding requestId={} event={} operation={}", requestId,
@@ -138,7 +143,7 @@ public class OperationHistoryDataManagerImpl implements OperationHistoryDataMana
             return;
         }
 
-        operations.add(new Record(requestId, event, operation));
+        operations.add(new Record(requestId, event, targetEntity, operation));
 
         if (operations.size() > maxQueueLength) {
             Record discarded = operations.remove();
@@ -204,6 +209,7 @@ public class OperationHistoryDataManagerImpl implements OperationHistoryDataMana
      * @param firstRecord first record to be stored
      */
     private void storeBatch(EntityManager entityManager, Record firstRecord) {
+        logger.info("store operation history record batch");
 
         try (EntityMgrCloser emc = new EntityMgrCloser(entityManager);
                         EntityTransCloser trans = new EntityTransCloser(entityManager.getTransaction())) {
@@ -233,17 +239,18 @@ public class OperationHistoryDataManagerImpl implements OperationHistoryDataMana
      * @param record record to be stored
      */
     private void storeRecord(EntityManager entityMgr, Record record) {
-
         Dbao newEntry = new Dbao();
 
         final VirtualControlLoopEvent event = record.getEvent();
         final ControlLoopOperation operation = record.getOperation();
 
+        logger.info("store operation history record for {}", event.getRequestId());
+
         newEntry.setClosedLoopName(event.getClosedLoopControlName());
         newEntry.setRequestId(record.getRequestId());
         newEntry.setActor(operation.getActor());
         newEntry.setOperation(operation.getOperation());
-        newEntry.setTarget(operation.getTarget());
+        newEntry.setTarget(record.getTargetEntity());
         newEntry.setSubrequestId(operation.getSubRequestId());
         newEntry.setMessage(operation.getMessage());
         newEntry.setOutcome(operation.getOutcome());
@@ -280,6 +287,7 @@ public class OperationHistoryDataManagerImpl implements OperationHistoryDataMana
     private static class Record {
         private String requestId;
         private VirtualControlLoopEvent event;
+        private String targetEntity;
         private ControlLoopOperation operation;
     }
 
index e1e0cbe..bd2ee04 100644 (file)
@@ -29,7 +29,8 @@ import org.onap.policy.controlloop.VirtualControlLoopEvent;
 public class OperationHistoryDataManagerStub implements OperationHistoryDataManager {
 
     @Override
-    public void store(String requestId, VirtualControlLoopEvent event, ControlLoopOperation operation) {
+    public void store(String requestId, VirtualControlLoopEvent event, String targetEntity,
+                    ControlLoopOperation operation) {
         // do nothing
     }
 
index e946d2e..9c2e22d 100644 (file)
@@ -276,7 +276,7 @@ public class ControlLoopOperationManager2Test {
         verify(mgrctx).updated(mgr);
 
         // should not have tried to store anything in the DB
-        verify(dataMgr, never()).store(any(), any(), any());
+        verify(dataMgr, never()).store(any(), any(), any(), any());
     }
 
     @Test
@@ -561,7 +561,7 @@ public class ControlLoopOperationManager2Test {
         assertTrue(mgr.nextStep());
         verify(mgrctx, times(2)).updated(mgr);
 
-        verify(dataMgr, never()).store(any(), any(), any());
+        verify(dataMgr, never()).store(any(), any(), any(), any());
     }
 
     /**
@@ -951,10 +951,13 @@ public class ControlLoopOperationManager2Test {
     }
 
     private void verifyDb(int nrecords, PolicyResult expectedResult, String expectedMsg) {
-        ArgumentCaptor<ControlLoopOperation> captor = ArgumentCaptor.forClass(ControlLoopOperation.class);
-        verify(dataMgr, times(nrecords)).store(any(), any(), captor.capture());
+        ArgumentCaptor<String> entityCaptor = ArgumentCaptor.forClass(String.class);
+        ArgumentCaptor<ControlLoopOperation> opCaptor = ArgumentCaptor.forClass(ControlLoopOperation.class);
+        verify(dataMgr, times(nrecords)).store(any(), any(), entityCaptor.capture(), opCaptor.capture());
 
-        ControlLoopOperation oper = captor.getValue();
+        assertEquals(MY_TARGET, entityCaptor.getValue());
+
+        ControlLoopOperation oper = opCaptor.getValue();
 
         assertEquals(expectedResult.toString(), oper.getOutcome());
         assertEquals(expectedMsg, oper.getMessage());
index 8e3c1fa..e6c66d1 100644 (file)
@@ -54,6 +54,7 @@ public class OperationHistoryDataManagerImplTest {
 
     private static final IllegalStateException EXPECTED_EXCEPTION = new IllegalStateException("expected exception");
     private static final String MY_TARGET = "my-target";
+    private static final String MY_ENTITY = "my-entity";
     private static final String REQ_ID = "my-request-id";
     private static final int BATCH_SIZE = 5;
     private static final int MAX_QUEUE_LENGTH = 23;
@@ -165,7 +166,7 @@ public class OperationHistoryDataManagerImplTest {
     @Test
     public void testStore_testStop() throws InterruptedException {
         // store
-        mgr.store(REQ_ID, event, operation);
+        mgr.store(REQ_ID, event, MY_ENTITY, operation);
 
         runThread();
 
@@ -192,7 +193,7 @@ public class OperationHistoryDataManagerImplTest {
         mgr.stop();
 
         // store
-        mgr.store(REQ_ID, event, operation);
+        mgr.store(REQ_ID, event, MY_ENTITY, operation);
 
         assertEquals(0, mgr.getRecordsAdded());
     }
@@ -204,7 +205,7 @@ public class OperationHistoryDataManagerImplTest {
     public void testStoreTooManyItems() throws InterruptedException {
         final int nextra = 5;
         for (int nitems = 0; nitems < MAX_QUEUE_LENGTH + nextra; ++nitems) {
-            mgr.store(REQ_ID, event, operation);
+            mgr.store(REQ_ID, event, MY_ENTITY, operation);
         }
 
         runThread();
@@ -225,9 +226,9 @@ public class OperationHistoryDataManagerImplTest {
         mgr = new RealThread();
         mgr.start();
 
-        mgr.store(REQ_ID, event, operation);
-        mgr.store(REQ_ID, event, operation);
-        mgr.store(REQ_ID, event, operation);
+        mgr.store(REQ_ID, event, MY_ENTITY, operation);
+        mgr.store(REQ_ID, event, MY_ENTITY, operation);
+        mgr.store(REQ_ID, event, MY_ENTITY, operation);
 
         waitForThread();
 
@@ -261,9 +262,9 @@ public class OperationHistoryDataManagerImplTest {
         mgr = new RealThread();
         mgr.start();
 
-        mgr.store(REQ_ID, event, operation);
-        mgr.store(REQ_ID, event, operation);
-        mgr.store(REQ_ID, event, operation);
+        mgr.store(REQ_ID, event, MY_ENTITY, operation);
+        mgr.store(REQ_ID, event, MY_ENTITY, operation);
+        mgr.store(REQ_ID, event, MY_ENTITY, operation);
 
         waitForThread();
 
@@ -278,7 +279,7 @@ public class OperationHistoryDataManagerImplTest {
         // arrange to throw an exception
         when(emfSpy.createEntityManager()).thenThrow(EXPECTED_EXCEPTION);
 
-        mgr.store(REQ_ID, event, operation);
+        mgr.store(REQ_ID, event, MY_ENTITY, operation);
 
         runThread();
     }
@@ -286,22 +287,22 @@ public class OperationHistoryDataManagerImplTest {
     @Test
     public void testStoreRecord() throws InterruptedException {
         // no start time
-        mgr.store(REQ_ID, event, operation);
+        mgr.store(REQ_ID, event, MY_ENTITY, operation);
 
         // no start time
         operation = new ControlLoopOperation(operation);
         operation.setStart(Instant.now());
-        mgr.store(REQ_ID, event, operation);
+        mgr.store(REQ_ID, event, MY_ENTITY, operation);
 
         // both start and end times
         operation = new ControlLoopOperation(operation);
         operation.setEnd(Instant.now());
-        mgr.store(REQ_ID, event, operation);
+        mgr.store(REQ_ID, event, MY_ENTITY, operation);
 
         // only end time
         operation = new ControlLoopOperation(operation);
         operation.setStart(null);
-        mgr.store(REQ_ID, event, operation);
+        mgr.store(REQ_ID, event, MY_ENTITY, operation);
 
         runThread();
 
index f4a7ff8..a6f5062 100644 (file)
@@ -30,7 +30,7 @@ public class OperationHistoryDataManagerStubTest {
     public void test() {
         OperationHistoryDataManagerStub mgr = new OperationHistoryDataManagerStub();
 
-        assertThatCode(() -> mgr.store(null, null, null)).doesNotThrowAnyException();
+        assertThatCode(() -> mgr.store(null, null, null, null)).doesNotThrowAnyException();
         assertThatCode(() -> mgr.stop()).doesNotThrowAnyException();
     }
 }