consul_rs_plus/
lib.rs

1#![allow(dead_code)]
2
3#[macro_use]
4extern crate serde_derive;
5extern crate base64;
6extern crate reqwest;
7extern crate serde_json;
8
9pub mod kv;
10mod config;
11pub mod session;
12pub mod pkg;
13
14use self::kv::*;
15use std::io::Read;
16use crate::pkg::CustomError;
17use base64::{decode};
18
19// todo: global use varible here
20// pub const PKGX: pkg::Pkg = pkg::Pkg::new(true);
21
22pub struct Client {
23  pub debug: bool,
24
25  host: String,
26  port: u16,
27
28  kv:   KVPair,
29  session: session::Session,
30}
31
32impl Client {
33  pub fn new<S: Into<String>>(host: S, port: u16) -> Client {
34    Client {
35      debug: false,
36      host: host.into(),
37      port: port,
38      kv: KVPair::new(),
39      session: session::Session::new(),
40    }
41  }
42
43  pub fn debug_print(&self, s: &str) {
44    if self.debug {
45      println!("[DEBUG] --- {:?}", s);
46    }
47  }
48
49  pub fn kv_get<S: Into<String>>(&self, key: S) -> String {
50    let res = self.kv.get(self, key);
51    match res {
52      Ok(kvs) => {
53        let kv = kvs.get(0).unwrap();
54        let val = &kv.Value;
55        let val_de = decode(val).unwrap();
56        let val_de_str = String::from_utf8(val_de).unwrap();
57        val_de_str
58      }
59      Err(err) => {
60        err
61      }
62    }
63  }
64
65  pub fn kv_get_folder<S: Into<String>>(&self, folder: S) -> Result<Vec<String>,
66    String> {
67    let folder_keys = self.kv.get_folder_keys(self, folder).unwrap();
68    serde_json::from_str::<Vec<String>>(&folder_keys).map_err(|e| e.to_string())
69  }
70
71  pub fn kv_set<S: Into<String>>(&self, key: S, v: S) -> Result<bool, String> {
72    self.kv.set(self, key, v)
73  }
74
75  pub fn kv_set_with_session<S: Into<String>>(&self, key: S, v: S, session: S)
76                          -> Result<bool, String> {
77    self.kv.set_with_session(self, key, v, session)
78  }
79
80  pub fn kv_delete<S: Into<String>>(&self, key: S) -> Result<bool, String> {
81    self.kv.delete(self, key)
82  }
83
84  pub fn kv_delete_both_session<S: Into<String>>(&self, key: S) -> Result<bool, String> {
85    self.kv.delete_both_session(self, key)
86  }
87
88  /*
89  pub async fn kv_folder_watch<S: Into<String>>(&self, folder: S) -> Result<bool, String> {
90    let res = self.kv.watch_tree(self, folder).await;
91
92    Ok(true)
93  }
94   */
95
96  pub fn session_set(&self, lock_delay: String, name: String, node: String,
97                     behavior: String, ttl: String) -> String {
98    let mut s = session::Session::new();
99    s.LockDelay = "0.001s".to_string();
100    if name != "".to_string() {
101      s.name = name;
102    }
103
104    if node != "".to_string() {
105      let nodex = Some(node);
106      s.node = nodex;
107    }
108    s.Behavior = behavior;
109    s.TTL = ttl;
110    self.debug_print(format!("lib session set: {:?}", s).as_str(), );
111    self.session.set(self, &s)
112  }
113
114  pub fn session_renew(&self, sid: &str) -> Result<(), CustomError> {
115    self.session.renew(self, sid)
116  }
117
118  pub fn session_delete(&self, sid: &str) -> String {
119    self.session.delete(self, sid)
120  }
121
122}
123
124#[cfg(test)]
125mod tests {
126  use crate::Client;
127  use base64::Config;
128  use tokio::sync::mpsc;
129  use crate::config;
130  use crate::pkg::CustomError;
131  use crate::kv::KVPair;
132
133  /*
134  // #[test]
135  #[tokio::test]
136  async fn test_kv_folder_watch() {
137    env_logger::init();
138    for i in 0..3 {
139      log::info!("i --- {:?}", i);
140    }
141    log::info!("log输出");
142    let host = config::CONFIG["consul_addr"];
143    let client = Client::new(host, 8500);
144    let res = client.kv_folder_watch("foo").await;
145  }
146   */
147
148  /*
149  #[tokio::test]
150  async fn test_kv_folder_watch_getnodes() {
151    env_logger::init();
152    for i in 0..3 {
153      log::info!("i --- {:?}", i);
154    }
155    log::info!("log输出");
156    let host = config::CONFIG["consul_addr"];
157    let client = Client::new(host, 8500);
158    let mut res = false;
159    let (sx, mut rx) = mpsc::channel(1);
160
161    tokio::task::spawn({
162      let resx = client.kv_folder_watch("foo").await.unwrap();
163      sx.send(resx).await.unwrap();
164    });
165
166    while let Some(resx) = rx.recv().await {
167      log::info!("resx --- {:?}", resx);
168    }
169  }
170   */
171
172  #[test]
173  fn test_kv_delete_both_session() {
174    let host = config::CONFIG["consul_addr"];
175    let client = Client::new(host, 8500);
176    let res = client.kv_delete_both_session("my-key");
177    println!("res ---------- {}", res.unwrap());
178  }
179
180  #[test]
181  fn test_kv_get() {
182    let host = config::CONFIG["consul_addr"];
183    let client = Client::new(host, 8500);
184    let val = client.kv_get("my-key");
185    println!("val ----- {}", val);
186  }
187
188  #[test]
189  fn test_session_set() {
190    let host = config::CONFIG["consul_addr"];
191    let client = Client::new(host, 8500);
192    let se = client.session_set("15s".to_string(), "my-session".to_string(), "node1".to_string(), "release".to_string(), "10m0s".to_string());
193  }
194
195  #[test]
196  fn test_kv_set_with_session() {
197    let host = config::CONFIG["consul_addr"];
198    let client = Client::new(host, 8500);
199    let session = client.session_set("15s".to_string(), "my-session".to_string(), "node1".to_string(), "release".to_string(), "10m0s".to_string());
200
201    let res = client.kv_set_with_session("my-key", "my-val", session.as_str()).unwrap();
202    println!("res ------- {}", res);
203  }
204
205  #[test]
206  fn test_session_renew() {
207    let host = config::CONFIG["consul_addr"];
208    let client = Client::new(host, 8500);
209    let ok = client.session_renew("d5663534-82f9-429b-954c-ae63d59d3502");
210    match ok {
211      Ok(_) => { println!("---ok---");}
212      Err(_) => { println!("---err---");}
213    }
214  }
215
216  #[test]
217  fn test_kv_ge_folder() {
218    let host = config::CONFIG["consul_addr"];
219    let client = Client::new(host, 8500);
220    let res = client.kv_get_folder("pomid/Echo");
221    let svcs = res.unwrap();
222    println!("svcs ------------- {:?}", svcs);
223  }
224
225}
226
227
228
229