From f44ce00fdc42d77116b537ebde5bdc82158335fa Mon Sep 17 00:00:00 2001 From: Guilherme Oenning Date: Tue, 22 Aug 2023 07:09:29 +0100 Subject: [PATCH] `core`: omit invalid resource version parameters when doing paged requests (#1281) * fix paging parameters when using any semantic Signed-off-by: goenning * fmt Signed-off-by: goenning --------- Signed-off-by: goenning Co-authored-by: Eirik A --- kube-core/src/params.rs | 28 ++++++++++++++++------------ kube-core/src/request.rs | 29 ++++++++++++++++++++++------- 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/kube-core/src/params.rs b/kube-core/src/params.rs index 41eb04b26..38e59e3d3 100644 --- a/kube-core/src/params.rs +++ b/kube-core/src/params.rs @@ -103,18 +103,22 @@ impl ListParams { } if let Some(continue_token) = &self.continue_token { qp.append_pair("continue", continue_token); - } - - if let Some(rv) = &self.resource_version { - qp.append_pair("resourceVersion", rv.as_str()); - } - match &self.version_match { - None => {} - Some(VersionMatch::NotOlderThan) => { - qp.append_pair("resourceVersionMatch", "NotOlderThan"); - } - Some(VersionMatch::Exact) => { - qp.append_pair("resourceVersionMatch", "Exact"); + } else { + // When there's a continue token, we don't want to set resourceVersion + if let Some(rv) = &self.resource_version { + if rv != "0" || (rv == "0" && self.limit.is_none()) { + qp.append_pair("resourceVersion", rv.as_str()); + + match &self.version_match { + None => {} + Some(VersionMatch::NotOlderThan) => { + qp.append_pair("resourceVersionMatch", "NotOlderThan"); + } + Some(VersionMatch::Exact) => { + qp.append_pair("resourceVersionMatch", "Exact"); + } + } + } } } } diff --git a/kube-core/src/request.rs b/kube-core/src/request.rs index 93dd5d8af..bd358bef0 100644 --- a/kube-core/src/request.rs +++ b/kube-core/src/request.rs @@ -746,16 +746,31 @@ mod test { } #[test] - fn list_not_older() { + fn list_paged_any_semantic() { + let url = corev1::Pod::url_path(&(), Some("ns")); + let gp = ListParams::default().limit(50).match_any(); + let req = Request::new(url).list(&gp).unwrap(); + assert_eq!(req.uri().query().unwrap(), "&limit=50"); + } + + #[test] + fn list_paged_with_continue_any_semantic() { + let url = corev1::Pod::url_path(&(), Some("ns")); + let gp = ListParams::default().limit(50).continue_token("1234").match_any(); + let req = Request::new(url).list(&gp).unwrap(); + assert_eq!(req.uri().query().unwrap(), "&limit=50&continue=1234"); + } + + #[test] + fn list_paged_with_continue_starting_at() { let url = corev1::Pod::url_path(&(), Some("ns")); let gp = ListParams::default() - .at("20") - .matching(VersionMatch::NotOlderThan); + .limit(50) + .continue_token("1234") + .at("9999") + .matching(VersionMatch::Exact); let req = Request::new(url).list(&gp).unwrap(); - assert_eq!( - req.uri().query().unwrap(), - "&resourceVersion=20&resourceVersionMatch=NotOlderThan" - ); + assert_eq!(req.uri().query().unwrap(), "&limit=50&continue=1234"); } #[test]