use bytes::Bytes;
use futures::Stream;
use serde::de::DeserializeOwned;
use crate::{
api::{Api, PatchParams, PostParams, Resource},
Error, Result,
};
pub use k8s_openapi::api::autoscaling::v1::{Scale, ScaleSpec, ScaleStatus};
impl<K> Api<K>
where
K: Clone + DeserializeOwned,
{
pub async fn get_scale(&self, name: &str) -> Result<Scale> {
let req = self.resource.get_scale(name)?;
self.client.request::<Scale>(req).await
}
pub async fn patch_scale(&self, name: &str, pp: &PatchParams, patch: Vec<u8>) -> Result<Scale> {
let req = self.resource.patch_scale(name, &pp, patch)?;
self.client.request::<Scale>(req).await
}
pub async fn replace_scale(&self, name: &str, pp: &PostParams, data: Vec<u8>) -> Result<Scale> {
let req = self.resource.replace_scale(name, &pp, data)?;
self.client.request::<Scale>(req).await
}
}
impl<K> Api<K>
where
K: Clone + DeserializeOwned,
{
pub async fn get_status(&self, name: &str) -> Result<K> {
let req = self.resource.get_status(name)?;
self.client.request::<K>(req).await
}
pub async fn patch_status(&self, name: &str, pp: &PatchParams, patch: Vec<u8>) -> Result<K> {
let req = self.resource.patch_status(name, &pp, patch)?;
self.client.request::<K>(req).await
}
pub async fn replace_status(&self, name: &str, pp: &PostParams, data: Vec<u8>) -> Result<K> {
let req = self.resource.replace_status(name, &pp, data)?;
self.client.request::<K>(req).await
}
}
#[derive(Default, Clone, Debug)]
pub struct LogParams {
pub container: Option<String>,
pub follow: bool,
pub limit_bytes: Option<i64>,
pub pretty: bool,
pub previous: bool,
pub since_seconds: Option<i64>,
pub tail_lines: Option<i64>,
pub timestamps: bool,
}
impl Resource {
pub fn logs(&self, name: &str, lp: &LogParams) -> Result<http::Request<Vec<u8>>> {
let base_url = self.make_url() + "/" + name + "/" + "log?";
let mut qp = url::form_urlencoded::Serializer::new(base_url);
if let Some(container) = &lp.container {
qp.append_pair("container", &container);
}
if lp.follow {
qp.append_pair("follow", "true");
}
if let Some(lb) = &lp.limit_bytes {
qp.append_pair("limitBytes", &lb.to_string());
}
if lp.pretty {
qp.append_pair("pretty", "true");
}
if lp.previous {
qp.append_pair("previous", "true");
}
if let Some(ss) = &lp.since_seconds {
qp.append_pair("sinceSeconds", &ss.to_string());
}
if let Some(tl) = &lp.tail_lines {
qp.append_pair("tailLines", &tl.to_string());
}
if lp.timestamps {
qp.append_pair("timestamps", "true");
}
let urlstr = qp.finish();
let req = http::Request::get(urlstr);
req.body(vec![]).map_err(Error::HttpError)
}
}
#[test]
fn log_path() {
use crate::api::Resource;
use k8s_openapi::api::core::v1 as corev1;
let r = Resource::namespaced::<corev1::Pod>("ns");
let mut lp = LogParams::default();
lp.container = Some("blah".into());
let req = r.logs("foo", &lp).unwrap();
assert_eq!(req.uri(), "/api/v1/namespaces/ns/pods/foo/log?&container=blah");
}
pub trait LoggingObject {}
impl LoggingObject for k8s_openapi::api::core::v1::Pod {}
impl<K> Api<K>
where
K: Clone + DeserializeOwned + LoggingObject,
{
pub async fn logs(&self, name: &str, lp: &LogParams) -> Result<String> {
let req = self.resource.logs(name, lp)?;
Ok(self.client.request_text(req).await?)
}
pub async fn log_stream(&self, name: &str, lp: &LogParams) -> Result<impl Stream<Item = Result<Bytes>>> {
let req = self.resource.logs(name, lp)?;
Ok(self.client.request_text_stream(req).await?)
}
}