github.skymusic.top/operator-framework/operator-sdk@v0.8.2/test/test-framework/cmd/manager/main.go (about)

     1  // Copyright 2018 The Operator-SDK Authors
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package main
    16  
    17  import (
    18  	"context"
    19  	"flag"
    20  	"fmt"
    21  	"os"
    22  	"runtime"
    23  
    24  	// Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.)
    25  	_ "k8s.io/client-go/plugin/pkg/client/auth"
    26  
    27  	"github.com/operator-framework/operator-sdk/pkg/k8sutil"
    28  	"github.com/operator-framework/operator-sdk/pkg/leader"
    29  	"github.com/operator-framework/operator-sdk/pkg/log/zap"
    30  	"github.com/operator-framework/operator-sdk/pkg/ready"
    31  	"github.com/operator-framework/operator-sdk/test/test-framework/pkg/apis"
    32  	"github.com/operator-framework/operator-sdk/test/test-framework/pkg/controller"
    33  	sdkVersion "github.com/operator-framework/operator-sdk/version"
    34  	"github.com/spf13/pflag"
    35  	"sigs.k8s.io/controller-runtime/pkg/client/config"
    36  	"sigs.k8s.io/controller-runtime/pkg/manager"
    37  	logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
    38  	"sigs.k8s.io/controller-runtime/pkg/runtime/signals"
    39  )
    40  
    41  var log = logf.Log.WithName("cmd")
    42  
    43  func printVersion() {
    44  	log.Info(fmt.Sprintf("Go Version: %s", runtime.Version()))
    45  	log.Info(fmt.Sprintf("Go OS/Arch: %s/%s", runtime.GOOS, runtime.GOARCH))
    46  	log.Info(fmt.Sprintf("Version of operator-sdk: %v", sdkVersion.Version))
    47  }
    48  
    49  func main() {
    50  	// Add the zap logger flag set to the CLI. The flag set must
    51  	// be added before calling pflag.Parse().
    52  	pflag.CommandLine.AddFlagSet(zap.FlagSet())
    53  
    54  	// Add flags registered by imported packages (e.g. glog and
    55  	// controller-runtime)
    56  	pflag.CommandLine.AddGoFlagSet(flag.CommandLine)
    57  
    58  	pflag.Parse()
    59  
    60  	// Use a zap logr.Logger implementation. If none of the zap
    61  	// flags are configured (or if the zap flag set is not being
    62  	// used), this defaults to a production zap logger.
    63  	//
    64  	// The logger instantiated here can be changed to any logger
    65  	// implementing the logr.Logger interface. This logger will
    66  	// be propagated through the whole operator, generating
    67  	// uniform and structured logs.
    68  	logf.SetLogger(zap.Logger())
    69  
    70  	printVersion()
    71  
    72  	namespace, err := k8sutil.GetWatchNamespace()
    73  	if err != nil {
    74  		log.Error(err, "Failed to get watch namespace")
    75  		os.Exit(1)
    76  	}
    77  
    78  	// Get a config to talk to the apiserver
    79  	cfg, err := config.GetConfig()
    80  	if err != nil {
    81  		log.Error(err, "")
    82  		os.Exit(1)
    83  	}
    84  
    85  	// Become the leader before proceeding
    86  	if err := leader.Become(context.TODO(), "memcached-operator-lock"); err != nil {
    87  		log.Error(err, "Failed to become leader")
    88  		return
    89  	}
    90  
    91  	r := ready.NewFileReady()
    92  	err = r.Set()
    93  	if err != nil {
    94  		log.Error(err, "")
    95  		os.Exit(1)
    96  	}
    97  	defer func() {
    98  		if err := r.Unset(); err != nil {
    99  			log.Error(err, "Failed to unset file ready")
   100  		}
   101  	}()
   102  
   103  	// Create a new Cmd to provide shared dependencies and start components
   104  	mgr, err := manager.New(cfg, manager.Options{Namespace: namespace})
   105  	if err != nil {
   106  		log.Error(err, "")
   107  		os.Exit(1)
   108  	}
   109  
   110  	log.Info("Registering Components.")
   111  
   112  	// Setup Scheme for all resources
   113  	if err := apis.AddToScheme(mgr.GetScheme()); err != nil {
   114  		log.Error(err, "")
   115  		os.Exit(1)
   116  	}
   117  
   118  	// Setup all Controllers
   119  	if err := controller.AddToManager(mgr); err != nil {
   120  		log.Error(err, "")
   121  		os.Exit(1)
   122  	}
   123  
   124  	log.Info("Starting the Cmd.")
   125  
   126  	// Start the Cmd
   127  	if err := mgr.Start(signals.SetupSignalHandler()); err != nil {
   128  		log.Error(err, "Manager exited non-zero")
   129  		os.Exit(1)
   130  	}
   131  }