|
1 | 1 | use crate::{Client, Error, Result};
|
2 | 2 | use k8s_openapi::{
|
3 |
| - api::{ |
4 |
| - core::v1::{LocalObjectReference, Namespace as k8sNs, ObjectReference}, |
5 |
| - }, |
| 3 | + api::core::v1::{LocalObjectReference, Namespace as k8sNs, ObjectReference}, |
6 | 4 | apimachinery::pkg::apis::meta::v1::OwnerReference,
|
7 | 5 | };
|
8 | 6 | use kube_core::{
|
9 | 7 | object::ObjectList,
|
10 | 8 | params::{GetParams, ListParams, Patch, PatchParams},
|
11 | 9 | request::Request,
|
12 |
| - ApiResource, ClusterResourceScope, DynamicResourceScope, NamespaceResourceScope, ObjectMeta, Resource, |
13 |
| - ResourceExt, |
| 10 | + ApiResource, ClusterResourceScope, DynamicResourceScope, NamespaceResourceScope, Resource, ResourceExt, |
| 11 | + TypeMeta, |
14 | 12 | };
|
15 | 13 | use serde::{de::DeserializeOwned, Serialize};
|
16 | 14 | use std::fmt::Debug;
|
@@ -233,6 +231,18 @@ pub enum NamespaceError {
|
233 | 231 | MissingName,
|
234 | 232 | }
|
235 | 233 |
|
| 234 | +#[derive(Serialize, Clone, Debug)] |
| 235 | +/// ApplyObject allows to wrap an object into Patch::Apply compatible structure, |
| 236 | +/// with populated TypeMeta. |
| 237 | +pub struct ApplyObject<R: Serialize> { |
| 238 | + /// Contains the API version and type of the request. |
| 239 | + #[serde(flatten)] |
| 240 | + pub types: TypeMeta, |
| 241 | + /// Contains the object data. |
| 242 | + #[serde(flatten)] |
| 243 | + pub data: R, |
| 244 | +} |
| 245 | + |
236 | 246 | /// Generic client extensions for the `unstable-client` feature
|
237 | 247 | ///
|
238 | 248 | /// These methods allow users to query across a wide-array of resources without needing
|
@@ -414,10 +424,17 @@ impl Client {
|
414 | 424 | let url = K::url_path(&Default::default(), meta.namespace.as_deref());
|
415 | 425 | let req = Request::new(url);
|
416 | 426 |
|
417 |
| - let mut resource = resource.clone(); |
418 |
| - resource.meta_mut().managed_fields = None; |
419 |
| - let patch = &Patch::Apply(resource); |
420 |
| - let req = req.patch(name, pp, patch).map_err(Error::BuildRequest)?; |
| 427 | + let apply = ApplyObject::<K> { |
| 428 | + types: TypeMeta::resource::<K>(), |
| 429 | + data: { |
| 430 | + let mut resource = resource.clone(); |
| 431 | + resource.meta_mut().managed_fields = None; |
| 432 | + resource |
| 433 | + }, |
| 434 | + }; |
| 435 | + let req = req |
| 436 | + .patch(name, pp, &Patch::Apply(apply)) |
| 437 | + .map_err(Error::BuildRequest)?; |
421 | 438 | self.request::<K>(req).await
|
422 | 439 | }
|
423 | 440 |
|
@@ -448,11 +465,16 @@ impl Client {
|
448 | 465 | let url = K::url_path(&Default::default(), meta.namespace.as_deref());
|
449 | 466 | let req = Request::new(url);
|
450 | 467 |
|
451 |
| - let mut resource = resource.clone(); |
452 |
| - resource.meta_mut().managed_fields = None; |
453 |
| - let patch = &Patch::Apply(resource); |
| 468 | + let apply = ApplyObject::<K> { |
| 469 | + types: TypeMeta::resource::<K>(), |
| 470 | + data: { |
| 471 | + let mut resource = resource.clone(); |
| 472 | + resource.meta_mut().managed_fields = None; |
| 473 | + resource |
| 474 | + }, |
| 475 | + }; |
454 | 476 | let req = req
|
455 |
| - .patch_subresource("status", name, pp, patch) |
| 477 | + .patch_subresource("status", name, pp, &Patch::Apply(apply)) |
456 | 478 | .map_err(Error::BuildRequest)?;
|
457 | 479 | self.request::<K>(req).await
|
458 | 480 | }
|
|
0 commit comments