How to use kubebuilder's client.List method?

5/2/2019

I'm working on a custom controller for a custom resource using kubebuilder (version 1.0.8). I have a scenario where I need to get a list of all the instances of my custom resource so I can sync up with an external database.

All the examples I've seen for kubernetes controllers use either client-go or just call the api server directly over http. However, kubebuilder has also given me this client.Client object to get and list resources. So I'm trying to use that.

After creating a client instance by using the passed in Manager instance (i.e. do mgr.GetClient()), I then tried to write some code to get the list of all the Environment resources I created.

func syncClusterWithDatabase(c client.Client, db *dynamodb.DynamoDB) {
    // Sync environments
    // Step 1 - read all the environments the cluster knows about
    clusterEnvironments := &cdsv1alpha1.EnvironmentList{}

    c.List(context.Background(), /* what do I put here? */, clusterEnvironments)
}

The example in the documentation for the List method shows:

c.List(context.Background, &result);

which doesn't even compile.

I saw a few method in the client package to limit the search to particular labels, or for a specific field with a specific value, but nothing to limit the result to a specific resource kind.

Is there a way to do this via the Client object? Should I do something else entirely?

-- Chris Tavares
go
kubebuilder
kubernetes

1 Answer

5/7/2019

So figured it out - the answer is to pass nil for the second parameter. The type of the output pointer determines which sort of resource it actually retrieves.

-- Chris Tavares
Source: StackOverflow