...
1 package couchctl
2
3 import (
4 "context"
5 "fmt"
6 "time"
7
8 dsapi "edge-infra.dev/pkg/edge/datasync/apis/v1alpha1"
9 "edge-infra.dev/pkg/k8s/meta/status"
10 "edge-infra.dev/pkg/k8s/runtime/conditions"
11
12 "github.com/go-logr/logr"
13 "k8s.io/apimachinery/pkg/fields"
14 kwatch "k8s.io/apimachinery/pkg/watch"
15 "sigs.k8s.io/controller-runtime/pkg/client"
16 )
17
18
19
20 func WatchCouchDBUser(ctx context.Context, cl client.WithWatch, user *dsapi.CouchDBUser, timeout time.Duration) error {
21 log := logr.FromContextOrDiscard(ctx)
22 list := &dsapi.CouchDBUserList{}
23 watch, err := cl.Watch(ctx, list, &client.ListOptions{
24 FieldSelector: fields.OneTermEqualSelector("metadata.name", user.Name),
25 Namespace: user.Namespace,
26 })
27 if err != nil {
28 log.Error(err, "fail to setup watch for CouchDBUser status")
29 return err
30 }
31 loop:
32 for {
33 select {
34 case event := <-watch.ResultChan():
35 u := event.Object.(*dsapi.CouchDBUser)
36 switch event.Type {
37 case kwatch.Added, kwatch.Modified:
38 ready := conditions.IsReady(u)
39 if !ready {
40 log.Info("CouchDBUser is not ready, will watch until timeout",
41 "reason", conditions.GetReason(u, status.ReadyCondition))
42 continue
43 }
44 break loop
45 case kwatch.Error:
46 err := fmt.Errorf("error retrieving CouchDBUser")
47 log.Error(err, "event error")
48 return err
49 }
50 case <-time.After(timeout):
51 err := fmt.Errorf("error timing out while retrieving CouchDBUser")
52 log.Error(err, "timeout error")
53 return err
54 }
55 }
56 return nil
57 }
58
View as plain text