forked from kubernetes-el/kubernetes-el
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkubernetes-nodes.el
155 lines (135 loc) · 5.75 KB
/
kubernetes-nodes.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
148
149
150
151
152
153
154
155
;;; kubernetes-nodes.el --- Rendering for Kubernetes nodes -*- lexical-binding: t; -*-
;;; Commentary:
;;; Code:
(require 'dash)
(require 'seq)
(require 'kubernetes-ast)
(require 'kubernetes-loading-container)
(require 'kubernetes-modes)
(require 'kubernetes-props)
(require 'kubernetes-state)
(require 'kubernetes-utils)
(require 'kubernetes-yaml)
;; Components
(defconst kubernetes-nodes--column-heading
["%-45s %-10s %-9s %-4s %8s" "Name Status Roles Age Version"])
(kubernetes-ast-define-component node-detail (node)
(-let (((&alist 'metadata (&alist 'name)
'status (&alist 'addresses 'nodeInfo))
node))
`((key-value 12 "Name" ,name)
,@(mapcar
(lambda (addr)
(-let [(&alist 'address 'type) addr]
`(key-value 12 ,type ,address)))
addresses)
,@(mapcar
(lambda (pair)
(cl-destructuring-bind (key . val) pair
`(key-value 12 ,(symbol-name key) ,val)))
nodeInfo))))
(kubernetes-ast-define-component node-line (state node)
(-let* ((current-time (kubernetes-state-current-time state))
((&alist 'metadata (&alist 'name 'labels 'creationTimestamp)
'status (&alist 'conditions
'nodeInfo (&alist 'kubeProxyVersion)))
node)
([fmt] kubernetes-nodes--column-heading)
(list-fmt (split-string fmt))
(type (or (seq-some (lambda (x) (when (string= (alist-get 'status x) "True")
(alist-get 'type x)))
conditions)
"Unknown"))
(str
(concat
;; Name
(format (pop list-fmt) (kubernetes-utils-ellipsize name 43))
" "
;; Status
(let ((s (kubernetes-utils-ellipsize type 10)))
(format (pop list-fmt)
(if (string-match-p "running" type)
(propertize s 'face 'kubernetes-dimmed)
s)))
" "
;; Roles
(format (pop list-fmt)
(kubernetes-utils-ellipsize
(or
(seq-some (lambda (x)
(when (string-match
"node-role.kubernetes.io/\\(.+\\)$"
x)
(match-string 1 x)))
(mapcar (lambda (x) (symbol-name (car x))) labels))
"<none>")
8))
" "
;; Age
(let ((start (apply #'encode-time (kubernetes-utils-parse-utc-timestamp creationTimestamp))))
(propertize (format (pop list-fmt) (kubernetes-utils-time-diff-string start current-time))
'face 'kubernetes-dimmed))
" "
;; Version
(format (pop list-fmt)
(propertize (kubernetes-utils-ellipsize kubeProxyVersion 8)
'face 'kubernetes-dimmed))))
(str (cond
((string-match-p "ready" type) str)
(t (propertize str 'face 'warning))))
(line `(line ,str)))
`(nav-prop (:node-name ,name)
(copy-prop ,name ,line))))
(kubernetes-ast-define-component node (state node)
`(section (,(intern (kubernetes-state-resource-name node)) t)
(heading (node-line ,state ,node))
(indent
(section (details nil)
(node-detail ,node)
(padding)))))
(kubernetes-ast-define-component nodes-list (state &optional hidden)
(-let (((&alist 'items nodes) (kubernetes-state--get state 'nodes))
([fmt labels] kubernetes-nodes--column-heading))
`(section (nodes-container ,hidden)
(header-with-count "Nodes" ,nodes)
(indent
(columnar-loading-container ,nodes
,(propertize
(apply #'format fmt (split-string labels))
'face
'magit-section-heading)
,@(--map `(node ,state ,it) nodes)))
(padding))))
;; Requests and state management
(kubernetes-state-define-refreshers nodes)
;; Interactive commands
(defun kubernetes-nodes--read-name (state)
"Read a node name from the user.
STATE is the current application state.
Update the node state if it not set yet."
(-let* (((&alist 'items nodes)
(or (kubernetes-state--get state 'nodes)
(progn
(message "Getting nodes...")
(let ((response (kubernetes-kubectl-await-on-async
kubernetes-props state
(-partial #'kubernetes-kubectl-get "nodes"))))
(kubernetes-state-update-nodes response)
response))))
(nodes (append nodes nil))
(names (-map #'kubernetes-state-resource-name nodes)))
(completing-read "Node: " names nil t)))
;;;###autoload
(defun kubernetes-display-node (node-name state)
"Display information for a node in a new window.
STATE is the current application state.
NODE-NAME is the name of the node to display."
(interactive (let ((state (kubernetes-state)))
(list (kubernetes-nodes--read-name state) state)))
(if-let (node (kubernetes-state-lookup-node node-name state))
(select-window
(display-buffer
(kubernetes-yaml-make-buffer kubernetes-display-node-buffer-name node)))
(error "Unknown node: %s" node-name)))
(provide 'kubernetes-nodes)
;;; kubernetes-nodes.el ends here