Skip to content

Commit 70998c0

Browse files
authored
tunnel --name should rename previous tunnel (#164753)
* tunnel --name should rename old tunnel * fix clippy warning
1 parent 83a4466 commit 70998c0

File tree

1 file changed

+62
-29
lines changed

1 file changed

+62
-29
lines changed

cli/src/tunnels/dev_tunnels.rs

+62-29
Original file line numberDiff line numberDiff line change
@@ -263,23 +263,7 @@ impl DevTunnels {
263263
pub async fn rename_tunnel(&mut self, name: &str) -> Result<(), AnyError> {
264264
is_valid_name(name)?;
265265

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?;
283267

284268
let mut tunnel = match self.launcher_tunnel.load() {
285269
Some(t) => t,
@@ -320,14 +304,36 @@ impl DevTunnels {
320304
preferred_name: Option<String>,
321305
use_random_name: bool,
322306
) -> 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+
331337
let tunnel_lookup = spanf!(
332338
self.log,
333339
self.log.span("dev-tunnel.tag.get"),
@@ -356,7 +362,9 @@ impl DevTunnels {
356362
}
357363
None => {
358364
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?;
360368
let (persisted, full_tunnel) = self.create_tunnel(&name).await?;
361369
self.launcher_tunnel.save(Some(persisted.clone()))?;
362370
(full_tunnel, persisted)
@@ -517,9 +525,31 @@ impl DevTunnels {
517525
Ok(tunnels)
518526
}
519527

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+
}
522547

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> {
523553
let existing_tunnels = self.list_all_server_tunnels().await?;
524554
let is_name_free = |n: &str| {
525555
!existing_tunnels
@@ -536,7 +566,10 @@ impl DevTunnels {
536566
if is_name_free(&name) {
537567
return Ok(name);
538568
}
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+
);
540573
use_random_name = true;
541574
}
542575

0 commit comments

Comments
 (0)