@@ -94,26 +94,36 @@ pub fn store_kubeconfig(path: &Path, contents: &str) -> Result<()> {
9494
9595/// Rewrite kubeconfig for remote deployment.
9696///
97- /// The kubeconfig points to 127.0.0.1:6443 , which works with an SSH tunnel:
98- /// `ssh -L 6443 :127.0.0.1:6443 user@host`
97+ /// The kubeconfig points to ` 127.0.0.1:<kube_port>` , which works with an SSH tunnel:
98+ /// `ssh -L <kube_port> :127.0.0.1:6443 user@host`
9999///
100100/// The cluster name includes "-remote" suffix to distinguish from local clusters.
101- pub fn rewrite_kubeconfig_remote ( contents : & str , cluster_name : & str , _destination : & str ) -> String {
102- // Use the same rewrite logic but with a remote-specific cluster name
103- // The server address stays as 127.0.0.1:6443 because users will use SSH tunneling
101+ pub fn rewrite_kubeconfig_remote (
102+ contents : & str ,
103+ cluster_name : & str ,
104+ _destination : & str ,
105+ kube_port : Option < u16 > ,
106+ ) -> String {
104107 let remote_name = format ! ( "{cluster_name}-remote" ) ;
105- rewrite_kubeconfig ( contents, & remote_name)
108+ rewrite_kubeconfig ( contents, & remote_name, kube_port )
106109}
107110
108- pub fn rewrite_kubeconfig ( contents : & str , cluster_name : & str ) -> String {
111+ /// Rewrite the raw k3s kubeconfig for use on the host.
112+ ///
113+ /// When `kube_port` is `Some`, the server URL is rewritten to
114+ /// `https://127.0.0.1:<kube_port>`. When `None`, the original server URL
115+ /// is left intact (the control plane is not exposed on the host).
116+ pub fn rewrite_kubeconfig ( contents : & str , cluster_name : & str , kube_port : Option < u16 > ) -> String {
109117 let mut replaced = Vec :: new ( ) ;
110118 for line in contents. lines ( ) {
111119 let trimmed = line. trim_start ( ) ;
112- if trimmed. starts_with ( "server:" ) {
113- let indent_len = line. len ( ) - trimmed. len ( ) ;
114- let indent = & line[ ..indent_len] ;
115- replaced. push ( format ! ( "{indent}server: https://127.0.0.1:6443" ) ) ;
116- continue ;
120+ if let Some ( kp) = kube_port {
121+ if trimmed. starts_with ( "server:" ) {
122+ let indent_len = line. len ( ) - trimmed. len ( ) ;
123+ let indent = & line[ ..indent_len] ;
124+ replaced. push ( format ! ( "{indent}server: https://127.0.0.1:{kp}" ) ) ;
125+ continue ;
126+ }
117127 }
118128 // Rename default cluster/context/user to the cluster name
119129 // Handle both "name: default" and "- name: default" (YAML list item)
@@ -237,16 +247,34 @@ mod tests {
237247 use super :: rewrite_kubeconfig;
238248
239249 #[ test]
240- fn rewrite_updates_server_address ( ) {
250+ fn rewrite_updates_server_address_with_kube_port ( ) {
241251 let input = "apiVersion: v1\n clusters:\n - cluster:\n server: https://10.0.0.1:6443\n " ;
242- let output = rewrite_kubeconfig ( input, "test-cluster" ) ;
252+ let output = rewrite_kubeconfig ( input, "test-cluster" , Some ( 6443 ) ) ;
243253 assert ! ( output. contains( "server: https://127.0.0.1:6443" ) ) ;
244254 }
245255
256+ #[ test]
257+ fn rewrite_updates_server_address_custom_port ( ) {
258+ let input = "apiVersion: v1\n clusters:\n - cluster:\n server: https://10.0.0.1:6443\n " ;
259+ let output = rewrite_kubeconfig ( input, "test-cluster" , Some ( 7443 ) ) ;
260+ assert ! ( output. contains( "server: https://127.0.0.1:7443" ) ) ;
261+ assert ! ( !output. contains( "server: https://127.0.0.1:6443" ) ) ;
262+ }
263+
264+ #[ test]
265+ fn rewrite_preserves_server_when_no_kube_port ( ) {
266+ let input = "apiVersion: v1\n clusters:\n - cluster:\n server: https://10.0.0.1:6443\n " ;
267+ let output = rewrite_kubeconfig ( input, "test-cluster" , None ) ;
268+ assert ! (
269+ output. contains( "server: https://10.0.0.1:6443" ) ,
270+ "server address should be preserved when kube_port is None"
271+ ) ;
272+ }
273+
246274 #[ test]
247275 fn rewrite_preserves_trailing_newline ( ) {
248276 let input = "apiVersion: v1\n server: https://10.0.0.1\n " ;
249- let output = rewrite_kubeconfig ( input, "test-cluster" ) ;
277+ let output = rewrite_kubeconfig ( input, "test-cluster" , Some ( 6443 ) ) ;
250278 assert ! ( output. ends_with( '\n' ) ) ;
251279 }
252280
@@ -266,7 +294,7 @@ mod tests {
266294 - name: default
267295 current-context: default
268296 " ;
269- let output = rewrite_kubeconfig ( input, "my-cluster" ) ;
297+ let output = rewrite_kubeconfig ( input, "my-cluster" , Some ( 6443 ) ) ;
270298 assert ! (
271299 output. contains( "name: my-cluster" ) ,
272300 "should contain 'name: my-cluster'"
0 commit comments