...

Source file src/edge-infra.dev/pkg/edge/datasync/controllers/couchctl/watch.go

Documentation: edge-infra.dev/pkg/edge/datasync/controllers/couchctl

     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  // WatchCouchDBUser watch couchdb user resource.
    19  // TODO make generic to watch any couchdb resource.
    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