github.com/caos/orbos@v1.5.14-0.20221103111702-e6cd0cea7ad4/cmd/orbctl/start.go (about)

     1  package main
     2  
     3  import (
     4  	"log"
     5  	"net/http"
     6  
     7  	"github.com/caos/orbos/internal/ctrlcrd"
     8  	"github.com/caos/orbos/internal/ctrlgitops"
     9  	"github.com/caos/orbos/pkg/kubernetes"
    10  	orbcfg "github.com/caos/orbos/pkg/orb"
    11  	"github.com/spf13/cobra"
    12  )
    13  
    14  func StartCommand() *cobra.Command {
    15  	return &cobra.Command{
    16  		Use:   "start",
    17  		Short: "Start an operator",
    18  		Long:  `Pass exactly one of orbiter, boom or networking"`,
    19  		Args:  cobra.MinimumNArgs(1),
    20  	}
    21  }
    22  
    23  func StartOrbiter(getRv GetRootValues) *cobra.Command {
    24  	var (
    25  		verbose bool
    26  		recur   bool
    27  		deploy  bool
    28  		pprof   bool
    29  		cmd     = &cobra.Command{
    30  			Use:   "orbiter",
    31  			Short: "Launch an orbiter",
    32  			Long:  "Ensures a desired state",
    33  		}
    34  	)
    35  
    36  	flags := cmd.Flags()
    37  	flags.BoolVar(&recur, "recur", true, "Ensure the desired state continously")
    38  	flags.BoolVar(&deploy, "deploy", true, "Ensure Orbiter deployment continously")
    39  	flags.BoolVar(&pprof, "pprof", false, "Start pprof to analyse memory usage")
    40  
    41  	cmd.RunE = func(cmd *cobra.Command, args []string) (err error) {
    42  
    43  		rv := getRv("start", "orbiter", map[string]interface{}{"recur": recur, "depoy": deploy, "pprof": pprof})
    44  		defer rv.ErrFunc(err)
    45  
    46  		if err := orbcfg.IsComplete(rv.OrbConfig); err != nil {
    47  			return err
    48  		}
    49  
    50  		if err := rv.GitClient.Configure(rv.OrbConfig.URL, []byte(rv.OrbConfig.Repokey)); err != nil {
    51  			return err
    52  		}
    53  
    54  		orbiterConfig := &ctrlgitops.OrbiterConfig{
    55  			Recur:         recur,
    56  			Deploy:        deploy,
    57  			Verbose:       verbose,
    58  			Version:       version,
    59  			OrbConfigPath: rv.OrbConfig.Path,
    60  			GitCommit:     gitCommit,
    61  		}
    62  
    63  		if pprof {
    64  			go func() {
    65  				log.Println(http.ListenAndServe("localhost:6060", nil))
    66  			}()
    67  		}
    68  
    69  		return ctrlgitops.Orbiter(rv.Ctx, monitor, orbiterConfig, rv.GitClient)
    70  	}
    71  	return cmd
    72  }
    73  
    74  func StartBoom(getRv GetRootValues) *cobra.Command {
    75  	var (
    76  		metricsAddr string
    77  		cmd         = &cobra.Command{
    78  			Use:   "boom",
    79  			Short: "Launch a boom",
    80  			Long:  "Ensures a desired state",
    81  		}
    82  	)
    83  
    84  	flags := cmd.Flags()
    85  	flags.StringVar(&metricsAddr, "metrics-addr", "", "The address the metric endpoint binds to.")
    86  
    87  	cmd.RunE = func(cmd *cobra.Command, args []string) (err error) {
    88  
    89  		rv := getRv("start", "boom", map[string]interface{}{"metrics-addr": metricsAddr != ""})
    90  		defer rv.ErrFunc(err)
    91  
    92  		monitor.Info("Takeoff Boom")
    93  
    94  		if rv.Gitops {
    95  			return ctrlgitops.Boom(monitor, rv.OrbConfig.Path, version)
    96  		}
    97  		return ctrlcrd.Start(monitor, version, "/boom", metricsAddr, "", ctrlcrd.Boom)
    98  	}
    99  	return cmd
   100  }
   101  
   102  func StartNetworking(getRv GetRootValues) *cobra.Command {
   103  	var (
   104  		metricsAddr string
   105  		cmd         = &cobra.Command{
   106  			Use:   "networking",
   107  			Short: "Launch a networking operator",
   108  			Long:  "Ensures a desired state of networking for an application",
   109  		}
   110  	)
   111  	flags := cmd.Flags()
   112  	flags.StringVar(&metricsAddr, "metrics-addr", "", "The address the metric endpoint binds to.")
   113  
   114  	cmd.RunE = func(cmd *cobra.Command, args []string) (err error) {
   115  		rv := getRv("start", "networking-operator", map[string]interface{}{"metrics-addr": metricsAddr != ""})
   116  		defer rv.ErrFunc(err)
   117  
   118  		monitor := rv.Monitor
   119  		orbConfig := rv.OrbConfig
   120  
   121  		monitor.Info("Takeoff Networking")
   122  
   123  		if rv.Gitops {
   124  
   125  			k8sClient, err := kubernetes.NewK8sClientPathBeforeInCluster(monitor, rv.Kubeconfig)
   126  			if err != nil {
   127  				return err
   128  			}
   129  			return ctrlgitops.Networking(rv.Ctx, monitor, orbConfig.Path, k8sClient, &version)
   130  		} else {
   131  			return ctrlcrd.Start(monitor, version, "/boom", metricsAddr, rv.Kubeconfig, ctrlcrd.Networking)
   132  		}
   133  		return ctrlcrd.Start(monitor, version, "/boom", metricsAddr, rv.Kubeconfig, ctrlcrd.Networking)
   134  	}
   135  	return cmd
   136  }