Skip to content

Commit 39cf8d9

Browse files
committed
Adding user info related information regarding deployment process actions
LMCROSSITXSADEPLOY-3329
1 parent 46fcac1 commit 39cf8d9

17 files changed

Lines changed: 174 additions & 25 deletions

File tree

multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/Constants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public class Constants {
3636
public static final String TRIPLE_APPENDED_STRING = "%s%s%s";
3737
public static final String SECURE_EXTENSION_DESCRIPTOR_ID = "__mta.secure";
3838
public static final String STRING_SEPARATOR = "-";
39+
public static final String AUTH_TOKEN_ORIGIN_FIELD = "origin";
3940

4041
public static final Long UNSET_LAST_LOG_TIMESTAMP_MS = 0L;
4142
public static final int LOG_STALLED_TASK_MINUTE_INTERVAL = 5;

multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/Messages.java

100644100755
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,8 @@ public class Messages {
295295
public static final String UNBINDING_SERVICE_INSTANCE_FROM_APP = "Unbinding service instance \"{0}\" from application \"{1}\"...";
296296
public static final String UNBINDING_SERVICE_INSTANCE_FROM_APP_FINISHED = "Unbinding service instance \"{0}\" from application \"{1}\" finished";
297297
public static final String POLLING_SERVICE_OPERATIONS = "Polling service operations...";
298-
public static final String AUTO_ABORTING_PROCESS_0 = "Auto-aborting process \"{0}\"...";
298+
public static final String AUTO_ABORTING_PROCESS_0 = "Auto-aborting process with processId: \"{0}\", action: \"{1}\", actor: system ...";
299+
public static final String DEPLOYMENT_PROCESS_ACTION_EXECUTED_FOR_PROCESS_0_ACTION_1_USER_2_ORIGIN_3 = "MTA deployment process action executed - processId: \"{0}\", action: \"{1}\", userGUID: \"{2}\", origin: \"{3}\"";
299300
public static final String SOME_INSTANCES_ARE_DOWN = "Some instances are down. Check the application logs of your application for details.";
300301
public static final String SOME_INSTANCES_HAVE_CRASHED = "Some instances have crashed. Check the application logs of your application for details.";
301302
public static final String CLEAN_UP_JOB_STARTED_BY_APPLICATION_INSTANCE_0_AT_1 = "Clean-up job started by application instance {0} at: {1}";

multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/flowable/AbortProcessAction.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,8 @@ public Action getAction() {
9090
return Action.ABORT;
9191
}
9292

93-
private Logger getLogger() {
93+
@Override
94+
protected Logger getLogger() {
9495
return LOGGER;
9596
}
9697

multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/flowable/ProcessAction.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.cloudfoundry.multiapps.controller.process.flowable;
22

3+
import java.text.MessageFormat;
34
import java.util.List;
45
import java.util.stream.Collectors;
56

@@ -9,11 +10,14 @@
910
import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientProvider;
1011
import org.cloudfoundry.multiapps.controller.core.util.UserInfo;
1112
import org.cloudfoundry.multiapps.controller.persistence.services.OperationService;
13+
import org.cloudfoundry.multiapps.controller.process.Constants;
14+
import org.cloudfoundry.multiapps.controller.process.Messages;
1215
import org.cloudfoundry.multiapps.controller.process.util.ClientReleaser;
1316
import org.cloudfoundry.multiapps.controller.process.util.HistoryUtil;
1417
import org.cloudfoundry.multiapps.controller.process.variables.Variables;
1518
import org.flowable.engine.HistoryService;
1619
import org.flowable.engine.RuntimeService;
20+
import org.slf4j.Logger;
1721

1822
public abstract class ProcessAction {
1923

@@ -38,6 +42,10 @@ protected List<String> getActiveExecutionIds(String superProcessInstanceId) {
3842
}
3943

4044
public void execute(UserInfo userInfo, String superProcessInstanceId) {
45+
if (userInfo != null) {
46+
logLifecycle(userInfo, superProcessInstanceId);
47+
}
48+
4149
for (AdditionalProcessAction additionalProcessAction : filterAdditionalActionsForThisAction()) {
4250
additionalProcessAction.executeAdditionalProcessAction(superProcessInstanceId);
4351
}
@@ -86,4 +94,15 @@ protected void updateOperationState(String processId, Operation.State newState)
8694
.build();
8795
operationService.update(operation, operation);
8896
}
97+
98+
protected abstract Logger getLogger();
99+
100+
protected void logLifecycle(UserInfo userInfo, String processId) {
101+
getLogger().info(MessageFormat.format(
102+
Messages.DEPLOYMENT_PROCESS_ACTION_EXECUTED_FOR_PROCESS_0_ACTION_1_USER_2_ORIGIN_3,
103+
processId, getAction().toString(), userInfo.getId(), userInfo.getToken()
104+
.getAdditionalInfo()
105+
.get(Constants.AUTH_TOKEN_ORIGIN_FIELD)));
106+
}
107+
89108
}

multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/flowable/ResumeProcessAction.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ private void triggerProcessInstance(UserInfo userInfo, String processId) {
5353
}
5454
}
5555

56+
@Override
57+
protected Logger getLogger() {
58+
return LOGGER;
59+
}
60+
5661
@Override
5762
public Action getAction() {
5863
return Action.RESUME;

multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/flowable/RetryProcessAction.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,9 @@ public Action getAction() {
6060
return Action.RETRY;
6161
}
6262

63+
@Override
64+
protected Logger getLogger() {
65+
return LOGGER;
66+
}
67+
6368
}

multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/flowable/commands/abort/AbortProcessFlowableCommandExecutor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public AbortProcessFlowableCommandExecutor(ProcessActionRegistry processActionRe
2323

2424
@Override
2525
public void executeCommand() {
26-
LOGGER.info(MessageFormat.format(Messages.AUTO_ABORTING_PROCESS_0, processInstanceId));
26+
LOGGER.info(MessageFormat.format(Messages.AUTO_ABORTING_PROCESS_0, processInstanceId, Action.ABORT.toString()));
2727
ProcessAction abortProcessAction = processActionRegistry.getAction(Action.ABORT);
2828
abortProcessAction.execute(null, processInstanceId);
2929
}

multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/jobs/OperationsCleaner.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
package org.cloudfoundry.multiapps.controller.process.jobs;
22

3-
import static java.text.MessageFormat.format;
4-
3+
import java.text.MessageFormat;
54
import java.time.LocalDateTime;
65
import java.time.ZonedDateTime;
76
import java.util.List;
87

98
import jakarta.inject.Inject;
109
import jakarta.inject.Named;
11-
1210
import org.cloudfoundry.multiapps.controller.api.model.ImmutableOperation;
1311
import org.cloudfoundry.multiapps.controller.api.model.Operation;
1412
import org.cloudfoundry.multiapps.controller.persistence.OrderDirection;
@@ -18,11 +16,12 @@
1816
import org.cloudfoundry.multiapps.controller.process.flowable.ProcessAction;
1917
import org.cloudfoundry.multiapps.controller.process.flowable.ProcessActionRegistry;
2018
import org.flowable.common.engine.api.FlowableObjectNotFoundException;
21-
2219
import org.slf4j.Logger;
2320
import org.slf4j.LoggerFactory;
2421
import org.springframework.core.annotation.Order;
2522

23+
import static java.text.MessageFormat.format;
24+
2625
@Named
2726
@Order(10)
2827
public class OperationsCleaner implements Cleaner {
@@ -59,7 +58,7 @@ public void execute(LocalDateTime expirationTime) {
5958

6059
private int abortActiveOperations(LocalDateTime expirationTime) {
6160
int abortedOperations = 0;
62-
for (int pageIndex = 0;; pageIndex++) {
61+
for (int pageIndex = 0; ; pageIndex++) {
6362
List<Operation> operationsPage = getOperationsPage(expirationTime, pageIndex);
6463
for (Operation operation : operationsPage) {
6564
if (inFinalState(operation)) {
@@ -107,6 +106,7 @@ private void abort(Operation operation) {
107106
ProcessAction abortAction = processActionRegistry.getAction(Action.ABORT);
108107
String processId = operation.getProcessId();
109108
LOGGER.debug(CleanUpJob.LOG_MARKER, format(Messages.ABORTING_OPERATION_0, processId));
109+
LOGGER.info(MessageFormat.format(Messages.AUTO_ABORTING_PROCESS_0, processId, Action.ABORT.toString()));
110110
abortAction.execute(null, processId);
111111
}
112112

multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/flowable/AbortProcessActionTest.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.mockito.ArgumentCaptor;
2424
import org.mockito.Mock;
2525
import org.mockito.Mockito;
26+
import org.slf4j.Logger;
2627

2728
class AbortProcessActionTest extends ProcessActionTest {
2829

@@ -46,6 +47,7 @@ class AbortProcessActionTest extends ProcessActionTest {
4647
.processType(ProcessType.DEPLOY)
4748
.state(Operation.State.RUNNING)
4849
.build();
50+
4951
@BeforeEach
5052
void setUp() {
5153
prepareOperationService();
@@ -86,6 +88,23 @@ void testAbortActionNoPublishingDynatraceEvent() {
8688
.publishProcessEvent(Mockito.any(), Mockito.any());
8789
}
8890

91+
@Test
92+
void testAbortActionWithUserGuidAndOriginButNotUsername() {
93+
Logger logger = Mockito.mock(Logger.class);
94+
ProcessAction abortAction = new AbortProcessAction(flowableFacade, Collections.emptyList(),
95+
historicOperationEventService, operationService,
96+
cloudControllerClientProvider, progressMessageService,
97+
dynatracePublisher) {
98+
@Override
99+
protected Logger getLogger() {
100+
return logger;
101+
}
102+
};
103+
104+
abortAction.execute(USER_INFO, PROCESS_GUID);
105+
assertUserInfoLogContent(logger, Action.ABORT);
106+
}
107+
89108
private void prepareOperationService() {
90109
OperationQuery mockedOperationQuery = Mockito.mock(OperationQuery.class);
91110
Mockito.when(mockedOperationQuery.processId(PROCESS_GUID))

multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/flowable/ProcessActionTest.java

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
import java.util.ArrayList;
44
import java.util.List;
5+
import java.util.Map;
56
import java.util.UUID;
67
import java.util.function.Supplier;
78

89
import org.cloudfoundry.multiapps.controller.api.model.ImmutableOperation;
910
import org.cloudfoundry.multiapps.controller.api.model.Operation;
11+
import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo;
1012
import org.cloudfoundry.multiapps.controller.core.cf.CloudControllerClientProvider;
1113
import org.cloudfoundry.multiapps.controller.core.util.UserInfo;
1214
import org.cloudfoundry.multiapps.controller.persistence.query.impl.OperationQueryImpl;
@@ -17,10 +19,14 @@
1719
import org.flowable.engine.runtime.Execution;
1820
import org.flowable.variable.api.history.HistoricVariableInstanceQuery;
1921
import org.junit.jupiter.api.BeforeEach;
22+
import org.mockito.ArgumentCaptor;
2023
import org.mockito.Mock;
2124
import org.mockito.Mockito;
2225
import org.mockito.MockitoAnnotations;
26+
import org.slf4j.Logger;
2327

28+
import static org.junit.jupiter.api.Assertions.assertFalse;
29+
import static org.junit.jupiter.api.Assertions.assertTrue;
2430
import static org.mockito.ArgumentMatchers.anyString;
2531

2632
abstract class ProcessActionTest {
@@ -31,7 +37,8 @@ abstract class ProcessActionTest {
3137
static final String PROCESS_GUID = RANDOM_UUID_SUPPLIER.get();
3238
static final String SUBPROCESS_1_ID = RANDOM_UUID_SUPPLIER.get();
3339
static final String SUBPROCESS_2_ID = RANDOM_UUID_SUPPLIER.get();
34-
static final UserInfo USER_INFO = new UserInfo("fake-user-guid", "fake-user", null);
40+
static final OAuth2AccessTokenWithAdditionalInfo token = mockToken();
41+
static final UserInfo USER_INFO = new UserInfo("fake-user-guid", "fake-user", token);
3542

3643
protected ProcessAction processAction;
3744
@Mock
@@ -124,5 +131,36 @@ protected void assertStateUpdated(Operation.State state) {
124131
.update(operation, operation);
125132
}
126133

134+
protected void assertUserInfoLogContent(Logger logger, Action expectedAction) {
135+
ArgumentCaptor<String> argumentCaptor = ArgumentCaptor.forClass(String.class);
136+
Mockito.verify(logger, Mockito.atLeastOnce())
137+
.info(argumentCaptor.capture());
138+
String logMessageToVerify = argumentCaptor.getAllValues()
139+
.stream()
140+
.filter(message -> message != null && message.contains(
141+
"MTA deployment process action executed"))
142+
.findFirst()
143+
.orElseThrow(
144+
() -> new AssertionError("No log line was printed. Captured logs: "
145+
+ argumentCaptor.getAllValues()));
146+
assertTrue(logMessageToVerify.contains("processId: \"" + PROCESS_GUID + "\""),
147+
"Must contain the processId. Actual: " + logMessageToVerify);
148+
assertTrue(logMessageToVerify.contains("action: \"" + expectedAction + "\""),
149+
"Must contain the action. Actual: " + logMessageToVerify);
150+
assertTrue(logMessageToVerify.contains("userGUID: \"fake-user-guid\""),
151+
"Must contain the userGUID. Actual: " + logMessageToVerify);
152+
assertTrue(logMessageToVerify.contains("origin: \"test-origin\""),
153+
"Must contain the origin. Actual: " + logMessageToVerify);
154+
assertFalse(logMessageToVerify.contains("fake-user\""),
155+
"Must NOT contain the username. Actual: " + logMessageToVerify);
156+
}
157+
127158
protected abstract ProcessAction createProcessAction();
159+
160+
private static OAuth2AccessTokenWithAdditionalInfo mockToken() {
161+
OAuth2AccessTokenWithAdditionalInfo token = Mockito.mock(OAuth2AccessTokenWithAdditionalInfo.class);
162+
Mockito.when(token.getAdditionalInfo())
163+
.thenReturn(Map.of("origin", "test-origin"));
164+
return token;
165+
}
128166
}

0 commit comments

Comments
 (0)