Documentation ¶
Index ¶
- func BootstrapDqlite(ctx context.Context, mgr BootstrapNodeManager, uuid model.UUID, ...) error
- func InsertControllerNodeID(ctx context.Context, runner coredatabase.TxnRunner, nodeID uint64) error
- func IsErrConstraintCheck(err error) bool
- func IsErrConstraintForeignKey(err error) bool
- func IsErrConstraintNotNull(err error) bool
- func IsErrConstraintPrimaryKey(err error) bool
- func IsErrConstraintRowID(err error) bool
- func IsErrConstraintTrigger(err error) bool
- func IsErrConstraintUnique(err error) bool
- func IsErrError(err error) bool
- func IsErrNotFound(err error) bool
- func IsError(err error) bool
- func IsErrorTarget(target any) bool
- func Retry(ctx context.Context, fn func() error) error
- func StdTxn(ctx context.Context, db *sql.DB, fn func(context.Context, *sql.Tx) error) error
- func Txn(ctx context.Context, db *sqlair.DB, fn func(context.Context, *sqlair.TX) error) error
- type BootstrapNodeManager
- type BootstrapOpt
- type DBMigration
- type NodeManager
- func (m *NodeManager) ClusterServers(ctx context.Context) ([]dqlite.NodeInfo, error)
- func (m *NodeManager) EnsureDataDir() (string, error)
- func (m *NodeManager) IsExistingNode() (bool, error)
- func (m *NodeManager) IsLoopbackBound(ctx context.Context) (bool, error)
- func (m *NodeManager) IsLoopbackPreferred() bool
- func (m *NodeManager) NodeInfo() (dqlite.NodeInfo, error)
- func (m *NodeManager) SetClusterServers(ctx context.Context, servers []dqlite.NodeInfo) error
- func (m *NodeManager) SetClusterToLocalNode(ctx context.Context) error
- func (m *NodeManager) SetNodeInfo(server dqlite.NodeInfo) error
- func (m *NodeManager) WithAddressOption(ip string) app.Option
- func (m *NodeManager) WithClusterOption(addrs []string) app.Option
- func (m *NodeManager) WithLogFuncOption() app.Option
- func (m *NodeManager) WithLoopbackAddressOption() app.Option
- func (m *NodeManager) WithPreferredCloudLocalAddressOption(source corenetwork.ConfigSource) (app.Option, error)
- func (m *NodeManager) WithTLSOption() (app.Option, error)
- func (m *NodeManager) WithTracingOption() app.Option
- type NullDuration
- type Schema
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func BootstrapDqlite ¶
func BootstrapDqlite( ctx context.Context, mgr BootstrapNodeManager, uuid model.UUID, logger logger.Logger, opts ...BootstrapOpt, ) error
BootstrapDqlite opens a new database for the controller, and runs the DDL to create its schema.
It accepts an optional list of functions to perform operations on the controller database.
func InsertControllerNodeID ¶
func InsertControllerNodeID(ctx context.Context, runner coredatabase.TxnRunner, nodeID uint64) error
InsertControllerNodeID inserts the node ID of the controller node into the controller_node table.
func IsErrConstraintCheck ¶
IsErrConstraintCheck returns true if the input error was returned by SQLite due to violation of a constraint check.
func IsErrConstraintForeignKey ¶
IsErrConstraintForeignKey returns true if the input error was returned by SQLite due to violation of a constraint foreign key.
func IsErrConstraintNotNull ¶
IsErrConstraintNotNull returns true if the input error was returned by SQLite due to violation of a constraint not null.
func IsErrConstraintPrimaryKey ¶
IsErrConstraintPrimaryKey returns true if the input error was returned by SQLite due to violation of a constraint primary key.
func IsErrConstraintRowID ¶
IsErrConstraintRowID returns true if the input error was returned by SQLite due to violation of a unique constraint.
func IsErrConstraintTrigger ¶
IsErrConstraintTrigger returns true if the input error was returned by SQLite due to violation of a constraint trigger.
func IsErrConstraintUnique ¶
IsErrConstraintUnique returns true if the input error was returned by SQLite due to violation of a unique constraint.
func IsErrError ¶
IsErrError returns true if the input error was returned by SQLite due to a generic error. This is normally used when we can't determine the specific error type. For example: - no such trigger - no such table This is useful when trying to determine if the error is sqlite specific or internal to Juju.
func IsErrNotFound ¶
IsErrNotFound returns true if the input error was returned by SQLite due to a missing record.
func IsError ¶
IsError reports if the any type passed to it is a database driver error in Juju. The purpose of this function is so that our domain error masking can assert if a specific error needs to be hidden from layers above that of the domain/state.
func IsErrorTarget ¶
IsErrorTarget reports if the any type passed to it is a database driver error.
func Retry ¶
Retry defines a generic retry function for applying transactions on a given database. It expects that no individual transaction function should take longer than the default timeout.
This should not be used directly, instead the TxnRunner should be used to handle transactions.
func StdTxn ¶
StdTxn defines a generic txn function for applying transactions on a given database. It expects that no individual transaction function should take longer than the default timeout. There are no retry semantics for running the function.
This should not be used directly, instead the TxnRunner should be used to handle transactions.
func Txn ¶
Txn executes the input function against the tracked database, using the sqlair package. The sqlair package provides a mapping library for SQL queries and statements. Retry semantics are applied automatically based on transient failures. This is the function that almost all downstream database consumers should use.
This should not be used directly, instead the TxnRunner should be used to handle transactions.
Types ¶
type BootstrapNodeManager ¶
type BootstrapNodeManager interface { // EnsureDataDir ensures that a directory for Dqlite data exists at // a path determined by the agent config, then returns that path. EnsureDataDir() (string, error) // IsLoopbackPreferred returns true if the Dqlite application should // be bound to the loopback address. IsLoopbackPreferred() bool // WithLoopbackAddressOption returns a Dqlite application // Option that will bind Dqlite to the loopback IP. WithLoopbackAddressOption() app.Option // WithPreferredCloudLocalAddressOption uses the input network config // source to return a local-cloud address to which to bind Dqlite, // provided that a unique one can be determined. WithPreferredCloudLocalAddressOption(network.ConfigSource) (app.Option, error) // WithTLSOption returns a Dqlite application Option for TLS encryption // of traffic between clients and clustered application nodes. WithTLSOption() (app.Option, error) // WithLogFuncOption returns a Dqlite application Option // that will proxy Dqlite log output via this factory's // logger where the level is recognised. WithLogFuncOption() app.Option // WithTracingOption returns a Dqlite application Option // that will enable tracing of Dqlite operations. WithTracingOption() app.Option }
BootstrapNodeManager is an interface for managing the bootstrap of a Dqlite node.
type BootstrapOpt ¶
type BootstrapOpt func( ctx context.Context, controller, model coredatabase.TxnRunner, ) error
BootstrapOpt is a function run when bootstrapping a database, used to insert initial data into the model.
type DBMigration ¶
type DBMigration struct {
// contains filtered or unexported fields
}
DBMigration is used to apply a series of deltas to a database.
func NewDBMigration ¶
NewDBMigration returns a reference to a new migration that is used to apply the input deltas to the input database. The deltas are applied in the order supplied.
type NodeManager ¶
type NodeManager struct {
// contains filtered or unexported fields
}
NodeManager is responsible for interrogating a single Dqlite node, and emitting configuration for starting its Dqlite `App` based on operational requirements and controller agent config.
func NewNodeManager ¶
func NewNodeManager(cfg agent.Config, isLoopbackPreferred bool, logger logger.Logger, slowQueryLogger coredatabase.SlowQueryLogger) *NodeManager
NewNodeManager returns a new NodeManager reference based on the input agent configuration.
If isLoopbackPreferred is true, we bind Dqlite to 127.0.0.1 and eschew TLS termination. This is useful primarily in unit testing and a temporary workaround for CAAS, which does not yet support enable-ha.
If it is false, we attempt to identify a unique local-cloud address. If we find one, we use it as the bind address. Otherwise, we fall back to the loopback binding.
func (*NodeManager) ClusterServers ¶
ClusterServers returns the node information for Dqlite nodes configured to be in the cluster.
func (*NodeManager) EnsureDataDir ¶
func (m *NodeManager) EnsureDataDir() (string, error)
EnsureDataDir ensures that a directory for Dqlite data exists at a path determined by the agent config, then returns that path.
func (*NodeManager) IsExistingNode ¶
func (m *NodeManager) IsExistingNode() (bool, error)
IsExistingNode returns true if this machine or container has ever started a Dqlite `App` before. Specifically, this is whether the Dqlite data directory is empty.
func (*NodeManager) IsLoopbackBound ¶
func (m *NodeManager) IsLoopbackBound(ctx context.Context) (bool, error)
IsLoopbackBound returns true if we are a cluster of one, and bound to the loopback IP address.
func (*NodeManager) IsLoopbackPreferred ¶
func (m *NodeManager) IsLoopbackPreferred() bool
IsLoopbackPreferred returns true if we should prefer to bind Dqlite to the loopback IP address. This is currently true for CAAS and unit testing. Once CAAS supports enable-ha we'll have to revisit this.
func (*NodeManager) NodeInfo ¶
func (m *NodeManager) NodeInfo() (dqlite.NodeInfo, error)
NodeInfo reads the local node information file in the Dqlite directory and returns the dqlite.NodeInfo represented by its contents.
func (*NodeManager) SetClusterServers ¶
SetClusterServers reconfigures the Dqlite cluster by writing the input servers to Dqlite's Raft log and the local node YAML store. This should only be called on a stopped Dqlite node.
func (*NodeManager) SetClusterToLocalNode ¶
func (m *NodeManager) SetClusterToLocalNode(ctx context.Context) error
SetClusterToLocalNode reconfigures the Dqlite cluster so that it has the local node as its only member. This is intended as a disaster recovery utility, and should only be called: 1. At great need. 2. With steadfast guarantees of data integrity.
func (*NodeManager) SetNodeInfo ¶
func (m *NodeManager) SetNodeInfo(server dqlite.NodeInfo) error
SetNodeInfo rewrites the local node information file in the Dqlite data directory, so that it matches the input NodeInfo. This should only be called on a stopped Dqlite node.
func (*NodeManager) WithAddressOption ¶
func (m *NodeManager) WithAddressOption(ip string) app.Option
WithAddressOption returns a Dqlite application Option for specifying the local address:port to use.
func (*NodeManager) WithClusterOption ¶
func (m *NodeManager) WithClusterOption(addrs []string) app.Option
WithClusterOption returns a Dqlite application Option for initialising Dqlite as the member of a cluster with peers representing other controllers.
func (*NodeManager) WithLogFuncOption ¶
func (m *NodeManager) WithLogFuncOption() app.Option
WithLogFuncOption returns a Dqlite application Option that will proxy Dqlite log output via this factory's logger where the level is recognised.
func (*NodeManager) WithLoopbackAddressOption ¶
func (m *NodeManager) WithLoopbackAddressOption() app.Option
WithLoopbackAddressOption returns a Dqlite application Option that will bind Dqlite to the loopback IP.
func (*NodeManager) WithPreferredCloudLocalAddressOption ¶
func (m *NodeManager) WithPreferredCloudLocalAddressOption(source corenetwork.ConfigSource) (app.Option, error)
WithPreferredCloudLocalAddressOption uses the input network config source to return a local-cloud address to which to bind Dqlite, provided that a unique one can be determined. If there are zero or multiple local-cloud addresses detected on the host, we fall back to binding to the loopback address. This method is only relevant to bootstrap. At all other times (such as when joining a cluster) the bind address is determined externally and passed as the argument to WithAddressOption.
func (*NodeManager) WithTLSOption ¶
func (m *NodeManager) WithTLSOption() (app.Option, error)
WithTLSOption returns a Dqlite application Option for TLS encryption of traffic between clients and clustered application nodes.
func (*NodeManager) WithTracingOption ¶
func (m *NodeManager) WithTracingOption() app.Option
WithTracingOption returns a Dqlite application Option that will enable tracing of Dqlite queries.
type NullDuration ¶
NullDuration represents a nullable time.Duration.
func NewNullDuration ¶
func NewNullDuration(d time.Duration) NullDuration
NewNullDuration returns a new NullDuration with the given duration.
func (*NullDuration) Scan ¶
func (nd *NullDuration) Scan(value interface{}) error
Scan implements the sql.Scanner interface.