blob: 3504eb7b7aec69ca579ace6de42276e7546e607a [file] [log] [blame]
package shepherd
import (
"context"
"fmt"
"net/netip"
"source.monogon.dev/cloud/bmaas/bmdb"
"source.monogon.dev/cloud/bmaas/bmdb/model"
)
var ErrMachineNotFound = fmt.Errorf("machine not found")
var ErrNotImplemented = fmt.Errorf("not implemented")
// ProviderID is an opaque unique identifier for a machine within a single
// provider instance. It is generated by the Provider and usually the same
// as the ID of the machine within the system that the Provider managed.
// The Shepherd (and BMaaS in general) requires these IDs to be unique
// within a provider and stable.
type ProviderID string
const InvalidProviderID ProviderID = "invalid"
// IsValid reports whether the ProviderID is valid.
func (p ProviderID) IsValid() bool {
return p != InvalidProviderID
}
// State defines in which state the machine is.
// See the different states for more information.
type State int
const (
// StateUndefined is used as a placeholder to prevent that the default
// value can create any type of bad behaviour.
StateUndefined State = iota
// StatePossiblyUsed defines the state where a machine is possibly used,
// this is a state for use in stateless providers where the shepherd has
// to check against the bmdb if Machine.ID is already provisioned or not.
// These machines must have a valid ID and Addr.
StatePossiblyUsed
// StateKnownUnused defines the state where a machine is know to be free,
// e.g. a hardware reservation at equinix. These machines may not have an
// ID or Addr.
StateKnownUnused
// StateKnownUsed defines the state where a machine is known to be used,
// e.g. a deployed machine that is in use. These machines must have a
// valid ID and Addr.
StateKnownUsed
)
func (s State) String() string {
switch s {
case StateUndefined:
return "Undefined"
case StateKnownUnused:
return "KnownUnused"
case StateKnownUsed:
return "KnownUsed"
case StatePossiblyUsed:
return "PossiblyUsed"
default:
return fmt.Sprintf("<invalid value %d>", s)
}
}
type Machine interface {
// ID returns the provider id, see ProviderID for more information.
ID() ProviderID
// Addr returns the machines ip address that is reachable from the
// shepherd. It is used to connect to the machine via SSH to execute
// all takeover tasks, etc.
Addr() netip.Addr
// State returns the state in which the machine is
State() State
}
type CreateMachineRequest struct {
// UnusedMachine resembles a machine to use as deployment target.
UnusedMachine Machine
}
// Provider is the interface that is used to abstract the interaction between
// the shepherd and machine providers like Equinix. All methods inside this
// interface must not be called concurrently.
type Provider interface {
// ListMachines returns all existing machines for a provider. Machines
// that are still in the state of being created by CreateMachine should
// not be returned.
ListMachines(context.Context) ([]Machine, error)
// GetMachine returns an existing machine for a provider. Machines
// that are still in the state of being created by CreateMachine should
// not be returned. If a there are no machines found after these filters
// an error should be returned.
GetMachine(context.Context, ProviderID) (Machine, error)
// CreateMachine creates a new machine with the given parameters and
// returns the created instance. The provider is required to create the
// entry into the machine table and MachineProvided tag. If there are no
// more machines avaiable, an error should be returned.
CreateMachine(context.Context, *bmdb.Session, CreateMachineRequest) (Machine, error)
// Type returns the value that represents this provider inside the database.
Type() model.Provider
}
type Recoverer interface {
Provider
// RebootMachine tries to bring a machine back from the dead by e.g. rebooting
RebootMachine(context.Context, ProviderID) error
// ReinstallMachine should reinstall the given machine and if the provider
// does not support reinstallation, the function should return an error
// stating this. If reinstalled, the installed tag should be updated to
// allow the reconcile loop to restart the takeover process.
ReinstallMachine(context.Context, ProviderID) error
}