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);
}
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 service = cloud.services().find(|service| service.name() == name)?;
let ip = service
@ -65,42 +80,35 @@ impl ActiveInstances {
.await
.ok()?
.next()?;
SocketAddr::new(ip, service.proxy_port())
} else {
match name.matches('-').count() {
// instance
1 => SocketAddr::new(
Cloud::get_by_filter(&self.docker, Some(name.into()), &self.config)
return Some(SocketAddr::new(ip, service.proxy_port()));
}
// instance-service
for (pos, _) in name.match_indices('-') {
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
.ok()?
.ip?,
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)?;
{
Ok(cloud) => cloud,
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()?;
SocketAddr::new(ip, service.proxy_port())
return Some(SocketAddr::new(ip, service.proxy_port()));
}
_ => return None,
}
};
println!("{name} => {addr}");
self.known.lock().unwrap().insert(name.into(), addr);
Some(addr)
None
}
pub fn last_addr(&self) -> Option<SocketAddr> {