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 }