Documentation
¶
Index ¶
- Constants
- func DiscoveryRestServer(d Discovery, config *clusterconfig.ReadOnlyConfig, ...) (*http.Server, error)
- func IsClusterNotification(r *http.Request) bool
- type Actor
- type ActorGroup
- type Cluster
- type ContextKey
- type Daemon
- type DaemonServiceRouter
- type DefaultService
- func (DefaultService) Delete(d context.Context, req *http.Request) Response
- func (DefaultService) Get(d context.Context, req *http.Request) Response
- func (DefaultService) Patch(d context.Context, req *http.Request) Response
- func (DefaultService) Post(d context.Context, req *http.Request) Response
- func (DefaultService) Put(d context.Context, req *http.Request) Response
- type Discovery
- type DiscoveryServiceRouter
- type Endpoints
- type EventBroadcaster
- type Facade
- type Gateway
- type Gauge
- type GaugeVec
- type Histogram
- type HistogramVec
- type Metrics
- type Node
- type OS
- type Operations
- type Option
- type RaftInstance
- type Response
- func BadRequest(err error) Response
- func Conflict(err error) Response
- func EmptySyncResponse() Response
- func Forbidden(err error) Response
- func InternalError(err error) Response
- func NotFound(err error) Response
- func NotImplemented(err error) Response
- func PreconditionFailed(err error) Response
- func SmartError(err error) Response
- func SyncResponse(success bool, metadata interface{}) Response
- func SyncResponseETag(success bool, metadata interface{}, eTag interface{}) Response
- func SyncResponseRedirect(address string) Response
- func Unavailable(err error) Response
- type SchedulerTask
- type Schedules
- type Service
- type ServiceRouter
- type State
Constants ¶
const Interval = 60
Interval represents the number of seconds to wait between to heartbeat rounds.
Variables ¶
This section is empty.
Functions ¶
func DiscoveryRestServer ¶
func DiscoveryRestServer( d Discovery, config *clusterconfig.ReadOnlyConfig, services, internalServices []Service, options ...Option, ) (*http.Server, error)
DiscoveryRestServer creates an http.Server capable of handling requests against the REST API endpoint.
func IsClusterNotification ¶
IsClusterNotification returns true if this an API request coming from a cluster node that is notifying us of some user-initiated API request that needs some action to be taken on this node as well.
Types ¶
type Actor ¶
type Actor interface {
// ID returns the unique ID for the actor
ID() string
// Types returns the underlying types the actor subscribes to
Types() []string
// Write pushes information to the actor
Write([]byte) error
// Close the actor
Close()
// NoForward decides if messages should be forwarded to the actor
NoForward() bool
// Done returns if the actor is done messaging.
Done() bool
}
Actor defines an broker between event messages and nodes
type ActorGroup ¶
type ActorGroup interface {
// Add an actor to a group
Add(a Actor)
// Prune removes any done actors
Prune() bool
// Walk over the actors with in the group one by one (order is not
// guaranteed).
Walk(func(Actor) error) error
}
ActorGroup holds a group of actors
type Cluster ¶
type Cluster interface {
database.DBAccessor
db.ClusterOpener
db.ClusterTransactioner
db.ClusterExclusiveLocker
// NodeID sets the the node NodeID associated with this cluster instance. It's used for
// backward-compatibility of all db-related APIs that were written before
// clustering and don't accept a node NodeID, so in those cases we automatically
// use this value as implicit node NodeID.
NodeID(int64)
// SchemaVersion returns the underlying schema version for the cluster
SchemaVersion() int
// Close the database facade.
Close() error
}
Cluster mediates access to data stored in the cluster dqlite database.
type ContextKey ¶
type ContextKey string
ContextKey defines a key that can be used to identify values within a context value.
const ( // DaemonKey represents a way to identify a daemon in a context DaemonKey ContextKey = "daemon" // DiscoveryKey represents a way to identify a service in a context DiscoveryKey ContextKey = "discovery" )
type Daemon ¶
type Daemon interface {
Facade
// Gateway returns the underlying Daemon Gateway
Gateway() Gateway
// Cluster returns the underlying Cluster
Cluster() Cluster
// Node returns the underlying Node associated with the daemon
Node() Node
// State creates a new State instance liked to our internal db and os.
State() State
// Operations return the underlying operational tasks associated with the
// current daemon
Operations() Operations
// Schedules return the underlying schedule tasks associated with the
// cluster
Schedules() Schedules
// ClusterConfigSchema returns the daemon schema for the Cluster
ClusterConfigSchema() config.Schema
// NodeConfigSchema returns the daemon schema for the local Node
NodeConfigSchema() config.Schema
// ActorGroup returns the actor group for event broadcast
ActorGroup() ActorGroup
// EventBroadcaster returns a event broadcaster for event processing
EventBroadcaster() EventBroadcaster
// Version returns the current version of the daemon
Version() string
// Nonce returns the current nonce of the daemon
Nonce() string
// Endpoints returns the underlying endpoints that the daemon controls.
Endpoints() Endpoints
// APIExtensions returns the extensions available to the current daemon
APIExtensions() []string
// UnsafeShutdown forces an automatic shutdown of the Daemon
UnsafeShutdown()
// UnsafeSetCluster forces a cluster onto the daemon.
UnsafeSetCluster(Cluster)
}
Daemon can respond to requests from a shared client.
type DaemonServiceRouter ¶
type DaemonServiceRouter struct {
*ServiceRouter
// contains filtered or unexported fields
}
DaemonServiceRouter creates a wrapper of a underlying router, then allows services to be added and handled.
func NewDaemonServiceRouter ¶
func NewDaemonServiceRouter( d Daemon, mux *mux.Router, clientCerts, clusterCerts func() []x509.Certificate, logger log.Logger, ) *DaemonServiceRouter
NewDaemonServiceRouter creates a ServiceRouter with sane defaults
type DefaultService ¶
type DefaultService struct{}
DefaultService creates a default service that just returns not implemented errors
type Discovery ¶
type Discovery interface {
Facade
// Version returns the current version of the discovery
Version() string
// Endpoints returns the underlying endpoints that the discovery controls.
Endpoints() Endpoints
// UnsafeShutdown forces an automatic shutdown of the Discovery
UnsafeShutdown()
}
Discovery can respond to requests from a shared client.
type DiscoveryServiceRouter ¶
type DiscoveryServiceRouter struct {
*ServiceRouter
// contains filtered or unexported fields
}
DiscoveryServiceRouter creates a wrapper of a underlying router, then allows services to be added and handled.
func NewDiscoveryServiceRouter ¶
func NewDiscoveryServiceRouter( d Discovery, mux *mux.Router, clientCerts, clusterCerts func() []x509.Certificate, logger log.Logger, ) *DiscoveryServiceRouter
NewDiscoveryServiceRouter creates a ServiceRouter with sane defaults
type Endpoints ¶
type Endpoints interface {
// NetworkPublicKey returns the public key of the TLS certificate used by the
// network endpoint.
NetworkPublicKey() []byte
// NetworkPrivateKey returns the private key of the TLS certificate used by the
// network endpoint.
NetworkPrivateKey() []byte
// NetworkCert returns the full TLS certificate information for this endpoint.
NetworkCert() *cert.Info
// NetworkUpdateAddress updates the address for the network endpoint,
// shutting it down and restarting it.
NetworkUpdateAddress(string) error
// PprofUpdateAddress updates the address for the pprof endpoint, shutting
// it down and restarting it.
PprofUpdateAddress(string) error
// NetworkUpdateCert updates the cert for the network endpoint,
// shutting it down and restarting it.
NetworkUpdateCert(*cert.Info) error
}
Endpoints are in charge of bringing up and down the HTTP endpoints for serving the RESTful API.
type EventBroadcaster ¶
type EventBroadcaster interface {
// Dispatch an event to other parts of the underlying system
Dispatch(map[string]interface{}) error
}
EventBroadcaster defines a way to broadcast events to other internal parts of the system.
type Facade ¶
type Facade interface {
// SetupChan returns a channel that blocks until setup has happened from
// the Daemon
SetupChan() <-chan struct{}
// RegisterChan returns a channel that blocks until all the registered tasks
// have happened for the Daemon
RegisterChan() <-chan struct{}
// ClientCerts returns the associated client certificates
ClientCerts() []x509.Certificate
// ClusterCerts returns the associated client certificates
ClusterCerts() []x509.Certificate
// APIMetrics returns a series of metrics, useful for diagnostics.
APIMetrics() Metrics
}
Facade defines a facade to interact with the underlying controller.
type Gateway ¶
type Gateway interface {
// Init the gateway, creating a new raft factory and gRPC server (if this
// node is a database node), and a gRPC dialer.
Init(*cert.Info) error
// Shutdown this gateway, stopping the gRPC server and possibly the raft
// factory.
Shutdown() error
// WaitLeadership will wait for the raft node to become leader. Should only
// be used by Bootstrap, since we know that we'll self elect.
WaitLeadership() error
// RaftNodes returns information about the nodes that a currently
// part of the raft cluster, as configured in the raft log. It returns an
// error if this node is not the leader.
RaftNodes() ([]db.RaftNode, error)
// Raft returns the raft instance
Raft() RaftInstance
// HandlerFuncs returns the HTTP handlers that should be added to the REST API
// endpoint in order to handle database-related requests.
HandlerFuncs() map[string]http.HandlerFunc
// DB returns the the underlying db node
DB() Node
// IsDatabaseNode returns true if this gateway also run acts a raft database
// node.
IsDatabaseNode() bool
// LeaderAddress returns the address of the current raft leader.
LeaderAddress() (string, error)
// Cert returns the currently available cert in the gateway
Cert() *cert.Info
// Reset the gateway, shutting it down and starting against from scratch
// using the given certificate.
//
// This is used when disabling clustering on a node.
Reset(cert *cert.Info) error
// DialFunc returns a dial function that can be used to connect to one of
// the dqlite nodes.
DialFunc() dqlite.DialFunc
// ServerStore returns a dqlite server store that can be used to lookup the
// addresses of known database nodes.
ServerStore() querycluster.ServerStore
// Context returns a cancellation context to pass to dqlite.NewDriver as
// option.
//
// This context gets cancelled by Gateway.Kill() and at that point any
// connection failure won't be retried.
Context() context.Context
}
Gateway mediates access to the dqlite cluster using a gRPC SQL client, and possibly runs a dqlite replica on this node (if we're configured to do so).
type Gauge ¶
type Gauge interface {
// Inc increments the Gauge by 1. Use Add to increment it by arbitrary
// values.
Inc()
}
Gauge is a Metric that represents a single numerical value that can arbitrarily go up and down.
type GaugeVec ¶
type GaugeVec interface {
// WithLabelValues works as GetMetricWithLabelValues, but panics where
// GetMetricWithLabelValues would have returned an error. By not returning an
// error, WithLabelValues allows shortcuts like
// myVec.WithLabelValues("404", "GET").Add(42)
WithLabelValues(lvs ...string) Gauge
}
GaugeVec is a Collector that bundles a set of Gauges that all share the same Desc, but have different values for their variable labels.
type Histogram ¶
type Histogram interface {
// Observe adds a single observation to the histogram.
Observe(float64)
}
A Histogram counts individual observations from an event or sample stream in configurable buckets. Similar to a summary, it also provides a sum of observations and an observation count.
type HistogramVec ¶
type HistogramVec interface {
// WithLabelValues works as GetMetricWithLabelValues, but panics where
// GetMetricWithLabelValues would have returned an error. By not returning an
// error, WithLabelValues allows shortcuts like
// myVec.WithLabelValues("404", "GET").Observe(42.21)
WithLabelValues(lvs ...string) Histogram
}
HistogramVec is a Collector that bundles a set of Histograms that all share the same Desc, but have different values for their variable labels.
type Metrics ¶
type Metrics interface {
APIDuration() HistogramVec
ConnectedClients() GaugeVec
}
Metrics is a collection metrics to use from the daemon
type Node ¶
type Node interface {
database.DBAccessor
db.NodeOpener
db.NodeTransactioner
// Dir returns the directory of the underlying database file.
Dir() string
// Close the database facade.
Close() error
}
Node mediates access to the data stored locally
type OS ¶
type OS interface {
// LocalDatabasePath returns the path of the local database file.
LocalDatabasePath() string
// GlobalDatabaseDir returns the path of the global database directory.
GlobalDatabaseDir() string
// GlobalDatabasePath returns the path of the global database SQLite file
// managed by dqlite.
GlobalDatabasePath() string
// VarDir represents the Data directory (e.g. /var/lib/therm/).
VarDir() string
// Hostname returns the host name reported by the kernel.
Hostname() (string, error)
// HostNames will generate a list of names for which the certificate will be
// valid.
// This will include the hostname and ip address
HostNames() ([]string, error)
// User returns the current user.
User() (*user.User, error)
}
OS is a high-level facade for accessing all operating-system level functionality that therm uses.
type Operations ¶
type Operations interface {
// Add an operation to the collection
Add(*operations.Operation) error
// GetOpByPartialID retrieves an op of the operation from the collection by a
// partial id. As long as the prefix matches an id then it will return that
// operation. If the id matches multiple ids then it will return an ambiguous
// error.
GetOpByPartialID(string) (operations.Op, error)
// DeleteOp attempts to kill an operation by the id
DeleteOp(string) error
// WaitOp for an operation to be completed
WaitOp(string, time.Duration) (bool, error)
// Walk over a collection of operations
Walk(func(operations.Op) error) error
}
Operations defines an interface for interacting with a series of operations
type Option ¶
type Option func(*options)
Option to be passed to Connect to customize the resulting instance.
func WithLogger ¶
WithLogger sets the logger on the option
type RaftInstance ¶
type RaftInstance interface {
// MembershipChanger returns the underlying rafthttp.Layer, which can be
// used to change the membership of this node in the cluster.
MembershipChanger() raftmembership.Changer
}
RaftInstance is a specific wrapper around raft.Raft, which also holds a reference to its network transport and dqlite FSM.
type Response ¶
type Response interface {
// Render the response with a response writer.
Render(http.ResponseWriter) error
}
Response defines a return value from a http request. The response then can be rendered.
func BadRequest ¶
BadRequest takes an error and returns a Response of badrequest error.
func EmptySyncResponse ¶
func EmptySyncResponse() Response
EmptySyncResponse defines an empty successful response
func InternalError ¶
InternalError takes an error and returns a Response of internal server error.
func NotImplemented ¶
NotImplemented takes an error and returns a Response of not implemented.
func PreconditionFailed ¶
PreconditionFailed takes an error and returns a Response of precondition failed error.
func SmartError ¶
SmartError returns the right error message based on err.
func SyncResponse ¶
SyncResponse defines a response that is synchronous
func SyncResponseETag ¶
SyncResponseETag defines a response that can add ETag as additional information
func SyncResponseRedirect ¶
SyncResponseRedirect defines a successful response that will aways perform a permanent redirect.
func Unavailable ¶
Unavailable takes an error and returns a Response of unavailable error.
type SchedulerTask ¶
type SchedulerTask interface {
// Run setups up the given schedule
Run() (task.Func, task.Schedule)
}
SchedulerTask defines a task that can be run repeatedly
func DaemonRestServer ¶
func DaemonRestServer( d Daemon, services, internalServices []Service, options ...Option, ) (*http.Server, SchedulerTask, error)
DaemonRestServer creates an http.Server capable of handling requests against the REST API endpoint.
type Schedules ¶
type Schedules interface {
// Add an task to the schedule
Add(*schedules.Task) error
// Remove a scheduled task
Remove(string) error
// GetTsk returns a scheduled task
GetTsk(string) (schedules.Tsk, error)
// Walk over a set of scheduled tasks
Walk(func(schedules.Tsk) error) error
}
Schedules defines an interface for interacting with a set of scheduled tasks
type Service ¶
type Service interface {
// Get handles GET requests
Get(context.Context, *http.Request) Response
// Put handles PUT requests
Put(context.Context, *http.Request) Response
// Post handles POST requests
Post(context.Context, *http.Request) Response
// Delete handles DELETE requests
Delete(context.Context, *http.Request) Response
// Patch handles PATCH requests
Patch(context.Context, *http.Request) Response
// Name returns the serialisable service name.
// The name has to conform to RFC 3986
Name() string
}
Service represents a endpoint that can perform http actions upon
type ServiceRouter ¶
type ServiceRouter struct {
// contains filtered or unexported fields
}
ServiceRouter creates a wrapper of a underlying router, then allows services to be added and handled.
func (*ServiceRouter) Add ¶
func (s *ServiceRouter) Add(prefix string, service Service)
Add a Service to the DaemonServiceRouter with a prefix (1.0/internal)
func (*ServiceRouter) ServeHTTP ¶
func (s *ServiceRouter) ServeHTTP(w http.ResponseWriter, r *http.Request)
type State ¶
type State interface {
// Node returns the underlying Node
Node() Node
// Cluster returns the underlying Cluster
Cluster() Cluster
// OS returns the underlying OS values
OS() OS
}
State is a gateway to the two main stateful components, the database and the operating system. It's typically used by model entities in order to perform changes.