From 4643dc83dd4262850851571c367e046433c685ad Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Thu, 7 Mar 2024 11:06:16 -0500 Subject: [PATCH 01/18] added doPutMetadata --- .../io/cryostat/graphql/ActiveRecordings.java | 25 +++++++++++++++++++ .../cryostat/recordings/ActiveRecording.java | 4 +++ .../cryostat/recordings/RecordingHelper.java | 15 +++++++++++ 3 files changed, 44 insertions(+) diff --git a/src/main/java/io/cryostat/graphql/ActiveRecordings.java b/src/main/java/io/cryostat/graphql/ActiveRecordings.java index efd1bc997..cc68dbd2c 100644 --- a/src/main/java/io/cryostat/graphql/ActiveRecordings.java +++ b/src/main/java/io/cryostat/graphql/ActiveRecordings.java @@ -322,6 +322,31 @@ public RecordingOptions asOptions() { } } + @Mutation + @Description( + "Updates the metadata labels for an existing Flight Recorder recording specified by the" + + " recording ID.") + public Uni doPutMetadata(Long recordingId, MetadataInput metadataInput) { + return Uni.createFrom() + .item( + () -> { + Map labels = metadataInput.getLabels(); + return recordingHelper.updateRecordingMetadata(recordingId, labels); + }); + } + + public static class MetadataInput { + private Map labels; + + public Map getLabels() { + return labels; + } + + public void setLabels(Map labels) { + this.labels = labels; + } + } + @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD") public static class RecordingMetadata { public @Nullable Map labels; diff --git a/src/main/java/io/cryostat/recordings/ActiveRecording.java b/src/main/java/io/cryostat/recordings/ActiveRecording.java index 3de4f2f9b..a84433b7f 100644 --- a/src/main/java/io/cryostat/recordings/ActiveRecording.java +++ b/src/main/java/io/cryostat/recordings/ActiveRecording.java @@ -142,6 +142,10 @@ public static ActiveRecording getByName(String name) { return find("name", name).singleResult(); } + public void setMetadata(Metadata metadatatadata) { + this.metadata = metadata; + } + @Transactional public static boolean deleteFromTarget(Target target, String recordingName) { Optional recording = diff --git a/src/main/java/io/cryostat/recordings/RecordingHelper.java b/src/main/java/io/cryostat/recordings/RecordingHelper.java index 1e60de209..bc676e24c 100644 --- a/src/main/java/io/cryostat/recordings/RecordingHelper.java +++ b/src/main/java/io/cryostat/recordings/RecordingHelper.java @@ -89,6 +89,7 @@ import jakarta.inject.Named; import jakarta.transaction.Transactional; import jakarta.ws.rs.BadRequestException; +import jakarta.ws.rs.NotFoundException; import jakarta.ws.rs.ServerErrorException; import jdk.jfr.RecordingState; import org.apache.commons.codec.binary.Base64; @@ -945,6 +946,20 @@ private Metadata taggingToMetadata(List tagSet) { return new Metadata(labels, expiry); } + public ActiveRecording updateRecordingMetadata( + Long recordingId, Map newLabels) { + ActiveRecording recording = ActiveRecording.findById(recordingId); + if (recording == null) { + throw new NotFoundException("Recording not found for ID: " + recordingId); + } + + Metadata updatedMetadata = new Metadata(newLabels); + recording.setMetadata(updatedMetadata); + recording.persist(); + + return recording; + } + @Blocking public Uni uploadToJFRDatasource(long targetEntityId, long remoteId) throws Exception { Target target = Target.getTargetById(targetEntityId); From be4d7fe3f9a321922ee5dc34b54bff3313f938bf Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Mon, 11 Mar 2024 12:16:04 -0400 Subject: [PATCH 02/18] @source --- src/main/java/io/cryostat/graphql/ActiveRecordings.java | 7 +++---- src/main/java/io/cryostat/recordings/RecordingHelper.java | 2 ++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/cryostat/graphql/ActiveRecordings.java b/src/main/java/io/cryostat/graphql/ActiveRecordings.java index cc68dbd2c..359252477 100644 --- a/src/main/java/io/cryostat/graphql/ActiveRecordings.java +++ b/src/main/java/io/cryostat/graphql/ActiveRecordings.java @@ -49,7 +49,6 @@ import jdk.jfr.RecordingState; import org.eclipse.microprofile.graphql.Description; import org.eclipse.microprofile.graphql.GraphQLApi; -import org.eclipse.microprofile.graphql.Mutation; import org.eclipse.microprofile.graphql.NonNull; import org.eclipse.microprofile.graphql.Source; import org.jboss.logging.Logger; @@ -322,16 +321,16 @@ public RecordingOptions asOptions() { } } - @Mutation @Description( "Updates the metadata labels for an existing Flight Recorder recording specified by the" + " recording ID.") - public Uni doPutMetadata(Long recordingId, MetadataInput metadataInput) { + public Uni doPutMetadata( + @Source ActiveRecording recording, MetadataInput metadataInput) { return Uni.createFrom() .item( () -> { Map labels = metadataInput.getLabels(); - return recordingHelper.updateRecordingMetadata(recordingId, labels); + return recordingHelper.updateRecordingMetadata(recording.id, labels); }); } diff --git a/src/main/java/io/cryostat/recordings/RecordingHelper.java b/src/main/java/io/cryostat/recordings/RecordingHelper.java index bc676e24c..e00a3744a 100644 --- a/src/main/java/io/cryostat/recordings/RecordingHelper.java +++ b/src/main/java/io/cryostat/recordings/RecordingHelper.java @@ -949,12 +949,14 @@ private Metadata taggingToMetadata(List tagSet) { public ActiveRecording updateRecordingMetadata( Long recordingId, Map newLabels) { ActiveRecording recording = ActiveRecording.findById(recordingId); + if (recording == null) { throw new NotFoundException("Recording not found for ID: " + recordingId); } Metadata updatedMetadata = new Metadata(newLabels); recording.setMetadata(updatedMetadata); + recording.persist(); return recording; From 4d2b1a9d9101211f79113400a30155589b4d2aa3 Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Mon, 11 Mar 2024 13:50:22 -0400 Subject: [PATCH 03/18] fix param typo --- src/main/java/io/cryostat/recordings/ActiveRecording.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/cryostat/recordings/ActiveRecording.java b/src/main/java/io/cryostat/recordings/ActiveRecording.java index a84433b7f..8f931969b 100644 --- a/src/main/java/io/cryostat/recordings/ActiveRecording.java +++ b/src/main/java/io/cryostat/recordings/ActiveRecording.java @@ -142,7 +142,7 @@ public static ActiveRecording getByName(String name) { return find("name", name).singleResult(); } - public void setMetadata(Metadata metadatatadata) { + public void setMetadata(Metadata metadata) { this.metadata = metadata; } From 358a36896a79cf13d0ebeac4e228103e3a8620ed Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Mon, 11 Mar 2024 23:39:53 -0400 Subject: [PATCH 04/18] resolve issues --- .../io/cryostat/graphql/ActiveRecordings.java | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/cryostat/graphql/ActiveRecordings.java b/src/main/java/io/cryostat/graphql/ActiveRecordings.java index 359252477..7e93efa58 100644 --- a/src/main/java/io/cryostat/graphql/ActiveRecordings.java +++ b/src/main/java/io/cryostat/graphql/ActiveRecordings.java @@ -325,17 +325,26 @@ public RecordingOptions asOptions() { "Updates the metadata labels for an existing Flight Recorder recording specified by the" + " recording ID.") public Uni doPutMetadata( - @Source ActiveRecording recording, MetadataInput metadataInput) { + @Source ActiveRecording recording, MetadataLabelsInput metadataInput) { return Uni.createFrom() .item( () -> { - Map labels = metadataInput.getLabels(); - return recordingHelper.updateRecordingMetadata(recording.id, labels); + return recordingHelper.updateRecordingMetadata( + recording.id, metadataInput.getLabels()); }); } - public static class MetadataInput { + public class MetadataLabelsInput { + private Map labels; + private Instant expiry; + + public MetadataLabelsInput() {} + + public MetadataLabelsInput(Map labels, Instant expiry) { + this.labels = labels; + this.expiry = expiry; + } public Map getLabels() { return labels; @@ -344,6 +353,14 @@ public Map getLabels() { public void setLabels(Map labels) { this.labels = labels; } + + public Instant getExpiry() { + return expiry; + } + + public void setExpiry(Instant expiry) { + this.expiry = expiry; + } } @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD") From c11e40b43267889ae7daa5bf36ced4125c811c00 Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Tue, 12 Mar 2024 12:00:22 -0400 Subject: [PATCH 05/18] fix naming --- src/main/java/io/cryostat/graphql/ActiveRecordings.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/cryostat/graphql/ActiveRecordings.java b/src/main/java/io/cryostat/graphql/ActiveRecordings.java index 7e93efa58..4d8293b0b 100644 --- a/src/main/java/io/cryostat/graphql/ActiveRecordings.java +++ b/src/main/java/io/cryostat/graphql/ActiveRecordings.java @@ -325,7 +325,7 @@ public RecordingOptions asOptions() { "Updates the metadata labels for an existing Flight Recorder recording specified by the" + " recording ID.") public Uni doPutMetadata( - @Source ActiveRecording recording, MetadataLabelsInput metadataInput) { + @Source ActiveRecording recording, MetadataLabels metadataInput) { return Uni.createFrom() .item( () -> { @@ -334,14 +334,14 @@ public Uni doPutMetadata( }); } - public class MetadataLabelsInput { + public class MetadataLabels { private Map labels; private Instant expiry; - public MetadataLabelsInput() {} + public MetadataLabels() {} - public MetadataLabelsInput(Map labels, Instant expiry) { + public MetadataLabels(Map labels, Instant expiry) { this.labels = labels; this.expiry = expiry; } From d07f790e482a1cdaa0a929791bf0d4e0a2537550 Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Tue, 12 Mar 2024 16:54:41 -0400 Subject: [PATCH 06/18] add doDelete on archived --- .../java/io/cryostat/graphql/ArchivedRecordings.java | 12 ++++++++++-- .../java/io/cryostat/recordings/RecordingHelper.java | 3 +++ src/main/java/io/cryostat/recordings/Recordings.java | 11 +++++++++-- .../reports/MemoryCachingReportsListener.java | 4 ++-- .../reports/StorageCachingReportsListener.java | 4 +++- src/test/java/itest/RecordingWorkflowTest.java | 2 +- 6 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/main/java/io/cryostat/graphql/ArchivedRecordings.java b/src/main/java/io/cryostat/graphql/ArchivedRecordings.java index afcf36f77..69b3784ed 100644 --- a/src/main/java/io/cryostat/graphql/ArchivedRecordings.java +++ b/src/main/java/io/cryostat/graphql/ArchivedRecordings.java @@ -29,8 +29,10 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import io.smallrye.common.annotation.Blocking; import io.smallrye.graphql.api.Nullable; +import io.vertx.core.cli.annotations.Description; import jakarta.inject.Inject; import org.eclipse.microprofile.graphql.GraphQLApi; +import org.eclipse.microprofile.graphql.NonNull; import org.eclipse.microprofile.graphql.Query; import org.eclipse.microprofile.graphql.Source; @@ -69,6 +71,12 @@ public TargetNodes.ArchivedRecordings archived( return out; } + @NonNull + public ArchivedRecording doDelete(@Source ArchivedRecording recording) { + recordingHelper.deleteArchivedRecording(recording.jvmId(), recording.filename()); + return recording; + } + @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD") public static class ArchivedRecordingsFilter implements Predicate { public @Nullable String name; @@ -83,9 +91,9 @@ public static class ArchivedRecordingsFilter implements Predicate matchesName = - n -> name == null || Objects.equals(name, n.name()); + n -> name == null || Objects.equals(name, n.filename()); Predicate matchesNames = - n -> names == null || names.contains(n.name()); + n -> names == null || names.contains(n.filename()); Predicate matchesSourceTarget = n -> sourceTarget == null diff --git a/src/main/java/io/cryostat/recordings/RecordingHelper.java b/src/main/java/io/cryostat/recordings/RecordingHelper.java index e00a3744a..04a103723 100644 --- a/src/main/java/io/cryostat/recordings/RecordingHelper.java +++ b/src/main/java/io/cryostat/recordings/RecordingHelper.java @@ -558,6 +558,7 @@ public List listArchivedRecordings() { getArchivedRecordingMetadata(jvmId, filename) .orElseGet(Metadata::empty); return new ArchivedRecording( + jvmId, filename, downloadUrl(jvmId, filename), reportUrl(jvmId, filename), @@ -596,6 +597,7 @@ public List listArchivedRecordings(String jvmId) { getArchivedRecordingMetadata(jvmId, filename) .orElseGet(Metadata::empty); return new ArchivedRecording( + jvmId, filename, downloadUrl(jvmId, filename), reportUrl(jvmId, filename), @@ -870,6 +872,7 @@ public void deleteArchivedRecording(String jvmId, String filename) { ArchivedRecordingEvent.Payload.of( target.map(t -> t.connectUrl).orElse(null), new ArchivedRecording( + jvmId, filename, downloadUrl(jvmId, filename), reportUrl(jvmId, filename), diff --git a/src/main/java/io/cryostat/recordings/Recordings.java b/src/main/java/io/cryostat/recordings/Recordings.java index 0ab21388f..29fd46203 100644 --- a/src/main/java/io/cryostat/recordings/Recordings.java +++ b/src/main/java/io/cryostat/recordings/Recordings.java @@ -222,6 +222,7 @@ public void agentPush( ArchivedRecordingEvent.Payload.of( target.map(t -> t.connectUrl).orElse(null), new ArchivedRecording( + jvmId, recording.fileName(), recordingHelper.downloadUrl(jvmId, recording.fileName()), recordingHelper.reportUrl(jvmId, recording.fileName()), @@ -275,6 +276,7 @@ public List agentGet(@RestPath String jvmId) { .orElseGet(Metadata::empty); result.add( new ArchivedRecording( + jvmId, filename, recordingHelper.downloadUrl(jvmId, filename), recordingHelper.reportUrl(jvmId, filename), @@ -338,6 +340,7 @@ Map doUpload(FileUpload recording, Metadata metadata, String jvm ArchivedRecordingEvent.Payload.of( target.map(t -> t.connectUrl).orElse(null), new ArchivedRecording( + jvmId, filename, recordingHelper.downloadUrl(jvmId, filename), recordingHelper.reportUrl(jvmId, filename), @@ -395,6 +398,7 @@ public Collection listFsArchives() { connectUrl, id, new ArrayList<>())); dir.recordings.add( new ArchivedRecording( + jvmId, filename, recordingHelper.downloadUrl(jvmId, filename), recordingHelper.reportUrl(jvmId, filename), @@ -768,6 +772,7 @@ public void deleteArchivedRecording(@RestPath String jvmId, @RestPath String fil ArchivedRecordingEvent.Payload.of( URI.create(connectUrl), new ArchivedRecording( + jvmId, filename, recordingHelper.downloadUrl(jvmId, filename), recordingHelper.reportUrl(jvmId, filename), @@ -1127,14 +1132,16 @@ public record LinkedRecordingDescriptor( // TODO include jvmId and filename public record ArchivedRecording( - String name, + String jvmId, + String filename, String downloadUrl, String reportUrl, Metadata metadata, long size, long archivedTime) { public ArchivedRecording { - Objects.requireNonNull(name); + Objects.requireNonNull(jvmId); + Objects.requireNonNull(filename); Objects.requireNonNull(downloadUrl); Objects.requireNonNull(reportUrl); Objects.requireNonNull(metadata); diff --git a/src/main/java/io/cryostat/reports/MemoryCachingReportsListener.java b/src/main/java/io/cryostat/reports/MemoryCachingReportsListener.java index 7eb49715b..54fe1853a 100644 --- a/src/main/java/io/cryostat/reports/MemoryCachingReportsListener.java +++ b/src/main/java/io/cryostat/reports/MemoryCachingReportsListener.java @@ -57,7 +57,7 @@ class MemoryCachingReportsListener { @ConsumeEvent(value = Recordings.ARCHIVED_RECORDING_DELETED) public void handleArchivedRecordingDeletion(ArchivedRecording recording) { - logger.tracev("archived recording cache invalidation: {0}", recording.name()); + logger.tracev("archived recording cache invalidation: {0}", recording.filename()); if (!quarkusCache || !memoryCache) { return; } @@ -65,7 +65,7 @@ public void handleArchivedRecordingDeletion(ArchivedRecording recording) { if (StringUtils.isBlank(jvmId)) { return; } - String key = recordingHelper.archivedRecordingKey(jvmId, recording.name()); + String key = recordingHelper.archivedRecordingKey(jvmId, recording.filename()); logger.tracev("Picked up deletion of archived recording: {0}", key); archivedCache.invalidate(key); } diff --git a/src/main/java/io/cryostat/reports/StorageCachingReportsListener.java b/src/main/java/io/cryostat/reports/StorageCachingReportsListener.java index a44fe133d..40de4f773 100644 --- a/src/main/java/io/cryostat/reports/StorageCachingReportsListener.java +++ b/src/main/java/io/cryostat/reports/StorageCachingReportsListener.java @@ -54,7 +54,9 @@ public void handleArchivedRecordingDeletion(ArchivedRecording recording) { Optional.ofNullable(recording.metadata().labels().get("jvmId")) .ifPresent( jvmId -> { - var key = recordingHelper.archivedRecordingKey(jvmId, recording.name()); + var key = + recordingHelper.archivedRecordingKey( + jvmId, recording.filename()); logger.tracev("Picked up deletion of archived recording: {0}", key); var req = DeleteObjectRequest.builder().bucket(bucket).key(key).build(); try { diff --git a/src/test/java/itest/RecordingWorkflowTest.java b/src/test/java/itest/RecordingWorkflowTest.java index 1abafc771..76503406e 100644 --- a/src/test/java/itest/RecordingWorkflowTest.java +++ b/src/test/java/itest/RecordingWorkflowTest.java @@ -175,7 +175,7 @@ public void testWorkflow() throws Exception { Matchers.equalTo(1)); recordingInfo = listResp.getJsonObject(0); MatcherAssert.assertThat( - recordingInfo.getString("name"), + recordingInfo.getString("filename"), Matchers.matchesRegex( TARGET_ALIAS + "_" + TEST_RECORDING_NAME + "_[\\d]{8}T[\\d]{6}Z.jfr")); String savedDownloadUrl = recordingInfo.getString("downloadUrl"); From e85897df96614d5037ca15c020a6feabab6e5d5a Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Wed, 13 Mar 2024 13:20:26 -0400 Subject: [PATCH 07/18] added doPutMetadata for ArchivedRecordings --- .../cryostat/graphql/ArchivedRecordings.java | 27 +++++++++-- .../cryostat/recordings/RecordingHelper.java | 45 +++++++++++++++++++ .../io/cryostat/recordings/Recordings.java | 4 +- .../reports/MemoryCachingReportsListener.java | 4 +- .../StorageCachingReportsListener.java | 4 +- .../java/itest/RecordingWorkflowTest.java | 2 +- 6 files changed, 75 insertions(+), 11 deletions(-) diff --git a/src/main/java/io/cryostat/graphql/ArchivedRecordings.java b/src/main/java/io/cryostat/graphql/ArchivedRecordings.java index 69b3784ed..cfcdfb032 100644 --- a/src/main/java/io/cryostat/graphql/ArchivedRecordings.java +++ b/src/main/java/io/cryostat/graphql/ArchivedRecordings.java @@ -20,11 +20,13 @@ import java.util.Objects; import java.util.function.Predicate; +import io.cryostat.graphql.ActiveRecordings.MetadataLabels; import io.cryostat.graphql.TargetNodes.AggregateInfo; import io.cryostat.graphql.TargetNodes.Recordings; import io.cryostat.graphql.matchers.LabelSelectorMatcher; import io.cryostat.recordings.RecordingHelper; import io.cryostat.recordings.Recordings.ArchivedRecording; +import io.cryostat.recordings.Recordings.Metadata; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import io.smallrye.common.annotation.Blocking; @@ -73,10 +75,29 @@ public TargetNodes.ArchivedRecordings archived( @NonNull public ArchivedRecording doDelete(@Source ArchivedRecording recording) { - recordingHelper.deleteArchivedRecording(recording.jvmId(), recording.filename()); + recordingHelper.deleteArchivedRecording(recording.jvmId(), recording.name()); return recording; } + @NonNull + public ArchivedRecording doPutMetadata( + @Source ArchivedRecording recording, MetadataLabels metadataInput) { + recordingHelper.updateArchivedRecordingMetadata( + recording.jvmId(), recording.name(), metadataInput.getLabels()); + + String downloadUrl = recordingHelper.downloadUrl(recording.jvmId(), recording.name()); + String reportUrl = recordingHelper.reportUrl(recording.jvmId(), recording.name()); + + return new ArchivedRecording( + recording.jvmId(), + recording.name(), + downloadUrl, + reportUrl, + new Metadata(metadataInput.getLabels(), metadataInput.getExpiry()), + recording.size(), + recording.archivedTime()); + } + @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD") public static class ArchivedRecordingsFilter implements Predicate { public @Nullable String name; @@ -91,9 +112,9 @@ public static class ArchivedRecordingsFilter implements Predicate matchesName = - n -> name == null || Objects.equals(name, n.filename()); + n -> name == null || Objects.equals(name, n.name()); Predicate matchesNames = - n -> names == null || names.contains(n.filename()); + n -> names == null || names.contains(n.name()); Predicate matchesSourceTarget = n -> sourceTarget == null diff --git a/src/main/java/io/cryostat/recordings/RecordingHelper.java b/src/main/java/io/cryostat/recordings/RecordingHelper.java index 04a103723..26343ddde 100644 --- a/src/main/java/io/cryostat/recordings/RecordingHelper.java +++ b/src/main/java/io/cryostat/recordings/RecordingHelper.java @@ -110,8 +110,10 @@ import software.amazon.awssdk.services.s3.model.DeleteObjectRequest; import software.amazon.awssdk.services.s3.model.GetObjectRequest; import software.amazon.awssdk.services.s3.model.GetObjectTaggingRequest; +import software.amazon.awssdk.services.s3.model.HeadObjectRequest; import software.amazon.awssdk.services.s3.model.ListObjectsV2Request; import software.amazon.awssdk.services.s3.model.NoSuchKeyException; +import software.amazon.awssdk.services.s3.model.PutObjectTaggingRequest; import software.amazon.awssdk.services.s3.model.S3Object; import software.amazon.awssdk.services.s3.model.Tag; import software.amazon.awssdk.services.s3.model.Tagging; @@ -965,6 +967,49 @@ public ActiveRecording updateRecordingMetadata( return recording; } + public ArchivedRecording updateArchivedRecordingMetadata( + String jvmId, String filename, Map newLabels) { + String key = archivedRecordingKey(jvmId, filename); + Optional existingMetadataOpt = getArchivedRecordingMetadata(key); + + if (existingMetadataOpt.isEmpty()) { + throw new NotFoundException( + "Could not find metadata for archived recording with key: " + key); + } + + // overwrite existing keys with new values + Map combinedLabels = new HashMap<>(existingMetadataOpt.get().labels()); + combinedLabels.putAll(newLabels); + + Instant expiry = existingMetadataOpt.get().expiry(); + Metadata updatedMetadata = new Metadata(combinedLabels, expiry); + + // Update the S3 object tagging with new metadata + Tagging tagging = createMetadataTagging(updatedMetadata); + storage.putObjectTagging( + PutObjectTaggingRequest.builder() + .bucket(archiveBucket) + .key(key) + .tagging(tagging) + .build()); + + var response = + storage.headObject( + HeadObjectRequest.builder().bucket(archiveBucket).key(key).build()); + + long size = response.contentLength(); + Instant lastModified = response.lastModified(); + + return new ArchivedRecording( + jvmId, + filename, + downloadUrl(jvmId, filename), + reportUrl(jvmId, filename), + updatedMetadata, + size, + lastModified.getEpochSecond()); + } + @Blocking public Uni uploadToJFRDatasource(long targetEntityId, long remoteId) throws Exception { Target target = Target.getTargetById(targetEntityId); diff --git a/src/main/java/io/cryostat/recordings/Recordings.java b/src/main/java/io/cryostat/recordings/Recordings.java index 29fd46203..9cbbd0d6d 100644 --- a/src/main/java/io/cryostat/recordings/Recordings.java +++ b/src/main/java/io/cryostat/recordings/Recordings.java @@ -1133,7 +1133,7 @@ public record LinkedRecordingDescriptor( // TODO include jvmId and filename public record ArchivedRecording( String jvmId, - String filename, + String name, String downloadUrl, String reportUrl, Metadata metadata, @@ -1141,7 +1141,7 @@ public record ArchivedRecording( long archivedTime) { public ArchivedRecording { Objects.requireNonNull(jvmId); - Objects.requireNonNull(filename); + Objects.requireNonNull(name); Objects.requireNonNull(downloadUrl); Objects.requireNonNull(reportUrl); Objects.requireNonNull(metadata); diff --git a/src/main/java/io/cryostat/reports/MemoryCachingReportsListener.java b/src/main/java/io/cryostat/reports/MemoryCachingReportsListener.java index 54fe1853a..7eb49715b 100644 --- a/src/main/java/io/cryostat/reports/MemoryCachingReportsListener.java +++ b/src/main/java/io/cryostat/reports/MemoryCachingReportsListener.java @@ -57,7 +57,7 @@ class MemoryCachingReportsListener { @ConsumeEvent(value = Recordings.ARCHIVED_RECORDING_DELETED) public void handleArchivedRecordingDeletion(ArchivedRecording recording) { - logger.tracev("archived recording cache invalidation: {0}", recording.filename()); + logger.tracev("archived recording cache invalidation: {0}", recording.name()); if (!quarkusCache || !memoryCache) { return; } @@ -65,7 +65,7 @@ public void handleArchivedRecordingDeletion(ArchivedRecording recording) { if (StringUtils.isBlank(jvmId)) { return; } - String key = recordingHelper.archivedRecordingKey(jvmId, recording.filename()); + String key = recordingHelper.archivedRecordingKey(jvmId, recording.name()); logger.tracev("Picked up deletion of archived recording: {0}", key); archivedCache.invalidate(key); } diff --git a/src/main/java/io/cryostat/reports/StorageCachingReportsListener.java b/src/main/java/io/cryostat/reports/StorageCachingReportsListener.java index 40de4f773..a44fe133d 100644 --- a/src/main/java/io/cryostat/reports/StorageCachingReportsListener.java +++ b/src/main/java/io/cryostat/reports/StorageCachingReportsListener.java @@ -54,9 +54,7 @@ public void handleArchivedRecordingDeletion(ArchivedRecording recording) { Optional.ofNullable(recording.metadata().labels().get("jvmId")) .ifPresent( jvmId -> { - var key = - recordingHelper.archivedRecordingKey( - jvmId, recording.filename()); + var key = recordingHelper.archivedRecordingKey(jvmId, recording.name()); logger.tracev("Picked up deletion of archived recording: {0}", key); var req = DeleteObjectRequest.builder().bucket(bucket).key(key).build(); try { diff --git a/src/test/java/itest/RecordingWorkflowTest.java b/src/test/java/itest/RecordingWorkflowTest.java index 76503406e..1abafc771 100644 --- a/src/test/java/itest/RecordingWorkflowTest.java +++ b/src/test/java/itest/RecordingWorkflowTest.java @@ -175,7 +175,7 @@ public void testWorkflow() throws Exception { Matchers.equalTo(1)); recordingInfo = listResp.getJsonObject(0); MatcherAssert.assertThat( - recordingInfo.getString("filename"), + recordingInfo.getString("name"), Matchers.matchesRegex( TARGET_ALIAS + "_" + TEST_RECORDING_NAME + "_[\\d]{8}T[\\d]{6}Z.jfr")); String savedDownloadUrl = recordingInfo.getString("downloadUrl"); From 69244c7dd6bb12e75dea4c722647f98dc707f34f Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Wed, 13 Mar 2024 13:46:02 -0400 Subject: [PATCH 08/18] mvn spotless:apply --- src/main/java/io/cryostat/graphql/ArchivedRecordings.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/io/cryostat/graphql/ArchivedRecordings.java b/src/main/java/io/cryostat/graphql/ArchivedRecordings.java index cfcdfb032..47cf4e3c6 100644 --- a/src/main/java/io/cryostat/graphql/ArchivedRecordings.java +++ b/src/main/java/io/cryostat/graphql/ArchivedRecordings.java @@ -31,7 +31,6 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import io.smallrye.common.annotation.Blocking; import io.smallrye.graphql.api.Nullable; -import io.vertx.core.cli.annotations.Description; import jakarta.inject.Inject; import org.eclipse.microprofile.graphql.GraphQLApi; import org.eclipse.microprofile.graphql.NonNull; From 774ccefc5f74e0d0f3e95281a8e4e3904f7d41a9 Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Wed, 13 Mar 2024 16:19:06 -0400 Subject: [PATCH 09/18] resolve github workflow errors --- src/main/java/io/cryostat/graphql/ActiveRecordings.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/cryostat/graphql/ActiveRecordings.java b/src/main/java/io/cryostat/graphql/ActiveRecordings.java index 4d8293b0b..0bc99c1c7 100644 --- a/src/main/java/io/cryostat/graphql/ActiveRecordings.java +++ b/src/main/java/io/cryostat/graphql/ActiveRecordings.java @@ -17,6 +17,7 @@ import java.time.Duration; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -334,7 +335,7 @@ public Uni doPutMetadata( }); } - public class MetadataLabels { + public static class MetadataLabels { private Map labels; private Instant expiry; @@ -342,16 +343,16 @@ public class MetadataLabels { public MetadataLabels() {} public MetadataLabels(Map labels, Instant expiry) { - this.labels = labels; + this.labels = new HashMap<>(labels); this.expiry = expiry; } public Map getLabels() { - return labels; + return new HashMap<>(labels); } public void setLabels(Map labels) { - this.labels = labels; + this.labels = new HashMap<>(labels); } public Instant getExpiry() { From 88f3f9e1ff0ee998f2f30d3d5352251349ca4f04 Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Thu, 14 Mar 2024 10:53:43 -0400 Subject: [PATCH 10/18] get rid of expiry on MetadataLabelsInput --- .../java/io/cryostat/graphql/ActiveRecordings.java | 10 ---------- .../java/io/cryostat/graphql/ArchivedRecordings.java | 2 +- .../java/io/cryostat/recordings/RecordingHelper.java | 3 +-- 3 files changed, 2 insertions(+), 13 deletions(-) diff --git a/src/main/java/io/cryostat/graphql/ActiveRecordings.java b/src/main/java/io/cryostat/graphql/ActiveRecordings.java index 0bc99c1c7..fd5933599 100644 --- a/src/main/java/io/cryostat/graphql/ActiveRecordings.java +++ b/src/main/java/io/cryostat/graphql/ActiveRecordings.java @@ -338,13 +338,11 @@ public Uni doPutMetadata( public static class MetadataLabels { private Map labels; - private Instant expiry; public MetadataLabels() {} public MetadataLabels(Map labels, Instant expiry) { this.labels = new HashMap<>(labels); - this.expiry = expiry; } public Map getLabels() { @@ -354,14 +352,6 @@ public Map getLabels() { public void setLabels(Map labels) { this.labels = new HashMap<>(labels); } - - public Instant getExpiry() { - return expiry; - } - - public void setExpiry(Instant expiry) { - this.expiry = expiry; - } } @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD") diff --git a/src/main/java/io/cryostat/graphql/ArchivedRecordings.java b/src/main/java/io/cryostat/graphql/ArchivedRecordings.java index 47cf4e3c6..e62a40a5e 100644 --- a/src/main/java/io/cryostat/graphql/ArchivedRecordings.java +++ b/src/main/java/io/cryostat/graphql/ArchivedRecordings.java @@ -92,7 +92,7 @@ public ArchivedRecording doPutMetadata( recording.name(), downloadUrl, reportUrl, - new Metadata(metadataInput.getLabels(), metadataInput.getExpiry()), + new Metadata(metadataInput.getLabels()), recording.size(), recording.archivedTime()); } diff --git a/src/main/java/io/cryostat/recordings/RecordingHelper.java b/src/main/java/io/cryostat/recordings/RecordingHelper.java index 26343ddde..9f14a4a52 100644 --- a/src/main/java/io/cryostat/recordings/RecordingHelper.java +++ b/src/main/java/io/cryostat/recordings/RecordingHelper.java @@ -981,8 +981,7 @@ public ArchivedRecording updateArchivedRecordingMetadata( Map combinedLabels = new HashMap<>(existingMetadataOpt.get().labels()); combinedLabels.putAll(newLabels); - Instant expiry = existingMetadataOpt.get().expiry(); - Metadata updatedMetadata = new Metadata(combinedLabels, expiry); + Metadata updatedMetadata = new Metadata(combinedLabels); // Update the S3 object tagging with new metadata Tagging tagging = createMetadataTagging(updatedMetadata); From ef1efe31665c96e4e4ab0bb49d4064a872c1f154 Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Thu, 14 Mar 2024 13:44:34 -0400 Subject: [PATCH 11/18] resolved compilation errors after rebase --- src/main/java/io/cryostat/graphql/ActiveRecordings.java | 3 ++- src/main/java/io/cryostat/recordings/RecordingHelper.java | 1 + src/main/java/io/cryostat/recordings/Recordings.java | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/cryostat/graphql/ActiveRecordings.java b/src/main/java/io/cryostat/graphql/ActiveRecordings.java index fd5933599..a0817681b 100644 --- a/src/main/java/io/cryostat/graphql/ActiveRecordings.java +++ b/src/main/java/io/cryostat/graphql/ActiveRecordings.java @@ -50,6 +50,7 @@ import jdk.jfr.RecordingState; import org.eclipse.microprofile.graphql.Description; import org.eclipse.microprofile.graphql.GraphQLApi; +import org.eclipse.microprofile.graphql.Mutation; import org.eclipse.microprofile.graphql.NonNull; import org.eclipse.microprofile.graphql.Source; import org.jboss.logging.Logger; @@ -341,7 +342,7 @@ public static class MetadataLabels { public MetadataLabels() {} - public MetadataLabels(Map labels, Instant expiry) { + public MetadataLabels(Map labels) { this.labels = new HashMap<>(labels); } diff --git a/src/main/java/io/cryostat/recordings/RecordingHelper.java b/src/main/java/io/cryostat/recordings/RecordingHelper.java index 9f14a4a52..4a4534298 100644 --- a/src/main/java/io/cryostat/recordings/RecordingHelper.java +++ b/src/main/java/io/cryostat/recordings/RecordingHelper.java @@ -738,6 +738,7 @@ public ArchivedRecording archiveRecording( new Notification(event.category().category(), event.payload())); } return new ArchivedRecording( + activeRecording.target.jvmId, filename, downloadUrl(activeRecording.target.jvmId, filename), reportUrl(activeRecording.target.jvmId, filename), diff --git a/src/main/java/io/cryostat/recordings/Recordings.java b/src/main/java/io/cryostat/recordings/Recordings.java index 9cbbd0d6d..af1042bc4 100644 --- a/src/main/java/io/cryostat/recordings/Recordings.java +++ b/src/main/java/io/cryostat/recordings/Recordings.java @@ -436,6 +436,7 @@ public Collection listFsArchives(@RestPath String jv connectUrl, id, new ArrayList<>())); dir.recordings.add( new ArchivedRecording( + jvmId, filename, recordingHelper.downloadUrl(jvmId, filename), recordingHelper.reportUrl(jvmId, filename), From 9926acaf64766b11727efd0ed563c5ba0a697289 Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Fri, 15 Mar 2024 18:56:33 -0400 Subject: [PATCH 12/18] @Blocking --- src/main/java/io/cryostat/graphql/ActiveRecordings.java | 3 +++ src/main/java/io/cryostat/recordings/RecordingHelper.java | 2 ++ 2 files changed, 5 insertions(+) diff --git a/src/main/java/io/cryostat/graphql/ActiveRecordings.java b/src/main/java/io/cryostat/graphql/ActiveRecordings.java index a0817681b..e41a94a88 100644 --- a/src/main/java/io/cryostat/graphql/ActiveRecordings.java +++ b/src/main/java/io/cryostat/graphql/ActiveRecordings.java @@ -323,6 +323,8 @@ public RecordingOptions asOptions() { } } + @Blocking + @Transactional @Description( "Updates the metadata labels for an existing Flight Recorder recording specified by the" + " recording ID.") @@ -336,6 +338,7 @@ public Uni doPutMetadata( }); } + @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD") public static class MetadataLabels { private Map labels; diff --git a/src/main/java/io/cryostat/recordings/RecordingHelper.java b/src/main/java/io/cryostat/recordings/RecordingHelper.java index 4a4534298..eb0dcee55 100644 --- a/src/main/java/io/cryostat/recordings/RecordingHelper.java +++ b/src/main/java/io/cryostat/recordings/RecordingHelper.java @@ -952,6 +952,7 @@ private Metadata taggingToMetadata(List tagSet) { return new Metadata(labels, expiry); } + @Blocking public ActiveRecording updateRecordingMetadata( Long recordingId, Map newLabels) { ActiveRecording recording = ActiveRecording.findById(recordingId); @@ -968,6 +969,7 @@ public ActiveRecording updateRecordingMetadata( return recording; } + @Blocking public ArchivedRecording updateArchivedRecordingMetadata( String jvmId, String filename, Map newLabels) { String key = archivedRecordingKey(jvmId, filename); From 645114d93a8249d4f1562fe90380d4bd847259d2 Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Tue, 19 Mar 2024 23:08:02 -0400 Subject: [PATCH 13/18] cleanup --- .../java/io/cryostat/recordings/RecordingHelper.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/main/java/io/cryostat/recordings/RecordingHelper.java b/src/main/java/io/cryostat/recordings/RecordingHelper.java index eb0dcee55..69bc7f6f2 100644 --- a/src/main/java/io/cryostat/recordings/RecordingHelper.java +++ b/src/main/java/io/cryostat/recordings/RecordingHelper.java @@ -971,7 +971,7 @@ public ActiveRecording updateRecordingMetadata( @Blocking public ArchivedRecording updateArchivedRecordingMetadata( - String jvmId, String filename, Map newLabels) { + String jvmId, String filename, Map updatedLabels) { String key = archivedRecordingKey(jvmId, filename); Optional existingMetadataOpt = getArchivedRecordingMetadata(key); @@ -980,13 +980,8 @@ public ArchivedRecording updateArchivedRecordingMetadata( "Could not find metadata for archived recording with key: " + key); } - // overwrite existing keys with new values - Map combinedLabels = new HashMap<>(existingMetadataOpt.get().labels()); - combinedLabels.putAll(newLabels); + Metadata updatedMetadata = new Metadata(updatedLabels); - Metadata updatedMetadata = new Metadata(combinedLabels); - - // Update the S3 object tagging with new metadata Tagging tagging = createMetadataTagging(updatedMetadata); storage.putObjectTagging( PutObjectTaggingRequest.builder() @@ -998,7 +993,6 @@ public ArchivedRecording updateArchivedRecordingMetadata( var response = storage.headObject( HeadObjectRequest.builder().bucket(archiveBucket).key(key).build()); - long size = response.contentLength(); Instant lastModified = response.lastModified(); From 93b2966602c762ce95934c729bda7ea16cddc144 Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Fri, 22 Mar 2024 10:32:22 -0400 Subject: [PATCH 14/18] update notification emission for update metadata --- .../cryostat/recordings/RecordingHelper.java | 56 +++++++++++++++---- .../io/cryostat/recordings/Recordings.java | 2 + 2 files changed, 46 insertions(+), 12 deletions(-) diff --git a/src/main/java/io/cryostat/recordings/RecordingHelper.java b/src/main/java/io/cryostat/recordings/RecordingHelper.java index 69bc7f6f2..fd080e69d 100644 --- a/src/main/java/io/cryostat/recordings/RecordingHelper.java +++ b/src/main/java/io/cryostat/recordings/RecordingHelper.java @@ -65,6 +65,9 @@ import io.cryostat.events.TargetTemplateService; import io.cryostat.recordings.ActiveRecording.Listener.ActiveRecordingEvent; import io.cryostat.recordings.ActiveRecording.Listener.ArchivedRecordingEvent; +import io.cryostat.recordings.RecordingHelper.RecordingOptions; +import io.cryostat.recordings.RecordingHelper.RecordingReplace; +import io.cryostat.recordings.RecordingHelper.SnapshotCreationException; import io.cryostat.recordings.Recordings.ArchivedRecording; import io.cryostat.recordings.Recordings.LinkedRecordingDescriptor; import io.cryostat.recordings.Recordings.Metadata; @@ -139,6 +142,7 @@ public class RecordingHelper { @Inject EventOptionsBuilder.Factory eventOptionsBuilderFactory; @Inject TargetTemplateService.Factory targetTemplateServiceFactory; @Inject S3TemplateService customTemplateService; + @Inject RecordingHelper recordingHelper; @Inject @Named(Producers.BASE64_URL) @@ -961,14 +965,25 @@ public ActiveRecording updateRecordingMetadata( throw new NotFoundException("Recording not found for ID: " + recordingId); } - Metadata updatedMetadata = new Metadata(newLabels); - recording.setMetadata(updatedMetadata); - - recording.persist(); + if (!recording.metadata.labels().equals(newLabels)) { + Metadata updatedMetadata = new Metadata(newLabels); + recording.setMetadata(updatedMetadata); + recording.persist(); + notify( + new ActiveRecordingEvent( + Recordings.RecordingEventCategory.METADATA_UPDATED, + ActiveRecordingEvent.Payload.of(recordingHelper, recording))); + } return recording; } + private void notify(ActiveRecordingEvent event) { + bus.publish( + MessagingServer.class.getName(), + new Notification(event.category().category(), event.payload())); + } + @Blocking public ArchivedRecording updateArchivedRecordingMetadata( String jvmId, String filename, Map updatedLabels) { @@ -996,14 +1011,31 @@ public ArchivedRecording updateArchivedRecordingMetadata( long size = response.contentLength(); Instant lastModified = response.lastModified(); - return new ArchivedRecording( - jvmId, - filename, - downloadUrl(jvmId, filename), - reportUrl(jvmId, filename), - updatedMetadata, - size, - lastModified.getEpochSecond()); + ArchivedRecording updatedRecording = + new ArchivedRecording( + jvmId, + filename, + downloadUrl(jvmId, filename), + reportUrl(jvmId, filename), + updatedMetadata, + size, + lastModified.getEpochSecond()); + + notifyArchiveMetadataUpdate(updatedRecording); + return updatedRecording; + + } + + private void notifyArchiveMetadataUpdate(ArchivedRecording updatedRecording) { + var event = + new ArchivedRecordingEvent( + Recordings.RecordingEventCategory.METADATA_UPDATED, + new ArchivedRecordingEvent.Payload( + null, updatedRecording)); + bus.publish(event.category().category(), event.payload().recording()); + bus.publish( + MessagingServer.class.getName(), + new Notification(event.category().category(), event.payload())); } @Blocking diff --git a/src/main/java/io/cryostat/recordings/Recordings.java b/src/main/java/io/cryostat/recordings/Recordings.java index af1042bc4..1059f7beb 100644 --- a/src/main/java/io/cryostat/recordings/Recordings.java +++ b/src/main/java/io/cryostat/recordings/Recordings.java @@ -1191,6 +1191,7 @@ public static Metadata empty() { public static final String ACTIVE_RECORDING_DELETED = "ActiveRecordingDeleted"; public static final String ACTIVE_RECORDING_SAVED = "ActiveRecordingSaved"; public static final String SNAPSHOT_RECORDING_CREATED = "SnapshotCreated"; + public static final String RECORDING_METADATA_UPDATED = "RecordingMetadataUpdated"; public enum RecordingEventCategory { ACTIVE_CREATED(ACTIVE_RECORDING_CREATED), @@ -1200,6 +1201,7 @@ public enum RecordingEventCategory { ARCHIVED_CREATED(ARCHIVED_RECORDING_CREATED), ARCHIVED_DELETED(ARCHIVED_RECORDING_DELETED), SNAPSHOT_CREATED(SNAPSHOT_RECORDING_CREATED), + METADATA_UPDATED(RECORDING_METADATA_UPDATED), ; private final String category; From dc2bd03a98e152804ef3a804002e38bfeab69500 Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Fri, 22 Mar 2024 16:06:01 -0400 Subject: [PATCH 15/18] mvn spotless:apply --- src/main/java/io/cryostat/recordings/RecordingHelper.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/io/cryostat/recordings/RecordingHelper.java b/src/main/java/io/cryostat/recordings/RecordingHelper.java index fd080e69d..d2580124c 100644 --- a/src/main/java/io/cryostat/recordings/RecordingHelper.java +++ b/src/main/java/io/cryostat/recordings/RecordingHelper.java @@ -1023,15 +1023,13 @@ public ArchivedRecording updateArchivedRecordingMetadata( notifyArchiveMetadataUpdate(updatedRecording); return updatedRecording; - } private void notifyArchiveMetadataUpdate(ArchivedRecording updatedRecording) { var event = new ArchivedRecordingEvent( Recordings.RecordingEventCategory.METADATA_UPDATED, - new ArchivedRecordingEvent.Payload( - null, updatedRecording)); + new ArchivedRecordingEvent.Payload(null, updatedRecording)); bus.publish(event.category().category(), event.payload().recording()); bus.publish( MessagingServer.class.getName(), From ba36dda8108e33b1dce952f9613e22ad57c587d4 Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Mon, 1 Apr 2024 15:18:22 -0400 Subject: [PATCH 16/18] resolve front end issues --- .../java/io/cryostat/recordings/ActiveRecording.java | 7 +++++-- .../java/io/cryostat/recordings/RecordingHelper.java | 4 +++- src/main/java/io/cryostat/targets/Target.java | 12 +++++++++--- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/cryostat/recordings/ActiveRecording.java b/src/main/java/io/cryostat/recordings/ActiveRecording.java index 8f931969b..db3b313c4 100644 --- a/src/main/java/io/cryostat/recordings/ActiveRecording.java +++ b/src/main/java/io/cryostat/recordings/ActiveRecording.java @@ -289,16 +289,19 @@ public record ActiveRecordingEvent( Objects.requireNonNull(payload); } - public record Payload(String target, LinkedRecordingDescriptor recording) { + public record Payload( + String target, LinkedRecordingDescriptor recording, String jvmId) { public Payload { Objects.requireNonNull(target); Objects.requireNonNull(recording); + Objects.requireNonNull(jvmId); } public static Payload of(RecordingHelper helper, ActiveRecording recording) { return new Payload( recording.target.connectUrl.toString(), - helper.toExternalForm(recording)); + helper.toExternalForm(recording), + recording.target.jvmId); } } } diff --git a/src/main/java/io/cryostat/recordings/RecordingHelper.java b/src/main/java/io/cryostat/recordings/RecordingHelper.java index d2580124c..7e9487596 100644 --- a/src/main/java/io/cryostat/recordings/RecordingHelper.java +++ b/src/main/java/io/cryostat/recordings/RecordingHelper.java @@ -1026,10 +1026,12 @@ public ArchivedRecording updateArchivedRecordingMetadata( } private void notifyArchiveMetadataUpdate(ArchivedRecording updatedRecording) { + var event = new ArchivedRecordingEvent( Recordings.RecordingEventCategory.METADATA_UPDATED, - new ArchivedRecordingEvent.Payload(null, updatedRecording)); + new ArchivedRecordingEvent.Payload( + updatedRecording.downloadUrl(), updatedRecording)); bus.publish(event.category().category(), event.payload().recording()); bus.publish( MessagingServer.class.getName(), diff --git a/src/main/java/io/cryostat/targets/Target.java b/src/main/java/io/cryostat/targets/Target.java index 18777dba7..7d97a126c 100644 --- a/src/main/java/io/cryostat/targets/Target.java +++ b/src/main/java/io/cryostat/targets/Target.java @@ -188,10 +188,11 @@ public enum EventKind { } @SuppressFBWarnings(value = {"EI_EXPOSE_REP", "EI_EXPOSE_REP2"}) - public record TargetDiscovery(EventKind kind, Target serviceRef) { + public record TargetDiscovery(EventKind kind, Target serviceRef, String jvmId) { public TargetDiscovery { Objects.requireNonNull(kind); Objects.requireNonNull(serviceRef); + Objects.requireNonNull(jvmId); } } @@ -279,14 +280,19 @@ private void notify(EventKind eventKind, Target target) { MessagingServer.class.getName(), new Notification( TARGET_JVM_DISCOVERY, - new TargetDiscoveryEvent(new TargetDiscovery(eventKind, target)))); - bus.publish(TARGET_JVM_DISCOVERY, new TargetDiscovery(eventKind, target)); + new TargetDiscoveryEvent( + new TargetDiscovery(eventKind, target, target.jvmId)))); + bus.publish(TARGET_JVM_DISCOVERY, new TargetDiscovery(eventKind, target, target.jvmId)); } public record TargetDiscoveryEvent(TargetDiscovery event) { public TargetDiscoveryEvent { Objects.requireNonNull(event); } + + public String jvmId() { + return event.serviceRef().jvmId; + } } } } From 9c20944c35c8240872aa4d5530b63e50d760c6b4 Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Mon, 1 Apr 2024 15:39:33 -0400 Subject: [PATCH 17/18] remove unused imports --- src/main/java/io/cryostat/recordings/RecordingHelper.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/io/cryostat/recordings/RecordingHelper.java b/src/main/java/io/cryostat/recordings/RecordingHelper.java index 7e9487596..8eb0bd623 100644 --- a/src/main/java/io/cryostat/recordings/RecordingHelper.java +++ b/src/main/java/io/cryostat/recordings/RecordingHelper.java @@ -65,9 +65,6 @@ import io.cryostat.events.TargetTemplateService; import io.cryostat.recordings.ActiveRecording.Listener.ActiveRecordingEvent; import io.cryostat.recordings.ActiveRecording.Listener.ArchivedRecordingEvent; -import io.cryostat.recordings.RecordingHelper.RecordingOptions; -import io.cryostat.recordings.RecordingHelper.RecordingReplace; -import io.cryostat.recordings.RecordingHelper.SnapshotCreationException; import io.cryostat.recordings.Recordings.ArchivedRecording; import io.cryostat.recordings.Recordings.LinkedRecordingDescriptor; import io.cryostat.recordings.Recordings.Metadata; From c8c59050f3ae082c5719419b497f75521c5d9446 Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Fri, 12 Apr 2024 20:58:04 -0400 Subject: [PATCH 18/18] resolve issues --- src/main/java/io/cryostat/graphql/ActiveRecordings.java | 4 +--- src/main/java/io/cryostat/recordings/RecordingHelper.java | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/cryostat/graphql/ActiveRecordings.java b/src/main/java/io/cryostat/graphql/ActiveRecordings.java index e41a94a88..a78c3c490 100644 --- a/src/main/java/io/cryostat/graphql/ActiveRecordings.java +++ b/src/main/java/io/cryostat/graphql/ActiveRecordings.java @@ -325,9 +325,7 @@ public RecordingOptions asOptions() { @Blocking @Transactional - @Description( - "Updates the metadata labels for an existing Flight Recorder recording specified by the" - + " recording ID.") + @Description("Updates the metadata labels for an existing Flight Recording.") public Uni doPutMetadata( @Source ActiveRecording recording, MetadataLabels metadataInput) { return Uni.createFrom() diff --git a/src/main/java/io/cryostat/recordings/RecordingHelper.java b/src/main/java/io/cryostat/recordings/RecordingHelper.java index 8eb0bd623..f17d0b8f4 100644 --- a/src/main/java/io/cryostat/recordings/RecordingHelper.java +++ b/src/main/java/io/cryostat/recordings/RecordingHelper.java @@ -955,7 +955,7 @@ private Metadata taggingToMetadata(List tagSet) { @Blocking public ActiveRecording updateRecordingMetadata( - Long recordingId, Map newLabels) { + long recordingId, Map newLabels) { ActiveRecording recording = ActiveRecording.findById(recordingId); if (recording == null) {