How to perform CRUD on 3rd-party Custom Resource for which go api is not available

684 views Asked by At

I am working on Opersator-SDK. In my operator controller, I want to perform CRUD operation on a Custom Resource (say ExampleCR) for which go api module is not available

Suppose ExampleCR does not have go api (I have access to crd definition in yaml). I am watching Deployment object and whenever Deployment object is created or updated. I want to perform following operation on ExampleCR in my controller code.

  1. kubectl create on ExampleCR
  2. kubectl update on ExampleCR
  3. kubectl get on ExampleCR
1

There are 1 answers

0
suraj.tripathi On BEST ANSWER

I was able to solve this using unstructured.Unstructured type.

Using the following sample, you can watch the CR (ExampleCR) in the controller (Ref).

// You can also watch unstructured objects
u := &unstructured.Unstructured{}
u.SetGroupVersionKind(schema.GroupVersionKind{
    Kind:    "ExampleCR",
    Group:   "",
    Version: "version", // set version here
})
//watch for primary resource
err = c.Watch(&source.Kind{Type: u}, &handler.EnqueueRequestForObject{})
//watch for secondary resource
err = c.Watch(&source.Kind{Type: u}, &handler.EnqueueRequestForOwner{
    IsController: true,
    OwnerType:    &ownerVersion.OwnerType{}})

Once you have done this, controller will receive the reconciliation request.

CRUD operation will remain same as we do it for other kinds (for example Pod).

creation of object can be done using following

func newExampleCR() (*unstructured.Unstructured)
    &unstructured.Unstructured{
        Object: map[string]interface{}{
            "apiVersion": "version", //set version here
            "kind":       "ExampleCR", // set CR name here
            "metadata": map[string]interface{}{
                "name": "demo-deployment",
            },
            "spec": map[string]interface{}{
                //spec goes here
            },
        },
    }
}

Complete example can be found here for deployment object

NOTE: You have to make sure that the CRD is registered with the scheme before the manager is started.