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:
commit
d4bb1b8fe3
1 changed files with 44 additions and 36 deletions
68
src/proxy.rs
68
src/proxy.rs
|
|
@ -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> {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue