github.com/operator-framework/operator-lifecycle-manager@v0.30.0/cmd/catalog/main.go (about) 1 package main 2 3 import ( 4 "context" 5 "fmt" 6 "net/http" 7 "os" 8 "time" 9 10 configv1client "github.com/openshift/client-go/config/clientset/versioned/typed/config/v1" 11 "github.com/sirupsen/logrus" 12 k8sscheme "k8s.io/client-go/kubernetes/scheme" 13 "k8s.io/client-go/tools/clientcmd" 14 utilclock "k8s.io/utils/clock" 15 16 "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client" 17 "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalog" 18 "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalogtemplate" 19 "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorclient" 20 "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorstatus" 21 "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/server" 22 "github.com/operator-framework/operator-lifecycle-manager/pkg/metrics" 23 ) 24 25 const ( 26 catalogNamespaceEnvVarName = "GLOBAL_CATALOG_NAMESPACE" 27 defaultWakeupInterval = 15 * time.Minute 28 defaultCatalogNamespace = "olm" 29 defaultConfigMapServerImage = "quay.io/operator-framework/configmap-operator-registry:latest" 30 defaultOPMImage = "quay.io/operator-framework/opm:latest" 31 defaultUtilImage = "quay.io/operator-framework/olm:latest" 32 defaultOperatorName = "" 33 defaultWorkLoadUserID = int64(1001) 34 ) 35 36 // config flags defined globally so that they appear on the test binary as well 37 38 func init() { 39 metrics.RegisterCatalog() 40 } 41 42 func main() { 43 cmd := newRootCmd() 44 if err := cmd.Execute(); err != nil { 45 fmt.Fprintln(os.Stderr, err) 46 os.Exit(1) 47 } 48 } 49 50 func (o *options) run(ctx context.Context, logger *logrus.Logger) error { 51 // If the catalogNamespaceEnvVarName environment variable is set, then update the value of catalogNamespace. 52 if catalogNamespaceEnvVarValue := os.Getenv(catalogNamespaceEnvVarName); catalogNamespaceEnvVarValue != "" { 53 logger.Infof("%s environment variable is set. Updating Global Catalog Namespace to %s", catalogNamespaceEnvVarName, catalogNamespaceEnvVarValue) 54 o.catalogNamespace = catalogNamespaceEnvVarValue 55 } 56 57 listenAndServe, err := server.GetListenAndServeFunc( 58 server.WithLogger(logger), 59 server.WithTLS(&o.tlsCertPath, &o.tlsKeyPath, &o.clientCAPath), 60 server.WithDebug(o.debug), 61 ) 62 if err != nil { 63 return fmt.Errorf("error setting up health/metric/pprof service: %v", err) 64 } 65 66 go func() { 67 if err := listenAndServe(); err != nil && err != http.ErrServerClosed { 68 logger.Error(err) 69 } 70 }() 71 72 // create a config client for operator status 73 config, err := clientcmd.BuildConfigFromFlags("", o.kubeconfig) 74 if err != nil { 75 return fmt.Errorf("error configuring client: %s", err.Error()) 76 } 77 configClient, err := configv1client.NewForConfig(config) 78 if err != nil { 79 return fmt.Errorf("error configuring client: %s", err.Error()) 80 } 81 opClient := operatorclient.NewClientFromConfig(o.kubeconfig, logger) 82 crClient, err := client.NewClient(o.kubeconfig) 83 if err != nil { 84 return fmt.Errorf("error configuring client: %s", err.Error()) 85 } 86 87 workloadUserID := int64(-1) 88 if o.setWorkloadUserID { 89 workloadUserID = defaultWorkLoadUserID 90 } 91 // TODO(tflannag): Use options pattern for catalog operator 92 // Create a new instance of the operator. 93 op, err := catalog.NewOperator( 94 ctx, 95 o.kubeconfig, 96 utilclock.RealClock{}, 97 logger, 98 o.wakeupInterval, 99 o.configMapServerImage, 100 o.opmImage, 101 o.utilImage, 102 o.catalogNamespace, 103 k8sscheme.Scheme, 104 o.installPlanTimeout, 105 o.bundleUnpackTimeout, 106 workloadUserID, 107 ) 108 if err != nil { 109 return fmt.Errorf("error configuring catalog operator: %s", err.Error()) 110 } 111 112 opCatalogTemplate, err := catalogtemplate.NewOperator( 113 ctx, 114 o.kubeconfig, 115 logger, 116 o.wakeupInterval, 117 o.catalogNamespace, 118 ) 119 if err != nil { 120 return fmt.Errorf("error configuring catalog template operator: %s", err.Error()) 121 } 122 123 op.Run(ctx) 124 <-op.Ready() 125 126 opCatalogTemplate.Run(ctx) 127 <-opCatalogTemplate.Ready() 128 129 if o.writeStatusName != "" { 130 operatorstatus.MonitorClusterStatus(o.writeStatusName, op.AtLevel(), op.Done(), opClient, configClient, crClient, logger) 131 } 132 133 <-op.Done() 134 135 return nil 136 }