Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions openaev-api/src/main/java/io/openaev/xtmhub/XtmHubClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
public class XtmHubClient {
private final XtmHubConfig config;
private final HttpClientFactory httpClientFactory;
private static final String platformIdentifier = "openaev";

public XtmHubConnectivityStatus refreshRegistrationStatus(
String platformId, String platformVersion, String token) {
Expand Down Expand Up @@ -57,12 +58,13 @@ mutation RefreshPlatformRegistrationConnectivityStatus($input: RefreshPlatformRe
"input": {
"platformId": "%s",
"platformVersion": "%s",
"token": "%s"
"token": "%s",
"platformIdentifier": "%s"
}
}
}
""",
platformId, platformVersion, token);
platformId, platformVersion, token, platformIdentifier);

JsonElement element = JsonParser.parseString(mutationBody);
return new StringEntity(element.toString());
Expand Down Expand Up @@ -90,6 +92,10 @@ private XtmHubConnectivityStatus parseResponseAsConnectivityStatus(ClassicHttpRe
return XtmHubConnectivityStatus.ACTIVE;
}

if (status.equals(XtmHubConnectivityStatus.NOT_FOUND.label)) {
return XtmHubConnectivityStatus.NOT_FOUND;
}

return XtmHubConnectivityStatus.INACTIVE;
} catch (Exception e) {
log.warn("Error occurred while parsing XTM Hub connectivity response: {}", e.getMessage(), e);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@
import java.net.*;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;

@Slf4j
@Service
@RequiredArgsConstructor
public class XtmHubConnectivityService {
Expand All @@ -23,13 +25,19 @@ void init() {
boolean checkIsReachable() {
HttpURLConnection connection = null;
try {
URI uri = new URI(XtmHubConfig.getApiUrl());
URI uri = new URI(XtmHubConfig.getApiUrl() + "/health");
connection = (HttpURLConnection) uri.toURL().openConnection();
connection.setRequestMethod("HEAD");
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
return HttpStatus.valueOf(connection.getResponseCode()).is2xxSuccessful();
HttpStatus httpStatus = HttpStatus.valueOf(connection.getResponseCode());
boolean isReachable = httpStatus.is2xxSuccessful();
if (!isReachable){
log.warn("XTM Hub backend is not reachable on URl {}, response status: {}", XtmHubConfig.getApiUrl(), httpStatus);
}
return isReachable;
} catch (Exception e) {
log.warn("XTM Hub backend is not reachable on URL {} due to {}", XtmHubConfig.getApiUrl(), e.getMessage(), e);
return false;
} finally {
if (connection != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

public enum XtmHubConnectivityStatus {
ACTIVE("active"),
INACTIVE("inactive");
INACTIVE("inactive"),
NOT_FOUND("not_found");

public final String label;

Expand Down
20 changes: 13 additions & 7 deletions openaev-api/src/main/java/io/openaev/xtmhub/XtmHubService.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,16 @@ public PlatformSettings unregister() {

public PlatformSettings refreshConnectivity() {
PlatformSettings settings = platformSettingsService.findSettings();

if (!isRegisteredWithXtmHub(settings)) {
return settings;
}

ConnectivityCheckResult checkResult = checkConnectivityStatus(settings);
if (checkResult.status == XtmHubConnectivityStatus.NOT_FOUND) {
log.warn("Platform was not found on XTM Hub");
return platformSettingsService.deleteXTMHubRegistration();
}

handleConnectivityLossNotification(settings, checkResult);

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

boolean isActive = status == XtmHubConnectivityStatus.ACTIVE;
LocalDateTime lastCheck = parseLastConnectivityCheck(settings);

return new ConnectivityCheckResult(isActive, lastCheck);
return new ConnectivityCheckResult(status, lastCheck);
}

private LocalDateTime parseLastConnectivityCheck(PlatformSettings settings) {
Expand All @@ -83,7 +86,7 @@ private void handleConnectivityLossNotification(
private boolean shouldSendConnectivityLossEmail(
PlatformSettings settings, ConnectivityCheckResult checkResult) {

return !checkResult.isActive()
return checkResult.status() != XtmHubConnectivityStatus.ACTIVE
&& hasConnectivityBeenLostForTooLong(checkResult.lastCheck())
&& isEmailNotificationEnabled(settings);
}
Expand All @@ -101,12 +104,14 @@ private PlatformSettings updateRegistrationStatus(
PlatformSettings settings, ConnectivityCheckResult checkResult) {

XtmHubRegistrationStatus newStatus =
checkResult.isActive()
checkResult.status() == XtmHubConnectivityStatus.ACTIVE
? XtmHubRegistrationStatus.REGISTERED
: XtmHubRegistrationStatus.LOST_CONNECTIVITY;

LocalDateTime updatedLastCheck =
checkResult.isActive() ? LocalDateTime.now() : checkResult.lastCheck();
checkResult.status() == XtmHubConnectivityStatus.ACTIVE
? LocalDateTime.now()
: checkResult.lastCheck();

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

/** Encapsulates the result of a connectivity check */
private record ConnectivityCheckResult(boolean isActive, LocalDateTime lastCheck) {}
private record ConnectivityCheckResult(
XtmHubConnectivityStatus status, LocalDateTime lastCheck) {}
}
24 changes: 24 additions & 0 deletions openaev-api/src/test/java/io/openaev/xtmhub/XtmHubServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,30 @@ void refreshConnectivity_WhenTokenIsNull_ShouldReturnSettingsUnchanged() {
verifyNoInteractions(xtmHubEmailService);
}

@Test
@DisplayName("Should remove XTM Hub registration when platform is not found in the hub")
void refreshConnectivity_WhenPlatformIsNotFound_ShouldRemoveRegistration() {
// Given
String token = "valid-token";
String platformId = "platform-123";
String platformVersion = "1.0.0";

mockSettings.setXtmHubToken(token);
mockSettings.setPlatformId(platformId);
mockSettings.setPlatformVersion(platformVersion);

when(platformSettingsService.findSettings()).thenReturn(mockSettings);
when(xtmHubClient.refreshRegistrationStatus(platformId, platformVersion, token))
.thenReturn(XtmHubConnectivityStatus.NOT_FOUND);

// When
xtmHubService.refreshConnectivity();

// Then
verify(platformSettingsService).deleteXTMHubRegistration();
verifyNoInteractions(xtmHubEmailService);
}

@Test
@DisplayName("Should update registration as REGISTERED when connectivity is ACTIVE")
void refreshConnectivity_WhenConnectivityIsActive_ShouldUpdateAsRegistered() {
Expand Down