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  }