| package main |
| |
| import ( |
| "errors" |
| "flag" |
| "fmt" |
| "strings" |
| "time" |
| |
| "source.monogon.dev/cloud/equinix/wrapngo" |
| "source.monogon.dev/cloud/shepherd/manager" |
| ) |
| |
| var ( |
| NoSuchKey = errors.New("no such key") |
| ) |
| |
| // providerConfig contains configuration options used by both the Initializer and |
| // Provisioner components of the Shepherd. In CLI scenarios, RegisterFlags should |
| // be called to configure this struct from CLI flags. Otherwise, this structure |
| // should be explicitly configured, as the default values are not valid. |
| type providerConfig struct { |
| // ProjectId is the Equinix project UUID used by the manager. See Equinix API |
| // documentation for details. Must be set. |
| ProjectId string |
| |
| // KeyLabel specifies the ID to use when handling the Equinix-registered SSH |
| // key used to authenticate to newly created servers. Must be set. |
| KeyLabel string |
| |
| // DevicePrefix applied to all devices (machines) created by the Provisioner, |
| // and used by the Provisioner to identify machines which it managed. |
| // Must be set. |
| DevicePrefix string |
| |
| // OS defines the operating system new devices are created with. Its format |
| // is specified by Equinix API. |
| OS string |
| |
| // UseProjectKeys defines if the provisioner adds all ssh keys defined inside |
| // the used project to every new machine. This is only used for debug purposes. |
| UseProjectKeys bool |
| |
| // RebootWaitSeconds defines how many seconds to sleep after a reboot call |
| // to ensure a reboot actually happened. |
| RebootWaitSeconds int |
| |
| // ReservationCacheTimeout defines how after which time the reservations should be |
| // refreshed. |
| ReservationCacheTimeout time.Duration |
| } |
| |
| func (pc *providerConfig) check() error { |
| if pc.ProjectId == "" { |
| return fmt.Errorf("-equinix_project_id must be set") |
| } |
| if pc.KeyLabel == "" { |
| return fmt.Errorf("-equinix_ssh_key_label must be set") |
| } |
| if pc.DevicePrefix == "" { |
| return fmt.Errorf("-equinix_device_prefix must be set") |
| } |
| |
| // These variables are _very_ important to configure correctly, otherwise someone |
| // running this locally with prod creds will actually destroy production |
| // data. |
| if strings.Contains(pc.KeyLabel, "FIXME") { |
| return fmt.Errorf("refusing to run with -equinix_ssh_key_label %q, please set it to something unique", pc.KeyLabel) |
| } |
| if strings.Contains(pc.DevicePrefix, "FIXME") { |
| return fmt.Errorf("refusing to run with -equinix_device_prefix %q, please set it to something unique", pc.DevicePrefix) |
| } |
| |
| return nil |
| } |
| |
| func (pc *providerConfig) RegisterFlags() { |
| flag.StringVar(&pc.ProjectId, "equinix_project_id", "", "Equinix project ID where resources will be managed") |
| flag.StringVar(&pc.KeyLabel, "equinix_ssh_key_label", "shepherd-FIXME", "Label used to identify managed SSH key in Equinix project") |
| flag.StringVar(&pc.DevicePrefix, "equinix_device_prefix", "shepherd-FIXME-", "Prefix applied to all devices (machines) in Equinix project, used to identify managed machines") |
| flag.StringVar(&pc.OS, "equinix_os", "ubuntu_20_04", "OS that provisioner will deploy on Equinix machines. Not the target OS for cluster customers.") |
| flag.BoolVar(&pc.UseProjectKeys, "equinix_use_project_keys", false, "Add all Equinix project keys to newly provisioned machines, not just the provisioner's managed key. Debug/development only.") |
| flag.IntVar(&pc.RebootWaitSeconds, "equinix_reboot_wait_seconds", 30, "How many seconds to sleep to ensure a reboot happend") |
| flag.DurationVar(&pc.ReservationCacheTimeout, "equinix_reservation_cache_timeout", time.Minute*15, "Reservation cache validity timeo") |
| } |
| |
| func (pc *providerConfig) New(sshKey *manager.SSHKey, api wrapngo.Client) (*equinixProvider, error) { |
| if err := pc.check(); err != nil { |
| return nil, err |
| } |
| |
| return &equinixProvider{ |
| config: pc, |
| sshKey: sshKey, |
| api: api, |
| }, nil |
| } |