]> git.eshelyaron.com Git - emacs.git/commitdiff
Add tramp-kubernetes integration
authorFilipp Gunbin <fgunbin@fastmail.fm>
Tue, 4 Oct 2022 23:46:40 +0000 (02:46 +0300)
committerFilipp Gunbin <fgunbin@fastmail.fm>
Wed, 5 Oct 2022 00:10:06 +0000 (03:10 +0300)
* doc/misc/tramp.texi (Inline methods): Add kubernetes.
(Customizing Methods): Remove kubernetes-tramp.
* etc/NEWS: Mention new Tramp method "kubernetes".
* lisp/net/tramp-compat.el (kubernetes-tramp): Warn if that package is
used.
* lisp/net/tramp-container.el (tramp-kubernetes-program): New
defcustom.
(tramp-kubernetes-method): New defconst.
(tramp-kubernetes--completion-function): New function.

doc/misc/tramp.texi
etc/NEWS
lisp/net/tramp-compat.el
lisp/net/tramp-container.el

index 064a2cb60239829c4a04b05e9328848af3be5b57..395df00bf7f4e76b910285b8d4932d834a32519d 100644 (file)
@@ -917,6 +917,14 @@ running container's name or ID, as returned by @samp{docker ps}.
 Podman is an alternative to @option{docker} which may be run rootless,
 if desired.
 
+@item @option{kubernetes}
+@cindex method @option{kubernetes}
+@cindex @option{kubernetes} method
+
+Integration for containers in Kubernetes pods.  The host name is a pod
+name returned by @samp{kubectl get pods}.  The first container in a
+pod is used.
+
 @end table
 
 
@@ -1777,15 +1785,6 @@ They can be installed with Emacs's Package Manager.  This includes
 @c @item ibuffer-tramp.el
 @c Contact Svend Sorensen <svend@@ciffer.net>
 
-@item kubernetes-tramp
-@cindex method @option{kubectl}
-@cindex @option{kubectl} method
-Integration for Docker containers deployed in a Kubernetes cluster.  A
-container is accessed via
-@file{@trampfn{kubectl,user@@container,/path/to/file}}, @samp{user}
-and @samp{container} have the same meaning as with the @option{docker}
-method.
-
 @item lxc-tramp
 @cindex method @option{lxc}
 @cindex @option{lxc} method
index d475c28e45e386e56277a9453c622111e15c6175..916abbc4363294005418c707464643d36170e7cd 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -2450,8 +2450,9 @@ and friends.
 ** Tramp
 
 +++
-*** New connection methods "docker" and "podman".
-It allows accessing environments provided by Docker and similar programs.
+*** New connection methods "docker", "podman" and "kubernetes".
+They allow accessing environments provided by Docker and similar
+programs.
 
 ---
 *** Tramp supports abbreviating remote home directories now.
index f6cc1034ca5070d9c08867faae5f77f930bf0b52..a1d1d284edba37b9c10c7c1d90e1334bd5089ae4 100644 (file)
 
 (with-eval-after-load 'docker-tramp
   (warn (concat "Package `docker-tramp' has been obsoleted, "
-               "please use integrated package `tramp-docker'")))
+               "please use integrated package `tramp-container'")))
+(with-eval-after-load 'kubernetes-tramp
+  (warn (concat "Package `kubernetes-tramp' has been obsoleted, "
+               "please use integrated package `tramp-container'")))
 
 ;; For not existing functions, obsolete functions, or functions with a
 ;; changed argument list, there are compiler warnings.  We want to
index d1c8f2bb4c45ab00aea61aef70c07d5baf9f7d92..e104babed27db57262a92ba5844f589b79cca21f 100644 (file)
 ;; Where:
 ;;     USER          is the user on the container to connect as (optional)
 ;;     CONTAINER     is the container to connect to
+;;
+;;
+;; Open file in a Kubernetes container:
+;;
+;;     C-x C-f /kubernetes:POD:/path/to/file
+;;
+;; Where:
+;;     POD     is the pod to connect to.
+;;             By default, the first container in that pod will be
+;;             used.
+;;
+;; Completion for POD and accessing it operate in the current
+;; namespace, use this command to change it:
+;;
+;; "kubectl config set-context --current --namespace=<name>"
 
 ;;; Code:
 
   :type '(choice (const "podman")
                  (string)))
 
+;;;###tramp-autoload
+(defcustom tramp-kubernetes-program "kubectl"
+  "Name of the Kubernetes client program."
+  :group 'tramp
+  :version "29.1"
+  :type '(choice (const "kubectl")
+                 (string)))
+
 ;;;###tramp-autoload
 (defconst tramp-docker-method "docker"
   "Tramp method name to use to connect to Docker containers.")
 (defconst tramp-podman-method "podman"
   "Tramp method name to use to connect to Podman containers.")
 
+;;;###tramp-autoload
+(defconst tramp-kubernetes-method "kubernetes"
+  "Tramp method name to use to connect to Kubernetes containers.")
+
 ;;;###tramp-autoload
 (defun tramp-docker--completion-function (&rest _args)
   "List Docker-like containers available for connection.
@@ -88,34 +115,59 @@ see its function help for a description of the format."
                      lines)))
     (mapcar (lambda (m) (list nil m)) (delq nil names))))
 
+;;;###tramp-autoload
+(defun tramp-kubernetes--completion-function (&rest _args)
+  "List Kubernetes pods available for connection.
+
+This function is used by `tramp-set-completion-function', please
+see its function help for a description of the format."
+  (when-let ((raw-list (shell-command-to-string
+                       (concat tramp-kubernetes-program
+                                " get pods --no-headers "
+                                "-o custom-columns=NAME:.metadata.name")))
+             (names (split-string raw-list "\n" 'omit)))
+    (mapcar (lambda (name)
+              (list nil name))
+            names)))
+
 ;;;###tramp-autoload
 (defvar tramp-default-remote-shell) ;; Silence byte compiler.
 
 ;;;###tramp-autoload
 (tramp--with-startup
- (push `(,tramp-docker-method
-         (tramp-login-program ,tramp-docker-program)
-         (tramp-login-args (("exec")
-                            ("-it")
-                            ("-u" "%u")
-                            ("%h")
-                           ("%l")))
-         (tramp-remote-shell ,tramp-default-remote-shell)
-         (tramp-remote-shell-login ("-l"))
-         (tramp-remote-shell-args ("-i" "-c")))
-       tramp-methods)
-
- (push `(,tramp-podman-method
-         (tramp-login-program ,tramp-podman-program)
-         (tramp-login-args (("exec")
-                            ("-it")
-                            ("-u" "%u")
-                            ("%h")
-                           ("%l")))
-         (tramp-remote-shell ,tramp-default-remote-shell)
-         (tramp-remote-shell-login ("-l"))
-         (tramp-remote-shell-args ("-i" "-c")))
-       tramp-methods)
+ (add-to-list 'tramp-methods
+              `(,tramp-docker-method
+                (tramp-login-program ,tramp-docker-program)
+                (tramp-login-args (("exec")
+                                   ("-it")
+                                   ("-u" "%u")
+                                   ("%h")
+                                  ("%l")))
+                (tramp-remote-shell ,tramp-default-remote-shell)
+                (tramp-remote-shell-login ("-l"))
+                (tramp-remote-shell-args ("-i" "-c"))))
+ (add-to-list 'tramp-methods
+              `(,tramp-podman-method
+                (tramp-login-program ,tramp-podman-program)
+                (tramp-login-args (("exec")
+                                   ("-it")
+                                   ("-u" "%u")
+                                   ("%h")
+                                  ("%l")))
+                (tramp-remote-shell ,tramp-default-remote-shell)
+                (tramp-remote-shell-login ("-l"))
+                (tramp-remote-shell-args ("-i" "-c"))))
+ (add-to-list 'tramp-methods
+              `(,tramp-kubernetes-method
+                (tramp-login-program ,tramp-kubernetes-program)
+                (tramp-login-args (("exec")
+                                   ("%h")
+                                   ("-it")
+                                   ("--")
+                                  ("%l")))
+                (tramp-remote-shell ,tramp-default-remote-shell)
+                (tramp-remote-shell-login ("-l"))
+                (tramp-remote-shell-args ("-i" "-c"))))
 
  (tramp-set-completion-function
   tramp-docker-method
@@ -123,7 +175,11 @@ see its function help for a description of the format."
 
  (tramp-set-completion-function
   tramp-podman-method
-  '((tramp-docker--completion-function ""))))
+  '((tramp-docker--completion-function "")))
+
+ (tramp-set-completion-function
+  tramp-kubernetes-method
+  '((tramp-kubernetes--completion-function ""))))
 
 (add-hook 'tramp-unload-hook
          (lambda ()