github.com/verrazzano/verrazzano@v1.7.1/application-operator/internal/operatorinit/run_cluster_agent.go (about) 1 // Copyright (c) 2023, Oracle and/or its affiliates. 2 // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. 3 4 package operatorinit 5 6 import ( 7 clustersv1alpha1 "github.com/verrazzano/verrazzano/application-operator/apis/clusters/v1alpha1" 8 "github.com/verrazzano/verrazzano/application-operator/constants" 9 "github.com/verrazzano/verrazzano/application-operator/controllers/clusters" 10 "github.com/verrazzano/verrazzano/application-operator/controllers/clusters/multiclusterapplicationconfiguration" 11 "github.com/verrazzano/verrazzano/application-operator/controllers/clusters/multiclustercomponent" 12 "github.com/verrazzano/verrazzano/application-operator/controllers/clusters/multiclusterconfigmap" 13 "github.com/verrazzano/verrazzano/application-operator/controllers/clusters/multiclustersecret" 14 "github.com/verrazzano/verrazzano/application-operator/controllers/clusters/verrazzanoproject" 15 "github.com/verrazzano/verrazzano/application-operator/mcagent" 16 "github.com/verrazzano/verrazzano/application-operator/metricsexporter" 17 "github.com/verrazzano/verrazzano/pkg/k8sutil" 18 vzlog "github.com/verrazzano/verrazzano/pkg/log" 19 vmcclient "github.com/verrazzano/verrazzano/platform-operator/clientset/versioned/scheme" 20 "go.uber.org/zap" 21 "k8s.io/apimachinery/pkg/runtime" 22 ctrl "sigs.k8s.io/controller-runtime" 23 "sigs.k8s.io/controller-runtime/pkg/manager" 24 ) 25 26 func StartClusterAgent(metricsAddr string, enableLeaderElection bool, log *zap.SugaredLogger, scheme *runtime.Scheme) error { 27 mgr, err := ctrl.NewManager(k8sutil.GetConfigOrDieFromController(), ctrl.Options{ 28 Scheme: scheme, 29 MetricsBindAddress: metricsAddr, 30 Port: 9443, 31 LeaderElection: enableLeaderElection, 32 LeaderElectionID: "5df248b5.verrazzano.io", 33 }) 34 if err != nil { 35 log.Errorf("Failed to start manager: %v", err) 36 return err 37 } 38 log.Info("Starting agent reconciler for syncing multi-cluster objects") 39 agentChannel, err := setupClusterAgentReconciler(mgr, log) 40 if err != nil { 41 return err 42 } 43 log.Info("Starting multicluster reconcilers") 44 if err := setupMulticlusterReconcilers(mgr, agentChannel, log); err != nil { 45 return err 46 } 47 // Initialize the metricsExporter 48 if err := metricsexporter.StartMetricsServer(); err != nil { 49 log.Errorf("Failed to create metrics exporter: %v", err) 50 return err 51 } 52 53 // +kubebuilder:scaffold:builder 54 55 log.Info("Starting manager") 56 if err = mgr.Start(ctrl.SetupSignalHandler()); err != nil { 57 log.Errorf("Failed to run manager: %v", err) 58 return err 59 } 60 return err 61 } 62 63 func setupClusterAgentReconciler(mgr manager.Manager, log *zap.SugaredLogger) (chan clusters.StatusUpdateMessage, error) { 64 // Create a buffered channel of size 10 for the multi cluster agent to receive messages 65 agentChannel := make(chan clusters.StatusUpdateMessage, constants.StatusUpdateChannelBufferSize) 66 67 if err := (&mcagent.Reconciler{ 68 Client: mgr.GetClient(), 69 Log: log.With(vzlog.FieldAgent, "multi-cluster"), 70 Scheme: mgr.GetScheme(), 71 AgentChannel: agentChannel, 72 }).SetupWithManager(mgr); err != nil { 73 log.Errorf("Failed to create managed cluster agent controller: %v", err) 74 return nil, err 75 } 76 return agentChannel, nil 77 } 78 79 func setupMulticlusterReconcilers(mgr manager.Manager, agentChannel chan clusters.StatusUpdateMessage, log *zap.SugaredLogger) error { 80 if err := (&multiclustersecret.Reconciler{ 81 Client: mgr.GetClient(), 82 Log: log, 83 Scheme: mgr.GetScheme(), 84 AgentChannel: agentChannel, 85 }).SetupWithManager(mgr); err != nil { 86 log.Errorf("Failed to create %s controller: %v", clustersv1alpha1.MultiClusterSecretKind, err) 87 return err 88 } 89 if err := (&multiclustercomponent.Reconciler{ 90 Client: mgr.GetClient(), 91 Log: log, 92 Scheme: mgr.GetScheme(), 93 AgentChannel: agentChannel, 94 }).SetupWithManager(mgr); err != nil { 95 log.Errorf("Failed to create %s controller: %v", clustersv1alpha1.MultiClusterComponentKind, err) 96 return err 97 } 98 if err := (&multiclusterconfigmap.Reconciler{ 99 Client: mgr.GetClient(), 100 Log: log, 101 Scheme: mgr.GetScheme(), 102 AgentChannel: agentChannel, 103 }).SetupWithManager(mgr); err != nil { 104 log.Errorf("Failed to create %s controller %v", clustersv1alpha1.MultiClusterConfigMapKind, err) 105 return err 106 } 107 if err := (&multiclusterapplicationconfiguration.Reconciler{ 108 Client: mgr.GetClient(), 109 Log: log, 110 Scheme: mgr.GetScheme(), 111 AgentChannel: agentChannel, 112 }).SetupWithManager(mgr); err != nil { 113 log.Errorf("Failed to create %s controller: %v", clustersv1alpha1.MultiClusterAppConfigKind, err) 114 return err 115 } 116 scheme := mgr.GetScheme() 117 vmcclient.AddToScheme(scheme) 118 if err := (&verrazzanoproject.Reconciler{ 119 Client: mgr.GetClient(), 120 Log: log, 121 Scheme: scheme, 122 AgentChannel: agentChannel, 123 }).SetupWithManager(mgr); err != nil { 124 log.Errorf("Failed to create %s controller %v", clustersv1alpha1.VerrazzanoProjectKind, err) 125 return err 126 } 127 return nil 128 }