From 9e08bd575aa36a05094d1fe8854ac0182022358a Mon Sep 17 00:00:00 2001 From: Maskym Vavilov Date: Mon, 19 Feb 2024 11:31:40 +0000 Subject: [PATCH] GH-661 comments p1 --- .../addon-manager/addon-manager.go | 103 +++++++++++++ cmd/gateway_controller/main.go | 135 +++--------------- 2 files changed, 126 insertions(+), 112 deletions(-) create mode 100644 cmd/gateway_controller/addon-manager/addon-manager.go diff --git a/cmd/gateway_controller/addon-manager/addon-manager.go b/cmd/gateway_controller/addon-manager/addon-manager.go new file mode 100644 index 000000000..ab8b79bf5 --- /dev/null +++ b/cmd/gateway_controller/addon-manager/addon-manager.go @@ -0,0 +1,103 @@ +package addon_manager + +import ( + "context" + "embed" + "os" + + operatorsv1 "github.com/operator-framework/api/pkg/operators/v1" + operatorsv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1" + "open-cluster-management.io/addon-framework/pkg/addonfactory" + "open-cluster-management.io/addon-framework/pkg/addonmanager" + addonapiv1alpha1 "open-cluster-management.io/api/addon/v1alpha1" + clusterv1 "open-cluster-management.io/api/cluster/v1" + + "k8s.io/apimachinery/pkg/runtime" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + ctrl "sigs.k8s.io/controller-runtime" + + kuadrantv1beta1 "github.com/kuadrant/kuadrant-operator/api/v1beta1" + + "github.com/Kuadrant/multicluster-gateway-controller/pkg/ocm/hub" +) + +//go:embed manifests +var FS embed.FS + +const ( + addonName = "kuadrant-addon" +) + +type AddonRunnable struct{} + +func (r AddonRunnable) Start(ctx context.Context) error { + setupLog := ctrl.Log.WithName("addon manager setup") + setupLog.Info("starting add-on manager") + addonScheme := runtime.NewScheme() + utilruntime.Must(operatorsv1alpha1.AddToScheme(addonScheme)) + utilruntime.Must(operatorsv1.AddToScheme(addonScheme)) + utilruntime.Must(kuadrantv1beta1.AddToScheme(addonScheme)) + + kubeConfig := ctrl.GetConfigOrDie() + + addonMgr, err := addonmanager.New(kubeConfig) + if err != nil { + setupLog.Error(err, "unable to setup addon manager") + os.Exit(1) + } + + agentAddon, err := addonfactory.NewAgentAddonFactory(addonName, FS, "manifests"). + WithAgentHealthProber(hub.AddonHealthProber()). + WithScheme(addonScheme). + WithGetValuesFuncs(GetDefaultValues, addonfactory.GetValuesFromAddonAnnotation). + BuildTemplateAgentAddon() + if err != nil { + setupLog.Error(err, "failed to build agent addon") + os.Exit(1) + } + err = addonMgr.AddAgent(agentAddon) + if err != nil { + setupLog.Error(err, "failed to add addon agent") + os.Exit(1) + } + + if err = addonMgr.Start(ctx); err != nil { + setupLog.Error(err, "problem running addon manager") + return err + } + + <-ctx.Done() + + return nil +} + +func GetDefaultValues(cluster *clusterv1.ManagedCluster, + addon *addonapiv1alpha1.ManagedClusterAddOn) (addonfactory.Values, error) { + + defaultIstioOperator := "istiocontrolplane" + defaultIstioOperatorNS := "istio-system" + defaultIstioConfigMap := "istio" + defaultCatalog := "operatorhubio-catalog" + defaultCatalogNS := "olm" + defaultChannel := "stable" + + manifestConfig := struct { + IstioOperator string + IstioConfigMapName string + IstioOperatorNamespace string + ClusterName string + CatalogSource string + CatalogSourceNS string + Channel string + }{ + ClusterName: cluster.Name, + IstioOperator: defaultIstioOperator, + IstioConfigMapName: defaultIstioConfigMap, + IstioOperatorNamespace: defaultIstioOperatorNS, + CatalogSource: defaultCatalog, + CatalogSourceNS: defaultCatalogNS, + Channel: defaultChannel, + } + + return addonfactory.StructToValues(manifestConfig), nil +} diff --git a/cmd/gateway_controller/main.go b/cmd/gateway_controller/main.go index 4a0df5ed2..9b80db709 100644 --- a/cmd/gateway_controller/main.go +++ b/cmd/gateway_controller/main.go @@ -17,24 +17,15 @@ limitations under the License. package main import ( - "context" - "embed" "flag" "os" - "sync" certmanv1 "github.com/jetstack/cert-manager/pkg/apis/certmanager/v1" - operatorsv1 "github.com/operator-framework/api/pkg/operators/v1" - operatorsv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1" - "open-cluster-management.io/addon-framework/pkg/addonfactory" - "open-cluster-management.io/addon-framework/pkg/addonmanager" - addonapiv1alpha1 "open-cluster-management.io/api/addon/v1alpha1" clusterv1 "open-cluster-management.io/api/cluster/v1" clusterv1beta2 "open-cluster-management.io/api/cluster/v1beta1" workv1 "open-cluster-management.io/api/work/v1" corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/client-go/dynamic" @@ -50,11 +41,9 @@ import ( "sigs.k8s.io/controller-runtime/pkg/webhook" gatewayapiv1 "sigs.k8s.io/gateway-api/apis/v1" - kuadrantv1beta1 "github.com/kuadrant/kuadrant-operator/api/v1beta1" - + addon_manager "github.com/Kuadrant/multicluster-gateway-controller/cmd/gateway_controller/addon-manager" "github.com/Kuadrant/multicluster-gateway-controller/pkg/apis/v1alpha1" "github.com/Kuadrant/multicluster-gateway-controller/pkg/controllers/gateway" - "github.com/Kuadrant/multicluster-gateway-controller/pkg/ocm/hub" "github.com/Kuadrant/multicluster-gateway-controller/pkg/placement" "github.com/Kuadrant/multicluster-gateway-controller/pkg/policysync" //+kubebuilder:scaffold:imports @@ -64,14 +53,6 @@ var ( metricsAddr string enableLeaderElection bool probeAddr string - setupLog = ctrl.Log.WithName("setup") - - //go:embed addon-manager/manifests - FS embed.FS -) - -const ( - addonName = "kuadrant-addon" ) func init() { @@ -85,75 +66,23 @@ func init() { //+kubebuilder:scaffold:scheme } -func GetDefaultValues(cluster *clusterv1.ManagedCluster, - addon *addonapiv1alpha1.ManagedClusterAddOn) (addonfactory.Values, error) { - - defaultIstioOperator := "istiocontrolplane" - defaultIstioOperatorNS := "istio-system" - defaultIstioConfigMap := "istio" - defaultCatalog := "operatorhubio-catalog" - defaultCatalogNS := "olm" - defaultChannel := "stable" - - manifestConfig := struct { - IstioOperator string - IstioConfigMapName string - IstioOperatorNamespace string - ClusterName string - CatalogSource string - CatalogSourceNS string - Channel string - }{ - ClusterName: cluster.Name, - IstioOperator: defaultIstioOperator, - IstioConfigMapName: defaultIstioConfigMap, - IstioOperatorNamespace: defaultIstioOperatorNS, - CatalogSource: defaultCatalog, - CatalogSourceNS: defaultCatalogNS, - Channel: defaultChannel, - } - - return addonfactory.StructToValues(manifestConfig), nil -} - -func startAddonManager(ctx context.Context) { - setupLog.Info("starting add-on manager") - addonScheme := runtime.NewScheme() - utilruntime.Must(operatorsv1alpha1.AddToScheme(addonScheme)) - utilruntime.Must(operatorsv1.AddToScheme(addonScheme)) - utilruntime.Must(kuadrantv1beta1.AddToScheme(addonScheme)) - - kubeConfig := ctrl.GetConfigOrDie() - - addonMgr, err := addonmanager.New(kubeConfig) - if err != nil { - setupLog.Error(err, "unable to setup addon manager") - os.Exit(1) - } - - agentAddon, err := addonfactory.NewAgentAddonFactory(addonName, FS, "addon-manager/manifests"). - WithAgentHealthProber(hub.AddonHealthProber()). - WithScheme(addonScheme). - WithGetValuesFuncs(GetDefaultValues, addonfactory.GetValuesFromAddonAnnotation). - BuildTemplateAgentAddon() - if err != nil { - setupLog.Error(err, "failed to build agent addon") - os.Exit(1) - } - err = addonMgr.AddAgent(agentAddon) - if err != nil { - setupLog.Error(err, "failed to add addon agent") - os.Exit(1) +func main() { + flag.StringVar(&metricsAddr, "metrics-bind-address", ":8080", "The address the metric endpoint binds to.") + flag.StringVar(&probeAddr, "health-probe-bind-address", ":8081", "The address the probe endpoint binds to.") + flag.BoolVar(&enableLeaderElection, "leader-elect", false, + "Enable leader election for controller manager. "+ + "Enabling this will ensure there is only one active controller manager.") + opts := zap.Options{ + Development: true, } + opts.BindFlags(flag.CommandLine) + flag.Parse() - if err := addonMgr.Start(ctx); err != nil { - setupLog.Error(err, "problem running addon manager") - os.Exit(1) - } + ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) + setupLog := ctrl.Log.WithName("gateway controller setup") -} + ctx := ctrl.SetupSignalHandler() -func startGatewayController(ctx context.Context) { mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ Scheme: scheme.Scheme, Metrics: metricsserver.Options{BindAddress: metricsAddr}, @@ -204,45 +133,27 @@ func startGatewayController(ctx context.Context) { //+kubebuilder:scaffold:builder - if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil { + if err = mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil { setupLog.Error(err, "unable to set up health check") os.Exit(1) } - if err := mgr.AddReadyzCheck("readyz", healthz.Ping); err != nil { + if err = mgr.AddReadyzCheck("readyz", healthz.Ping); err != nil { setupLog.Error(err, "unable to set up ready check") os.Exit(1) } - setupLog.Info("starting manager") - - if err := mgr.Start(ctx); err != nil { - setupLog.Error(err, "problem running controller manager") + // add addon-manager + if err = mgr.Add(addon_manager.AddonRunnable{}); err != nil { + setupLog.Error(err, "unable to add addon manager runnable") os.Exit(1) } -} + setupLog.Info("starting manager") -func main() { - flag.StringVar(&metricsAddr, "metrics-bind-address", ":8080", "The address the metric endpoint binds to.") - flag.StringVar(&probeAddr, "health-probe-bind-address", ":8081", "The address the probe endpoint binds to.") - flag.BoolVar(&enableLeaderElection, "leader-elect", false, - "Enable leader election for controller manager. "+ - "Enabling this will ensure there is only one active controller manager.") - opts := zap.Options{ - Development: true, + if err = mgr.Start(ctx); err != nil { + setupLog.Error(err, "problem running controller manager") + os.Exit(1) } - opts.BindFlags(flag.CommandLine) - flag.Parse() - - ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) - - ctx := ctrl.SetupSignalHandler() - - wg := sync.WaitGroup{} - wg.Add(2) - go startAddonManager(ctx) - go startGatewayController(ctx) - wg.Wait() <-ctx.Done() }