Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
2 changes: 1 addition & 1 deletion charts/darts-api/Chart.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ appVersion: "1.0"
description: A Helm chart for darts-api App
name: darts-api
home: https://github.com/hmcts/darts-api
version: 0.0.114
version: 0.0.115
maintainers:
- name: HMCTS darts team
dependencies:
Expand Down
3 changes: 3 additions & 0 deletions charts/darts-api/values.dev.template.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ java:
SHEDLOCK_LOG_LEVEL: INFO
ARM_RPO_TOTAL_CATCHUP_HOURS: 5
ARM_RPO_TOTAL_CATCHUP_MAX_HOURS_ENDING_POINT: 50
ARM_DOWN_FOR_MAINTENANCE: false
secrets:
DARTS_API_DB_PASSWORD:
secretRef: "postgres"
Expand Down Expand Up @@ -168,6 +169,7 @@ darts-portal:
DARTS_AZUREAD_B2C_ORIGIN_HOST: https://hmctsstgextid.b2clogin.com
DARTS_AZUREAD_B2C_HOSTNAME: https://darts.staging.apps.hmcts.net
MANUAL_DELETION_ENABLED: true
ARM_DOWN_FOR_MAINTENANCE: false

darts-gateway:
enabled: ${DEV_ENABLE_DARTS_GATEWAY}
Expand Down Expand Up @@ -340,6 +342,7 @@ function:
ENABLE_ARM_V5_2_UPGRADE: true
ARM_RPO_TOTAL_CATCHUP_HOURS: 5
ARM_RPO_TOTAL_CATCHUP_MAX_HOURS_ENDING_POINT: 50
ARM_DOWN_FOR_MAINTENANCE: false

secrets:
DARTS_API_DB_PASSWORD:
Expand Down
2 changes: 2 additions & 0 deletions charts/darts-api/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ java:
SHEDLOCK_LOG_LEVEL: INFO
ARM_RPO_TOTAL_CATCHUP_HOURS: 5
ARM_RPO_TOTAL_CATCHUP_MAX_HOURS_ENDING_POINT: 50
ARM_DOWN_FOR_MAINTENANCE: false

function:
scaleType: Job
Expand Down Expand Up @@ -256,6 +257,7 @@ function:
ARM_RPO_FEATURE_FLAG_LOGS_ENABLED: false
DETS_TO_ARM_PUSH_FEATURE_FLAG_LOGS_ENABLED: false
ARM_PULL_FEATURE_FLAG_LOGS_ENABLED: false
ARM_DOWN_FOR_MAINTENANCE: false
secrets:
DARTS_API_DB_CONNECTION_STRING:
secretRef: darts-api-function-values
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Service;
import uk.gov.hmcts.darts.arm.exception.ArmDownForMaintenanceException;
import uk.gov.hmcts.darts.common.datamanagement.api.DataManagementFacade;
import uk.gov.hmcts.darts.common.datamanagement.component.impl.DownloadResponseMetaData;
import uk.gov.hmcts.darts.common.entity.ExternalObjectDirectoryEntity;
Expand All @@ -20,6 +21,7 @@

import static uk.gov.hmcts.darts.annotation.errors.AnnotationApiError.FAILED_TO_DOWNLOAD_ANNOTATION_DOCUMENT;
import static uk.gov.hmcts.darts.annotation.errors.AnnotationApiError.FAILED_TO_UPLOAD_ANNOTATION_DOCUMENT;
import static uk.gov.hmcts.darts.arm.enums.ArmApiError.ARM_DOWN_FOR_MAINTENANCE;
import static uk.gov.hmcts.darts.common.enums.ExternalLocationTypeEnum.INBOUND;
import static uk.gov.hmcts.darts.common.enums.ExternalLocationTypeEnum.UNSTRUCTURED;

Expand Down Expand Up @@ -58,6 +60,10 @@ public Resource download(List<ExternalObjectDirectoryEntity> externalObjectDirec
DownloadResponseMetaData downloadResponseMetaData = dataManagementFacade.retrieveFileFromStorage(externalObjectDirectoryEntities);

return downloadResponseMetaData.getResource();
} catch (ArmDownForMaintenanceException e) {
log.error("ARM is down for maintenance, failed to download annotation document {}",
externalObjectDirectoryEntities.getFirst().getAnnotationDocumentEntity().getId(), e);
throw new DartsApiException(ARM_DOWN_FOR_MAINTENANCE, e);
} catch (IOException | FileNotDownloadedException e) {
log.error("Failed to download annotation document {}",
externalObjectDirectoryEntities.getFirst().getAnnotationDocumentEntity().getId(), e);
Expand Down
32 changes: 32 additions & 0 deletions src/main/java/uk/gov/hmcts/darts/arm/enums/ArmApiError.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package uk.gov.hmcts.darts.arm.enums;

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import uk.gov.hmcts.darts.common.exception.DartsApiError;
import uk.gov.hmcts.darts.common.model.ArmErrorCode;
import uk.gov.hmcts.darts.common.model.ArmTitleErrors;

@Getter
@RequiredArgsConstructor
@SuppressWarnings("java:S6548")
public enum ArmApiError implements DartsApiError {

ARM_DOWN_FOR_MAINTENANCE(
ArmErrorCode.ARM_DOWN_FOR_MAINTENTANCE.getValue(),
HttpStatus.SERVICE_UNAVAILABLE,
ArmTitleErrors.ARM_DOWN_FOR_MAINTENTANCE.getValue()
);

private static final String ERROR_TYPE_PREFIX = "ARM";

private final String errorTypeNumeric;
private final HttpStatus httpStatus;
private final String title;

@Override
public String getErrorTypePrefix() {
return ERROR_TYPE_PREFIX;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package uk.gov.hmcts.darts.arm.exception;

public class ArmDownForMaintenanceException extends Exception {

public ArmDownForMaintenanceException(String message) {
super(message);
}

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package uk.gov.hmcts.darts.audio.service;

import uk.gov.hmcts.darts.arm.exception.ArmDownForMaintenanceException;
import uk.gov.hmcts.darts.common.entity.MediaEntity;

import java.io.IOException;
Expand All @@ -18,7 +19,7 @@ List<MediaEntity> filterMediaByMediaRequestTimeframeAndSortByStartTimeAndChannel
OffsetDateTime startTime,
OffsetDateTime endTime);

Path retrieveFromStorageAndSaveToTempWorkspace(MediaEntity mediaEntity) throws IOException;
Path retrieveFromStorageAndSaveToTempWorkspace(MediaEntity mediaEntity) throws IOException, ArmDownForMaintenanceException;

void handleKedaInvocationForMediaRequests();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import uk.gov.hmcts.darts.arm.enums.ArmApiError;
import uk.gov.hmcts.darts.arm.exception.ArmDownForMaintenanceException;
import uk.gov.hmcts.darts.audio.component.AudioBeingProcessedFromArchiveQuery;
import uk.gov.hmcts.darts.audio.exception.AudioApiError;
import uk.gov.hmcts.darts.audio.model.AudioBeingProcessedFromArchiveQueryResult;
Expand Down Expand Up @@ -71,6 +73,9 @@ public BinaryData encode(Long mediaId) {
Path encodedAudioPath = encodedAudioFileInfo.getPath();

mediaBinaryData = fileOperationService.convertFileToBinaryData(encodedAudioPath.toFile().getAbsolutePath());

} catch (ArmDownForMaintenanceException e) {
throw new DartsApiException(ArmApiError.ARM_DOWN_FOR_MAINTENANCE, e);
} catch (InterruptedException exception) {
Thread.currentThread().interrupt();
throw new DartsApiException(AudioApiError.FAILED_TO_PROCESS_AUDIO_REQUEST, exception);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import uk.gov.hmcts.darts.arm.exception.ArmDownForMaintenanceException;
import uk.gov.hmcts.darts.arm.service.ExternalObjectDirectoryService;
import uk.gov.hmcts.darts.audio.component.OutboundFileProcessor;
import uk.gov.hmcts.darts.audio.component.OutboundFileZipGenerator;
Expand All @@ -17,7 +18,6 @@
import uk.gov.hmcts.darts.audio.enums.AudioRequestOutputFormat;
import uk.gov.hmcts.darts.audio.exception.AudioApiError;
import uk.gov.hmcts.darts.audio.helper.TransformedMediaHelper;
import uk.gov.hmcts.darts.audio.helper.UnstructuredDataHelper;
import uk.gov.hmcts.darts.audio.model.AudioFileInfo;
import uk.gov.hmcts.darts.audio.service.AudioTransformationService;
import uk.gov.hmcts.darts.audio.service.MediaRequestService;
Expand Down Expand Up @@ -71,17 +71,12 @@ public class AudioTransformationServiceImpl implements AudioTransformationServic
private final OutboundFileZipGenerator outboundFileZipGenerator;
private final FileOperationService fileOperationService;
private final MediaRepository mediaRepository;
private final ExternalObjectDirectoryService eodService;
private final TransformedMediaHelper transformedMediaHelper;
private final LogApi logApi;
private final DataManagementFacade dataManagementFacade;
private final UnstructuredDataHelper unstructuredDataHelper;
private final CurrentTimeHelper currentTimeHelper;
private final AudioTransformationServiceProperties config;
private final ProcessMediaRequestsForKeda processMediaRequestsForKeda;
private final MediaRequestService mediaRequestService;


private static final Comparator<MediaEntity> MEDIA_START_TIME_CHANNEL_COMPARATOR = (media1, media2) -> {
if (media1.getStart().equals(media2.getStart())) {
return media1.getChannel().compareTo(media2.getChannel());
Expand Down Expand Up @@ -134,7 +129,6 @@ public static class ProcessMediaRequestsForKeda {
private final LogApi logApi;
private AudioTransformationServiceImpl audioTransformationService;


/**
* For all audio related to a given AudioRequest, download, transform and upload the processed file to outbound
* storage.
Expand Down Expand Up @@ -238,7 +232,6 @@ public void processAudioRequest(Integer requestId) {
}
}


@Override
public List<MediaEntity> filterMediaByMediaRequestTimeframeAndSortByStartTimeAndChannel(List<MediaEntity> mediaEntitiesForRequest,
OffsetDateTime startTime,
Expand All @@ -256,7 +249,7 @@ public List<MediaEntity> filterMediaByMediaRequestTimeframeAndSortByStartTimeAnd
}

private Map<MediaEntity, Path> downloadAndSaveMediaToWorkspace(List<MediaEntity> mediaEntitiesForRequest)
throws IOException {
throws IOException, ArmDownForMaintenanceException {
Map<MediaEntity, Path> downloadedMedias = new LinkedHashMap<>();
for (MediaEntity mediaEntity : mediaEntitiesForRequest) {
Path downloadPath = retrieveFromStorageAndSaveToTempWorkspace(mediaEntity);
Expand All @@ -268,7 +261,7 @@ private Map<MediaEntity, Path> downloadAndSaveMediaToWorkspace(List<MediaEntity>

@Override
@SuppressWarnings({"PMD.AvoidThrowingRawExceptionTypes"})
public Path retrieveFromStorageAndSaveToTempWorkspace(MediaEntity mediaEntity) throws IOException {
public Path retrieveFromStorageAndSaveToTempWorkspace(MediaEntity mediaEntity) throws IOException, ArmDownForMaintenanceException {

try (DownloadResponseMetaData downloadResponseMetaData = dataManagementFacade.retrieveFileFromStorage(mediaEntity)) {
String id = downloadResponseMetaData.getEodEntity().getExternalLocation();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package uk.gov.hmcts.darts.common.datamanagement.api;

import uk.gov.hmcts.darts.arm.exception.ArmDownForMaintenanceException;
import uk.gov.hmcts.darts.common.datamanagement.component.impl.DownloadResponseMetaData;
import uk.gov.hmcts.darts.common.entity.AnnotationDocumentEntity;
import uk.gov.hmcts.darts.common.entity.ExternalObjectDirectoryEntity;
Expand All @@ -17,11 +18,14 @@
*/
public interface DataManagementFacade {

DownloadResponseMetaData retrieveFileFromStorage(MediaEntity mediaEntity) throws FileNotDownloadedException;
DownloadResponseMetaData retrieveFileFromStorage(MediaEntity mediaEntity) throws FileNotDownloadedException, ArmDownForMaintenanceException;

DownloadResponseMetaData retrieveFileFromStorage(TranscriptionDocumentEntity transcriptionDocumentEntity) throws FileNotDownloadedException;
DownloadResponseMetaData retrieveFileFromStorage(
TranscriptionDocumentEntity transcriptionDocumentEntity) throws FileNotDownloadedException, ArmDownForMaintenanceException;

DownloadResponseMetaData retrieveFileFromStorage(AnnotationDocumentEntity annotationDocumentEntity) throws FileNotDownloadedException;
DownloadResponseMetaData retrieveFileFromStorage(
AnnotationDocumentEntity annotationDocumentEntity) throws FileNotDownloadedException, ArmDownForMaintenanceException;

DownloadResponseMetaData retrieveFileFromStorage(List<ExternalObjectDirectoryEntity> eodEntities) throws FileNotDownloadedException;
DownloadResponseMetaData retrieveFileFromStorage(
List<ExternalObjectDirectoryEntity> eodEntities) throws FileNotDownloadedException, ArmDownForMaintenanceException;
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.io.FileUtils;
import org.springframework.stereotype.Service;
import uk.gov.hmcts.darts.arm.exception.ArmDownForMaintenanceException;
import uk.gov.hmcts.darts.arm.service.ArmApiService;
import uk.gov.hmcts.darts.audio.helper.UnstructuredDataHelper;
import uk.gov.hmcts.darts.common.datamanagement.component.impl.DownloadResponseMetaData;
Expand Down Expand Up @@ -35,8 +36,10 @@
import java.util.Optional;
import java.util.UUID;

import static java.lang.Boolean.TRUE;
import static java.util.Objects.nonNull;
import static uk.gov.hmcts.darts.common.datamanagement.enums.DatastoreContainerType.ARM;
import static uk.gov.hmcts.darts.common.datamanagement.enums.DatastoreContainerType.UNSTRUCTURED;
import static uk.gov.hmcts.darts.common.enums.ObjectRecordStatusEnum.STORED;

@Slf4j
Expand All @@ -58,7 +61,8 @@ public class DataManagementFacadeImpl implements DataManagementFacade {
private final ObjectRetrievalQueueRepository objectRetrievalQueueRepository;

@Override
public DownloadResponseMetaData retrieveFileFromStorage(MediaEntity mediaEntity) throws FileNotDownloadedException {
public DownloadResponseMetaData retrieveFileFromStorage(MediaEntity mediaEntity)
throws FileNotDownloadedException, ArmDownForMaintenanceException {
ObjectRecordStatusEntity storedStatus = objectRecordStatusRepository.getReferenceById(STORED.getId());
List<ExternalObjectDirectoryEntity> storedEodEntities = externalObjectDirectoryRepository.findByEntityAndStatus(mediaEntity, storedStatus);
if (CollectionUtils.isEmpty(storedEodEntities)) {
Expand All @@ -82,7 +86,8 @@ public DownloadResponseMetaData retrieveFileFromStorage(MediaEntity mediaEntity)
}

@Override
public DownloadResponseMetaData retrieveFileFromStorage(TranscriptionDocumentEntity transcriptionDocumentEntity) throws FileNotDownloadedException {
public DownloadResponseMetaData retrieveFileFromStorage(TranscriptionDocumentEntity transcriptionDocumentEntity)
throws FileNotDownloadedException, ArmDownForMaintenanceException {
ObjectRecordStatusEntity storedStatus = objectRecordStatusRepository.getReferenceById(STORED.getId());
List<ExternalObjectDirectoryEntity> storedEodEntities = externalObjectDirectoryRepository.findByEntityAndStatus(transcriptionDocumentEntity,
storedStatus);
Expand All @@ -108,7 +113,8 @@ public DownloadResponseMetaData retrieveFileFromStorage(TranscriptionDocumentEnt
}

@Override
public DownloadResponseMetaData retrieveFileFromStorage(AnnotationDocumentEntity annotationDocumentEntity) throws FileNotDownloadedException {
public DownloadResponseMetaData retrieveFileFromStorage(
AnnotationDocumentEntity annotationDocumentEntity) throws FileNotDownloadedException, ArmDownForMaintenanceException {
ObjectRecordStatusEntity storedStatus = objectRecordStatusRepository.getReferenceById(STORED.getId());
List<ExternalObjectDirectoryEntity> storedEodEntities = externalObjectDirectoryRepository.findByEntityAndStatus(annotationDocumentEntity, storedStatus);
if (CollectionUtils.isEmpty(storedEodEntities)) {
Expand All @@ -125,7 +131,8 @@ public DownloadResponseMetaData retrieveFileFromStorage(AnnotationDocumentEntity
}

@Override
public DownloadResponseMetaData retrieveFileFromStorage(List<ExternalObjectDirectoryEntity> eodEntities) throws FileNotDownloadedException {
public DownloadResponseMetaData retrieveFileFromStorage(
List<ExternalObjectDirectoryEntity> eodEntities) throws FileNotDownloadedException, ArmDownForMaintenanceException {
if (CollectionUtils.isEmpty(eodEntities)) {
log.error("Supplied list of EodEntities is empty");
throw new FileNotDownloadedException("Supplied list of EodEntities is empty");
Expand Down Expand Up @@ -160,10 +167,12 @@ private DownloadResponseMetaData retrieveFileFromStorage(DatastoreContainerType
}

/**
* Loop through each storage type in order to see if it has a matched EodEntity, and if it does, try to download the file from there, if it fails,
* Loop through each storage type in order to see if it has a matched EodEntity, and if it does, try to download the file from there. If it fails,
* move to the next one, if they all fail then throw a FileNotDownloadedException.
*/
private DownloadResponseMetaData getDataFromStorage(List<ExternalObjectDirectoryEntity> storedEodEntities) throws FileNotDownloadedException {
@SuppressWarnings("PMD.CyclomaticComplexity")
private DownloadResponseMetaData getDataFromStorage(
List<ExternalObjectDirectoryEntity> storedEodEntities) throws FileNotDownloadedException, ArmDownForMaintenanceException {
List<DatastoreContainerType> storageOrder = storageOrderHelper.getStorageOrder();
StringBuilder logBuilder = new StringBuilder(134)
.append("Starting to search for files with ")
Expand All @@ -182,7 +191,11 @@ private DownloadResponseMetaData getDataFromStorage(List<ExternalObjectDirectory
.append('\n');
continue;
}
if (datastoreContainerType.equals(DatastoreContainerType.UNSTRUCTURED)) {
if (TRUE.equals(dataManagementConfiguration.getArmDownForMaintenance())
&& datastoreContainerType.equals(ARM)) {
throw new ArmDownForMaintenanceException("ARM is currently down for maintenance, cannot download files from ARM at this time");
}
if (datastoreContainerType.equals(UNSTRUCTURED)) {
eodEntityToDelete = eodEntity;
}
Optional<BlobContainerDownloadable> container = getSupportedContainer(datastoreContainerType);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,9 @@ public class DataManagementConfiguration extends StorageConfiguration {
@Value("${darts.storage.blob.az-copy-output-level}")
private String azCopyOutputLevel;

@Value("${darts.storage.blob.arm-down-for-maintenance}")
private Boolean armDownForMaintenance;

@Override
@Value("${darts.storage.blob.temp-blob-workspace}")
public void setTempBlobWorkspace(String tempBlobWorkspace) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Service;
import uk.gov.hmcts.darts.arm.enums.ArmApiError;
import uk.gov.hmcts.darts.arm.exception.ArmDownForMaintenanceException;
import uk.gov.hmcts.darts.audit.api.AuditApi;
import uk.gov.hmcts.darts.authorisation.component.UserIdentity;
import uk.gov.hmcts.darts.common.datamanagement.api.DataManagementFacade;
Expand Down Expand Up @@ -68,6 +70,8 @@ private Resource getResourceStreamFor(TranscriptionDocumentEntity latestTranscri
try {
DownloadResponseMetaData downloadResponseMetaData = dataManagementFacade.retrieveFileFromStorage(latestTranscriptionDocument);
return downloadResponseMetaData.getResource();
} catch (ArmDownForMaintenanceException e) {
throw new DartsApiException(ArmApiError.ARM_DOWN_FOR_MAINTENANCE, e);
} catch (IOException | FileNotDownloadedException ex) {
log.error("Failed to download transcript file using latestTranscriptionDocument ID {}",
latestTranscriptionDocument.getId(),
Expand Down
2 changes: 2 additions & 0 deletions src/main/resources/application.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,7 @@ darts:
url: ${ARM_URL}
arm-service-entitlement: ${ARM_SERVICE_ENTITLEMENT:}
arm-storage-account-name: ${ARM_STORAGE_ACCOUNT_NAME:}
arm-down-for-maintenance: ${ARM_DOWN_FOR_MAINTENANCE:false}

authentication-url:
token-path: /auth/account/token
Expand Down Expand Up @@ -350,6 +351,7 @@ darts:
az-copy-preserve-access-tier: "--s2s-preserve-access-tier=false"
az-copy-log-level: ${AZCOPY_LOG_LEVEL:}
az-copy-output-level: ${AZCOPY_OUTPUT_LEVEL:}
arm-down-for-maintenance: ${ARM_DOWN_FOR_MAINTENANCE:false}
search:
order: "UNSTRUCTURED,DETS,ARM,VODAFONE"
case-document:
Expand Down
Loading
Loading