kube-rs / kube

Rust Kubernetes client and controller runtime
https://kube.rs
Apache License 2.0
3.06k stars 320 forks source link

Create `APIResource` from `ApiResource` for extension an `APIService` #1194

Open clux opened 1 year ago

clux commented 1 year ago

What problem are you trying to solve?

Reading this blog post: https://metalbear.co/blog/writing-a-kubernetes-operator/ on how to set up an extension apiservice with kube, most of how this is done looks reasonably easy.

However, there's awkward step where it's necessary to convert our Resource to an APIResource. That bit is basically what you see in their source here: https://github.com/metalbear-co/farm-operator/blob/f7ae23f61daff4bdc9b9063796bc49057c20e914/example/step-3/src/main.rs#L14-L36

i.e. manually converting between the two:

APIResource {
    group: Some(llama::Llama::group(&()).into()),
    kind: llama::Llama::kind(&()).into(),
    name: llama::Llama::plural(&()).into(),
    namespaced: true,
    verbs: vec!["list".to_string(), "get".to_string()],
    ..Default::default()
},

This came up in https://github.com/kube-rs/website/pull/34#issuecomment-1475905161

Describe the solution you'd like

The example above is converting using the Resource trait, but that is actually insufficient (hence the manually supplied verbs).

The only place that has all that information for us is the ApiResource.

This feels like a simple Into<APIResource> for ApiResource impl.

If anyone wants to do this, it should be an easy one.

Note that CRD users via kube-derive will have access to their own ApiResource without going through discovery (which crucially they can't do as they are the apiserver for this resource) by using CustomResourceExt::api_resource. So from there, a converter will fill in the rest.

Target crate for feature

kube-core

clux commented 1 year ago

Turns out we can't do this cleanly yet because we'd actually need to do that into impl from the pair (ApiResource, ApiCapabilities).

There is an ongoing (but bitrotted) PR that aims to consolidate these structs, but need to fix that up first.