@@ -263,23 +263,7 @@ impl DevTunnels {
263
263
pub async fn rename_tunnel ( & mut self , name : & str ) -> Result < ( ) , AnyError > {
264
264
is_valid_name ( name) ?;
265
265
266
- let existing = spanf ! (
267
- self . log,
268
- self . log. span( "dev-tunnel.rename.search" ) ,
269
- self . client. list_all_tunnels( & TunnelRequestOptions {
270
- tags: vec![ VSCODE_CLI_TUNNEL_TAG . to_string( ) , name. to_string( ) ] ,
271
- require_all_tags: true ,
272
- ..Default :: default ( )
273
- } )
274
- )
275
- . map_err ( |e| wrap ( e, "failed to list existing tunnels" ) ) ?;
276
-
277
- if !existing. is_empty ( ) {
278
- return Err ( AnyError :: from ( TunnelCreationFailed (
279
- name. to_string ( ) ,
280
- "tunnel name already in use" . to_string ( ) ,
281
- ) ) ) ;
282
- }
266
+ self . check_is_name_free ( name) . await ?;
283
267
284
268
let mut tunnel = match self . launcher_tunnel . load ( ) {
285
269
Some ( t) => t,
@@ -320,14 +304,36 @@ impl DevTunnels {
320
304
preferred_name : Option < String > ,
321
305
use_random_name : bool ,
322
306
) -> Result < ActiveTunnel , AnyError > {
323
- let matches_preferred_name = |tunnel : & PersistedTunnel | {
324
- match & preferred_name {
325
- Some ( p) => p. eq ( & tunnel. name ) ,
326
- None => true
327
- }
328
- } ;
329
- let ( tunnel, persisted) = match self . launcher_tunnel . load ( ) . filter ( matches_preferred_name) {
330
- Some ( persisted) => {
307
+ let ( tunnel, persisted) = match self . launcher_tunnel . load ( ) {
308
+ Some ( mut persisted) => {
309
+ if let Some ( name) = preferred_name {
310
+ if persisted. name . ne ( & name) {
311
+ self . check_is_name_free ( & name) . await ?;
312
+ let mut full_tunnel = spanf ! (
313
+ self . log,
314
+ self . log. span( "dev-tunnel.tag.get" ) ,
315
+ self . client
316
+ . get_tunnel( & persisted. locator( ) , NO_REQUEST_OPTIONS )
317
+ )
318
+ . map_err ( |e| wrap ( e, "failed to lookup tunnel" ) ) ?;
319
+
320
+ info ! ( self . log, "Updating name of existing tunnel" ) ;
321
+
322
+ full_tunnel. tags =
323
+ vec ! [ name. to_string( ) , VSCODE_CLI_TUNNEL_TAG . to_string( ) ] ;
324
+ if spanf ! (
325
+ self . log,
326
+ self . log. span( "dev-tunnel.tag.update" ) ,
327
+ self . client. update_tunnel( & full_tunnel, NO_REQUEST_OPTIONS )
328
+ )
329
+ . is_ok ( )
330
+ {
331
+ persisted. name = name. to_string ( ) ;
332
+ self . launcher_tunnel . save ( Some ( persisted. clone ( ) ) ) ?;
333
+ }
334
+ }
335
+ }
336
+
331
337
let tunnel_lookup = spanf ! (
332
338
self . log,
333
339
self . log. span( "dev-tunnel.tag.get" ) ,
@@ -356,7 +362,9 @@ impl DevTunnels {
356
362
}
357
363
None => {
358
364
debug ! ( self . log, "No code server tunnel found, creating new one" ) ;
359
- let name = self . get_name_for_tunnel ( preferred_name, use_random_name) . await ?;
365
+ let name = self
366
+ . get_name_for_tunnel ( preferred_name, use_random_name)
367
+ . await ?;
360
368
let ( persisted, full_tunnel) = self . create_tunnel ( & name) . await ?;
361
369
self . launcher_tunnel . save ( Some ( persisted. clone ( ) ) ) ?;
362
370
( full_tunnel, persisted)
@@ -517,9 +525,31 @@ impl DevTunnels {
517
525
Ok ( tunnels)
518
526
}
519
527
520
- async fn get_name_for_tunnel ( & mut self , preferred_name : Option < String > , mut use_random_name : bool ) -> Result < String , AnyError > {
521
-
528
+ async fn check_is_name_free ( & mut self , name : & str ) -> Result < ( ) , AnyError > {
529
+ let existing = spanf ! (
530
+ self . log,
531
+ self . log. span( "dev-tunnel.rename.search" ) ,
532
+ self . client. list_all_tunnels( & TunnelRequestOptions {
533
+ tags: vec![ VSCODE_CLI_TUNNEL_TAG . to_string( ) , name. to_string( ) ] ,
534
+ require_all_tags: true ,
535
+ ..Default :: default ( )
536
+ } )
537
+ )
538
+ . map_err ( |e| wrap ( e, "failed to list existing tunnels" ) ) ?;
539
+ if !existing. is_empty ( ) {
540
+ return Err ( AnyError :: from ( TunnelCreationFailed (
541
+ name. to_string ( ) ,
542
+ "tunnel name already in use" . to_string ( ) ,
543
+ ) ) ) ;
544
+ } ;
545
+ Ok ( ( ) )
546
+ }
522
547
548
+ async fn get_name_for_tunnel (
549
+ & mut self ,
550
+ preferred_name : Option < String > ,
551
+ mut use_random_name : bool ,
552
+ ) -> Result < String , AnyError > {
523
553
let existing_tunnels = self . list_all_server_tunnels ( ) . await ?;
524
554
let is_name_free = |n : & str | {
525
555
!existing_tunnels
@@ -536,7 +566,10 @@ impl DevTunnels {
536
566
if is_name_free ( & name) {
537
567
return Ok ( name) ;
538
568
}
539
- info ! ( self . log, "{} is already taken, using a random name instead" , & name) ;
569
+ info ! (
570
+ self . log,
571
+ "{} is already taken, using a random name instead" , & name
572
+ ) ;
540
573
use_random_name = true ;
541
574
}
542
575
0 commit comments