node_discover/
lib.rs

1//! Retrieve IP addresses of nodes from a provider.
2//!
3//! Query DigitalOcean for droplets in region "lon1" and with tag "cool-tag"
4//! ```rust no_run
5//! use node_discover::get_addresses;
6//!
7//! #[tokio::main]
8//! async fn main() {
9//!     let args = "provider=digitalocean region=lon1 tag_name=cool-tag".to_string();
10//!     let res = get_addresses(args).await;
11//!     match res {
12//!         Ok(addrs) => println!("{:?}", addrs),
13//!         Err(e) => println!("Error: {}", e),
14//!     };
15//! }
16//! ```
17//!
18//! Query AWS for instances in region "eu-west-1" and with name=cool-name and get their private ipv4 addrs
19//! ```rust no_run
20//! use node_discover::get_addresses;
21//!
22//! #[tokio::main]
23//! async fn main() {
24//!     let args = "provider=aws region=eu-west-1 tag_key=Name tag_value=cool-name addr_type=private_v4".to_string();
25//!     let res = get_addresses(args).await;
26//!     match res {
27//!         Ok(addrs) => println!("{:?}", addrs),
28//!         Err(e) => println!("Error: {}", e),
29//!     };
30//! }
31//! ```
32mod args;
33mod errors;
34mod providers;
35
36use std::convert::TryFrom;
37
38use args::ParsedArgs;
39pub use args::SupportedProvider;
40use errors::DiscoverError;
41
42#[cfg(feature = "aws")]
43pub use providers::aws::AWSProvider;
44#[cfg(feature = "digitalocean")]
45pub use providers::digitalocean::DOProvider;
46pub use providers::*;
47
48pub async fn get_addresses(args: String) -> Result<Vec<String>, DiscoverError> {
49    let args = ParsedArgs::try_from(args)?;
50    match *args.provider() {
51        SupportedProvider::AWS => {
52            #[cfg(feature = "aws")]
53            {
54                let p = AWSProvider::try_from(args)?;
55                return p.addrs().await;
56            }
57            #[allow(unreachable_code)]
58            Err(DiscoverError::UnsupportedProvider("aws".into()))
59        }
60        SupportedProvider::DigitalOcean => {
61            #[cfg(feature = "digitalocean")]
62            {
63                let p = DOProvider::try_from(args)?;
64                return p.addrs().await;
65            }
66            #[allow(unreachable_code)]
67            Err(DiscoverError::UnsupportedProvider("digitalocean".into()))
68        }
69    }
70}