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  }