Skip to content

Commit ab83f44

Browse files
authored
feat: support retrieving the cached console log lines of the node (#87)
1 parent be86ee9 commit ab83f44

File tree

2 files changed

+67
-0
lines changed

2 files changed

+67
-0
lines changed

cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/v3/V3HttpHandlerNode.java

+27
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import eu.cloudnetservice.node.config.Configuration;
5050
import eu.cloudnetservice.node.impl.command.source.DriverCommandSource;
5151
import eu.cloudnetservice.node.impl.config.JsonConfiguration;
52+
import eu.cloudnetservice.node.impl.log.QueuedConsoleLogAppender;
5253
import eu.cloudnetservice.node.service.CloudServiceManager;
5354
import eu.cloudnetservice.utils.base.StringUtil;
5455
import eu.cloudnetservice.utils.base.concurrent.TaskUtil;
@@ -57,6 +58,7 @@
5758
import jakarta.inject.Singleton;
5859
import jakarta.validation.Valid;
5960
import java.nio.charset.StandardCharsets;
61+
import java.util.Locale;
6062
import java.util.Map;
6163
import java.util.concurrent.atomic.AtomicInteger;
6264
import java.util.concurrent.atomic.AtomicReference;
@@ -77,6 +79,7 @@ public final class V3HttpHandlerNode {
7779
private final NodeServerProvider nodeServerProvider;
7880
private final CloudServiceManager cloudServiceManager;
7981
private final ServiceTaskProvider serviceTaskProvider;
82+
private final QueuedConsoleLogAppender consoleLogAppender;
8083
private final GroupConfigurationProvider groupConfigurationProvider;
8184

8285
@Inject
@@ -90,6 +93,7 @@ public V3HttpHandlerNode(
9093
@NonNull NodeServerProvider nodeServerProvider,
9194
@NonNull CloudServiceManager cloudServiceManager,
9295
@NonNull ServiceTaskProvider serviceTaskProvider,
96+
@NonNull QueuedConsoleLogAppender consoleLogAppender,
9397
@NonNull GroupConfigurationProvider groupConfigurationProvider
9498
) {
9599
this.logger = logger;
@@ -101,6 +105,7 @@ public V3HttpHandlerNode(
101105
this.nodeServerProvider = nodeServerProvider;
102106
this.cloudServiceManager = cloudServiceManager;
103107
this.serviceTaskProvider = serviceTaskProvider;
108+
this.consoleLogAppender = consoleLogAppender;
104109
this.groupConfigurationProvider = groupConfigurationProvider;
105110
}
106111

@@ -211,6 +216,28 @@ public V3HttpHandlerNode(
211216
return HttpResponseCode.SWITCHING_PROTOCOLS;
212217
}
213218

219+
@RequestHandler(path = "/api/v3/node/logLines")
220+
@Authentication(providers = "jwt", scopes = {"cloudnet_rest:node_read", "cloudnet_rest:node_log_lines"})
221+
public @NonNull IntoResponse<?> handleLogLinesRequest(
222+
@NonNull @Optional @FirstRequestQueryParam(value = "format", def = "raw") String formatType
223+
) {
224+
return switch (formatType.toLowerCase(Locale.ROOT)) {
225+
case "raw" -> {
226+
var lines = this.consoleLogAppender.cachedLogEntries().stream()
227+
.map(ILoggingEvent::getFormattedMessage)
228+
.toList();
229+
yield JsonResponse.builder().body(Map.of("lines", lines));
230+
}
231+
case "ansi" -> JsonResponse.builder().body(Map.of("lines", this.consoleLogAppender.formattedCachedLogLines()));
232+
default -> ProblemDetail.builder()
233+
.type("console-invalid-formatting-type")
234+
.title("Console Invalid Formatting Type")
235+
.status(HttpResponseCode.BAD_REQUEST)
236+
.detail("The cached log lines do not support the format " + formatType)
237+
.build();
238+
};
239+
}
240+
214241
private void reloadConfig() {
215242
this.configuration.reloadFrom(JsonConfiguration.loadFromFile());
216243
this.serviceTaskProvider.reload();

cloudnet-rest-module/src/main/resources/documentation/swagger.yaml

+40
Original file line numberDiff line numberDiff line change
@@ -710,6 +710,46 @@ paths:
710710
$ref: '#/components/responses/Problem'
711711
'403':
712712
$ref: '#/components/responses/Problem'
713+
/node/logLines:
714+
get:
715+
tags:
716+
- Node
717+
parameters:
718+
- name: format
719+
in: query
720+
required: false
721+
description: |
722+
Whether to send the cached log lines as plain text or as ansi formatted text.
723+
- `raw`: The log lines are sent as plain text
724+
- `ansi`: The log lines are sent as ansi formatted text
725+
726+
If no value is provided the default value is `raw`.
727+
summary: Get the cached log lines of the node the request is sent to
728+
description: |
729+
Based on the requested formatting the log lines are either returned as text only, where no color and formatting
730+
is applied or as ansi formatted text, where the color and formatting is applied.
731+
732+
One of the following scopes is needed to execute the request:
733+
- `cloudnet_rest:node_read`
734+
- `cloudnet_rest:node_log_lines`
735+
responses:
736+
'200':
737+
description: OK
738+
content:
739+
application/json:
740+
schema:
741+
properties:
742+
lines:
743+
type: array
744+
items:
745+
type: string
746+
'400':
747+
description: If the requested format is not supported.
748+
$ref: '#/components/responses/Problem'
749+
'401':
750+
$ref: '#/components/responses/Problem'
751+
'403':
752+
$ref: '#/components/responses/Problem'
713753
/node/reload:
714754
parameters:
715755
- name: type

0 commit comments

Comments
 (0)