blob: 550eea36d386deb834c2782e909221abdbcda7cf [file] [log] [blame]
Serge Bazanskicaa12082023-02-16 14:54:04 +01001package main
2
3import (
4 "context"
5 "flag"
6 "fmt"
7 "os"
8 "strings"
9
10 "k8s.io/klog"
11
12 "source.monogon.dev/cloud/bmaas/bmdb"
Serge Bazanski77628312023-02-15 23:33:22 +010013 "source.monogon.dev/cloud/bmaas/bmdb/webug"
Serge Bazanskicaa12082023-02-16 14:54:04 +010014 "source.monogon.dev/cloud/lib/component"
15 "source.monogon.dev/cloud/shepherd/equinix/manager"
16 "source.monogon.dev/cloud/shepherd/equinix/wrapngo"
17 clicontext "source.monogon.dev/metropolis/cli/pkg/context"
18)
19
20type Config struct {
21 Component component.ComponentConfig
22 BMDB bmdb.BMDB
23
24 SharedConfig manager.SharedConfig
25 AgentConfig manager.AgentConfig
26 ProvisionerConfig manager.ProvisionerConfig
27 InitializerConfig manager.InitializerConfig
Serge Bazanski77628312023-02-15 23:33:22 +010028 WebugConfig webug.Config
Serge Bazanskicaa12082023-02-16 14:54:04 +010029 API wrapngo.Opts
30}
31
32// TODO(q3k): factor this out to BMDB library?
33func runtimeInfo() string {
34 hostname, _ := os.Hostname()
35 if hostname == "" {
36 hostname = "UNKNOWN"
37 }
38 return fmt.Sprintf("host %s", hostname)
39}
40
41func (c *Config) RegisterFlags() {
42 c.Component.RegisterFlags("shepherd")
43 c.BMDB.ComponentName = "shepherd-equinix"
44 c.BMDB.RuntimeInfo = runtimeInfo()
45 c.BMDB.Database.RegisterFlags("bmdb")
46
47 c.SharedConfig.RegisterFlags("")
48 c.AgentConfig.RegisterFlags()
49 c.ProvisionerConfig.RegisterFlags()
50 c.InitializerConfig.RegisterFlags()
Serge Bazanski77628312023-02-15 23:33:22 +010051 c.WebugConfig.RegisterFlags()
Serge Bazanskicaa12082023-02-16 14:54:04 +010052 c.API.RegisterFlags()
53}
54
55func main() {
56 c := &Config{}
57 c.RegisterFlags()
58 flag.Parse()
59
60 ctx := clicontext.WithInterrupt(context.Background())
61
62 if c.API.APIKey == "" || c.API.User == "" {
63 klog.Exitf("-equinix_api_username and -equinix_api_key must be set")
64 }
65 api := wrapngo.New(&c.API)
66
67 // These variables are _very_ important to configure correctly, otherwise someone
68 // running this locally with prod creds will actually destroy production
69 // data.
70 if strings.Contains(c.SharedConfig.KeyLabel, "FIXME") {
71 klog.Exitf("refusing to run with -equinix_ssh_key_label %q, please set it to something unique", c.SharedConfig.KeyLabel)
72 }
73 if strings.Contains(c.SharedConfig.DevicePrefix, "FIXME") {
74 klog.Exitf("refusing to run with -equinix_device_prefix %q, please set it to something unique", c.SharedConfig.DevicePrefix)
75 }
76
77 klog.Infof("Ensuring our SSH key is configured...")
78 if err := c.SharedConfig.SSHEquinixEnsure(ctx, api); err != nil {
79 klog.Exitf("Ensuring SSH key failed: %v", err)
80 }
81
82 provisioner, err := c.ProvisionerConfig.New(api, &c.SharedConfig)
83 if err != nil {
84 klog.Exitf("%v", err)
85 }
86
87 initializer, err := c.InitializerConfig.New(api, &c.SharedConfig, &c.AgentConfig)
88 if err != nil {
89 klog.Exitf("%v", err)
90 }
91
92 conn, err := c.BMDB.Open(true)
93 if err != nil {
94 klog.Exitf("Failed to open BMDB connection: %v", err)
95 }
Serge Bazanski77628312023-02-15 23:33:22 +010096
Serge Bazanskicaa12082023-02-16 14:54:04 +010097 go func() {
98 err = provisioner.Run(ctx, conn)
99 if err != nil {
100 klog.Exit(err)
101 }
102 }()
103 go func() {
104 err = initializer.Run(ctx, conn)
105 if err != nil {
106 klog.Exit(err)
107 }
108 }()
Serge Bazanski77628312023-02-15 23:33:22 +0100109 go func() {
110 if err := c.WebugConfig.Start(ctx, conn); err != nil && err != ctx.Err() {
111 klog.Exitf("Failed to start webug: %v", err)
112 }
113 }()
Serge Bazanskicaa12082023-02-16 14:54:04 +0100114
115 <-ctx.Done()
116}