pub mod create_lb;
pub mod create_pool;
pub mod delete_lb;
pub mod delete_pool;
pub mod list_lb;
pub mod pool_details;
use crate::framework::ApiResultTraits;
use chrono::offset::Utc;
use chrono::DateTime;
use std::collections::{HashMap, HashSet};
use std::hash::{Hash, Hasher};
use std::net::IpAddr;
#[derive(Eq, PartialEq, Deserialize, Serialize, Clone, Debug)]
pub struct LoadBalancer {
pub id: String,
pub created_on: DateTime<Utc>,
pub modified_on: DateTime<Utc>,
pub description: String,
pub name: String,
pub enabled: bool,
#[serde(default = "LoadBalancer::default_ttl")]
pub ttl: u32,
pub fallback_pool: LbPoolId,
pub default_pools: Vec<LbPoolId>,
pub region_pools: LbPoolMapping,
pub pop_pools: LbPoolMapping,
pub proxied: bool,
pub steering_policy: SteeringPolicy,
pub session_affinity: SessionAffinity,
pub session_affinity_attributes: SessionAffinityAttributes,
#[serde(default = "LoadBalancer::default_session_affinity_ttl")]
pub session_affinity_ttl: u32,
}
impl LoadBalancer {
fn default_ttl() -> u32 {
30
}
fn default_session_affinity_ttl() -> u32 {
5000
}
}
type LbPoolId = String;
type LbPoolMapping = HashMap<String, Vec<LbPoolId>>;
#[derive(Eq, PartialEq, Deserialize, Serialize, Clone, Debug)]
#[serde(rename_all = "lowercase")]
pub enum SteeringPolicy {
#[serde(rename = "")]
Nil,
Off,
Geo,
Random,
DynamicLatency,
}
#[derive(Eq, PartialEq, Deserialize, Serialize, Clone, Debug)]
#[serde(rename_all = "lowercase")]
pub enum SessionAffinity {
#[serde(rename = "")]
Nil,
None,
Cookie,
IpCookie,
}
#[derive(Eq, PartialEq, Deserialize, Serialize, Clone, Debug)]
pub struct SessionAffinityAttributes {
pub samesite: SameSite,
pub secure: Secure,
pub drain_duration: u32,
}
#[derive(Eq, PartialEq, Deserialize, Serialize, Clone, Debug)]
pub enum SameSite {
Auto,
Lax,
None,
Strict,
}
#[derive(Eq, PartialEq, Deserialize, Serialize, Clone, Debug)]
pub enum Secure {
Auto,
Always,
Never,
}
impl ApiResultTraits for LoadBalancer {}
#[derive(Eq, PartialEq, Deserialize, Serialize, Clone, Debug)]
pub struct Pool {
pub id: String,
pub created_on: DateTime<Utc>,
pub modified_on: DateTime<Utc>,
pub description: String,
pub name: String,
pub enabled: bool,
pub minimum_origins: u8,
pub monitor: String,
pub check_regions: Option<Vec<String>>,
pub origins: HashSet<Origin>,
pub notification_email: String,
}
#[derive(Deserialize, Serialize, Clone, Debug)]
pub struct Origin {
pub name: String,
pub address: IpAddr,
pub enabled: bool,
pub weight: f64,
}
impl PartialEq for Origin {
fn eq(&self, other: &Self) -> bool {
let diff_is_small = (self.weight - other.weight).abs() < 0.01;
self.name == other.name
&& self.address == other.address
&& self.enabled == other.enabled
&& diff_is_small
}
}
impl Eq for Origin {}
impl Hash for Origin {
fn hash<H: Hasher>(&self, state: &mut H) {
self.name.hash(state);
self.address.hash(state);
self.enabled.hash(state);
self.weight.to_bits().hash(state);
}
}
impl ApiResultTraits for Origin {}
impl ApiResultTraits for Pool {}