github.com/cilium/cilium@v1.16.2/pkg/k8s/synced/cell.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright Authors of Cilium 3 4 package synced 5 6 import ( 7 "context" 8 "errors" 9 10 "github.com/cilium/hive/cell" 11 "github.com/cilium/hive/job" 12 13 "github.com/cilium/cilium/pkg/k8s/client" 14 "github.com/cilium/cilium/pkg/option" 15 "github.com/cilium/cilium/pkg/promise" 16 ) 17 18 type syncedParams struct { 19 cell.In 20 21 CacheStatus CacheStatus 22 } 23 24 var Cell = cell.Module( 25 "k8s-synced", 26 "Provides types for internal K8s resource synchronization", 27 28 cell.Provide(func() *APIGroups { 29 return new(APIGroups) 30 }), 31 32 cell.Provide(func(params syncedParams) *Resources { 33 return &Resources{ 34 CacheStatus: params.CacheStatus, 35 } 36 }), 37 38 cell.Provide(func() CacheStatus { 39 return make(CacheStatus) 40 }), 41 ) 42 43 var CRDSyncCell = cell.Module( 44 "k8s-synced-crdsync", 45 "Provides promise for waiting for CRD to have been synchronized", 46 47 cell.Provide(newCRDSyncPromise), 48 ) 49 50 // CRDSync is an empty type used for promise.Promise. If SyncCRDs() fails, the error is passed via 51 // promise Reject to the result of the promise Await() call. 52 type CRDSync struct{} 53 54 // CRDSyncResourceNames is a slice of CRD resource names CRDSync promise waits for 55 type CRDSyncResourceNames []string 56 57 var ErrCRDSyncDisabled = errors.New("CRDSync promise is disabled") 58 59 // RejectedCRDSyncPromise can be used in hives that do not provide the CRDSync promise. 60 var RejectedCRDSyncPromise = func() promise.Promise[CRDSync] { 61 crdSyncResolver, crdSyncPromise := promise.New[CRDSync]() 62 crdSyncResolver.Reject(ErrCRDSyncDisabled) 63 return crdSyncPromise 64 } 65 66 type syncCRDsPromiseParams struct { 67 cell.In 68 69 Lifecycle cell.Lifecycle 70 Jobs job.Registry 71 Health cell.Health 72 Clientset client.Clientset 73 Resources *Resources 74 APIGroups *APIGroups 75 ResourceNames CRDSyncResourceNames 76 } 77 78 func newCRDSyncPromise(params syncCRDsPromiseParams) promise.Promise[CRDSync] { 79 crdSyncResolver, crdSyncPromise := promise.New[CRDSync]() 80 if !params.Clientset.IsEnabled() || option.Config.DryMode { 81 crdSyncResolver.Reject(ErrCRDSyncDisabled) 82 return crdSyncPromise 83 } 84 85 g := params.Jobs.NewGroup(params.Health) 86 g.Add(job.OneShot("sync-crds", func(ctx context.Context, health cell.Health) error { 87 err := SyncCRDs(ctx, params.Clientset, params.ResourceNames, params.Resources, params.APIGroups) 88 if err != nil { 89 crdSyncResolver.Reject(err) 90 } else { 91 crdSyncResolver.Resolve(struct{}{}) 92 } 93 return err 94 })) 95 params.Lifecycle.Append(g) 96 97 return crdSyncPromise 98 }