0

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
  • 29,165
  • 4
  • 46
  • 63

2 Answers2

0

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
  • 29,165
  • 4
  • 46
  • 63
0

According to the latest documentation, the List method is defined as follows,

List(ctx context.Context, list ObjectList, opts ...ListOption) error

If the List method you are calling has the same definition as above, your code should compile. As it has variadic options to set the namespace and field match, the mandatory arguments are Context and objectList.

Ref: KubeBuilder Book