1
0
Fork 0
mirror of https://codeberg.org/icewind/haze.git synced 2026-10-01 16:54:08 +02:00

feat(proxy): Support single word instance name

Before, we were assuming that instance names were always containing a
`-`.
This commit is contained in:
Louis Chmn 2026-08-08 12:22:04 +02:00
commit a9194603af

View file

@ -57,7 +57,22 @@ impl ActiveInstances {
return Some(ip); return Some(ip);
} }
let addr = if ServiceType::from_str(name).is_ok() { let addr = self.resolve_addr(name).await?;
println!("{name} => {addr}");
self.known.lock().unwrap().insert(name.into(), addr);
Some(addr)
}
async fn resolve_addr(&self, name: &str) -> Option<SocketAddr> {
// instance
if let Ok(cloud) = Cloud::get_by_filter(&self.docker, Some(name.into()), &self.config).await
{
return Some(SocketAddr::new(cloud.ip?, 80));
}
// service
if ServiceType::from_str(name).is_ok() {
let cloud = self.last()?; let cloud = self.last()?;
let service = cloud.services().find(|service| service.name() == name)?; let service = cloud.services().find(|service| service.name() == name)?;
let ip = service let ip = service
@ -65,42 +80,35 @@ impl ActiveInstances {
.await .await
.ok()? .ok()?
.next()?; .next()?;
SocketAddr::new(ip, service.proxy_port()) return Some(SocketAddr::new(ip, service.proxy_port()));
} else { }
match name.matches('-').count() {
// instance // instance-service
1 => SocketAddr::new( for (pos, _) in name.match_indices('-') {
Cloud::get_by_filter(&self.docker, Some(name.into()), &self.config) let instance_name = &name[..pos];
let service_name = &name[pos + 1..];
if ServiceType::from_str(service_name).is_err() {
continue;
}
let cloud =
match Cloud::get_by_filter(&self.docker, Some(instance_name.into()), &self.config)
.await .await
.ok()? {
.ip?, Ok(cloud) => cloud,
80, Err(_) => continue,
), };
// service with instance let service = match cloud.services().find(|s| s.name() == service_name) {
2.. => { Some(service) => service,
let service_name = name.splitn(3, '-').last()?; None => continue,
let name = &name[0..(name.len() - service_name.len() - 1)]; };
let cloud = Cloud::get_by_filter(&self.docker, Some(name.into()), &self.config)
.await
.ok()?;
let service = cloud
.services()
.find(|service| service.name() == service_name)?;
let ip = service let ip = service
.get_ips(&self.docker, &cloud.id) .get_ips(&self.docker, &cloud.id)
.await .await
.ok()? .ok()?
.next()?; .next()?;
SocketAddr::new(ip, service.proxy_port()) return Some(SocketAddr::new(ip, service.proxy_port()));
} }
_ => return None, None
}
};
println!("{name} => {addr}");
self.known.lock().unwrap().insert(name.into(), addr);
Some(addr)
} }
pub fn last_addr(&self) -> Option<SocketAddr> { pub fn last_addr(&self) -> Option<SocketAddr> {