Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Request: support arbitrary subresources #487

Merged
merged 2 commits into from
Apr 10, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 22 additions & 66 deletions kube/src/api/request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -168,26 +168,27 @@ impl Request {
}
}

/// Scale subresource
/// Subresources
impl Request {
/// Get an instance of the scale subresource
pub fn get_scale(&self, name: &str) -> Result<http::Request<Vec<u8>>> {
let target = format!("{}/{}/scale", self.url_path, name);
/// Get an instance of the subresource
pub fn get_subresource(&self, subresource_name: &str, name: &str) -> Result<http::Request<Vec<u8>>> {
let target = format!("{}/{}/{}", self.url_path, name, subresource_name);
let mut qp = url::form_urlencoded::Serializer::new(target);
let urlstr = qp.finish();
let req = http::Request::get(urlstr);
req.body(vec![]).map_err(Error::HttpError)
}

/// Patch an instance of the scale subresource
pub fn patch_scale<P: serde::Serialize>(
/// Patch an instance of the subresource
pub fn patch_subresource<P: serde::Serialize>(
&self,
subresource_name: &str,
name: &str,
pp: &PatchParams,
patch: &Patch<P>,
) -> Result<http::Request<Vec<u8>>> {
pp.validate(patch)?;
let target = format!("{}/{}/scale?", self.url_path, name);
let target = format!("{}/{}/{}?", self.url_path, name, subresource_name);
let mut qp = url::form_urlencoded::Serializer::new(target);
pp.populate_qp(&mut qp);
let urlstr = qp.finish();
Expand All @@ -199,14 +200,15 @@ impl Request {
.map_err(Error::HttpError)
}

/// Replace an instance of the scale subresource
pub fn replace_scale(
/// Replace an instance of the subresource
pub fn replace_subresource(
&self,
subresource_name: &str,
name: &str,
pp: &PostParams,
data: Vec<u8>,
) -> Result<http::Request<Vec<u8>>> {
let target = format!("{}/{}/scale?", self.url_path, name);
let target = format!("{}/{}/{}?", self.url_path, name, subresource_name);
let mut qp = url::form_urlencoded::Serializer::new(target);
if pp.dry_run {
qp.append_pair("dryRun", "All");
Expand All @@ -217,56 +219,6 @@ impl Request {
}
}

/// Status subresource
impl Request {
/// Get an instance of the status subresource
pub fn get_status(&self, name: &str) -> Result<http::Request<Vec<u8>>> {
let target = format!("{}/{}/status", self.url_path, name);
let mut qp = url::form_urlencoded::Serializer::new(target);
let urlstr = qp.finish();
let req = http::Request::get(urlstr);
req.body(vec![]).map_err(Error::HttpError)
}

/// Patch an instance of the status subresource
pub fn patch_status<P: serde::Serialize>(
&self,
name: &str,
pp: &PatchParams,
patch: &Patch<P>,
) -> Result<http::Request<Vec<u8>>> {
pp.validate(patch)?;
let target = format!("{}/{}/status?", self.url_path, name);
let mut qp = url::form_urlencoded::Serializer::new(target);
pp.populate_qp(&mut qp);
let urlstr = qp.finish();

http::Request::patch(urlstr)
.header("Accept", "application/json")
.header("Content-Type", patch.content_type())
.body(patch.serialize()?)
.map_err(Error::HttpError)
}

/// Replace an instance of the status subresource
pub fn replace_status(
&self,
name: &str,
pp: &PostParams,
data: Vec<u8>,
) -> Result<http::Request<Vec<u8>>> {
let target = format!("{}/{}/status?", self.url_path, name);
let mut qp = url::form_urlencoded::Serializer::new(target);
if pp.dry_run {
qp.append_pair("dryRun", "All");
}
let urlstr = qp.finish();
let req = http::Request::put(urlstr);
req.body(data).map_err(Error::HttpError)
}
}


/// Extensive tests for Request of k8s_openapi::Resource structs
///
/// Cheap sanity check to ensure type maps work as expected
Expand Down Expand Up @@ -456,7 +408,7 @@ mod test {
let url = corev1::Node::url_path(&(), None);
let pp = PatchParams::default();
let req = Request::new(url)
.patch_status("mynode", &pp, &Patch::Merge(()))
.patch_subresource("status", "mynode", &pp, &Patch::Merge(()))
.unwrap();
assert_eq!(req.uri(), "/api/v1/nodes/mynode/status?");
assert_eq!(
Expand All @@ -469,7 +421,9 @@ mod test {
fn replace_status_path() {
let url = corev1::Node::url_path(&(), None);
let pp = PostParams::default();
let req = Request::new(url).replace_status("mynode", &pp, vec![]).unwrap();
let req = Request::new(url)
.replace_subresource("status", "mynode", &pp, vec![])
.unwrap();
assert_eq!(req.uri(), "/api/v1/nodes/mynode/status?");
assert_eq!(req.method(), "PUT");
}
Expand Down Expand Up @@ -501,7 +455,7 @@ mod test {
let url = apiextsv1beta1::CustomResourceDefinition::url_path(&(), None);
let pp = PostParams::default();
let req = Request::new(url)
.replace_status("mycrd.domain.io", &pp, vec![])
.replace_subresource("status", "mycrd.domain.io", &pp, vec![])
.unwrap();
assert_eq!(
req.uri(),
Expand All @@ -511,7 +465,7 @@ mod test {
#[test]
fn get_scale_path() {
let url = corev1::Node::url_path(&(), None);
let req = Request::new(url).get_scale("mynode").unwrap();
let req = Request::new(url).get_subresource("scale", "mynode").unwrap();
assert_eq!(req.uri(), "/api/v1/nodes/mynode/scale");
assert_eq!(req.method(), "GET");
}
Expand All @@ -520,7 +474,7 @@ mod test {
let url = corev1::Node::url_path(&(), None);
let pp = PatchParams::default();
let req = Request::new(url)
.patch_scale("mynode", &pp, &Patch::Merge(()))
.patch_subresource("scale", "mynode", &pp, &Patch::Merge(()))
.unwrap();
assert_eq!(req.uri(), "/api/v1/nodes/mynode/scale?");
assert_eq!(req.method(), "PATCH");
Expand All @@ -529,7 +483,9 @@ mod test {
fn replace_scale_path() {
let url = corev1::Node::url_path(&(), None);
let pp = PostParams::default();
let req = Request::new(url).replace_scale("mynode", &pp, vec![]).unwrap();
let req = Request::new(url)
.replace_subresource("scale", "mynode", &pp, vec![])
.unwrap();
assert_eq!(req.uri(), "/api/v1/nodes/mynode/scale?");
assert_eq!(req.method(), "PUT");
}
Expand Down
12 changes: 6 additions & 6 deletions kube/src/api/subresource.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ where
/// Fetch the scale subresource
#[instrument(skip(self), level = "trace")]
pub async fn get_scale(&self, name: &str) -> Result<Scale> {
let req = self.request.get_scale(name)?;
let req = self.request.get_subresource("scale", name)?;
self.client.request::<Scale>(req).await
}

Expand All @@ -34,14 +34,14 @@ where
pp: &PatchParams,
patch: &Patch<P>,
) -> Result<Scale> {
let req = self.request.patch_scale(name, &pp, patch)?;
let req = self.request.patch_subresource("scale", name, &pp, patch)?;
self.client.request::<Scale>(req).await
}

/// Replace the scale subresource
#[instrument(skip(self), level = "trace")]
pub async fn replace_scale(&self, name: &str, pp: &PostParams, data: Vec<u8>) -> Result<Scale> {
let req = self.request.replace_scale(name, &pp, data)?;
let req = self.request.replace_subresource("scale", name, &pp, data)?;
self.client.request::<Scale>(req).await
}
}
Expand All @@ -60,7 +60,7 @@ where
/// This actually returns the whole K, with metadata, and spec.
#[instrument(skip(self), level = "trace")]
pub async fn get_status(&self, name: &str) -> Result<K> {
let req = self.request.get_status(name)?;
let req = self.request.get_subresource("status", name)?;
self.client.request::<K>(req).await
}

Expand Down Expand Up @@ -94,7 +94,7 @@ where
pp: &PatchParams,
patch: &Patch<P>,
) -> Result<K> {
let req = self.request.patch_status(name, &pp, patch)?;
let req = self.request.patch_subresource("status", name, &pp, patch)?;
self.client.request::<K>(req).await
}

Expand All @@ -119,7 +119,7 @@ where
/// ```
#[instrument(skip(self), level = "trace")]
pub async fn replace_status(&self, name: &str, pp: &PostParams, data: Vec<u8>) -> Result<K> {
let req = self.request.replace_status(name, &pp, data)?;
let req = self.request.replace_subresource("status", name, &pp, data)?;
self.client.request::<K>(req).await
}
}
Expand Down