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

Merge pull request 'feat(proxy): Support single word instance name' (#29) from artonge/haze:artonge/feat/support_single_word_instance_name into main

Reviewed-on: https://codeberg.org/icewind/haze/pulls/29
This commit is contained in:
Robin Appelman 2026-08-10 23:22:33 +02:00
commit d4bb1b8fe3

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];
.await let service_name = &name[pos + 1..];
.ok()? if ServiceType::from_str(service_name).is_err() {
.ip?, continue;
80,
),
// service with instance
2.. => {
let service_name = name.splitn(3, '-').last()?;
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
.get_ips(&self.docker, &cloud.id)
.await
.ok()?
.next()?;
SocketAddr::new(ip, service.proxy_port())
}
_ => return None,
} }
}; let cloud =
match Cloud::get_by_filter(&self.docker, Some(instance_name.into()), &self.config)
println!("{name} => {addr}"); .await
{
self.known.lock().unwrap().insert(name.into(), addr); Ok(cloud) => cloud,
Some(addr) Err(_) => continue,
};
let service = match cloud.services().find(|s| s.name() == service_name) {
Some(service) => service,
None => continue,
};
let ip = service
.get_ips(&self.docker, &cloud.id)
.await
.ok()?
.next()?;
return Some(SocketAddr::new(ip, service.proxy_port()));
}
None
} }
pub fn last_addr(&self) -> Option<SocketAddr> { pub fn last_addr(&self) -> Option<SocketAddr> {