blob: 567ebd765032e69dbfa9005e64779e26b5b6e054 [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"
13 "source.monogon.dev/cloud/lib/component"
14 "source.monogon.dev/cloud/shepherd/equinix/manager"
15 "source.monogon.dev/cloud/shepherd/equinix/wrapngo"
16 clicontext "source.monogon.dev/metropolis/cli/pkg/context"
17)
18
19type Config struct {
20 Component component.ComponentConfig
21 BMDB bmdb.BMDB
22
23 SharedConfig manager.SharedConfig
24 AgentConfig manager.AgentConfig
25 ProvisionerConfig manager.ProvisionerConfig
26 InitializerConfig manager.InitializerConfig
27 API wrapngo.Opts
28}
29
30// TODO(q3k): factor this out to BMDB library?
31func runtimeInfo() string {
32 hostname, _ := os.Hostname()
33 if hostname == "" {
34 hostname = "UNKNOWN"
35 }
36 return fmt.Sprintf("host %s", hostname)
37}
38
39func (c *Config) RegisterFlags() {
40 c.Component.RegisterFlags("shepherd")
41 c.BMDB.ComponentName = "shepherd-equinix"
42 c.BMDB.RuntimeInfo = runtimeInfo()
43 c.BMDB.Database.RegisterFlags("bmdb")
44
45 c.SharedConfig.RegisterFlags("")
46 c.AgentConfig.RegisterFlags()
47 c.ProvisionerConfig.RegisterFlags()
48 c.InitializerConfig.RegisterFlags()
49 c.API.RegisterFlags()
50}
51
52func main() {
53 c := &Config{}
54 c.RegisterFlags()
55 flag.Parse()
56
57 ctx := clicontext.WithInterrupt(context.Background())
58
59 if c.API.APIKey == "" || c.API.User == "" {
60 klog.Exitf("-equinix_api_username and -equinix_api_key must be set")
61 }
62 api := wrapngo.New(&c.API)
63
64 // These variables are _very_ important to configure correctly, otherwise someone
65 // running this locally with prod creds will actually destroy production
66 // data.
67 if strings.Contains(c.SharedConfig.KeyLabel, "FIXME") {
68 klog.Exitf("refusing to run with -equinix_ssh_key_label %q, please set it to something unique", c.SharedConfig.KeyLabel)
69 }
70 if strings.Contains(c.SharedConfig.DevicePrefix, "FIXME") {
71 klog.Exitf("refusing to run with -equinix_device_prefix %q, please set it to something unique", c.SharedConfig.DevicePrefix)
72 }
73
74 klog.Infof("Ensuring our SSH key is configured...")
75 if err := c.SharedConfig.SSHEquinixEnsure(ctx, api); err != nil {
76 klog.Exitf("Ensuring SSH key failed: %v", err)
77 }
78
79 provisioner, err := c.ProvisionerConfig.New(api, &c.SharedConfig)
80 if err != nil {
81 klog.Exitf("%v", err)
82 }
83
84 initializer, err := c.InitializerConfig.New(api, &c.SharedConfig, &c.AgentConfig)
85 if err != nil {
86 klog.Exitf("%v", err)
87 }
88
89 conn, err := c.BMDB.Open(true)
90 if err != nil {
91 klog.Exitf("Failed to open BMDB connection: %v", err)
92 }
93 go func() {
94 err = provisioner.Run(ctx, conn)
95 if err != nil {
96 klog.Exit(err)
97 }
98 }()
99 go func() {
100 err = initializer.Run(ctx, conn)
101 if err != nil {
102 klog.Exit(err)
103 }
104 }()
105
106 <-ctx.Done()
107}