etcds 0.16.0

An etcd v3 API server - light server version for queue management
use std::sync::atomic::{AtomicU16, Ordering};
use etcd_client::{Client, Error};
use etcds::cluster::EtcdNode;

pub const TESTING_RANGE: bool = false;
pub const TESTING_PREFIX: bool = false;

pub type Result<T> = std::result::Result<T, Error>;

static PORT: AtomicU16 = AtomicU16::new(22379);

pub async fn start_server() -> (EtcdNode, Client) {
    let port = PORT.fetch_add(1, Ordering::Relaxed);
    let addr = format!("localhost:{}", port);

    let mut cfg = etcds::cli::EtcdConfig::with_defaults();
    cfg.listen_client_urls = addr.clone();

    let log = slog::Logger::root(slog::Discard, slog::o!());
    let node = EtcdNode::init(
        cfg, log,
        #[cfg(feature = "tracer")] None,
    ).await.unwrap();
    node.serve().await.unwrap();

    let endpoint = format!("http://{}", addr);
    let mut client = Client::connect([endpoint.as_str()], None).await.unwrap();
    for _ in 0..50 {
        if client.status().await.is_ok() {
            return (node, client);
        }
        tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
    }
    panic!("Test server on {} did not become ready", addr);
}