github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/controllers/client_deferred.go (about)

     1  package controllers
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"fmt"
     7  	"sync/atomic"
     8  
     9  	"k8s.io/apimachinery/pkg/api/meta"
    10  	"k8s.io/apimachinery/pkg/runtime"
    11  	"k8s.io/apimachinery/pkg/runtime/schema"
    12  	ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
    13  )
    14  
    15  var ErrClientNotInitialized = errors.New("controller client not initialized")
    16  
    17  type DeferredClient struct {
    18  	impl atomic.Value
    19  }
    20  
    21  var _ ctrlclient.Client = &DeferredClient{}
    22  
    23  func ProvideDeferredClient() *DeferredClient {
    24  	return &DeferredClient{}
    25  }
    26  
    27  func (d *DeferredClient) initialize(client ctrlclient.Client) {
    28  	d.impl.Store(client)
    29  }
    30  
    31  func (d *DeferredClient) client() ctrlclient.Client {
    32  	v := d.impl.Load()
    33  	if v == nil {
    34  		return nil
    35  	}
    36  	cli, ok := v.(ctrlclient.Client)
    37  	if !ok {
    38  		panic(fmt.Errorf("deferred client initialized with bad type: %T", v))
    39  	}
    40  	return cli
    41  }
    42  
    43  func (d *DeferredClient) GroupVersionKindFor(obj runtime.Object) (schema.GroupVersionKind, error) {
    44  	cli := d.client()
    45  	if cli == nil {
    46  		return schema.GroupVersionKind{}, ErrClientNotInitialized
    47  	}
    48  	return cli.GroupVersionKindFor(obj)
    49  }
    50  
    51  func (d *DeferredClient) IsObjectNamespaced(obj runtime.Object) (bool, error) {
    52  	cli := d.client()
    53  	if cli == nil {
    54  		return false, ErrClientNotInitialized
    55  	}
    56  	return cli.IsObjectNamespaced(obj)
    57  }
    58  
    59  func (d *DeferredClient) SubResource(subResource string) ctrlclient.SubResourceClient {
    60  	cli := d.client()
    61  	if cli == nil {
    62  		return nil
    63  	}
    64  	return cli.SubResource(subResource)
    65  }
    66  
    67  func (d *DeferredClient) Get(ctx context.Context, key ctrlclient.ObjectKey, obj ctrlclient.Object, _ ...ctrlclient.GetOption) error {
    68  	cli := d.client()
    69  	if cli == nil {
    70  		return ErrClientNotInitialized
    71  	}
    72  	return cli.Get(ctx, key, obj)
    73  }
    74  
    75  func (d *DeferredClient) List(ctx context.Context, list ctrlclient.ObjectList, opts ...ctrlclient.ListOption) error {
    76  	cli := d.client()
    77  	if cli == nil {
    78  		return ErrClientNotInitialized
    79  	}
    80  	return cli.List(ctx, list, opts...)
    81  }
    82  
    83  func (d *DeferredClient) Create(ctx context.Context, obj ctrlclient.Object, opts ...ctrlclient.CreateOption) error {
    84  	cli := d.client()
    85  	if cli == nil {
    86  		return ErrClientNotInitialized
    87  	}
    88  	return cli.Create(ctx, obj, opts...)
    89  }
    90  
    91  func (d *DeferredClient) Delete(ctx context.Context, obj ctrlclient.Object, opts ...ctrlclient.DeleteOption) error {
    92  	cli := d.client()
    93  	if cli == nil {
    94  		return ErrClientNotInitialized
    95  	}
    96  	return cli.Delete(ctx, obj, opts...)
    97  }
    98  
    99  func (d *DeferredClient) Update(ctx context.Context, obj ctrlclient.Object, opts ...ctrlclient.UpdateOption) error {
   100  	cli := d.client()
   101  	if cli == nil {
   102  		return ErrClientNotInitialized
   103  	}
   104  	return cli.Update(ctx, obj, opts...)
   105  }
   106  
   107  func (d *DeferredClient) Patch(ctx context.Context, obj ctrlclient.Object, patch ctrlclient.Patch, opts ...ctrlclient.PatchOption) error {
   108  	cli := d.client()
   109  	if cli == nil {
   110  		return ErrClientNotInitialized
   111  	}
   112  	return cli.Patch(ctx, obj, patch, opts...)
   113  }
   114  
   115  func (d *DeferredClient) DeleteAllOf(ctx context.Context, obj ctrlclient.Object, opts ...ctrlclient.DeleteAllOfOption) error {
   116  	cli := d.client()
   117  	if cli == nil {
   118  		return ErrClientNotInitialized
   119  	}
   120  	return cli.DeleteAllOf(ctx, obj, opts...)
   121  }
   122  
   123  func (d *DeferredClient) Status() ctrlclient.StatusWriter {
   124  	cli := d.client()
   125  	if cli == nil {
   126  		return nil
   127  	}
   128  	return cli.Status()
   129  }
   130  
   131  func (d *DeferredClient) Scheme() *runtime.Scheme {
   132  	cli := d.client()
   133  	if cli == nil {
   134  		return nil
   135  	}
   136  	return cli.Scheme()
   137  }
   138  
   139  func (d *DeferredClient) RESTMapper() meta.RESTMapper {
   140  	cli := d.client()
   141  	if cli == nil {
   142  		return nil
   143  	}
   144  	return cli.RESTMapper()
   145  }