poddy/k8s/
scale.rs

1use async_trait::async_trait;
2use k8s_openapi::api::apps::v1::Deployment;
3use kube::{
4    api::{Patch, PatchParams},
5    Api,
6};
7use serde::de::DeserializeOwned;
8use serde_json::json;
9use std::fmt::Debug;
10
11pub trait Scalable {}
12
13#[async_trait]
14pub trait Scale {
15    type Resource;
16    async fn replicas(&self, name: &str, replicas: i32) -> Result<Self::Resource, kube::Error>;
17}
18
19#[async_trait]
20impl<S> Scale for Api<S>
21where
22    S: Scalable + Clone + DeserializeOwned + Debug,
23{
24    type Resource = S;
25
26    async fn replicas(&self, name: &str, replicas: i32) -> Result<Self::Resource, kube::Error> {
27        let pp = PatchParams::default();
28        self.patch(
29            name,
30            &pp,
31            &Patch::Strategic(json!({"spec":{"replicas": replicas}})),
32        )
33        .await
34    }
35}
36
37impl Scalable for Deployment {}