Skip to content

Commit 99bd6b4

Browse files
authored
[backend] feat: reset XTM Hub registration when platform is not found (#4441) (#4442)
1 parent fabf014 commit 99bd6b4

File tree

5 files changed

+63
-11
lines changed

5 files changed

+63
-11
lines changed

openaev-api/src/main/java/io/openaev/xtmhub/XtmHubClient.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
public class XtmHubClient {
2323
private final XtmHubConfig config;
2424
private final HttpClientFactory httpClientFactory;
25+
private static final String platformIdentifier = "openaev";
2526

2627
public XtmHubConnectivityStatus refreshRegistrationStatus(
2728
String platformId, String platformVersion, String token) {
@@ -57,12 +58,13 @@ mutation RefreshPlatformRegistrationConnectivityStatus($input: RefreshPlatformRe
5758
"input": {
5859
"platformId": "%s",
5960
"platformVersion": "%s",
60-
"token": "%s"
61+
"token": "%s",
62+
"platformIdentifier": "%s"
6163
}
6264
}
6365
}
6466
""",
65-
platformId, platformVersion, token);
67+
platformId, platformVersion, token, platformIdentifier);
6668

6769
JsonElement element = JsonParser.parseString(mutationBody);
6870
return new StringEntity(element.toString());
@@ -90,6 +92,10 @@ private XtmHubConnectivityStatus parseResponseAsConnectivityStatus(ClassicHttpRe
9092
return XtmHubConnectivityStatus.ACTIVE;
9193
}
9294

95+
if (status.equals(XtmHubConnectivityStatus.NOT_FOUND.label)) {
96+
return XtmHubConnectivityStatus.NOT_FOUND;
97+
}
98+
9399
return XtmHubConnectivityStatus.INACTIVE;
94100
} catch (Exception e) {
95101
log.warn("Error occurred while parsing XTM Hub connectivity response: {}", e.getMessage(), e);

openaev-api/src/main/java/io/openaev/xtmhub/XtmHubConnectivityService.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@
55
import java.net.*;
66
import lombok.Getter;
77
import lombok.RequiredArgsConstructor;
8+
import lombok.extern.slf4j.Slf4j;
89
import org.springframework.http.HttpStatus;
910
import org.springframework.stereotype.Service;
1011

12+
@Slf4j
1113
@Service
1214
@RequiredArgsConstructor
1315
public class XtmHubConnectivityService {
@@ -28,8 +30,21 @@ boolean checkIsReachable() {
2830
connection.setRequestMethod("HEAD");
2931
connection.setConnectTimeout(5000);
3032
connection.setReadTimeout(5000);
31-
return HttpStatus.valueOf(connection.getResponseCode()).is2xxSuccessful();
33+
HttpStatus httpStatus = HttpStatus.valueOf(connection.getResponseCode());
34+
boolean isReachable = httpStatus.is2xxSuccessful();
35+
if (!isReachable) {
36+
log.warn(
37+
"XTM Hub backend is not reachable on URl {}, response status: {}",
38+
XtmHubConfig.getApiUrl(),
39+
httpStatus);
40+
}
41+
return isReachable;
3242
} catch (Exception e) {
43+
log.warn(
44+
"XTM Hub backend is not reachable on URL {} due to {}",
45+
XtmHubConfig.getApiUrl(),
46+
e.getMessage(),
47+
e);
3348
return false;
3449
} finally {
3550
if (connection != null) {

openaev-api/src/main/java/io/openaev/xtmhub/XtmHubConnectivityStatus.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
public enum XtmHubConnectivityStatus {
44
ACTIVE("active"),
5-
INACTIVE("inactive");
5+
INACTIVE("inactive"),
6+
NOT_FOUND("not_found");
67

78
public final String label;
89

openaev-api/src/main/java/io/openaev/xtmhub/XtmHubService.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,16 @@ public PlatformSettings unregister() {
4141

4242
public PlatformSettings refreshConnectivity() {
4343
PlatformSettings settings = platformSettingsService.findSettings();
44-
4544
if (!isRegisteredWithXtmHub(settings)) {
4645
return settings;
4746
}
4847

4948
ConnectivityCheckResult checkResult = checkConnectivityStatus(settings);
49+
if (checkResult.status == XtmHubConnectivityStatus.NOT_FOUND) {
50+
log.warn("Platform was not found on XTM Hub");
51+
return platformSettingsService.deleteXTMHubRegistration();
52+
}
53+
5054
handleConnectivityLossNotification(settings, checkResult);
5155

5256
return updateRegistrationStatus(settings, checkResult);
@@ -61,10 +65,9 @@ private ConnectivityCheckResult checkConnectivityStatus(PlatformSettings setting
6165
xtmHubClient.refreshRegistrationStatus(
6266
settings.getPlatformId(), settings.getPlatformVersion(), settings.getXtmHubToken());
6367

64-
boolean isActive = status == XtmHubConnectivityStatus.ACTIVE;
6568
LocalDateTime lastCheck = parseLastConnectivityCheck(settings);
6669

67-
return new ConnectivityCheckResult(isActive, lastCheck);
70+
return new ConnectivityCheckResult(status, lastCheck);
6871
}
6972

7073
private LocalDateTime parseLastConnectivityCheck(PlatformSettings settings) {
@@ -83,7 +86,7 @@ private void handleConnectivityLossNotification(
8386
private boolean shouldSendConnectivityLossEmail(
8487
PlatformSettings settings, ConnectivityCheckResult checkResult) {
8588

86-
return !checkResult.isActive()
89+
return checkResult.status() != XtmHubConnectivityStatus.ACTIVE
8790
&& hasConnectivityBeenLostForTooLong(checkResult.lastCheck())
8891
&& isEmailNotificationEnabled(settings);
8992
}
@@ -101,12 +104,14 @@ private PlatformSettings updateRegistrationStatus(
101104
PlatformSettings settings, ConnectivityCheckResult checkResult) {
102105

103106
XtmHubRegistrationStatus newStatus =
104-
checkResult.isActive()
107+
checkResult.status() == XtmHubConnectivityStatus.ACTIVE
105108
? XtmHubRegistrationStatus.REGISTERED
106109
: XtmHubRegistrationStatus.LOST_CONNECTIVITY;
107110

108111
LocalDateTime updatedLastCheck =
109-
checkResult.isActive() ? LocalDateTime.now() : checkResult.lastCheck();
112+
checkResult.status() == XtmHubConnectivityStatus.ACTIVE
113+
? LocalDateTime.now()
114+
: checkResult.lastCheck();
110115

111116
boolean shouldKeepEmailNotificationEnabled =
112117
!shouldSendConnectivityLossEmail(settings, checkResult);
@@ -126,5 +131,6 @@ private LocalDateTime parseRegistrationDate(PlatformSettings settings) {
126131
}
127132

128133
/** Encapsulates the result of a connectivity check */
129-
private record ConnectivityCheckResult(boolean isActive, LocalDateTime lastCheck) {}
134+
private record ConnectivityCheckResult(
135+
XtmHubConnectivityStatus status, LocalDateTime lastCheck) {}
130136
}

openaev-api/src/test/java/io/openaev/xtmhub/XtmHubServiceTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,30 @@ void refreshConnectivity_WhenTokenIsNull_ShouldReturnSettingsUnchanged() {
7676
verifyNoInteractions(xtmHubEmailService);
7777
}
7878

79+
@Test
80+
@DisplayName("Should remove XTM Hub registration when platform is not found in the hub")
81+
void refreshConnectivity_WhenPlatformIsNotFound_ShouldRemoveRegistration() {
82+
// Given
83+
String token = "valid-token";
84+
String platformId = "platform-123";
85+
String platformVersion = "1.0.0";
86+
87+
mockSettings.setXtmHubToken(token);
88+
mockSettings.setPlatformId(platformId);
89+
mockSettings.setPlatformVersion(platformVersion);
90+
91+
when(platformSettingsService.findSettings()).thenReturn(mockSettings);
92+
when(xtmHubClient.refreshRegistrationStatus(platformId, platformVersion, token))
93+
.thenReturn(XtmHubConnectivityStatus.NOT_FOUND);
94+
95+
// When
96+
xtmHubService.refreshConnectivity();
97+
98+
// Then
99+
verify(platformSettingsService).deleteXTMHubRegistration();
100+
verifyNoInteractions(xtmHubEmailService);
101+
}
102+
79103
@Test
80104
@DisplayName("Should update registration as REGISTERED when connectivity is ACTIVE")
81105
void refreshConnectivity_WhenConnectivityIsActive_ShouldUpdateAsRegistered() {

0 commit comments

Comments
 (0)