use crate::client::RestClient;
use crate::error::Result;
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MetricResponse {
pub interval: String,
pub timestamps: Vec<i64>,
pub values: Vec<Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Proxy {
pub uid: u32,
pub bdb_uid: u32,
pub node_uid: u32,
pub status: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub addr: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub port: Option<u16>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_connections: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub threads: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub backlog: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_eviction: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_keepcnt: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_keepidle: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_keepintvl: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub conns: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub corefile: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub duration_usage_threshold: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub dynamic_threads_scaling: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ignore_bdb_cconn_limit: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ignore_bdb_cconn_output_buff_limits: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub incoming_connections_capacity: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub incoming_connections_min_capacity: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub incoming_connections_rate_limit: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub log_level: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_listeners: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_servers: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_threads: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_worker_client_conns: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_worker_server_conns: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_worker_txns: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub maxmemory_clients: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub threads_usage_threshold: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProxyStats {
pub uid: u32,
pub intervals: Vec<StatsInterval>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StatsInterval {
pub interval: String,
pub timestamps: Vec<i64>,
pub values: Vec<Value>,
}
pub struct ProxyHandler {
client: RestClient,
}
impl ProxyHandler {
pub fn new(client: RestClient) -> Self {
ProxyHandler { client }
}
pub async fn list(&self) -> Result<Vec<Proxy>> {
self.client.get("/v1/proxies").await
}
pub async fn get(&self, uid: u32) -> Result<Proxy> {
self.client.get(&format!("/v1/proxies/{}", uid)).await
}
pub async fn stats(&self, uid: u32) -> Result<ProxyStats> {
self.client.get(&format!("/v1/proxies/{}/stats", uid)).await
}
pub async fn stats_metric(&self, uid: u32, metric: &str) -> Result<MetricResponse> {
self.client
.get(&format!("/v1/proxies/{}/stats/{}", uid, metric))
.await
}
pub async fn list_by_database(&self, bdb_uid: u32) -> Result<Vec<Proxy>> {
self.client
.get(&format!("/v1/bdbs/{}/proxies", bdb_uid))
.await
}
pub async fn list_by_node(&self, node_uid: u32) -> Result<Vec<Proxy>> {
self.client
.get(&format!("/v1/nodes/{}/proxies", node_uid))
.await
}
pub async fn reload(&self, uid: u32) -> Result<()> {
self.client
.post_action(&format!("/v1/proxies/{}/actions/reload", uid), &Value::Null)
.await
}
pub async fn update_all(&self, update: ProxyUpdate) -> Result<Vec<Proxy>> {
self.client.put("/v1/proxies", &update).await
}
pub async fn update(&self, uid: u32, update: ProxyUpdate) -> Result<Proxy> {
self.client
.put(&format!("/v1/proxies/{}", uid), &update)
.await
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProxyUpdate {
#[serde(skip_serializing_if = "Option::is_none")]
pub max_connections: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub threads: Option<u32>,
}