Skip to content

resolve an Api's ApiResource directly from a DynamicObject/TypeMeta via Discovery#2031

Open
jessemin wants to merge 1 commit into
kube-rs:mainfrom
jessemin:fix-1430-resolve-dynamicobject
Open

resolve an Api's ApiResource directly from a DynamicObject/TypeMeta via Discovery#2031
jessemin wants to merge 1 commit into
kube-rs:mainfrom
jessemin:fix-1430-resolve-dynamicobject

Conversation

@jessemin

@jessemin jessemin commented Jul 1, 2026

Copy link
Copy Markdown

Adds two convenience methods on Discovery to remove the boilerplate of going from a DynamicObject (or a bare TypeMeta) to its ApiResource/ApiCapabilities, so callers can build an Api without hand-assembling a GroupVersionKind.

pub fn resolve_typemeta(&self, tm: &TypeMeta) -> Option<(ApiResource, ApiCapabilities)>
pub fn resolve_object(&self, obj: &DynamicObject) -> Option<(ApiResource, ApiCapabilities)>

Both are thin wrappers over the existing GroupVersionKind::try_from(&TypeMeta) (kube-core/src/gvk.rs) and Discovery::resolve_gvk, so there's no new parsing/discovery logic — resolve_object just delegates to resolve_typemeta(obj.types.as_ref()?).

This follows the direction converged on in #1430 (resolve_typemeta as the general primitive that also enables custom dynamic types, resolve_object as the ergonomic wrapper for the motivating case), and keeps the surface on Discovery rather than adding an Api constructor.

Before:

let tm = object.types.as_ref().unwrap();
let gvk = /* split api_version, build GroupVersionKind ... */;
let (ar, _caps) = discovery.resolve_gvk(&gvk).unwrap();

After:
let (ar, _caps) = discovery.resolve_object(&object).unwrap();

Also adds a doc example on resolve_object (the TryFrom<&TypeMeta> impls are hard to discover in docs, per @nightkr's note).

Testing

  • 4 unit tests covering resolve_typemeta/resolve_object (hit + miss + missing-TypeMeta), building a Discovery in-crate via ApiGroup::from_v2 + a mock client.
  • cargo fmt, cargo clippy, doctest all clean.

Closes #1430

…ia Discovery

Add Discovery::resolve_typemeta(&TypeMeta) and Discovery::resolve_object(&DynamicObject),
thin wrappers over the existing GroupVersionKind::try_from(&TypeMeta) + resolve_gvk, so
callers can go from a dynamic object to its ApiResource without hand-assembling a GVK.

Closes kube-rs#1430

Signed-off-by: Jesik Min <serendipity9210@gmail.com>
@codecov

codecov Bot commented Jul 1, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 77.4%. Comparing base (8e6c86e) to head (845d5b2).

Additional details and impacted files
@@           Coverage Diff           @@
##            main   #2031     +/-   ##
=======================================
+ Coverage   77.3%   77.4%   +0.2%     
=======================================
  Files         89      89             
  Lines       9017    9054     +37     
=======================================
+ Hits        6965    7006     +41     
+ Misses      2052    2048      -4     
Files with missing lines Coverage Δ
kube-client/src/discovery/mod.rs 73.7% <100.0%> (+25.5%) ⬆️

... and 6 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Make it easier to get an Api for a DynamicObject

1 participant