Skip to content

Commit

Permalink
Update json-patch to 2.0.0 (#1507)
Browse files Browse the repository at this point in the history
Signed-off-by: song <[email protected]>
  • Loading branch information
bobsongplus authored Jun 6, 2024
1 parent 7ee3298 commit 5aa8f83
Show file tree
Hide file tree
Showing 7 changed files with 32 additions and 12 deletions.
3 changes: 2 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ hyper-openssl = "0.10.2"
hyper-rustls = { version = "0.27.0", default-features = false }
hyper-socks2 = { version = "0.9.0", default-features = false }
hyper-timeout = "0.5.1"
json-patch = "1.0.0"
json-patch = "2.0.0"
jsonptr = "0.4.7"

This comment has been minimized.

Copy link
@nicraMarcin

nicraMarcin Aug 21, 2024

The newest version is 0.6.0 and doesn't work with this

This comment has been minimized.

Copy link
@clux

clux Aug 21, 2024

Member

yep, they have breaking changes and needs manual action: #1537

This comment has been minimized.

Copy link
@nicraMarcin

nicraMarcin Aug 21, 2024

So this is json-path's issue and it should be updated in that crate.
Thanks

This comment has been minimized.

Copy link
@clux

clux Aug 21, 2024

Member

well, we do need to update the pin here, to support the new jsonptr (it's just that this forces more changes in here due to their breaking changes - and it's not done yet)

This comment has been minimized.

Copy link
@clux

clux Aug 21, 2024

Member

ah, wait. json-path also needs to bump the pin of jsonptr because their apis depend on each other, so it is indeed an upstream issue. EDIT: made a tracking issue: #1563

jsonpath-rust = "0.5.0"
k8s-openapi = { version = "0.22.0", default-features = false }
openssl = "0.10.36"
Expand Down
1 change: 1 addition & 0 deletions examples/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ garde = { version = "0.18.0", default-features = false, features = ["derive"] }
anyhow.workspace = true
futures = { workspace = true, features = ["async-await"] }
jsonpath-rust.workspace = true
jsonptr.workspace = true
kube = { path = "../kube", version = "^0.91.0", default-features = false, features = ["admission"] }
kube-derive = { path = "../kube-derive", version = "^0.91.0", default-features = false } # only needed to opt out of schema
k8s-openapi.workspace = true
Expand Down
9 changes: 6 additions & 3 deletions examples/admission_controller.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
use jsonptr::Pointer;
use kube::core::{
admission::{AdmissionRequest, AdmissionResponse, AdmissionReview},
DynamicObject, Resource, ResourceExt,
};
use std::{convert::Infallible, error::Error};

use kube::runtime::finalizer;
use std::{convert::Infallible, error::Error, str::FromStr};
use tracing::*;
use warp::{reply, Filter, Reply};

Expand Down Expand Up @@ -75,13 +78,13 @@ fn mutate(res: AdmissionResponse, obj: &DynamicObject) -> Result<AdmissionRespon
// Ensure labels exist before adding a key to it
if obj.meta().labels.is_none() {
patches.push(json_patch::PatchOperation::Add(json_patch::AddOperation {
path: "/metadata/labels".into(),
path: Pointer::new(["metadata", "labels"]),
value: serde_json::json!({}),
}));
}
// Add our label
patches.push(json_patch::PatchOperation::Add(json_patch::AddOperation {
path: "/metadata/labels/admission".into(),
path: Pointer::new(["metadata", "labels", "admission"]),
value: serde_json::Value::String("modified-by-admission-controller".into()),
}));
Ok(res.with_patch(json_patch::Patch(patches))?)
Expand Down
1 change: 1 addition & 0 deletions kube-core/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,4 @@ k8s-openapi = { workspace = true, features = ["latest"] }
assert-json-diff.workspace = true
kube = { path = "../kube", version = "<1.0.0, >=0.53.0" }
serde_yaml.workspace = true
jsonptr.workspace = true
3 changes: 2 additions & 1 deletion kube-core/src/admission.rs
Original file line number Diff line number Diff line change
Expand Up @@ -223,11 +223,12 @@ pub enum Operation {
/// .into_review();
///
/// use json_patch::{AddOperation, Patch, PatchOperation};
/// use jsonptr::Pointer;
///
/// // A response adding a label to the resource.
/// let _: AdmissionReview<_> = AdmissionResponse::from(&req)
/// .with_patch(Patch(vec![PatchOperation::Add(AddOperation {
/// path: "/metadata/labels/my-label".to_owned(),
/// path: Pointer::new(["metadata","labels","my-label"]),
/// value: serde_json::Value::String("my-value".to_owned()),
/// })]))
/// .unwrap()
Expand Down
1 change: 1 addition & 0 deletions kube-runtime/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ tokio = { workspace = true, features = ["time"] }
tokio-util = { workspace = true, features = ["time"] }
tracing.workspace = true
json-patch.workspace = true
jsonptr.workspace = true
serde_json.workspace = true
thiserror.workspace = true
backoff.workspace = true
Expand Down
26 changes: 19 additions & 7 deletions kube-runtime/src/finalizer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@
use crate::controller::Action;
use futures::{TryFuture, TryFutureExt};
use json_patch::{AddOperation, PatchOperation, RemoveOperation, TestOperation};
use jsonptr::Pointer;
use kube_client::{
api::{Patch, PatchParams},
Api, Resource, ResourceExt,
};

use serde::{de::DeserializeOwned, Serialize};
use std::{error::Error as StdError, fmt::Debug, sync::Arc};
use std::{error::Error as StdError, fmt::Debug, str::FromStr, sync::Arc};
use thiserror::Error;

#[derive(Debug, Error)]
Expand All @@ -25,6 +27,8 @@ where
RemoveFinalizer(#[source] kube_client::Error),
#[error("object has no name")]
UnnamedObject,
#[error("invalid finalizer")]
InvalidFinalizer,
}

struct FinalizerState {
Expand Down Expand Up @@ -138,10 +142,14 @@ where
// `Test` ensures that we fail instead of deleting someone else's finalizer
// (in which case a new `Cleanup` event will be sent)
PatchOperation::Test(TestOperation {
path: finalizer_path.clone(),
path: Pointer::from_str(finalizer_path.as_str())
.map_err(|_err| Error::InvalidFinalizer)?,
value: finalizer_name.into(),
}),
PatchOperation::Remove(RemoveOperation { path: finalizer_path }),
PatchOperation::Remove(RemoveOperation {
path: Pointer::from_str(finalizer_path.as_str())
.map_err(|_err| Error::InvalidFinalizer)?,
}),
])),
)
.await
Expand All @@ -156,11 +164,13 @@ where
let patch = json_patch::Patch(if obj.finalizers().is_empty() {
vec![
PatchOperation::Test(TestOperation {
path: "/metadata/finalizers".to_string(),
path: Pointer::from_str("/metadata/finalizers")
.map_err(|_err| Error::InvalidFinalizer)?,
value: serde_json::Value::Null,
}),
PatchOperation::Add(AddOperation {
path: "/metadata/finalizers".to_string(),
path: Pointer::from_str("/metadata/finalizers")
.map_err(|_err| Error::InvalidFinalizer)?,
value: vec![finalizer_name].into(),
}),
]
Expand All @@ -170,11 +180,13 @@ where
// https://github.com/kube-rs/kube/issues/964#issuecomment-1197311254),
// so we need to fail and retry if anyone else has added the finalizer in the meantime
PatchOperation::Test(TestOperation {
path: "/metadata/finalizers".to_string(),
path: Pointer::from_str("/metadata/finalizers")
.map_err(|_err| Error::InvalidFinalizer)?,
value: obj.finalizers().into(),
}),
PatchOperation::Add(AddOperation {
path: "/metadata/finalizers/-".to_string(),
path: Pointer::from_str("/metadata/finalizers/-")
.map_err(|_err| Error::InvalidFinalizer)?,
value: finalizer_name.into(),
}),
]
Expand Down

0 comments on commit 5aa8f83

Please sign in to comment.