From c9e8021fe8ced723c074943cb749496e21f1d80f Mon Sep 17 00:00:00 2001 From: Maxime Bajeux Date: Thu, 16 Jul 2020 23:59:27 +0200 Subject: [PATCH] feat(k8s/logs): Add the ability to download application/stack logs (#4046) * feat(logs): Add the ability to download application/stack logs * feat(kubernetes): minor UI update Co-authored-by: Anthony Lapenna --- app/kubernetes/views/applications/logs/logs.html | 7 +++++++ .../views/applications/logs/logsController.js | 10 +++++++++- app/kubernetes/views/stacks/logs/logs.html | 7 +++++++ app/kubernetes/views/stacks/logs/logsController.js | 9 ++++++++- 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/app/kubernetes/views/applications/logs/logs.html b/app/kubernetes/views/applications/logs/logs.html index eaefc6417..6c9f1e19e 100644 --- a/app/kubernetes/views/applications/logs/logs.html +++ b/app/kubernetes/views/applications/logs/logs.html @@ -46,6 +46,13 @@ + +
+
+ +
+
+ diff --git a/app/kubernetes/views/applications/logs/logsController.js b/app/kubernetes/views/applications/logs/logsController.js index a7d761dd5..015d31c0e 100644 --- a/app/kubernetes/views/applications/logs/logsController.js +++ b/app/kubernetes/views/applications/logs/logsController.js @@ -1,14 +1,17 @@ import angular from 'angular'; +import _ from 'lodash-es'; class KubernetesApplicationLogsController { /* @ngInject */ - constructor($async, $state, $interval, Notifications, KubernetesApplicationService, KubernetesPodService) { + constructor($async, $state, $interval, Notifications, KubernetesApplicationService, KubernetesPodService, Blob, FileSaver) { this.$async = $async; this.$state = $state; this.$interval = $interval; this.Notifications = Notifications; this.KubernetesApplicationService = KubernetesApplicationService; this.KubernetesPodService = KubernetesPodService; + this.Blob = Blob; + this.FileSaver = FileSaver; this.onInit = this.onInit.bind(this); this.stopRepeater = this.stopRepeater.bind(this); @@ -35,6 +38,11 @@ class KubernetesApplicationLogsController { this.repeater = this.$interval(this.getApplicationLogsAsync, this.state.refreshRate); } + downloadLogs() { + const data = new this.Blob([_.reduce(this.applicationLogs, (acc, log) => acc + '\n' + log, '')]); + this.FileSaver.saveAs(data, this.podName + '_logs.txt'); + } + async getApplicationLogsAsync() { try { this.applicationLogs = await this.KubernetesPodService.logs(this.application.ResourcePool, this.podName); diff --git a/app/kubernetes/views/stacks/logs/logs.html b/app/kubernetes/views/stacks/logs/logs.html index cab652fb9..0717a63d6 100644 --- a/app/kubernetes/views/stacks/logs/logs.html +++ b/app/kubernetes/views/stacks/logs/logs.html @@ -44,6 +44,13 @@ + +
+
+ +
+
+ diff --git a/app/kubernetes/views/stacks/logs/logsController.js b/app/kubernetes/views/stacks/logs/logsController.js index bcb7a2c1e..cadcab1db 100644 --- a/app/kubernetes/views/stacks/logs/logsController.js +++ b/app/kubernetes/views/stacks/logs/logsController.js @@ -6,13 +6,15 @@ const colors = ['red', 'orange', 'lime', 'green', 'darkgreen', 'cyan', 'turquois class KubernetesStackLogsController { /* @ngInject */ - constructor($async, $state, $interval, Notifications, KubernetesApplicationService, KubernetesPodService) { + constructor($async, $state, $interval, Notifications, KubernetesApplicationService, KubernetesPodService, FileSaver, Blob) { this.$async = $async; this.$state = $state; this.$interval = $interval; this.Notifications = Notifications; this.KubernetesApplicationService = KubernetesApplicationService; this.KubernetesPodService = KubernetesPodService; + this.Blob = Blob; + this.FileSaver = FileSaver; this.onInit = this.onInit.bind(this); this.stopRepeater = this.stopRepeater.bind(this); @@ -87,6 +89,11 @@ class KubernetesStackLogsController { } } + downloadLogs() { + const data = new this.Blob([(this.dataLogs = _.reduce(this.stackLogs, (acc, log) => acc + '\n' + log.AppName + ' ' + log.Line, ''))]); + this.FileSaver.saveAs(data, this.state.transition.name + '_logs.txt'); + } + async onInit() { this.state = { autoRefresh: false,