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 = (ðereumcontroller.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 = (ðereumv1alpha1.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 = (ðereum2controller.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 = (ðereum2v1alpha1.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 = (ðereum2controller.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 = (ðereum2v1alpha1.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 }