138 lines
5.6 KiB
EmacsLisp
138 lines
5.6 KiB
EmacsLisp
;;; kubernetes-ingress.el --- Rendering routines for Kubernetes ingress. -*- lexical-binding: t; -*-
|
|
;;; Commentary:
|
|
;;; Code:
|
|
|
|
(require 'dash)
|
|
|
|
(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-ingress--column-heading
|
|
(propertize (format "%-45s %-25s %20s %10s" "Name" "Hosts" "Address" "Age")
|
|
'face 'magit-section-heading))
|
|
|
|
(kubernetes-ast-define-component ingress-detail (ingress)
|
|
(-let [(&alist 'metadata (&alist 'namespace ns 'creationTimestamp time)) ingress]
|
|
`((section (namespace nil)
|
|
(nav-prop (:namespace-name ,ns)
|
|
(key-value 12 "Namespace" ,(propertize ns 'face 'kubernetes-namespace))))
|
|
(key-value 12 "Created" ,time))))
|
|
|
|
(kubernetes-ast-define-component ingress-line (state ingress)
|
|
(-let* ((current-time (kubernetes-state-current-time state))
|
|
(pending-deletion (kubernetes-state-ingress-pending-deletion state))
|
|
(marked-ingress (kubernetes-state-marked-ingress state))
|
|
((&alist 'metadata (&alist 'name name 'creationTimestamp created-time)
|
|
'spec (&alist 'rules ingress-rules)
|
|
'status (&alist 'loadBalancer (&alist 'ingress ingress-lb-list)))
|
|
ingress)
|
|
(line `(line ,(concat
|
|
;; Name
|
|
(format "%-45s " (kubernetes-utils-ellipsize name 45))
|
|
|
|
;; Hosts
|
|
(format "%-25s " (--mapcat (alist-get 'host it) ingress-rules))
|
|
|
|
;; Address
|
|
(format "%20s "
|
|
(mapconcat
|
|
'identity
|
|
(mapcar
|
|
(lambda (i) (format "%s" (alist-get 'ip i )))
|
|
ingress-lb-list)
|
|
", "))
|
|
|
|
;; Age
|
|
(let ((start (apply #'encode-time (kubernetes-utils-parse-utc-timestamp created-time))))
|
|
(propertize (format "%10s" (kubernetes-utils-time-diff-string start current-time))
|
|
'face 'magit-dimmed))))))
|
|
|
|
`(nav-prop (:ingress-name ,name)
|
|
(copy-prop ,name
|
|
,(cond
|
|
((member name pending-deletion)
|
|
`(propertize (face kubernetes-pending-deletion) ,line))
|
|
((member name marked-ingress)
|
|
`(mark-for-delete ,line))
|
|
(t
|
|
line))))))
|
|
|
|
(kubernetes-ast-define-component ingress (state ingress)
|
|
`(section (,(intern (kubernetes-state-resource-name ingress)) t)
|
|
(heading (ingress-line ,state ,ingress))
|
|
(section (details nil)
|
|
(indent
|
|
(ingress-detail ,ingress)
|
|
(padding)))))
|
|
(kubernetes-ast-define-component ingress-list (state &optional hidden)
|
|
(-let [(&alist 'items ingress) (kubernetes-state-ingress state)]
|
|
`(section (ingress-container ,hidden)
|
|
(header-with-count "Ingress" ,ingress)
|
|
(indent
|
|
(columnar-loading-container ,ingress ,kubernetes-ingress--column-heading
|
|
,(--map `(ingress ,state ,it) ingress)))
|
|
(padding))))
|
|
|
|
;; Requests and state management
|
|
|
|
(kubernetes-state-define-refreshers ingress)
|
|
|
|
(defun kubernetes-ingress-delete-marked (state)
|
|
(let ((names (kubernetes-state-marked-ingress state)))
|
|
(dolist (name names)
|
|
(kubernetes-state-delete-ingress name)
|
|
(kubernetes-kubectl-delete-ingress kubernetes-props state name
|
|
(lambda (_)
|
|
(message "Deleting ingress %s succeeded." name))
|
|
(lambda (_)
|
|
(message "Deleting ingress %s failed" name)
|
|
(kubernetes-state-mark-ingress name))))
|
|
(kubernetes-state-trigger-redraw)))
|
|
|
|
;; Displaying ingress
|
|
|
|
(defun kubernetes-ingress--read-name (state)
|
|
"Read a ingress name from the user.
|
|
|
|
STATE is the current application state.
|
|
|
|
Update the ingress state if it not set yet."
|
|
(-let* (((&alist 'items ingress)
|
|
(or (kubernetes-state-ingress state)
|
|
(progn
|
|
(message "Getting ingress...")
|
|
(let ((response (kubernetes-kubectl-await-on-async kubernetes-props state #'kubernetes-kubectl-get-ingress)))
|
|
(kubernetes-state-update-ingress response)
|
|
response))))
|
|
(ingress (append ingress nil))
|
|
(names (-map #'kubernetes-state-resource-name ingress)))
|
|
(completing-read "Ingress: " names nil t)))
|
|
|
|
;;;###autoload
|
|
(defun kubernetes-display-ingress (ingress-name state)
|
|
"Display information for a ingress in a new window.
|
|
|
|
STATE is the current application state.
|
|
|
|
INGRESS-NAME is the name of the ingress to display."
|
|
(interactive (let ((state (kubernetes-state)))
|
|
(list (kubernetes-ingress--read-name state) state)))
|
|
(if-let (ingress (kubernetes-state-lookup-ingress ingress-name state))
|
|
(select-window
|
|
(display-buffer
|
|
(kubernetes-yaml-make-buffer kubernetes-display-ingress-buffer-name ingress)))
|
|
(error "Unknown ingress: %s" ingress-name)))
|
|
|
|
|
|
|
|
(provide 'kubernetes-ingress)
|
|
|
|
;;; kubernetes-ingress.el ends here
|