Skip to content

Create APIResource from ApiResource for extension an APIService #1194

@clux

Description

@clux

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 kube-rs/website#34 (comment)

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    blockedawaiting upstream workcoregeneric apimachinery style work

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions