blob: 0060502e6a22f61d22f9555b2060f3b50b227d87 [file] [log] [blame]
Serge Bazanskicaa12082023-02-16 14:54:04 +01001package main
2
3import (
4 "context"
5 "flag"
6 "fmt"
7 "os"
Serge Bazanskicaa12082023-02-16 14:54:04 +01008
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +02009 "golang.org/x/crypto/ssh"
Tim Windelschmidt44cacd62023-06-12 23:54:45 +020010 "k8s.io/klog/v2"
Serge Bazanskicaa12082023-02-16 14:54:04 +010011
12 "source.monogon.dev/cloud/bmaas/bmdb"
Serge Bazanski77628312023-02-15 23:33:22 +010013 "source.monogon.dev/cloud/bmaas/bmdb/webug"
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020014 "source.monogon.dev/cloud/equinix/wrapngo"
Serge Bazanskicaa12082023-02-16 14:54:04 +010015 "source.monogon.dev/cloud/lib/component"
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020016 "source.monogon.dev/cloud/shepherd/manager"
Tim Windelschmidt5f5f3302024-02-22 23:50:24 +010017 ssh2 "source.monogon.dev/go/net/ssh"
Serge Bazanskicaa12082023-02-16 14:54:04 +010018 clicontext "source.monogon.dev/metropolis/cli/pkg/context"
19)
20
21type Config struct {
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020022 Component component.ComponentConfig
23 BMDB bmdb.BMDB
24 WebugConfig webug.Config
Serge Bazanskicaa12082023-02-16 14:54:04 +010025
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020026 SSHKey manager.SSHKey
Serge Bazanskicaa12082023-02-16 14:54:04 +010027 InitializerConfig manager.InitializerConfig
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020028 ProvisionerConfig manager.ProvisionerConfig
Serge Bazanskiae004682023-04-18 13:28:48 +020029 RecovererConfig manager.RecovererConfig
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020030
31 API wrapngo.Opts
32 Provider providerConfig
33 UpdaterConfig UpdaterConfig
Serge Bazanskicaa12082023-02-16 14:54:04 +010034}
35
36// TODO(q3k): factor this out to BMDB library?
37func runtimeInfo() string {
38 hostname, _ := os.Hostname()
39 if hostname == "" {
40 hostname = "UNKNOWN"
41 }
42 return fmt.Sprintf("host %s", hostname)
43}
44
45func (c *Config) RegisterFlags() {
46 c.Component.RegisterFlags("shepherd")
47 c.BMDB.ComponentName = "shepherd-equinix"
48 c.BMDB.RuntimeInfo = runtimeInfo()
49 c.BMDB.Database.RegisterFlags("bmdb")
Serge Bazanski77628312023-02-15 23:33:22 +010050 c.WebugConfig.RegisterFlags()
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020051
52 c.SSHKey.RegisterFlags()
53 c.InitializerConfig.RegisterFlags()
54 c.ProvisionerConfig.RegisterFlags()
55 c.RecovererConfig.RegisterFlags()
56
Serge Bazanskicaa12082023-02-16 14:54:04 +010057 c.API.RegisterFlags()
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020058 c.Provider.RegisterFlags()
59 c.UpdaterConfig.RegisterFlags()
Serge Bazanskicaa12082023-02-16 14:54:04 +010060}
61
62func main() {
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020063 var c Config
Serge Bazanskicaa12082023-02-16 14:54:04 +010064 c.RegisterFlags()
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020065
Serge Bazanskicaa12082023-02-16 14:54:04 +010066 flag.Parse()
Tim Windelschmidt44cacd62023-06-12 23:54:45 +020067 if flag.NArg() > 0 {
68 klog.Exitf("unexpected positional arguments: %v", flag.Args())
69 }
Serge Bazanskicaa12082023-02-16 14:54:04 +010070
Serge Bazanskic50f6942023-04-24 18:27:22 +020071 registry := c.Component.PrometheusRegistry()
72 c.BMDB.EnableMetrics(registry)
73
Serge Bazanskicaa12082023-02-16 14:54:04 +010074 ctx := clicontext.WithInterrupt(context.Background())
Serge Bazanskifbda89e2023-04-24 17:43:58 +020075 c.Component.StartPrometheus(ctx)
Serge Bazanskicaa12082023-02-16 14:54:04 +010076
77 if c.API.APIKey == "" || c.API.User == "" {
78 klog.Exitf("-equinix_api_username and -equinix_api_key must be set")
79 }
Serge Bazanskidea7cd02023-04-26 13:58:17 +020080 c.API.MetricsRegistry = registry
Serge Bazanskicaa12082023-02-16 14:54:04 +010081 api := wrapngo.New(&c.API)
82
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020083 provider, err := c.Provider.New(&c.SSHKey, api)
Serge Bazanskicaa12082023-02-16 14:54:04 +010084 if err != nil {
85 klog.Exitf("%v", err)
86 }
87
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020088 sshSigner, err := c.SSHKey.Signer()
Serge Bazanskicaa12082023-02-16 14:54:04 +010089 if err != nil {
90 klog.Exitf("%v", err)
91 }
92
Tim Windelschmidt5f5f3302024-02-22 23:50:24 +010093 sshClient := &ssh2.DirectClient{
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020094 AuthMethod: ssh.PublicKeys(sshSigner),
95 // Equinix OS installations always use root.
96 Username: "root",
97 }
98
99 provisioner, err := manager.NewProvisioner(provider, c.ProvisionerConfig)
100 if err != nil {
101 klog.Exitf("%v", err)
102 }
103
104 initializer, err := manager.NewInitializer(provider, sshClient, c.InitializerConfig)
105 if err != nil {
106 klog.Exitf("%v", err)
107 }
108
109 recoverer, err := manager.NewRecoverer(provider, c.RecovererConfig)
Serge Bazanskiae004682023-04-18 13:28:48 +0200110 if err != nil {
111 klog.Exitf("%v", err)
112 }
113
Serge Bazanskiafd3cf82023-04-19 17:43:46 +0200114 updater, err := c.UpdaterConfig.New(api)
115 if err != nil {
116 klog.Exitf("%v", err)
117 }
118
Serge Bazanskicaa12082023-02-16 14:54:04 +0100119 conn, err := c.BMDB.Open(true)
120 if err != nil {
121 klog.Exitf("Failed to open BMDB connection: %v", err)
122 }
Serge Bazanski77628312023-02-15 23:33:22 +0100123
Serge Bazanskicaa12082023-02-16 14:54:04 +0100124 go func() {
125 err = provisioner.Run(ctx, conn)
126 if err != nil {
127 klog.Exit(err)
128 }
129 }()
130 go func() {
Serge Bazanski86a714d2023-04-17 15:54:21 +0200131 err = manager.RunControlLoop(ctx, conn, initializer)
Serge Bazanskicaa12082023-02-16 14:54:04 +0100132 if err != nil {
133 klog.Exit(err)
134 }
135 }()
Serge Bazanski77628312023-02-15 23:33:22 +0100136 go func() {
Serge Bazanskiae004682023-04-18 13:28:48 +0200137 err = manager.RunControlLoop(ctx, conn, recoverer)
138 if err != nil {
139 klog.Exit(err)
140 }
141 }()
142 go func() {
Serge Bazanskiafd3cf82023-04-19 17:43:46 +0200143 err = updater.Run(ctx, conn)
144 if err != nil {
145 klog.Exit(err)
146 }
147 }()
148 go func() {
Serge Bazanski77628312023-02-15 23:33:22 +0100149 if err := c.WebugConfig.Start(ctx, conn); err != nil && err != ctx.Err() {
150 klog.Exitf("Failed to start webug: %v", err)
151 }
152 }()
Serge Bazanskicaa12082023-02-16 14:54:04 +0100153
154 <-ctx.Done()
155}