Skip to content

Commit 492d215

Browse files
committed
Fix comments
1 parent e3a0042 commit 492d215

File tree

10 files changed

+196
-20
lines changed

10 files changed

+196
-20
lines changed

multiapps-controller-persistence/src/test/java/org/cloudfoundry/multiapps/controller/persistence/services/ApplicationShutdownServiceTest.java

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.junit.jupiter.api.Test;
1616

1717
import static org.junit.jupiter.api.Assertions.assertEquals;
18+
import static org.junit.jupiter.api.Assertions.assertNotNull;
1819
import static org.junit.jupiter.api.Assertions.assertThrows;
1920

2021
class ApplicationShutdownServiceTest {
@@ -25,8 +26,10 @@ class ApplicationShutdownServiceTest {
2526
.toString();
2627
private final String INSTANCE_ID_2 = UUID.randomUUID()
2728
.toString();
28-
private final ApplicationShutdown APPLICATION_SHUTDOWN = createApplicationShutdownInstance(INSTANCE_ID, 0);
29-
private final ApplicationShutdown APPLICATION_SHUTDOWN_2 = createApplicationShutdownInstance(INSTANCE_ID_2, 1);
29+
private final ApplicationShutdown APPLICATION_SHUTDOWN = createApplicationShutdownInstance(INSTANCE_ID, 0,
30+
ApplicationShutdown.Status.FINISHED);
31+
private final ApplicationShutdown APPLICATION_SHUTDOWN_2 = createApplicationShutdownInstance(INSTANCE_ID_2, 1,
32+
ApplicationShutdown.Status.RUNNING);
3033

3134
private final ApplicationShutdownService applicationShutdownService = createApplicationShutdownService();
3235

@@ -42,7 +45,7 @@ void testAdd() {
4245
assertEquals(1, applicationShutdownService.createQuery()
4346
.list()
4447
.size());
45-
48+
4649
assertEquals(APPLICATION_SHUTDOWN.getId(), applicationShutdownService.createQuery()
4750
.id(APPLICATION_SHUTDOWN.getId())
4851
.singleResult()
@@ -71,61 +74,65 @@ void testAddWithMoreThanOneApplicationShutdown() {
7174

7275
@Test
7376
void testQueryById() {
74-
testQueryByCriteria((query, applicationShutdown) -> query.id(applicationShutdown.getId()), 1);
77+
testQueryByCriteria((query, applicationShutdown) -> query.id(applicationShutdown.getId()), 1, true);
7578
}
7679

7780
@Test
7881
void testQueryByApplicationId() {
79-
testQueryByCriteria((query, applicationShutdown) -> query.applicationId(applicationShutdown.getApplicationId()), 2);
82+
testQueryByCriteria((query, applicationShutdown) -> query.applicationId(applicationShutdown.getApplicationId()), 2, false);
8083
}
8184

8285
@Test
8386
void testQueryByShutdownStatus() {
84-
testQueryByCriteria((query, applicationShutdown) -> query.shutdownStatus(applicationShutdown.getStatus()), 2);
87+
testQueryByCriteria((query, applicationShutdown) -> query.shutdownStatus(applicationShutdown.getStatus()), 1, true);
8588
}
8689

8790
@Test
8891
void testQueryByApplicationInstanceIndex() {
8992
testQueryByCriteria(
90-
(query, applicationShutdown) -> query.applicationInstanceIndex(applicationShutdown.getApplicationInstanceIndex()), 1);
93+
(query, applicationShutdown) -> query.applicationInstanceIndex(applicationShutdown.getApplicationInstanceIndex()), 1, true);
9194
}
9295

9396
@Test
9497
void testQueryByStartedAt() {
95-
testQueryByCriteria((query, applicationShutdown) -> query.startedAt(applicationShutdown.getStartedAt()), 2);
98+
testQueryByCriteria((query, applicationShutdown) -> query.startedAt(applicationShutdown.getStartedAt()), 2, false);
9699
}
97100

98101
private interface ApplicationShutdownQueryBuilder {
99102
ApplicationShutdownQuery build(ApplicationShutdownQuery applicationShutdownQuery, ApplicationShutdown applicationShutdown);
100103
}
101104

102-
private void testQueryByCriteria(ApplicationShutdownQueryBuilder applicationShutdownQueryBuilder, int resultCount) {
105+
private void testQueryByCriteria(ApplicationShutdownQueryBuilder applicationShutdownQueryBuilder, int resultCount,
106+
boolean shouldAssertThatAppExists) {
103107
addApplicationShutdown(List.of(APPLICATION_SHUTDOWN, APPLICATION_SHUTDOWN_2));
104108
assertEquals(resultCount, applicationShutdownQueryBuilder.build(applicationShutdownService.createQuery(), APPLICATION_SHUTDOWN)
105109
.list()
106110
.size());
107111
assertEquals(resultCount, applicationShutdownQueryBuilder.build(applicationShutdownService.createQuery(), APPLICATION_SHUTDOWN)
108112
.delete());
109-
assertApplicationShutdownExists(APPLICATION_SHUTDOWN_2.getId());
113+
if (shouldAssertThatAppExists) {
114+
assertApplicationShutdownExists(APPLICATION_SHUTDOWN_2.getId());
115+
}
110116
}
111117

112118
private void assertApplicationShutdownExists(String id) {
113-
// If does not exist, will throw NoResultException
114-
applicationShutdownService.createQuery()
115-
.id(id);
119+
ApplicationShutdown applicationShutdown = applicationShutdownService.createQuery()
120+
.id(id)
121+
.singleResult();
122+
assertNotNull(applicationShutdown);
116123
}
117124

118125
private void addApplicationShutdown(List<ApplicationShutdown> applicationShutdowns) {
119126
applicationShutdowns.forEach(applicationShutdownService::add);
120127
}
121128

122-
private ApplicationShutdown createApplicationShutdownInstance(String instanceId, int index) {
129+
private ApplicationShutdown createApplicationShutdownInstance(String instanceId, int index, ApplicationShutdown.Status status) {
123130
return ImmutableApplicationShutdown.builder()
124131
.id(instanceId)
125132
.applicationId(APPLICATION_ID)
126133
.applicationInstanceIndex(index)
127134
.startedAt(Date.from(Instant.now()))
128-
.status(ApplicationShutdown.Status.FINISHED)
135+
.status(status)
129136
.build();
130137
}
131138

multiapps-controller-process/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,5 +106,9 @@
106106
<artifactId>h2</artifactId>
107107
<scope>test</scope>
108108
</dependency>
109+
<dependency>
110+
<groupId>org.cloudfoundry.multiapps</groupId>
111+
<artifactId>multiapps-controller-shutdown-client</artifactId>
112+
</dependency>
109113
</dependencies>
110114
</project>

multiapps-controller-process/src/main/java/module-info.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,5 +56,6 @@
5656

5757
requires static java.compiler;
5858
requires static org.immutables.value;
59+
requires org.cloudfoundry.multiapps.controller.shutdown.client;
5960

6061
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -790,6 +790,8 @@ public class Messages {
790790
public static final String TOTAL_SIZE_OF_ALL_RESOLVED_CONTENT_0 = "Total size for all resolved content {0}";
791791
public static final String STARTED_SHUTTING_DOWN_APPLICATION_WITH_ID_AND_INDEX = "Started shutting down application with ID: \"{0}\" and index: \"{1}\"";
792792
public static final String SHUT_DOWN_APPLICATION_WITH_ID_AND_INDEX_FINISHED_SUCCESSFULLY = "Shut down application with ID: \"{0}\" and index: \"{1}\" finished successfully";
793+
public static final String NO_LEFTOVER_APPLICATION_SHUTDOWNS = "No leftover application shutdowns";
794+
public static final String DELETED_LEFTOVER_APPLICATION_SHUTDOWNS = "Deleted {0} leftover application shutdowns";
793795

794796
public static final String IGNORING_NOT_FOUND_OPTIONAL_SERVICE = "Service {0} not found but is optional";
795797
public static final String IGNORING_NOT_FOUND_INACTIVE_SERVICE = "Service {0} not found but is inactive";

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public ApplicationShutdownJob(FlowableFacade flowableFacade, ApplicationShutdown
3232
this.applicationConfiguration = applicationConfiguration;
3333
}
3434

35-
@Scheduled(fixedRate = 5, timeUnit = TimeUnit.SECONDS)
35+
@Scheduled(fixedRate = 5, timeUnit = TimeUnit.SECONDS, initialDelay = 30)
3636
public void run() {
3737
ApplicationShutdown applicationShutdown = getApplicationToShutdown();
3838

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package org.cloudfoundry.multiapps.controller.process.jobs;
2+
3+
import java.text.MessageFormat;
4+
import java.time.LocalDateTime;
5+
import java.util.List;
6+
7+
import jakarta.inject.Named;
8+
import org.cloudfoundry.multiapps.controller.persistence.dto.ApplicationShutdown;
9+
import org.cloudfoundry.multiapps.controller.persistence.services.ApplicationShutdownService;
10+
import org.cloudfoundry.multiapps.controller.process.Messages;
11+
import org.cloudfoundry.multiapps.controller.shutdown.client.util.ShutdownUtil;
12+
import org.slf4j.Logger;
13+
import org.slf4j.LoggerFactory;
14+
15+
@Named
16+
public class LeftoverApplicationShutdownCleaner implements Cleaner {
17+
18+
private static final Logger LOGGER = LoggerFactory.getLogger(LeftoverApplicationShutdownCleaner.class);
19+
20+
private final ApplicationShutdownService applicationShutdownService;
21+
22+
public LeftoverApplicationShutdownCleaner(ApplicationShutdownService applicationShutdownService) {
23+
this.applicationShutdownService = applicationShutdownService;
24+
}
25+
26+
@Override
27+
public void execute(LocalDateTime expirationTime) {
28+
List<ApplicationShutdown> leftoverApplicationShutdowns = getApplicationShutdownsScheduledForMoreThanADay();
29+
30+
if (leftoverApplicationShutdowns.isEmpty()) {
31+
LOGGER.info(Messages.NO_LEFTOVER_APPLICATION_SHUTDOWNS);
32+
return;
33+
}
34+
35+
deleteLeftoverApplicationShutdowns(leftoverApplicationShutdowns);
36+
LOGGER.info(MessageFormat.format(Messages.DELETED_LEFTOVER_APPLICATION_SHUTDOWNS, leftoverApplicationShutdowns.size()));
37+
}
38+
39+
private List<ApplicationShutdown> getApplicationShutdownsScheduledForMoreThanADay() {
40+
List<ApplicationShutdown> applicationShutdowns = applicationShutdownService.createQuery()
41+
.list();
42+
return applicationShutdowns.stream()
43+
.filter(ShutdownUtil::isApplicationShutdownScheduledForMoreThanADay)
44+
.toList();
45+
}
46+
47+
private void deleteLeftoverApplicationShutdowns(List<ApplicationShutdown> leftoverApplicationShutdowns) {
48+
leftoverApplicationShutdowns.forEach(applicationShutdown -> applicationShutdownService.createQuery()
49+
.id(applicationShutdown.getId())
50+
.delete());
51+
}
52+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package org.cloudfoundry.multiapps.controller.process.jobs;
2+
3+
import java.time.Instant;
4+
import java.time.LocalDateTime;
5+
import java.util.Date;
6+
import java.util.List;
7+
import java.util.UUID;
8+
9+
import org.cloudfoundry.multiapps.controller.persistence.dto.ApplicationShutdown;
10+
import org.cloudfoundry.multiapps.controller.persistence.dto.ImmutableApplicationShutdown;
11+
import org.cloudfoundry.multiapps.controller.persistence.query.impl.ApplicationShutdownQueryImpl;
12+
import org.cloudfoundry.multiapps.controller.persistence.services.ApplicationShutdownService;
13+
import org.junit.jupiter.api.BeforeEach;
14+
import org.junit.jupiter.api.Test;
15+
import org.mockito.Mock;
16+
import org.mockito.MockitoAnnotations;
17+
18+
import static org.mockito.ArgumentMatchers.any;
19+
import static org.mockito.Mockito.times;
20+
import static org.mockito.Mockito.verify;
21+
import static org.mockito.Mockito.when;
22+
23+
class LeftoverApplicationShutdownCleanerTest {
24+
25+
@Mock
26+
private ApplicationShutdownService applicationShutdownService;
27+
28+
@Mock
29+
private ApplicationShutdownQueryImpl applicationShutdownQuery;
30+
31+
private LeftoverApplicationShutdownCleaner leftoverApplicationShutdownCleaner;
32+
33+
@BeforeEach
34+
void setUp() throws Exception {
35+
MockitoAnnotations.openMocks(this)
36+
.close();
37+
leftoverApplicationShutdownCleaner = new LeftoverApplicationShutdownCleaner(applicationShutdownService);
38+
when(applicationShutdownService.createQuery()).thenReturn(applicationShutdownQuery);
39+
}
40+
41+
@Test
42+
void testExecuteWithoutScheduledApplications() {
43+
when(applicationShutdownQuery.list()).thenReturn(List.of());
44+
leftoverApplicationShutdownCleaner.execute(LocalDateTime.now());
45+
verify(applicationShutdownService).createQuery();
46+
verify(applicationShutdownQuery).list();
47+
}
48+
49+
@Test
50+
void testExecuteWithScheduledApplicationButNoLeftovers() {
51+
ApplicationShutdown applicationShutdown = createApplicationShutdown(Date.from(Instant.now()));
52+
when(applicationShutdownQuery.list()).thenReturn(List.of(applicationShutdown));
53+
leftoverApplicationShutdownCleaner.execute(LocalDateTime.now());
54+
verify(applicationShutdownService).createQuery();
55+
verify(applicationShutdownQuery).list();
56+
}
57+
58+
@Test
59+
void testExecuteWithLeftoverApplications() {
60+
Date timeBeforeTwoDays = new Date(1738061834);
61+
ApplicationShutdown applicationShutdown = createApplicationShutdown(timeBeforeTwoDays);
62+
when(applicationShutdownQuery.list()).thenReturn(List.of(applicationShutdown));
63+
when(applicationShutdownQuery.id(any())).thenReturn(applicationShutdownQuery);
64+
65+
leftoverApplicationShutdownCleaner.execute(LocalDateTime.now());
66+
67+
verify(applicationShutdownService, times(2)).createQuery();
68+
verify(applicationShutdownQuery).list();
69+
verify(applicationShutdownQuery).delete();
70+
}
71+
72+
private ApplicationShutdown createApplicationShutdown(Date startedAt) {
73+
return ImmutableApplicationShutdown.builder()
74+
.applicationInstanceIndex(0)
75+
.applicationId(UUID.randomUUID()
76+
.toString())
77+
.id(UUID.randomUUID()
78+
.toString())
79+
.startedAt(startedAt)
80+
.build();
81+
}
82+
}

multiapps-controller-shutdown-client/src/main/java/module-info.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
exports org.cloudfoundry.multiapps.controller.shutdown.client;
44
exports org.cloudfoundry.multiapps.controller.shutdown.client.configuration;
5+
exports org.cloudfoundry.multiapps.controller.shutdown.client.util;
56

67
requires com.fasterxml.jackson.annotation;
78
requires org.cloudfoundry.multiapps.common;

multiapps-controller-shutdown-client/src/main/java/org/cloudfoundry/multiapps/controller/shutdown/client/util/ShutdownUtil.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ private ShutdownUtil() {
1717
private static final Logger LOGGER = LoggerFactory.getLogger(ShutdownUtil.class);
1818

1919
public static final int TIMEOUT_IN_SECONDS = 600; //10 minutes
20+
public static final int DAY_IN_SECONDS = 86400; //1 day
2021

2122
public static boolean areThereUnstoppedInstances(List<ApplicationShutdown> shutdownInstances) {
2223
return shutdownInstances.stream()
@@ -25,11 +26,19 @@ public static boolean areThereUnstoppedInstances(List<ApplicationShutdown> shutd
2526
}
2627

2728
public static boolean isTimeoutExceeded(ApplicationShutdown applicationShutdown) {
28-
Instant tenMinutesAfterStartedDate = Instant.from(applicationShutdown.getStartedAt()
29-
.toInstant())
30-
.plusSeconds(TIMEOUT_IN_SECONDS);
29+
return isTimeExceeded(applicationShutdown, TIMEOUT_IN_SECONDS);
30+
}
31+
32+
public static boolean isApplicationShutdownScheduledForMoreThanADay(ApplicationShutdown applicationShutdown) {
33+
return isTimeExceeded(applicationShutdown, DAY_IN_SECONDS);
34+
}
35+
36+
private static boolean isTimeExceeded(ApplicationShutdown applicationShutdown, int seconds) {
37+
Instant secondsAfterStartedDate = Instant.from(applicationShutdown.getStartedAt()
38+
.toInstant())
39+
.plusSeconds(seconds);
3140
Instant timeNow = Instant.now();
32-
return timeNow.isAfter(tenMinutesAfterStartedDate);
41+
return timeNow.isAfter(secondsAfterStartedDate);
3342
}
3443

3544
public static void logShutdownStatus(List<ApplicationShutdown> shutdownInstances) {

multiapps-controller-shutdown-client/src/test/java/org/cloudfoundry/multiapps/controller/shutdown/client/util/ShutdownUtilTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,24 @@ void testIsTimeoutExceededWithTimeOutNotExceeded() {
5252
assertFalse(ShutdownUtil.isTimeoutExceeded(applicationShutdownInstance));
5353
}
5454

55+
@Test
56+
void testIsApplicationShutdownScheduledForMoreThanADay() {
57+
Instant timeBeforeTenMinutes = Instant.now()
58+
.minusSeconds(ShutdownUtil.DAY_IN_SECONDS);
59+
ApplicationShutdown applicationShutdownInstance = createApplicationShutdownInstance(true, Date.from(timeBeforeTenMinutes));
60+
61+
assertTrue(ShutdownUtil.isApplicationShutdownScheduledForMoreThanADay(applicationShutdownInstance));
62+
}
63+
64+
@Test
65+
void testIsApplicationShutdownScheduledForMoreThanADayWithTimeOutNotExceeded() {
66+
Instant timeBeforeTenMinutes = Instant.now()
67+
.minusSeconds(TIMEOUT_IN_SECONDS);
68+
ApplicationShutdown applicationShutdownInstance = createApplicationShutdownInstance(true, Date.from(timeBeforeTenMinutes));
69+
70+
assertFalse(ShutdownUtil.isApplicationShutdownScheduledForMoreThanADay(applicationShutdownInstance));
71+
}
72+
5573
private ApplicationShutdown createApplicationShutdownInstance(boolean isInstanceStopped, Date startedAt) {
5674
return ImmutableApplicationShutdown.builder()
5775
.id(UUID.randomUUID()

0 commit comments

Comments
 (0)