in genie-web/src/main/java/com/netflix/genie/web/services/impl/ArchivedJobServiceImpl.java [113:178]
public ArchivedJobMetadata getArchivedJobMetadata(
final String jobId
) throws JobNotFoundException, JobNotArchivedException, JobDirectoryManifestNotFoundException {
final Instant startTime = Instant.now();
log.debug("Attempting to fetch archived job metadata for job {}", jobId);
final Set<Tag> tags = Sets.newHashSet();
try {
final String archiveLocation;
try {
archiveLocation = this.persistenceService
.getJobArchiveLocation(jobId)
.orElseThrow(() -> new JobNotArchivedException("Job " + jobId + " wasn't archived"));
} catch (final NotFoundException nfe) {
throw new JobNotFoundException(nfe);
}
final URI jobDirectoryRoot;
try {
jobDirectoryRoot = new URI(archiveLocation + SLASH).normalize();
} catch (final URISyntaxException e) {
throw new GenieRuntimeException("Unable to create URI from archive location: " + archiveLocation, e);
}
// TODO: This is pretty hardcoded and we may want to store direct link
// to manifest in database or something
final URI manifestLocation;
if (StringUtils.isBlank(JobArchiveService.MANIFEST_DIRECTORY)) {
manifestLocation = jobDirectoryRoot.resolve(JobArchiveService.MANIFEST_NAME).normalize();
} else {
manifestLocation = jobDirectoryRoot
.resolve(JobArchiveService.MANIFEST_DIRECTORY + SLASH)
.resolve(JobArchiveService.MANIFEST_NAME)
.normalize();
}
final Resource manifestResource = this.resourceLoader.getResource(manifestLocation.toString());
if (manifestResource == null || !manifestResource.exists()) {
throw new JobDirectoryManifestNotFoundException(
"No job directory manifest exists at " + manifestLocation
);
}
final DirectoryManifest manifest;
try (InputStream manifestData = manifestResource.getInputStream()) {
manifest = GenieObjectMapper
.getMapper()
.readValue(manifestData, DirectoryManifest.class);
} catch (final IOException e) {
throw new GenieRuntimeException("Unable to read job directory manifest from " + manifestLocation, e);
}
MetricsUtils.addSuccessTags(tags);
return new ArchivedJobMetadata(jobId, manifest, jobDirectoryRoot);
} catch (final Throwable t) {
MetricsUtils.addFailureTagsWithException(tags, t);
throw t;
} finally {
log.debug("Finished attempting to fetch archived job metadata for job {}", jobId);
this.meterRegistry
.timer(GET_ARCHIVED_JOB_METADATA_METRIC_NAME, tags)
.record(Duration.between(startTime, Instant.now()));
}
}