forked from kube-rs/kube
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
clean up api::discovery module - for kube-rs#523 (kube-rs#538)
* clean up api::discovery module - for kube-rs#523 - moves the modules from kube::client to kube::api - introduces easier way to get recommended_resources and recommended_kind from an `ApiGroup` - restructures file for readability (internal Version sorting quirks documented and tested) - renamed `ApiResourceExtras` to `ApiCapabilities` - renamed `ApiGroup::group` to `ApiGroup::get` - added support for `Discovery::single` which avoids having to deal with the `HashMap` and returns a straight `ApiGroup` (making the recommended doc examples more compelling) - documents the version sorting a bit better - renamed `ApiGroup::preferred_version_or_guess` to `ApiGroup::preferred_version_or_latest` and referred to the version policy - separated querying to helpers on `ApiGroup` - moved sorting to `ApiGroup` construction part * clippy * changelog * promote discovery to its own module * factor out version logic into own private module * add some docs + small renames `resources_by_version` -> `versioned_resources` to match `recommended_resources`. few more doc links * remove stray todo and add back kube::client::Status * add better entry point for the cheaper single case * fix tests * restructure completely again for cache/oneshot distinction actually many legit use cases here, so made it kind of nice. finally, this allows us to deprecate old ApiResource from_apiresource as well as old Client listers (which we use internally). possibly some more cleanups incoming. * clippy * split discovery into 3 files * discovery error type * fix tests * rename openapi mod to parse mod * revert premature deprecation * document changes * make DiscoveryError work on config only feat + fix rustfmt makefile * resolve last questions
- Loading branch information
Showing
22 changed files
with
1,005 additions
and
552 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,109 @@ | ||
//! Type information structs for API discovery | ||
use crate::{gvk::GroupVersionKind, resource::Resource}; | ||
|
||
/// Information about a Kubernetes API resource | ||
/// | ||
/// Enough information to use it like a `Resource` by passing it to the dynamic `Api` | ||
/// constructors like `Api::all_with` and `Api::namespaced_with`. | ||
#[derive(Debug, Clone, Hash, Eq, PartialEq)] | ||
pub struct ApiResource { | ||
/// Resource group, empty for core group. | ||
pub group: String, | ||
/// group version | ||
pub version: String, | ||
/// apiVersion of the resource (v1 for core group, | ||
/// groupName/groupVersions for other). | ||
pub api_version: String, | ||
/// Singular PascalCase name of the resource | ||
pub kind: String, | ||
/// Plural name of the resource | ||
pub plural: String, | ||
} | ||
|
||
impl ApiResource { | ||
/// Creates an ApiResource by type-erasing a Resource | ||
pub fn erase<K: Resource>(dt: &K::DynamicType) -> Self { | ||
ApiResource { | ||
group: K::group(dt).to_string(), | ||
version: K::version(dt).to_string(), | ||
api_version: K::api_version(dt).to_string(), | ||
kind: K::kind(dt).to_string(), | ||
plural: K::plural(dt).to_string(), | ||
} | ||
} | ||
|
||
/// Creates an ApiResource from group, version, kind and plural name. | ||
pub fn from_gvk_with_plural(gvk: &GroupVersionKind, plural: &str) -> Self { | ||
ApiResource { | ||
api_version: gvk.api_version(), | ||
group: gvk.group.clone(), | ||
version: gvk.version.clone(), | ||
kind: gvk.kind.clone(), | ||
plural: plural.to_string(), | ||
} | ||
} | ||
|
||
/// Creates an ApiResource from group, version and kind. | ||
/// | ||
/// # Warning | ||
/// This function will **guess** the resource plural name. | ||
/// Usually, this is ok, but for CRDs with complex pluralisations it can fail. | ||
/// If you are getting your values from `kube_derive` use the generated method for giving you an [`ApiResource`]. | ||
/// Otherwise consider using [`ApiResource::from_gvk_with_plural`](crate::discovery::ApiResource::from_gvk_with_plural) | ||
/// to explicitly set the plural, or run api discovery on it via `kube::discovery`. | ||
pub fn from_gvk(gvk: &GroupVersionKind) -> Self { | ||
ApiResource::from_gvk_with_plural(gvk, &crate::resource::to_plural(&gvk.kind.to_ascii_lowercase())) | ||
} | ||
} | ||
|
||
|
||
/// Resource scope | ||
#[derive(Debug, Clone, Hash, Eq, PartialEq)] | ||
pub enum Scope { | ||
/// Objects are global | ||
Cluster, | ||
/// Each object lives in namespace. | ||
Namespaced, | ||
} | ||
|
||
/// Rbac verbs for ApiCapabilities | ||
pub mod verbs { | ||
/// Create a resource | ||
pub const CREATE: &str = "create"; | ||
/// Get single resource | ||
pub const GET: &str = "get"; | ||
/// List objects | ||
pub const LIST: &str = "list"; | ||
/// Watch for objects changes | ||
pub const WATCH: &str = "watch"; | ||
/// Delete single object | ||
pub const DELETE: &str = "delete"; | ||
/// Delete multiple objects at once | ||
pub const DELETE_COLLECTION: &str = "deletecollection"; | ||
/// Update an object | ||
pub const UPDATE: &str = "update"; | ||
/// Patch an object | ||
pub const PATCH: &str = "patch"; | ||
} | ||
|
||
/// Contains the capabilities of an API resource | ||
#[derive(Debug, Clone)] | ||
pub struct ApiCapabilities { | ||
/// Scope of the resource | ||
pub scope: Scope, | ||
/// Available subresources. | ||
/// | ||
/// Please note that returned ApiResources are not standalone resources. | ||
/// Their name will be of form `subresource_name`, not `resource_name/subresource_name`. | ||
/// To work with subresources, use `Request` methods for now. | ||
pub subresources: Vec<(ApiResource, ApiCapabilities)>, | ||
/// Supported operations on this resource | ||
pub operations: Vec<String>, | ||
} | ||
|
||
impl ApiCapabilities { | ||
/// Checks that given verb is supported on this resource. | ||
pub fn supports_operation(&self, operation: &str) -> bool { | ||
self.operations.iter().any(|op| op == operation) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.