Skip to content

Commit

Permalink
Change get_known_services to return instance name
Browse files Browse the repository at this point in the history
  • Loading branch information
balliegojr committed Oct 7, 2023
1 parent b56cc29 commit 540ad06
Show file tree
Hide file tree
Showing 5 changed files with 103 additions and 92 deletions.
5 changes: 5 additions & 0 deletions simple-mdns/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
# 0.5.0 (Unreleased)

### Breaking changes
- Change `get_known_services` to return instance name

# 0.4.2 (2023-10-04)
### Fixed
- Uses correct tokio features for worspace resolver 2
Expand Down
22 changes: 16 additions & 6 deletions simple-mdns/src/async_discovery/service_discovery.rs
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ impl ServiceDiscovery {
}

/// Return the addresses of all known services
pub async fn get_known_services(&self) -> Vec<InstanceInformation> {
pub async fn get_known_services(&self) -> HashMap<String, InstanceInformation> {
self.resource_manager
.read()
.await
Expand All @@ -152,8 +152,15 @@ impl ServiceDiscovery {
let mut ip_addresses: Vec<IpAddr> = Vec::new();
let mut ports = Vec::new();
let mut attributes = HashMap::new();
let mut instance_name: Option<String> = Default::default();

for resource in domain_resources {
if instance_name.is_none() {
instance_name = resource
.name
.without(&self.service_name)
.map(|sub_domain| sub_domain.to_string());
}
match &resource.rdata {
simple_dns::rdata::RData::A(a) => {
ip_addresses.push(Ipv4Addr::from(a.address).into())
Expand All @@ -167,11 +174,14 @@ impl ServiceDiscovery {
}
}

InstanceInformation {
ip_addresses,
ports,
attributes,
}
(
instance_name.unwrap_or_default(),
InstanceInformation {
ip_addresses,
ports,
attributes,
},
)
})
.collect()
}
Expand Down
24 changes: 18 additions & 6 deletions simple-mdns/src/sync_discovery/service_discovery.rs
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ impl ServiceDiscovery {
}

/// Return the addresses of all known services
pub fn get_known_services(&self) -> Vec<InstanceInformation> {
pub fn get_known_services(&self) -> HashMap<String, InstanceInformation> {
self.resource_manager
.read()
.unwrap()
Expand All @@ -134,8 +134,17 @@ impl ServiceDiscovery {
let mut ip_addresses: Vec<IpAddr> = Vec::new();
let mut ports = Vec::new();
let mut attributes = HashMap::new();
let mut instance_name: Option<String> = Default::default();

for resource in domain_resources {
if instance_name.is_none() {
dbg!(&self.service_name, &resource.name);
instance_name = resource
.name
.without(&self.service_name)
.map(|sub_domain| sub_domain.to_string());
}

match &resource.rdata {
simple_dns::rdata::RData::A(a) => {
ip_addresses.push(Ipv4Addr::from(a.address).into())
Expand All @@ -149,11 +158,14 @@ impl ServiceDiscovery {
}
}

InstanceInformation {
ip_addresses,
ports,
attributes,
}
(
instance_name.unwrap_or_default(),
InstanceInformation {
ip_addresses,
ports,
attributes,
},
)
})
.collect()
}
Expand Down
72 changes: 32 additions & 40 deletions simple-mdns/tests/service_discovery.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,40 +33,36 @@ fn service_discovery_can_find_services() -> Result<(), Box<dyn Error>> {

std::thread::sleep(Duration::from_secs(2));

let mut from_a: Vec<SocketAddr> = service_discovery_a
let from_a: HashMap<String, SocketAddr> = service_discovery_a
.get_known_services()
.iter()
.flat_map(|x| x.get_socket_addresses())
.into_iter()
.map(|(name, x)| (name, x.get_socket_addresses().next().unwrap()))
.collect();

let mut from_b: Vec<SocketAddr> = service_discovery_b
let from_b: HashMap<String, SocketAddr> = service_discovery_b
.get_known_services()
.iter()
.flat_map(|x| x.get_socket_addresses())
.into_iter()
.map(|(name, x)| (name, x.get_socket_addresses().next().unwrap()))
.collect();

let mut from_c: Vec<SocketAddr> = service_discovery_c
let from_c: HashMap<String, SocketAddr> = service_discovery_c
.get_known_services()
.iter()
.flat_map(|x| x.get_socket_addresses())
.into_iter()
.map(|(name, x)| (name, x.get_socket_addresses().next().unwrap()))
.collect();

from_a.sort();
from_b.sort();
from_c.sort();

assert_eq!(2, from_a.len());
assert_eq!(2, from_b.len());
assert_eq!(2, from_c.len());

assert_eq!(&("192.168.1.3:8080".parse::<SocketAddr>()?), &from_a[0]);
assert_eq!(&("192.168.1.4:8080".parse::<SocketAddr>()?), &from_a[1]);
assert_eq!(&("192.168.1.3:8080".parse::<SocketAddr>()?), &from_a["b"]);
assert_eq!(&("192.168.1.4:8080".parse::<SocketAddr>()?), &from_a["c"]);

assert_eq!(&("192.168.1.2:8080".parse::<SocketAddr>()?), &from_b[0]);
assert_eq!(&("192.168.1.4:8080".parse::<SocketAddr>()?), &from_b[1]);
assert_eq!(&("192.168.1.2:8080".parse::<SocketAddr>()?), &from_b["a"]);
assert_eq!(&("192.168.1.4:8080".parse::<SocketAddr>()?), &from_b["c"]);

assert_eq!(&("192.168.1.2:8080".parse::<SocketAddr>()?), &from_c[0]);
assert_eq!(&("192.168.1.3:8080".parse::<SocketAddr>()?), &from_c[1]);
assert_eq!(&("192.168.1.2:8080".parse::<SocketAddr>()?), &from_c["a"]);
assert_eq!(&("192.168.1.3:8080".parse::<SocketAddr>()?), &from_c["b"]);
Ok(())
}

Expand Down Expand Up @@ -100,13 +96,13 @@ fn service_discovery_receive_attributes() -> Result<(), Box<dyn Error>> {
let d_attr: HashMap<String, Option<String>> = service_discovery_d
.get_known_services()
.into_iter()
.flat_map(|x| x.attributes)
.flat_map(|(_, x)| x.attributes)
.collect();

let e_attr: HashMap<String, Option<String>> = service_discovery_e
.get_known_services()
.into_iter()
.flat_map(|x| x.attributes)
.flat_map(|(_, x)| x.attributes)
.collect();

assert_eq!(1, d_attr.len());
Expand Down Expand Up @@ -156,57 +152,53 @@ fn service_discovery_can_find_services_ipv6() -> Result<(), Box<dyn Error>> {

std::thread::sleep(Duration::from_secs(2));

let mut from_a: Vec<SocketAddr> = service_discovery_a
let from_a: HashMap<String, SocketAddr> = service_discovery_a
.get_known_services()
.iter()
.flat_map(|x| x.get_socket_addresses())
.into_iter()
.map(|(name, x)| (name, x.get_socket_addresses().next().unwrap()))
.collect();

let mut from_b: Vec<SocketAddr> = service_discovery_b
let from_b: HashMap<String, SocketAddr> = service_discovery_b
.get_known_services()
.iter()
.flat_map(|x| x.get_socket_addresses())
.into_iter()
.map(|(name, x)| (name, x.get_socket_addresses().next().unwrap()))
.collect();

let mut from_c: Vec<SocketAddr> = service_discovery_c
let from_c: HashMap<String, SocketAddr> = service_discovery_c
.get_known_services()
.iter()
.flat_map(|x| x.get_socket_addresses())
.into_iter()
.map(|(name, x)| (name, x.get_socket_addresses().next().unwrap()))
.collect();

from_a.sort();
from_b.sort();
from_c.sort();

assert_eq!(2, from_a.len());
assert_eq!(2, from_b.len());
assert_eq!(2, from_c.len());

assert_eq!(
&("[fe80::26fc:f50f:6755:7d68]:8080".parse::<SocketAddr>()?),
&from_a[0]
&from_a["b"]
);
assert_eq!(
&("[fe80::26fc:f50f:6755:7d69]:8080".parse::<SocketAddr>()?),
&from_a[1]
&from_a["c"]
);

assert_eq!(
&("[fe80::26fc:f50f:6755:7d67]:8080".parse::<SocketAddr>()?),
&from_b[0]
&from_b["a"]
);
assert_eq!(
&("[fe80::26fc:f50f:6755:7d69]:8080".parse::<SocketAddr>()?),
&from_b[1]
&from_b["c"]
);

assert_eq!(
&("[fe80::26fc:f50f:6755:7d67]:8080".parse::<SocketAddr>()?),
&from_c[0]
&from_c["a"]
);
assert_eq!(
&("[fe80::26fc:f50f:6755:7d68]:8080".parse::<SocketAddr>()?),
&from_c[1]
&from_c["b"]
);
Ok(())
}
72 changes: 32 additions & 40 deletions simple-mdns/tests/service_discovery_tokio.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,43 +37,39 @@ async fn service_discovery_can_find_services() -> Result<(), Box<dyn Error>> {

tokio::time::sleep(Duration::from_secs(2)).await;

let mut from_a: Vec<SocketAddr> = service_discovery_a
let from_a: HashMap<String, SocketAddr> = service_discovery_a
.get_known_services()
.await
.iter()
.flat_map(|x| x.get_socket_addresses())
.into_iter()
.map(|(name, x)| (name, x.get_socket_addresses().next().unwrap()))
.collect();

let mut from_b: Vec<SocketAddr> = service_discovery_b
let from_b: HashMap<String, SocketAddr> = service_discovery_b
.get_known_services()
.await
.iter()
.flat_map(|x| x.get_socket_addresses())
.into_iter()
.map(|(name, x)| (name, x.get_socket_addresses().next().unwrap()))
.collect();

let mut from_c: Vec<SocketAddr> = service_discovery_c
let from_c: HashMap<String, SocketAddr> = service_discovery_c
.get_known_services()
.await
.iter()
.flat_map(|x| x.get_socket_addresses())
.into_iter()
.map(|(name, x)| (name, x.get_socket_addresses().next().unwrap()))
.collect();

from_a.sort();
from_b.sort();
from_c.sort();

assert_eq!(2, from_a.len());
assert_eq!(2, from_b.len());
assert_eq!(2, from_c.len());

assert_eq!(&("192.168.1.3:8080".parse::<SocketAddr>()?), &from_a[0]);
assert_eq!(&("192.168.1.4:8080".parse::<SocketAddr>()?), &from_a[1]);
assert_eq!(&("192.168.1.3:8080".parse::<SocketAddr>()?), &from_a["b"]);
assert_eq!(&("192.168.1.4:8080".parse::<SocketAddr>()?), &from_a["c"]);

assert_eq!(&("192.168.1.2:8080".parse::<SocketAddr>()?), &from_b[0]);
assert_eq!(&("192.168.1.4:8080".parse::<SocketAddr>()?), &from_b[1]);
assert_eq!(&("192.168.1.2:8080".parse::<SocketAddr>()?), &from_b["a"]);
assert_eq!(&("192.168.1.4:8080".parse::<SocketAddr>()?), &from_b["c"]);

assert_eq!(&("192.168.1.2:8080".parse::<SocketAddr>()?), &from_c[0]);
assert_eq!(&("192.168.1.3:8080".parse::<SocketAddr>()?), &from_c[1]);
assert_eq!(&("192.168.1.2:8080".parse::<SocketAddr>()?), &from_c["a"]);
assert_eq!(&("192.168.1.3:8080".parse::<SocketAddr>()?), &from_c["b"]);
Ok(())
}

Expand Down Expand Up @@ -110,14 +106,14 @@ async fn service_discovery_receive_attributes() -> Result<(), Box<dyn Error>> {
.get_known_services()
.await
.into_iter()
.flat_map(|x| x.attributes)
.flat_map(|(_, x)| x.attributes)
.collect();

let e_attr: HashMap<String, Option<String>> = service_discovery_e
.get_known_services()
.await
.into_iter()
.flat_map(|x| x.attributes)
.flat_map(|(_, x)| x.attributes)
.collect();

assert_eq!(1, d_attr.len());
Expand Down Expand Up @@ -170,60 +166,56 @@ async fn service_discovery_can_find_services_ipv6() -> Result<(), Box<dyn Error>

tokio::time::sleep(Duration::from_secs(2)).await;

let mut from_a: Vec<SocketAddr> = service_discovery_a
let from_a: HashMap<String, SocketAddr> = service_discovery_a
.get_known_services()
.await
.iter()
.flat_map(|x| x.get_socket_addresses())
.into_iter()
.map(|(name, x)| (name, x.get_socket_addresses().next().unwrap()))
.collect();

let mut from_b: Vec<SocketAddr> = service_discovery_b
let from_b: HashMap<String, SocketAddr> = service_discovery_b
.get_known_services()
.await
.iter()
.flat_map(|x| x.get_socket_addresses())
.into_iter()
.map(|(name, x)| (name, x.get_socket_addresses().next().unwrap()))
.collect();

let mut from_c: Vec<SocketAddr> = service_discovery_c
let from_c: HashMap<String, SocketAddr> = service_discovery_c
.get_known_services()
.await
.iter()
.flat_map(|x| x.get_socket_addresses())
.into_iter()
.map(|(name, x)| (name, x.get_socket_addresses().next().unwrap()))
.collect();

from_a.sort();
from_b.sort();
from_c.sort();

assert_eq!(2, from_a.len());
assert_eq!(2, from_b.len());
assert_eq!(2, from_c.len());

assert_eq!(
&("[fe80::26fc:f50f:6755:7d68]:8080".parse::<SocketAddr>()?),
&from_a[0]
&from_a["b"]
);
assert_eq!(
&("[fe80::26fc:f50f:6755:7d69]:8080".parse::<SocketAddr>()?),
&from_a[1]
&from_a["c"]
);

assert_eq!(
&("[fe80::26fc:f50f:6755:7d67]:8080".parse::<SocketAddr>()?),
&from_b[0]
&from_b["a"]
);
assert_eq!(
&("[fe80::26fc:f50f:6755:7d69]:8080".parse::<SocketAddr>()?),
&from_b[1]
&from_b["c"]
);

assert_eq!(
&("[fe80::26fc:f50f:6755:7d67]:8080".parse::<SocketAddr>()?),
&from_c[0]
&from_c["a"]
);
assert_eq!(
&("[fe80::26fc:f50f:6755:7d68]:8080".parse::<SocketAddr>()?),
&from_c[1]
&from_c["b"]
);
Ok(())
}

0 comments on commit 540ad06

Please sign in to comment.