...

Source file src/edge-infra.dev/pkg/sds/patching/k8s/controller/manager.go

Documentation: edge-infra.dev/pkg/sds/patching/k8s/controller

     1  package controller
     2  
     3  import (
     4  	"os"
     5  	"time"
     6  
     7  	"github.com/go-logr/logr"
     8  	"k8s.io/apimachinery/pkg/fields"
     9  	kruntime "k8s.io/apimachinery/pkg/runtime"
    10  	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
    11  	clientgoscheme "k8s.io/client-go/kubernetes/scheme"
    12  	"k8s.io/client-go/rest"
    13  	ctrl "sigs.k8s.io/controller-runtime"
    14  	"sigs.k8s.io/controller-runtime/pkg/cache"
    15  	"sigs.k8s.io/controller-runtime/pkg/client"
    16  	ctrlmgr "sigs.k8s.io/controller-runtime/pkg/manager"
    17  
    18  	"k8s.io/apimachinery/pkg/util/wait"
    19  
    20  	"edge-infra.dev/pkg/k8s/runtime/controller"
    21  	v1ienpatch "edge-infra.dev/pkg/sds/patching/k8s/apis/ienpatch/v1"
    22  )
    23  
    24  var (
    25  	scheme      = kruntime.NewScheme()
    26  	requeueTime = time.Minute
    27  )
    28  
    29  func init() {
    30  	utilruntime.Must(clientgoscheme.AddToScheme(scheme))
    31  	utilruntime.Must(v1ienpatch.AddToScheme(scheme))
    32  }
    33  
    34  func Run(logger logr.Logger, opts ...controller.Option) error {
    35  	ctrl.SetLogger(logger)
    36  	log := ctrl.Log.WithName("setup")
    37  
    38  	backoff := wait.Backoff{ // Max duration is approx 9.5 minutes
    39  		Duration: 500 * time.Millisecond,
    40  		Factor:   2.0,
    41  		Jitter:   1.0,
    42  		Steps:    15,
    43  		Cap:      60 * time.Second,
    44  	}
    45  	var mgrPtr *ctrlmgr.Manager
    46  	if err := wait.ExponentialBackoff(backoff, func() (bool, error) {
    47  		mgr, err := createManager(opts...) // setup the controller manager
    48  		if err != nil {
    49  			log.Error(err, "unable to setup the controller manager")
    50  			return false, nil // not returning error to continue backoff
    51  		}
    52  		mgrPtr = &mgr
    53  		return true, nil
    54  	}); err != nil {
    55  		log.Error(err, "error creating patchctl manager: too many retries")
    56  		os.Exit(1)
    57  	}
    58  	mgr := *mgrPtr
    59  
    60  	// register controllers
    61  	if err := setupControllersWithManager(mgr, log); err != nil {
    62  		log.Error(err, "unable to setup controllers")
    63  		return err
    64  	}
    65  
    66  	// start controllers registered to the manager
    67  	if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
    68  		log.Error(err, "could not start controllers")
    69  		return err
    70  	}
    71  
    72  	return nil
    73  }
    74  
    75  func createManager(o ...controller.Option) (mgr ctrl.Manager, err error) {
    76  	mgrRestConfig, mgrOpts := getManagerOptions(o...)
    77  	return ctrl.NewManager(mgrRestConfig, mgrOpts)
    78  }
    79  
    80  func getManagerOptions(opts ...controller.Option) (*rest.Config, ctrlmgr.Options) {
    81  	mgrConfig, mgrOpts := controller.ProcessOptions(opts...)
    82  	mgrOpts.Scheme = scheme
    83  	mgrOpts.Cache = cacheOptions()
    84  	return mgrConfig, mgrOpts
    85  }
    86  
    87  func cacheOptions() cache.Options {
    88  	return cache.Options{
    89  		ByObject: map[client.Object]cache.ByObject{
    90  			&v1ienpatch.IENPatch{}: {
    91  				Field: fields.Everything(),
    92  			},
    93  		},
    94  	}
    95  }
    96  
    97  func setupControllersWithManager(mgr ctrl.Manager, log logr.Logger) error {
    98  	controller := NewPatchController(mgr, log)
    99  	return controller.SetUpWithManager(mgr)
   100  }
   101  

View as plain text