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 {}