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  }