forked from kubernetes-el/kubernetes-el
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkubernetes-logs.el
147 lines (119 loc) · 5.15 KB
/
kubernetes-logs.el
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
;;; kubernetes-logs.el --- Utilities for working with log buffers. -*- lexical-binding: t; -*-
;;; Commentary:
;;; Code:
(require 'subr-x)
(require 'kubernetes-modes)
(require 'kubernetes-utils)
(autoload 'json-pretty-print-buffer "json")
(require 'kubernetes-vars)
(defun kubernetes-logs--log-line-buffer-for-string (s)
(let ((propertized (with-temp-buffer
(insert s)
(goto-char (point-min))
(when (equal (char-after) ?\{)
(json-pretty-print-buffer)
(funcall kubernetes-json-mode)
(font-lock-ensure))
(buffer-string))))
(with-current-buffer (get-buffer-create kubernetes-log-line-buffer-name)
(kubernetes-log-line-mode)
(let ((inhibit-read-only t))
(erase-buffer)
(insert propertized)
(goto-char (point-min)))
(current-buffer))))
;;;###autoload
(defun kubernetes-logs-inspect-line (pos)
"Show detail for the log line at POS."
(interactive "d")
(display-buffer (kubernetes-logs--log-line-buffer-for-string
(save-excursion
(goto-char pos)
(buffer-substring (line-beginning-position) (line-end-position))))))
;;;###autoload
(defun kubernetes-logs-previous-line ()
"Move backward and inspect the line at point."
(interactive)
(with-current-buffer kubernetes-logs-buffer-name
(forward-line -1)
(when (get-buffer kubernetes-log-line-buffer-name)
(kubernetes-logs-inspect-line (point)))))
;;;###autoload
(defun kubernetes-logs-forward-line ()
"Move forward and inspect the line at point."
(interactive)
(with-current-buffer kubernetes-logs-buffer-name
(forward-line 1)
(when (get-buffer kubernetes-log-line-buffer-name)
(kubernetes-logs-inspect-line (point)))))
;;;###autoload
(defun kubernetes-logs-follow (pod-name args state)
"Open a streaming logs buffer for a pod.
POD-NAME is the name of the pod to log.
ARGS are additional args to pass to kubectl.
STATE is the current application state."
(interactive
(let ((state (kubernetes-state)))
(list (or (kubernetes-utils-maybe-pod-name-at-point)
(kubernetes-utils-read-pod-name state))
(transient-args 'kubernetes-logs)
state)))
(kubernetes-logs-fetch-all pod-name (cons "-f" args) state))
;;;###autoload
(defun kubernetes-logs-fetch-all (pod-name args state)
"Open a streaming logs buffer for POD.
POD-NAME is the name of the pod to log.
ARGS are additional args to pass to kubectl.
STATE is the current application state"
(interactive
(let ((state (kubernetes-state)))
(list (or (kubernetes-utils-maybe-pod-name-at-point) (kubernetes-utils-read-pod-name state))
(transient-args 'kubernetes-logs)
state)))
(let ((args (append (list "logs") args (list pod-name) (kubernetes-kubectl--flags-from-state (kubernetes-state))
(when-let (ns (kubernetes-state--get state 'current-namespace))
(list (format "--namespace=%s" ns))))))
(with-current-buffer (kubernetes-utils-process-buffer-start kubernetes-logs-buffer-name #'kubernetes-logs-mode kubernetes-kubectl-executable args)
(select-window (display-buffer (current-buffer))))))
(transient-define-prefix kubernetes-logs ()
"Fetch or tail logs from Kubernetes resources."
[["Flags"
("-a" "Print logs from all containers in this pod" "--all-containers=true")
("-p" "Print logs for previous instances of the container in this pod" "-p")]
["Options"
("=c" "Select container" "--container=" kubernetes-utils-read-container-name)
("=t" "Number of lines to display" "--tail=" transient-read-number-N+)]
["Time"
("=s" "Since relative time" "--since=" kubernetes-utils-read-time-value)
("=d" "Since absolute datetime" "--since-time=" kubernetes-utils-read-iso-datetime)]]
[["Actions"
("l" "Logs" kubernetes-logs-fetch-all)
("f" "Logs (stream and follow)" kubernetes-logs-follow)]])
;;;###autoload
(defvar kubernetes-logs-mode-map
(let ((keymap (make-sparse-keymap)))
(define-key keymap (kbd "n") #'kubernetes-logs-forward-line)
(define-key keymap (kbd "p") #'kubernetes-logs-previous-line)
(define-key keymap (kbd "RET") #'kubernetes-logs-inspect-line)
(define-key keymap (kbd "M-w") nil)
keymap)
"Keymap for `kubernetes-logs-mode'.")
;;;###autoload
(define-derived-mode kubernetes-logs-mode kubernetes-mode "Kubernetes Logs"
"Mode for displaying and inspecting Kubernetes logs.
\\<kubernetes-logs-mode-map>\
Type \\[kubernetes-logs-inspect-line] to open the line at point in a new buffer.
\\{kubernetes-logs-mode-map}")
;;;###autoload
(defvar kubernetes-log-line-mode-map
(let ((keymap (make-sparse-keymap)))
(define-key keymap (kbd "n") #'kubernetes-logs-forward-line)
(define-key keymap (kbd "p") #'kubernetes-logs-previous-line)
keymap)
"Keymap for `kubernetes-log-line-mode'.")
;;;###autoload
(define-derived-mode kubernetes-log-line-mode kubernetes-mode "Log Line"
"Mode for inspecting Kubernetes log lines.
\\{kubernetes-log-line-mode-map}")
(provide 'kubernetes-logs)
;;; kubernetes-logs.el ends here