From 540ad0660a8cbf07ed32a3c05417ccd742a683fd Mon Sep 17 00:00:00 2001 From: Ilson Roberto Balliego Junior Date: Sat, 7 Oct 2023 21:13:10 +0200 Subject: [PATCH] Change get_known_services to return instance name --- simple-mdns/CHANGELOG.md | 5 ++ .../src/async_discovery/service_discovery.rs | 22 ++++-- .../src/sync_discovery/service_discovery.rs | 24 +++++-- simple-mdns/tests/service_discovery.rs | 72 +++++++++---------- simple-mdns/tests/service_discovery_tokio.rs | 72 +++++++++---------- 5 files changed, 103 insertions(+), 92 deletions(-) diff --git a/simple-mdns/CHANGELOG.md b/simple-mdns/CHANGELOG.md index 2fc9632..d60d684 100644 --- a/simple-mdns/CHANGELOG.md +++ b/simple-mdns/CHANGELOG.md @@ -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 diff --git a/simple-mdns/src/async_discovery/service_discovery.rs b/simple-mdns/src/async_discovery/service_discovery.rs index 4a53a41..3f3fb0f 100644 --- a/simple-mdns/src/async_discovery/service_discovery.rs +++ b/simple-mdns/src/async_discovery/service_discovery.rs @@ -143,7 +143,7 @@ impl ServiceDiscovery { } /// Return the addresses of all known services - pub async fn get_known_services(&self) -> Vec { + pub async fn get_known_services(&self) -> HashMap { self.resource_manager .read() .await @@ -152,8 +152,15 @@ impl ServiceDiscovery { let mut ip_addresses: Vec = Vec::new(); let mut ports = Vec::new(); let mut attributes = HashMap::new(); + let mut instance_name: Option = 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()) @@ -167,11 +174,14 @@ impl ServiceDiscovery { } } - InstanceInformation { - ip_addresses, - ports, - attributes, - } + ( + instance_name.unwrap_or_default(), + InstanceInformation { + ip_addresses, + ports, + attributes, + }, + ) }) .collect() } diff --git a/simple-mdns/src/sync_discovery/service_discovery.rs b/simple-mdns/src/sync_discovery/service_discovery.rs index 1cf883e..00aa345 100644 --- a/simple-mdns/src/sync_discovery/service_discovery.rs +++ b/simple-mdns/src/sync_discovery/service_discovery.rs @@ -125,7 +125,7 @@ impl ServiceDiscovery { } /// Return the addresses of all known services - pub fn get_known_services(&self) -> Vec { + pub fn get_known_services(&self) -> HashMap { self.resource_manager .read() .unwrap() @@ -134,8 +134,17 @@ impl ServiceDiscovery { let mut ip_addresses: Vec = Vec::new(); let mut ports = Vec::new(); let mut attributes = HashMap::new(); + let mut instance_name: Option = 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()) @@ -149,11 +158,14 @@ impl ServiceDiscovery { } } - InstanceInformation { - ip_addresses, - ports, - attributes, - } + ( + instance_name.unwrap_or_default(), + InstanceInformation { + ip_addresses, + ports, + attributes, + }, + ) }) .collect() } diff --git a/simple-mdns/tests/service_discovery.rs b/simple-mdns/tests/service_discovery.rs index 41fc8f6..e2c9ecb 100644 --- a/simple-mdns/tests/service_discovery.rs +++ b/simple-mdns/tests/service_discovery.rs @@ -33,40 +33,36 @@ fn service_discovery_can_find_services() -> Result<(), Box> { std::thread::sleep(Duration::from_secs(2)); - let mut from_a: Vec = service_discovery_a + let from_a: HashMap = 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 = service_discovery_b + let from_b: HashMap = 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 = service_discovery_c + let from_c: HashMap = 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::()?), &from_a[0]); - assert_eq!(&("192.168.1.4:8080".parse::()?), &from_a[1]); + assert_eq!(&("192.168.1.3:8080".parse::()?), &from_a["b"]); + assert_eq!(&("192.168.1.4:8080".parse::()?), &from_a["c"]); - assert_eq!(&("192.168.1.2:8080".parse::()?), &from_b[0]); - assert_eq!(&("192.168.1.4:8080".parse::()?), &from_b[1]); + assert_eq!(&("192.168.1.2:8080".parse::()?), &from_b["a"]); + assert_eq!(&("192.168.1.4:8080".parse::()?), &from_b["c"]); - assert_eq!(&("192.168.1.2:8080".parse::()?), &from_c[0]); - assert_eq!(&("192.168.1.3:8080".parse::()?), &from_c[1]); + assert_eq!(&("192.168.1.2:8080".parse::()?), &from_c["a"]); + assert_eq!(&("192.168.1.3:8080".parse::()?), &from_c["b"]); Ok(()) } @@ -100,13 +96,13 @@ fn service_discovery_receive_attributes() -> Result<(), Box> { let d_attr: HashMap> = service_discovery_d .get_known_services() .into_iter() - .flat_map(|x| x.attributes) + .flat_map(|(_, x)| x.attributes) .collect(); let e_attr: HashMap> = 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()); @@ -156,57 +152,53 @@ fn service_discovery_can_find_services_ipv6() -> Result<(), Box> { std::thread::sleep(Duration::from_secs(2)); - let mut from_a: Vec = service_discovery_a + let from_a: HashMap = 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 = service_discovery_b + let from_b: HashMap = 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 = service_discovery_c + let from_c: HashMap = 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::()?), - &from_a[0] + &from_a["b"] ); assert_eq!( &("[fe80::26fc:f50f:6755:7d69]:8080".parse::()?), - &from_a[1] + &from_a["c"] ); assert_eq!( &("[fe80::26fc:f50f:6755:7d67]:8080".parse::()?), - &from_b[0] + &from_b["a"] ); assert_eq!( &("[fe80::26fc:f50f:6755:7d69]:8080".parse::()?), - &from_b[1] + &from_b["c"] ); assert_eq!( &("[fe80::26fc:f50f:6755:7d67]:8080".parse::()?), - &from_c[0] + &from_c["a"] ); assert_eq!( &("[fe80::26fc:f50f:6755:7d68]:8080".parse::()?), - &from_c[1] + &from_c["b"] ); Ok(()) } diff --git a/simple-mdns/tests/service_discovery_tokio.rs b/simple-mdns/tests/service_discovery_tokio.rs index c86c5e3..7cc3bb3 100644 --- a/simple-mdns/tests/service_discovery_tokio.rs +++ b/simple-mdns/tests/service_discovery_tokio.rs @@ -37,43 +37,39 @@ async fn service_discovery_can_find_services() -> Result<(), Box> { tokio::time::sleep(Duration::from_secs(2)).await; - let mut from_a: Vec = service_discovery_a + let from_a: HashMap = 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 = service_discovery_b + let from_b: HashMap = 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 = service_discovery_c + let from_c: HashMap = 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::()?), &from_a[0]); - assert_eq!(&("192.168.1.4:8080".parse::()?), &from_a[1]); + assert_eq!(&("192.168.1.3:8080".parse::()?), &from_a["b"]); + assert_eq!(&("192.168.1.4:8080".parse::()?), &from_a["c"]); - assert_eq!(&("192.168.1.2:8080".parse::()?), &from_b[0]); - assert_eq!(&("192.168.1.4:8080".parse::()?), &from_b[1]); + assert_eq!(&("192.168.1.2:8080".parse::()?), &from_b["a"]); + assert_eq!(&("192.168.1.4:8080".parse::()?), &from_b["c"]); - assert_eq!(&("192.168.1.2:8080".parse::()?), &from_c[0]); - assert_eq!(&("192.168.1.3:8080".parse::()?), &from_c[1]); + assert_eq!(&("192.168.1.2:8080".parse::()?), &from_c["a"]); + assert_eq!(&("192.168.1.3:8080".parse::()?), &from_c["b"]); Ok(()) } @@ -110,14 +106,14 @@ async fn service_discovery_receive_attributes() -> Result<(), Box> { .get_known_services() .await .into_iter() - .flat_map(|x| x.attributes) + .flat_map(|(_, x)| x.attributes) .collect(); let e_attr: HashMap> = 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()); @@ -170,60 +166,56 @@ async fn service_discovery_can_find_services_ipv6() -> Result<(), Box tokio::time::sleep(Duration::from_secs(2)).await; - let mut from_a: Vec = service_discovery_a + let from_a: HashMap = 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 = service_discovery_b + let from_b: HashMap = 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 = service_discovery_c + let from_c: HashMap = 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::()?), - &from_a[0] + &from_a["b"] ); assert_eq!( &("[fe80::26fc:f50f:6755:7d69]:8080".parse::()?), - &from_a[1] + &from_a["c"] ); assert_eq!( &("[fe80::26fc:f50f:6755:7d67]:8080".parse::()?), - &from_b[0] + &from_b["a"] ); assert_eq!( &("[fe80::26fc:f50f:6755:7d69]:8080".parse::()?), - &from_b[1] + &from_b["c"] ); assert_eq!( &("[fe80::26fc:f50f:6755:7d67]:8080".parse::()?), - &from_c[0] + &from_c["a"] ); assert_eq!( &("[fe80::26fc:f50f:6755:7d68]:8080".parse::()?), - &from_c[1] + &from_c["b"] ); Ok(()) }