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}