# README
Waiting for Resource Changes
The test harness supports several methods for querying Kubernetes object types and waiting for conditions to be met. This example shows how to create various wait conditions to drive your tests.
Waiting for a single object
The wait package has built-in with utilities for waiting on Pods, Jobs, and Deployments:
func TestPodRunning(t *testing.T) {
var err error
pod := v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "my-pod"}}
err = wait.For(conditions.New(client.Resources()).PodRunning(pod), WithImmediate())
if err != nil {
t.Error(err)
}
}
Additionally, it is easy to wait for changes to any resource type with the ResourceMatch
method:
func TestResourceMatch(t *testing.T) {
...
deployment := appsv1.Deployment{ObjectMeta: metav1.ObjectMeta{Name: "deploy-name"}}
err = wait.For(conditions.New(client.Resources()).ResourceMatch(deployment, func(object k8s.Object) bool {
d := object.(*appsv1.Deployment)
return d.Status.AvailableReplicas == 2 && d.Status.ReadyReplicas == 2
}))
if err != nil {
t.Error(err)
}
...
}
Waiting for a lists of objects
It is common to need to check for the existence of a set of objects by name:
func TestResourcesFound(t *testing.T) {
...
pods := &v1.PodList{
Items: []v1.Pod{
{ObjectMeta: metav1.ObjectMeta{Name: "p9", Namespace: namespace}},
{ObjectMeta: metav1.ObjectMeta{Name: "p10", Namespace: namespace}},
{ObjectMeta: metav1.ObjectMeta{Name: "p11", Namespace: namespace}},
},
}
// wait for the set of pods to exist
err = wait.For(conditions.New(client.Resources()).ResourcesFound(pods))
if err != nil {
t.Error(err)
}
...
}
Or to check for their absence:
func TestResourcesDeleted(t *testing.T) {
...
pods := &v1.PodList{}
// wait for 1 pod with the label `"app": "d5"`
err = wait.For(conditions.New(client.Resources()).ResourceListN(
pods,
1,
resources.WithLabelSelector(labels.FormatLabels(map[string]string{"app": "d5"}))),
)
if err != nil {
t.Error(err)
}
err = client.Resources().Delete(context.Background(), deployment)
if err != nil {
t.Error(err)
}
// wait for the set of pods to finish deleting
err = wait.For(conditions.New(client.Resources()).ResourcesDeleted(pods))
if err != nil {
t.Error(err)
}
...
}