github.com/kotalco/kotal@v0.3.0/main.go (about)

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"os"
     6  
     7  	"k8s.io/apimachinery/pkg/runtime"
     8  	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
     9  	clientgoscheme "k8s.io/client-go/kubernetes/scheme"
    10  	_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
    11  	ctrl "sigs.k8s.io/controller-runtime"
    12  	"sigs.k8s.io/controller-runtime/pkg/healthz"
    13  	"sigs.k8s.io/controller-runtime/pkg/log/zap"
    14  	"sigs.k8s.io/controller-runtime/pkg/metrics/server"
    15  	"sigs.k8s.io/controller-runtime/pkg/webhook"
    16  
    17  	aptosv1alpha1 "github.com/kotalco/kotal/apis/aptos/v1alpha1"
    18  	bitcoinv1alpha1 "github.com/kotalco/kotal/apis/bitcoin/v1alpha1"
    19  	chainlinkv1alpha1 "github.com/kotalco/kotal/apis/chainlink/v1alpha1"
    20  	ethereumv1alpha1 "github.com/kotalco/kotal/apis/ethereum/v1alpha1"
    21  	ethereum2v1alpha1 "github.com/kotalco/kotal/apis/ethereum2/v1alpha1"
    22  	filecoinv1alpha1 "github.com/kotalco/kotal/apis/filecoin/v1alpha1"
    23  	graphv1alpha1 "github.com/kotalco/kotal/apis/graph/v1alpha1"
    24  	ipfsv1alpha1 "github.com/kotalco/kotal/apis/ipfs/v1alpha1"
    25  	nearv1alpha1 "github.com/kotalco/kotal/apis/near/v1alpha1"
    26  	polkadotv1alpha1 "github.com/kotalco/kotal/apis/polkadot/v1alpha1"
    27  	stacksv1alpha1 "github.com/kotalco/kotal/apis/stacks/v1alpha1"
    28  	aptoscontroller "github.com/kotalco/kotal/controllers/aptos"
    29  	bitcoincontroller "github.com/kotalco/kotal/controllers/bitcoin"
    30  	chainlinkcontroller "github.com/kotalco/kotal/controllers/chainlink"
    31  	ethereumcontroller "github.com/kotalco/kotal/controllers/ethereum"
    32  	ethereum2controller "github.com/kotalco/kotal/controllers/ethereum2"
    33  	filecoincontroller "github.com/kotalco/kotal/controllers/filecoin"
    34  	graphcontrollers "github.com/kotalco/kotal/controllers/graph"
    35  	ipfscontroller "github.com/kotalco/kotal/controllers/ipfs"
    36  	nearcontroller "github.com/kotalco/kotal/controllers/near"
    37  	polkadotcontroller "github.com/kotalco/kotal/controllers/polkadot"
    38  	"github.com/kotalco/kotal/controllers/shared"
    39  	stackscontroller "github.com/kotalco/kotal/controllers/stacks"
    40  	// +kubebuilder:scaffold:imports
    41  )
    42  
    43  var (
    44  	scheme         = runtime.NewScheme()
    45  	setupLog       = ctrl.Log.WithName("setup")
    46  	enableWebhooks = os.Getenv("ENABLE_WEBHOOKS") != "false"
    47  )
    48  
    49  func init() {
    50  	utilruntime.Must(clientgoscheme.AddToScheme(scheme))
    51  	utilruntime.Must(ethereumv1alpha1.AddToScheme(scheme))
    52  	utilruntime.Must(ethereum2v1alpha1.AddToScheme(scheme))
    53  	utilruntime.Must(ipfsv1alpha1.AddToScheme(scheme))
    54  	utilruntime.Must(filecoinv1alpha1.AddToScheme(scheme))
    55  	utilruntime.Must(polkadotv1alpha1.AddToScheme(scheme))
    56  	utilruntime.Must(chainlinkv1alpha1.AddToScheme(scheme))
    57  	utilruntime.Must(nearv1alpha1.AddToScheme(scheme))
    58  	utilruntime.Must(bitcoinv1alpha1.AddToScheme(scheme))
    59  	utilruntime.Must(stacksv1alpha1.AddToScheme(scheme))
    60  	utilruntime.Must(aptosv1alpha1.AddToScheme(scheme))
    61  	utilruntime.Must(graphv1alpha1.AddToScheme(scheme))
    62  	// +kubebuilder:scaffold:scheme
    63  }
    64  
    65  func main() {
    66  	var metricsAddr, probeAddr string
    67  	var enableLeaderElection bool
    68  
    69  	flag.StringVar(&metricsAddr, "metrics-bind-address", ":8080", "The address the metric endpoint binds to.")
    70  	flag.StringVar(&probeAddr, "health-probe-bind-address", ":8081", "The address the probe endpoint binds to.")
    71  	flag.BoolVar(&enableLeaderElection, "leader-elect", false,
    72  		"Enable leader election for controller manager. "+
    73  			"Enabling this will ensure there is only one active controller manager.")
    74  
    75  	opts := zap.Options{
    76  		Development: true,
    77  	}
    78  	opts.BindFlags(flag.CommandLine)
    79  	flag.Parse()
    80  
    81  	ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts)))
    82  
    83  	webhookServer := webhook.NewServer(webhook.Options{
    84  		Port: 9443,
    85  	})
    86  	mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
    87  		Scheme: scheme,
    88  		Metrics: server.Options{
    89  			BindAddress: metricsAddr,
    90  		},
    91  		HealthProbeBindAddress: probeAddr,
    92  		WebhookServer:          webhookServer,
    93  		LeaderElection:         enableLeaderElection,
    94  		LeaderElectionID:       "2b1fce2f.kotal.io",
    95  	})
    96  	if err != nil {
    97  		setupLog.Error(err, "unable to start manager")
    98  		os.Exit(1)
    99  	}
   100  
   101  	if err = (&filecoincontroller.NodeReconciler{
   102  		Reconciler: shared.Reconciler{
   103  			Client: mgr.GetClient(),
   104  			Scheme: mgr.GetScheme(),
   105  		},
   106  	}).SetupWithManager(mgr); err != nil {
   107  		setupLog.Error(err, "unable to create controller", "controller", "Node")
   108  		os.Exit(1)
   109  	}
   110  	if enableWebhooks {
   111  		if err = (&filecoinv1alpha1.Node{}).SetupWebhookWithManager(mgr); err != nil {
   112  			setupLog.Error(err, "unable to create webhook", "webhook", "Node")
   113  			os.Exit(1)
   114  		}
   115  	}
   116  
   117  	if err = (&ethereumcontroller.NodeReconciler{
   118  		Client: mgr.GetClient(),
   119  		Scheme: mgr.GetScheme(),
   120  	}).SetupWithManager(mgr); err != nil {
   121  		setupLog.Error(err, "unable to create controller", "controller", "Node")
   122  		os.Exit(1)
   123  	}
   124  	if enableWebhooks {
   125  		if err = (&ethereumv1alpha1.Node{}).SetupWebhookWithManager(mgr); err != nil {
   126  			setupLog.Error(err, "unable to create webhook", "webhook", "Node")
   127  			os.Exit(1)
   128  		}
   129  	}
   130  
   131  	if err = (&ethereum2controller.BeaconNodeReconciler{
   132  		Reconciler: shared.Reconciler{
   133  			Client: mgr.GetClient(),
   134  			Scheme: mgr.GetScheme(),
   135  		},
   136  	}).SetupWithManager(mgr); err != nil {
   137  		setupLog.Error(err, "unable to create controller", "controller", "BeaconNode")
   138  		os.Exit(1)
   139  	}
   140  	if enableWebhooks {
   141  		if err = (&ethereum2v1alpha1.BeaconNode{}).SetupWebhookWithManager(mgr); err != nil {
   142  			setupLog.Error(err, "unable to create webhook", "webhook", "Node")
   143  			os.Exit(1)
   144  		}
   145  	}
   146  
   147  	if err = (&ethereum2controller.ValidatorReconciler{
   148  		Reconciler: shared.Reconciler{
   149  			Client: mgr.GetClient(),
   150  			Scheme: mgr.GetScheme(),
   151  		},
   152  	}).SetupWithManager(mgr); err != nil {
   153  		setupLog.Error(err, "unable to create controller", "controller", "Validator")
   154  		os.Exit(1)
   155  	}
   156  	if enableWebhooks {
   157  		if err = (&ethereum2v1alpha1.Validator{}).SetupWebhookWithManager(mgr); err != nil {
   158  			setupLog.Error(err, "unable to create webhook", "webhook", "Validator")
   159  			os.Exit(1)
   160  		}
   161  	}
   162  
   163  	if err = (&ipfscontroller.PeerReconciler{
   164  		Reconciler: shared.Reconciler{
   165  			Client: mgr.GetClient(),
   166  			Scheme: mgr.GetScheme(),
   167  		},
   168  	}).SetupWithManager(mgr); err != nil {
   169  		setupLog.Error(err, "unable to create controller", "controller", "Peer")
   170  		os.Exit(1)
   171  	}
   172  	if enableWebhooks {
   173  		if err = (&ipfsv1alpha1.Peer{}).SetupWebhookWithManager(mgr); err != nil {
   174  			setupLog.Error(err, "unable to create webhook", "webhook", "Peer")
   175  			os.Exit(1)
   176  		}
   177  	}
   178  
   179  	if err = (&ipfscontroller.ClusterPeerReconciler{
   180  		Reconciler: shared.Reconciler{
   181  			Client: mgr.GetClient(),
   182  			Scheme: mgr.GetScheme(),
   183  		},
   184  	}).SetupWithManager(mgr); err != nil {
   185  		setupLog.Error(err, "unable to create controller", "controller", "ClusterPeer")
   186  		os.Exit(1)
   187  	}
   188  	if enableWebhooks {
   189  		if err = (&ipfsv1alpha1.ClusterPeer{}).SetupWebhookWithManager(mgr); err != nil {
   190  			setupLog.Error(err, "unable to create webhook", "webhook", "ClusterPeer")
   191  			os.Exit(1)
   192  		}
   193  	}
   194  
   195  	if err = (&polkadotcontroller.NodeReconciler{
   196  		Reconciler: shared.Reconciler{
   197  			Client: mgr.GetClient(),
   198  			Scheme: mgr.GetScheme(),
   199  		},
   200  	}).SetupWithManager(mgr); err != nil {
   201  		setupLog.Error(err, "unable to create controller", "controller", "Node")
   202  		os.Exit(1)
   203  	}
   204  	if enableWebhooks {
   205  		if err = (&polkadotv1alpha1.Node{}).SetupWebhookWithManager(mgr); err != nil {
   206  			setupLog.Error(err, "unable to create webhook", "webhook", "Node")
   207  			os.Exit(1)
   208  		}
   209  	}
   210  
   211  	if err = (&chainlinkcontroller.NodeReconciler{
   212  		Reconciler: shared.Reconciler{
   213  			Client: mgr.GetClient(),
   214  			Scheme: mgr.GetScheme(),
   215  		},
   216  	}).SetupWithManager(mgr); err != nil {
   217  		setupLog.Error(err, "unable to create controller", "controller", "Node")
   218  		os.Exit(1)
   219  	}
   220  	if enableWebhooks {
   221  		if err = (&chainlinkv1alpha1.Node{}).SetupWebhookWithManager(mgr); err != nil {
   222  			setupLog.Error(err, "unable to create webhook", "webhook", "Node")
   223  			os.Exit(1)
   224  		}
   225  	}
   226  
   227  	if err = (&nearcontroller.NodeReconciler{
   228  		Reconciler: shared.Reconciler{
   229  			Client: mgr.GetClient(),
   230  			Scheme: mgr.GetScheme(),
   231  		},
   232  	}).SetupWithManager(mgr); err != nil {
   233  		setupLog.Error(err, "unable to create controller", "controller", "Node")
   234  		os.Exit(1)
   235  	}
   236  	if enableWebhooks {
   237  		if err = (&nearv1alpha1.Node{}).SetupWebhookWithManager(mgr); err != nil {
   238  			setupLog.Error(err, "unable to create webhook", "webhook", "Node")
   239  			os.Exit(1)
   240  		}
   241  	}
   242  
   243  	if err = (&bitcoincontroller.NodeReconciler{
   244  		Reconciler: shared.Reconciler{
   245  			Client: mgr.GetClient(),
   246  			Scheme: mgr.GetScheme(),
   247  		},
   248  	}).SetupWithManager(mgr); err != nil {
   249  		setupLog.Error(err, "unable to create controller", "controller", "Node")
   250  		os.Exit(1)
   251  	}
   252  	if enableWebhooks {
   253  		if err = (&bitcoinv1alpha1.Node{}).SetupWebhookWithManager(mgr); err != nil {
   254  			setupLog.Error(err, "unable to create webhook", "webhook", "Node")
   255  			os.Exit(1)
   256  		}
   257  	}
   258  
   259  	if err = (&stackscontroller.NodeReconciler{
   260  		Reconciler: shared.Reconciler{
   261  			Client: mgr.GetClient(),
   262  			Scheme: mgr.GetScheme(),
   263  		},
   264  	}).SetupWithManager(mgr); err != nil {
   265  		setupLog.Error(err, "unable to create controller", "controller", "Node")
   266  		os.Exit(1)
   267  	}
   268  	if enableWebhooks {
   269  		if err = (&stacksv1alpha1.Node{}).SetupWebhookWithManager(mgr); err != nil {
   270  			setupLog.Error(err, "unable to create webhook", "webhook", "Node")
   271  			os.Exit(1)
   272  		}
   273  	}
   274  	if err = (&aptoscontroller.NodeReconciler{
   275  		Reconciler: shared.Reconciler{
   276  			Client: mgr.GetClient(),
   277  			Scheme: mgr.GetScheme(),
   278  		},
   279  	}).SetupWithManager(mgr); err != nil {
   280  		setupLog.Error(err, "unable to create controller", "controller", "Node")
   281  		os.Exit(1)
   282  	}
   283  	if enableWebhooks {
   284  		if err = (&aptosv1alpha1.Node{}).SetupWebhookWithManager(mgr); err != nil {
   285  			setupLog.Error(err, "unable to create webhook", "webhook", "Node")
   286  			os.Exit(1)
   287  		}
   288  	}
   289  	if err = (&graphcontrollers.NodeReconciler{
   290  		Client: mgr.GetClient(),
   291  		Scheme: mgr.GetScheme(),
   292  	}).SetupWithManager(mgr); err != nil {
   293  		setupLog.Error(err, "unable to create controller", "controller", "Node")
   294  		os.Exit(1)
   295  	}
   296  	// +kubebuilder:scaffold:builder
   297  
   298  	if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil {
   299  		setupLog.Error(err, "unable to set up health check")
   300  		os.Exit(1)
   301  	}
   302  	if err := mgr.AddReadyzCheck("readyz", healthz.Ping); err != nil {
   303  		setupLog.Error(err, "unable to set up ready check")
   304  		os.Exit(1)
   305  	}
   306  
   307  	setupLog.Info("starting manager")
   308  	if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
   309  		setupLog.Error(err, "problem running manager")
   310  		os.Exit(1)
   311  	}
   312  }