db

package
v0.0.0-...-e623927 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 1, 2018 License: Apache-2.0 Imports: 29 Imported by: 0

Documentation

Index

Constants

View Source
const (
	StoragePoolVolumeTypeContainer = iota
	StoragePoolVolumeTypeImage
	StoragePoolVolumeTypeCustom
)

XXX: this was extracted from lxd/storage_volume_utils.go, we find a way to

factor it independently from both the db and main packages.
View Source
const (
	StoragePoolVolumeTypeNameContainer string = "container"
	StoragePoolVolumeTypeNameImage     string = "image"
	StoragePoolVolumeTypeNameCustom    string = "custom"
)

Leave the string type in here! This guarantees that go treats this is as a typed string constant. Removing it causes go to treat these as untyped string constants which is not what we want.

View Source
const DefaultOfflineThreshold = 20

DefaultOfflineThreshold is the default value for the cluster.offline_threshold configuration key, expressed in seconds.

Variables

View Source
var (
	// DbErrAlreadyDefined hapens when the given entry already exists,
	// for example a container.
	DbErrAlreadyDefined = fmt.Errorf("The container/snapshot already exists")

	/* NoSuchObjectError is in the case of joins (and probably other) queries,
	 * we don't get back sql.ErrNoRows when no rows are returned, even though we do
	 * on selects without joins. Instead, you can use this error to
	 * propagate up and generate proper 404s to the client when something
	 * isn't found so we don't abuse sql.ErrNoRows any more than we
	 * already do.
	 */
	NoSuchObjectError = fmt.Errorf("No such object")

	Upgrading = fmt.Errorf("The cluster database is upgrading")
)
View Source
var ErrSomeNodesAreBehind = fmt.Errorf("some nodes are behind this node's version")

ErrSomeNodesAreBehind is returned by OpenCluster if some of the nodes in the cluster have a schema or API version that is less recent than this node.

View Source
var ImageSourceProtocol = map[int]string{
	0: "lxd",
	1: "direct",
	2: "simplestreams",
}
View Source
var NetworkNodeConfigKeys = []string{
	"bridge.external_interfaces",
}

NetworkNodeConfigKeys lists all network config keys which are node-specific.

View Source
var StoragePoolNodeConfigKeys = []string{
	"size",
	"source",
	"volatile.initial_source",
}

StoragePoolNodeConfigKeys lists all storage pool config keys which are node-specific.

Functions

func ConfigValueSet

func ConfigValueSet(cluster *Cluster, key string, value string) error

func ContainerConfigClear

func ContainerConfigClear(tx *sql.Tx, id int) error

func ContainerConfigInsert

func ContainerConfigInsert(tx *sql.Tx, id int, config map[string]string) error

func ContainerProfilesInsert

func ContainerProfilesInsert(tx *sql.Tx, id int, profiles []string) error

func ContainerUpdate

func ContainerUpdate(tx *sql.Tx, id int, description string, architecture int, ephemeral bool) error

func DevicesAdd

func DevicesAdd(tx *sql.Tx, w string, cID int64, devices types.Devices) error

func NetworkConfigClear

func NetworkConfigClear(tx *sql.Tx, networkID, nodeID int64) error

func NetworkUpdateDescription

func NetworkUpdateDescription(tx *sql.Tx, id int64, description string) error

func OpenNode

func OpenNode(dir string, fresh func(*Node) error, legacyPatches map[int]*LegacyPatch) (*Node, *Dump, error)

OpenNode creates a new Node object.

The fresh hook parameter is used by the daemon to mark all known patch names as applied when a brand new database is created.

The legacyPatches parameter is used as a mean to apply the legacy V10, V11, V15, V29 and V30 non-db updates during the database upgrade sequence, to avoid any change in semantics wrt the old logic (see PR #3322).

Return the newly created Node object, and a Dump of the pre-clustering data if we've migrating to a cluster-aware version.

func ProfileConfigAdd

func ProfileConfigAdd(tx *sql.Tx, id int64, config map[string]string) error

func ProfileConfigClear

func ProfileConfigClear(tx *sql.Tx, id int64) error

func ProfileDescriptionUpdate

func ProfileDescriptionUpdate(tx *sql.Tx, id int64, description string) error

func StoragePoolConfigClear

func StoragePoolConfigClear(tx *sql.Tx, poolID, nodeID int64) error

Delete storage pool config.

func StoragePoolUpdateDescription

func StoragePoolUpdateDescription(tx *sql.Tx, id int64, description string) error

Update the storage pool description.

func StoragePoolVolumeTypeToName

func StoragePoolVolumeTypeToName(volumeType int) (string, error)

StoragePoolVolumeTypeToName converts a volume integer type code to its human-readable name.

func StorageVolumeConfigAdd

func StorageVolumeConfigAdd(tx *sql.Tx, volumeID int64, volumeConfig map[string]string) error

Add new storage volume config into database.

func StorageVolumeConfigClear

func StorageVolumeConfigClear(tx *sql.Tx, volumeID int64) error

Delete storage volume config.

func StorageVolumeDescriptionUpdate

func StorageVolumeDescriptionUpdate(tx *sql.Tx, volumeID int64, description string) error

Update description of a storage volume.

func TxCommit

func TxCommit(tx *sql.Tx) error

func UpdateSchemasDotGo

func UpdateSchemasDotGo() error

UpdateSchemasDotGo updates the schema.go files in the local/ and cluster/ sub-packages.

Types

type CertInfo

type CertInfo struct {
	ID          int
	Fingerprint string
	Type        int
	Name        string
	Certificate string
}

CertInfo is here to pass the certificates content from the database around

type Cluster

type Cluster struct {
	// contains filtered or unexported fields
}

Cluster mediates access to LXD's data stored in the cluster dqlite database.

func ForLocalInspection

func ForLocalInspection(db *sql.DB) *Cluster

ForLocalInspection is a aid for the hack in initializeDbObject, which sets the db-related Deamon attributes upfront, to be backward compatible with the legacy patches that need to interact with the database.

func NewTestCluster

func NewTestCluster(t *testing.T) (*Cluster, func())

NewTestCluster creates a new Cluster for testing purposes, along with a function that can be used to clean it up when done.

func OpenCluster

func OpenCluster(name string, dialer grpcsql.Dialer, address string) (*Cluster, error)

OpenCluster creates a new Cluster object for interacting with the dqlite database.

- name: Basename of the database file holding the data. Typically "db.bin". - dialer: Function used to connect to the dqlite backend via gRPC SQL. - address: Network address of this node (or empty string). - api: Number of API extensions that this node supports.

The address and api parameters will be used to determine if the cluster database matches our version, and possibly trigger a schema update. If the schema update can't be performed right now, because some nodes are still behind, an Upgrading error is returned.

func (*Cluster) Begin

func (c *Cluster) Begin() (*sql.Tx, error)

Begin a new transaction against the cluster database.

FIXME: legacy method.

func (*Cluster) CertDelete

func (c *Cluster) CertDelete(fingerprint string) error

CertDelete deletes a certificate from the db.

func (*Cluster) CertSave

func (c *Cluster) CertSave(cert *CertInfo) error

CertSave stores a CertBaseInfo object in the db, it will ignore the ID field from the CertInfo.

func (*Cluster) CertUpdate

func (c *Cluster) CertUpdate(fingerprint string, certName string, certType int) error

func (*Cluster) CertificateGet

func (c *Cluster) CertificateGet(fingerprint string) (cert *CertInfo, err error)

CertificateGet gets an CertBaseInfo object from the database. The argument fingerprint will be queried with a LIKE query, means you can pass a shortform and will get the full fingerprint. There can never be more than one image with a given fingerprint, as it is enforced by a UNIQUE constraint in the schema.

func (*Cluster) CertificatesGet

func (c *Cluster) CertificatesGet() (certs []*CertInfo, err error)

CertificatesGet returns all certificates from the DB as CertBaseInfo objects.

func (*Cluster) Close

func (c *Cluster) Close() error

Close the database facade.

func (*Cluster) ContainerConfig

func (c *Cluster) ContainerConfig(containerId int) (map[string]string, error)

ContainerConfig gets the container configuration map from the DB

func (*Cluster) ContainerConfigGet

func (c *Cluster) ContainerConfigGet(id int, key string) (string, error)

func (*Cluster) ContainerConfigRemove

func (c *Cluster) ContainerConfigRemove(id int, name string) error

func (*Cluster) ContainerCreate

func (c *Cluster) ContainerCreate(args ContainerArgs) (int, error)

func (*Cluster) ContainerGet

func (c *Cluster) ContainerGet(name string) (ContainerArgs, error)

func (*Cluster) ContainerGetSnapshots

func (c *Cluster) ContainerGetSnapshots(name string) ([]string, error)

func (*Cluster) ContainerId

func (c *Cluster) ContainerId(name string) (int, error)

func (*Cluster) ContainerLastUsedUpdate

func (c *Cluster) ContainerLastUsedUpdate(id int, date time.Time) error

func (*Cluster) ContainerName

func (c *Cluster) ContainerName(id int) (string, error)

func (*Cluster) ContainerNextSnapshot

func (c *Cluster) ContainerNextSnapshot(name string) int

* Note, the code below doesn't deal with snapshots of snapshots. * To do that, we'll need to weed out based on # slashes in names

func (*Cluster) ContainerPool

func (c *Cluster) ContainerPool(containerName string) (string, error)

Get the storage pool of a given container.

func (*Cluster) ContainerProfiles

func (c *Cluster) ContainerProfiles(containerId int) ([]string, error)

Get a list of profiles for a given container id.

func (*Cluster) ContainerRemove

func (c *Cluster) ContainerRemove(name string) error

func (*Cluster) ContainerRename

func (c *Cluster) ContainerRename(oldName string, newName string) error

func (*Cluster) ContainerSetState

func (c *Cluster) ContainerSetState(id int, state string) error

func (*Cluster) ContainerSetStateful

func (c *Cluster) ContainerSetStateful(id int, stateful bool) error

func (*Cluster) ContainersList

func (c *Cluster) ContainersList(cType ContainerType) ([]string, error)

func (*Cluster) ContainersResetState

func (c *Cluster) ContainersResetState() error

func (*Cluster) DB

func (c *Cluster) DB() *sql.DB

DB returns the low level database handle to the cluster database.

FIXME: this is used for compatibility with some legacy code, and should be

dropped once there are no call sites left.

func (*Cluster) Devices

func (c *Cluster) Devices(qName string, isprofile bool) (types.Devices, error)

func (*Cluster) EnterExclusive

func (c *Cluster) EnterExclusive() error

EnterExclusive acquires a lock on the cluster db, so any successive call to Transaction will block until ExitExclusive has been called.

func (*Cluster) ExitExclusive

func (c *Cluster) ExitExclusive(f func(*ClusterTx) error) error

ExitExclusive runs the given transaction and then releases the lock acquired with EnterExclusive.

func (*Cluster) ImageAliasAdd

func (c *Cluster) ImageAliasAdd(name string, imageID int, desc string) error

Insert an alias ento the database.

func (*Cluster) ImageAliasDelete

func (c *Cluster) ImageAliasDelete(name string) error

func (*Cluster) ImageAliasGet

func (c *Cluster) ImageAliasGet(name string, isTrustedClient bool) (int, api.ImageAliasesEntry, error)

func (*Cluster) ImageAliasRename

func (c *Cluster) ImageAliasRename(id int, name string) error

func (*Cluster) ImageAliasUpdate

func (c *Cluster) ImageAliasUpdate(id int, imageID int, desc string) error

func (*Cluster) ImageAliasesGet

func (c *Cluster) ImageAliasesGet() ([]string, error)

func (*Cluster) ImageAliasesMove

func (c *Cluster) ImageAliasesMove(source int, destination int) error

func (*Cluster) ImageAssociateNode

func (c *Cluster) ImageAssociateNode(fingerprint string) error

ImageAssociateNode creates a new entry in the images_nodes table for tracking that the current node has the given image.

func (*Cluster) ImageDelete

func (c *Cluster) ImageDelete(id int) error

func (*Cluster) ImageExists

func (c *Cluster) ImageExists(fingerprint string) (bool, error)

Whether an image with the given fingerprint exists.

func (*Cluster) ImageGet

func (c *Cluster) ImageGet(fingerprint string, public bool, strictMatching bool) (int, *api.Image, error)

ImageGet gets an Image object from the database. If strictMatching is false, The fingerprint argument will be queried with a LIKE query, means you can pass a shortform and will get the full fingerprint. There can never be more than one image with a given fingerprint, as it is enforced by a UNIQUE constraint in the schema.

func (*Cluster) ImageGetPoolNamesFromIDs

func (c *Cluster) ImageGetPoolNamesFromIDs(poolIDs []int64) ([]string, error)

Get the names of all storage pools on which a given image exists.

func (*Cluster) ImageGetPools

func (c *Cluster) ImageGetPools(imageFingerprint string) ([]int64, error)

Get the names of all storage pools on which a given image exists.

func (*Cluster) ImageInsert

func (c *Cluster) ImageInsert(fp string, fname string, sz int64, public bool, autoUpdate bool, architecture string, createdAt time.Time, expiresAt time.Time, properties map[string]string) error

func (*Cluster) ImageLastAccessInit

func (c *Cluster) ImageLastAccessInit(fingerprint string) error

func (*Cluster) ImageLastAccessUpdate

func (c *Cluster) ImageLastAccessUpdate(fingerprint string, date time.Time) error

func (*Cluster) ImageLocate

func (c *Cluster) ImageLocate(fingerprint string) (string, error)

ImageLocate returns the address of an online node that has a local copy of the given image, or an empty string if the image is already available on this node.

If the image is not available on any online node, an error is returned.

func (*Cluster) ImageSourceGet

func (c *Cluster) ImageSourceGet(imageId int) (int, api.ImageSource, error)

func (*Cluster) ImageSourceGetCachedFingerprint

func (c *Cluster) ImageSourceGetCachedFingerprint(server string, protocol string, alias string) (string, error)

Try to find a source entry of a locally cached image that matches the given remote details (server, protocol and alias). Return the fingerprint linked to the matching entry, if any.

func (*Cluster) ImageSourceInsert

func (c *Cluster) ImageSourceInsert(imageId int, server string, protocol string, certificate string, alias string) error

func (*Cluster) ImageUpdate

func (c *Cluster) ImageUpdate(id int, fname string, sz int64, public bool, autoUpdate bool, architecture string, createdAt time.Time, expiresAt time.Time, properties map[string]string) error

func (*Cluster) ImageUploadedAt

func (c *Cluster) ImageUploadedAt(id int, uploadedAt time.Time) error

ImageUploadedAt updates the upload_date column and an image row.

func (*Cluster) ImagesGet

func (c *Cluster) ImagesGet(public bool) ([]string, error)

func (*Cluster) ImagesGetExpired

func (c *Cluster) ImagesGetExpired(expiry int64) ([]string, error)

func (*Cluster) ImportPreClusteringData

func (c *Cluster) ImportPreClusteringData(dump *Dump) error

ImportPreClusteringData imports the data loaded with LoadPreClusteringData.

func (*Cluster) NetworkConfigGet

func (c *Cluster) NetworkConfigGet(id int64) (map[string]string, error)

func (*Cluster) NetworkCreate

func (c *Cluster) NetworkCreate(name, description string, config map[string]string) (int64, error)

func (*Cluster) NetworkDelete

func (c *Cluster) NetworkDelete(name string) error

func (*Cluster) NetworkGet

func (c *Cluster) NetworkGet(name string) (int64, *api.Network, error)

func (*Cluster) NetworkGetInterface

func (c *Cluster) NetworkGetInterface(devName string) (int64, *api.Network, error)

func (*Cluster) NetworkRename

func (c *Cluster) NetworkRename(oldName string, newName string) error

func (*Cluster) NetworkUpdate

func (c *Cluster) NetworkUpdate(name, description string, config map[string]string) error

func (*Cluster) Networks

func (c *Cluster) Networks() ([]string, error)

func (*Cluster) NetworksNotPending

func (c *Cluster) NetworksNotPending() ([]string, error)

NetworksNotPending returns the names of all networks that are not pending.

func (*Cluster) NodeID

func (c *Cluster) NodeID(id int64)

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.

func (*Cluster) ProfileCleanupLeftover

func (c *Cluster) ProfileCleanupLeftover() error

func (*Cluster) ProfileConfig

func (c *Cluster) ProfileConfig(name string) (map[string]string, error)

Get the profile configuration map from the DB

func (*Cluster) ProfileContainersGet

func (c *Cluster) ProfileContainersGet(profile string) ([]string, error)

func (*Cluster) ProfileCreate

func (c *Cluster) ProfileCreate(profile string, description string, config map[string]string,
	devices types.Devices) (int64, error)

func (*Cluster) ProfileCreateDefault

func (c *Cluster) ProfileCreateDefault() error

func (*Cluster) ProfileDelete

func (c *Cluster) ProfileDelete(name string) error

func (*Cluster) ProfileGet

func (c *Cluster) ProfileGet(name string) (int64, *api.Profile, error)

func (*Cluster) ProfileUpdate

func (c *Cluster) ProfileUpdate(name string, newName string) error

func (*Cluster) Profiles

func (c *Cluster) Profiles() ([]string, error)

Profiles returns a string list of profiles.

func (*Cluster) StoragePoolConfigGet

func (c *Cluster) StoragePoolConfigGet(poolID int64) (map[string]string, error)

Get config of a storage pool.

func (*Cluster) StoragePoolCreate

func (c *Cluster) StoragePoolCreate(poolName string, poolDescription string, poolDriver string, poolConfig map[string]string) (int64, error)

Create new storage pool.

func (*Cluster) StoragePoolDelete

func (c *Cluster) StoragePoolDelete(poolName string) (*api.StoragePool, error)

Delete storage pool.

func (*Cluster) StoragePoolGet

func (c *Cluster) StoragePoolGet(poolName string) (int64, *api.StoragePool, error)

Get a single storage pool.

func (*Cluster) StoragePoolGetID

func (c *Cluster) StoragePoolGetID(poolName string) (int64, error)

Get id of a single storage pool.

func (*Cluster) StoragePoolInsertZfsDriver

func (c *Cluster) StoragePoolInsertZfsDriver() error

func (*Cluster) StoragePoolNodeVolumeGetType

func (c *Cluster) StoragePoolNodeVolumeGetType(volumeName string, volumeType int, poolID int64) (int64, *api.StorageVolume, error)

Get a single storage volume attached to a given storage pool of a given type, on the current node.

func (*Cluster) StoragePoolNodeVolumeGetTypeID

func (c *Cluster) StoragePoolNodeVolumeGetTypeID(volumeName string, volumeType int, poolID int64) (int64, error)

Get ID of a storage volume on a given storage pool of a given storage volume type, on the current node.

func (*Cluster) StoragePoolNodeVolumesGet

func (c *Cluster) StoragePoolNodeVolumesGet(poolID int64, volumeTypes []int) ([]*api.StorageVolume, error)

Get all storage volumes attached to a given storage pool on the current node.

func (*Cluster) StoragePoolNodeVolumesGetType

func (c *Cluster) StoragePoolNodeVolumesGetType(volumeType int, poolID int64) ([]string, error)

Get all storage volumes attached to a given storage pool of a given volume type, on the current node.

func (*Cluster) StoragePoolUpdate

func (c *Cluster) StoragePoolUpdate(poolName, description string, poolConfig map[string]string) error

Update storage pool.

func (*Cluster) StoragePoolVolumeCreate

func (c *Cluster) StoragePoolVolumeCreate(volumeName, volumeDescription string, volumeType int, poolID int64, volumeConfig map[string]string) (int64, error)

Create new storage volume attached to a given storage pool.

func (*Cluster) StoragePoolVolumeDelete

func (c *Cluster) StoragePoolVolumeDelete(volumeName string, volumeType int, poolID int64) error

Delete storage volume attached to a given storage pool.

func (*Cluster) StoragePoolVolumeGetType

func (c *Cluster) StoragePoolVolumeGetType(volumeName string, volumeType int, poolID, nodeID int64) (int64, *api.StorageVolume, error)

StoragePoolVolumeGetType returns a single storage volume attached to a given storage pool of a given type, on the node with the given ID.

func (*Cluster) StoragePoolVolumeGetTypeID

func (c *Cluster) StoragePoolVolumeGetTypeID(volumeName string, volumeType int, poolID, nodeID int64) (int64, error)

StoragePoolVolumeGetTypeID returns the ID of a storage volume on a given storage pool of a given storage volume type, on the given node.

func (*Cluster) StoragePoolVolumeRename

func (c *Cluster) StoragePoolVolumeRename(oldVolumeName string, newVolumeName string, volumeType int, poolID int64) error

Rename storage volume attached to a given storage pool.

func (*Cluster) StoragePoolVolumeUpdate

func (c *Cluster) StoragePoolVolumeUpdate(volumeName string, volumeType int, poolID int64, volumeDescription string, volumeConfig map[string]string) error

Update storage volume attached to a given storage pool.

func (*Cluster) StoragePoolVolumesGet

func (c *Cluster) StoragePoolVolumesGet(poolID int64, volumeTypes []int) ([]*api.StorageVolume, error)

StoragePoolVolumesGet returns all storage volumes attached to a given storage pool on any node.

func (*Cluster) StoragePoolVolumesGetNames

func (c *Cluster) StoragePoolVolumesGetNames(poolID int64) (int, error)

Get the names of all storage volumes attached to a given storage pool.

func (*Cluster) StoragePoolVolumesGetType

func (c *Cluster) StoragePoolVolumesGetType(volumeType int, poolID, nodeID int64) ([]string, error)

StoragePoolVolumesGetType get all storage volumes attached to a given storage pool of a given volume type, on the given node.

func (*Cluster) StoragePools

func (c *Cluster) StoragePools() ([]string, error)

Get all storage pools.

func (*Cluster) StoragePoolsGetDrivers

func (c *Cluster) StoragePoolsGetDrivers() ([]string, error)

Get the names of all storage volumes attached to a given storage pool.

func (*Cluster) StoragePoolsNotPending

func (c *Cluster) StoragePoolsNotPending() ([]string, error)

StoragePoolsNotPending returns the names of all storage pools that are not pending.

func (*Cluster) StorageVolumeCleanupImages

func (c *Cluster) StorageVolumeCleanupImages(fingerprints []string) error

func (*Cluster) StorageVolumeConfigGet

func (c *Cluster) StorageVolumeConfigGet(volumeID int64) (map[string]string, error)

Get config of a storage volume.

func (*Cluster) StorageVolumeDescriptionGet

func (c *Cluster) StorageVolumeDescriptionGet(volumeID int64) (string, error)

Get the description of a storage volume.

func (*Cluster) StorageVolumeMoveToLVMThinPoolNameKey

func (c *Cluster) StorageVolumeMoveToLVMThinPoolNameKey() error

func (*Cluster) StorageVolumeNodeGet

func (c *Cluster) StorageVolumeNodeGet(volumeID int64) (string, error)

StorageVolumeNodeGet returns the name of the node a storage volume is on.

func (*Cluster) Transaction

func (c *Cluster) Transaction(f func(*ClusterTx) error) error

Transaction creates a new ClusterTx object and transactionally executes the cluster database interactions invoked by the given function. If the function returns no error, all database changes are committed to the cluster database database, otherwise they are rolled back.

If EnterExclusive has been called before, calling Transaction will block until ExitExclusive has been called as well to release the lock.

type ClusterTx

type ClusterTx struct {
	// contains filtered or unexported fields
}

ClusterTx models a single interaction with a LXD cluster database.

It wraps low-level sql.Tx objects and offers a high-level API to fetch and update data.

func NewTestClusterTx

func NewTestClusterTx(t *testing.T) (*ClusterTx, func())

NewTestClusterTx returns a fresh ClusterTx object, along with a function that can be called to cleanup state when done with it.

func (*ClusterTx) Config

func (c *ClusterTx) Config() (map[string]string, error)

Config fetches all LXD cluster config keys.

func (*ClusterTx) ContainerNodeAddress

func (c *ClusterTx) ContainerNodeAddress(name string) (string, error)

ContainerNodeAddress returns the address of the node hosting the container with the given name.

It returns the empty string if the container is hosted on this node.

func (*ClusterTx) ContainersByNodeName

func (c *ClusterTx) ContainersByNodeName() (map[string]string, error)

ContainersByNodeName returns a map associating each container to the name of its node.

func (*ClusterTx) ContainersListByNodeAddress

func (c *ClusterTx) ContainersListByNodeAddress() (map[string][]string, error)

ContainersListByNodeAddress returns the names of all containers grouped by cluster node address.

The node address of containers running on the local node is set to the empty string, to distinguish it from remote nodes.

Containers whose node is down are addeded to the special address "0.0.0.0".

func (*ClusterTx) NetworkConfigAdd

func (c *ClusterTx) NetworkConfigAdd(networkID, nodeID int64, config map[string]string) error

NetworkConfigAdd adds a new entry in the networks_config table

func (*ClusterTx) NetworkConfigs

func (c *ClusterTx) NetworkConfigs() (map[string]map[string]string, error)

NetworkConfigs returns a map associating each network name to its config values.

func (*ClusterTx) NetworkCreatePending

func (c *ClusterTx) NetworkCreatePending(node, name string, conf map[string]string) error

NetworkCreatePending creates a new pending network on the node with the given name.

func (*ClusterTx) NetworkCreated

func (c *ClusterTx) NetworkCreated(name string) error

NetworkCreated sets the state of the given network to "Created".

func (*ClusterTx) NetworkErrored

func (c *ClusterTx) NetworkErrored(name string) error

NetworkErrored sets the state of the given network to "Errored".

func (*ClusterTx) NetworkID

func (c *ClusterTx) NetworkID(name string) (int64, error)

NetworkID returns the ID of the network with the given name.

func (*ClusterTx) NetworkIDsNotPending

func (c *ClusterTx) NetworkIDsNotPending() (map[string]int64, error)

NetworkIDsNotPending returns a map associating each network name to its ID.

Pending networks are skipped.

func (*ClusterTx) NetworkNodeConfigs

func (c *ClusterTx) NetworkNodeConfigs(networkID int64) (map[string]map[string]string, error)

NetworkNodeConfigs returns the node-specific configuration of all nodes grouped by node name, for the given networkID.

If the network is not defined on all nodes, an error is returned.

func (*ClusterTx) NetworkNodeJoin

func (c *ClusterTx) NetworkNodeJoin(networkID, nodeID int64) error

NetworkNodeJoin adds a new entry in the networks_nodes table.

It should only be used when a new node joins the cluster, when it's safe to assume that the relevant network has already been created on the joining node, and we just need to track it.

func (*ClusterTx) NodeAdd

func (c *ClusterTx) NodeAdd(name string, address string) (int64, error)

NodeAdd adds a node to the current list of LXD nodes that are part of the cluster. It returns the ID of the newly inserted row.

func (*ClusterTx) NodeAddress

func (c *ClusterTx) NodeAddress() (string, error)

NodeAddress returns the address of the node this method is invoked on.

func (*ClusterTx) NodeByAddress

func (c *ClusterTx) NodeByAddress(address string) (NodeInfo, error)

NodeByAddress returns the node with the given network address.

func (*ClusterTx) NodeByName

func (c *ClusterTx) NodeByName(name string) (NodeInfo, error)

NodeByName returns the node with the given name.

func (*ClusterTx) NodeClear

func (c *ClusterTx) NodeClear(id int64) error

NodeClear removes any container or image associated with this node.

func (*ClusterTx) NodeHeartbeat

func (c *ClusterTx) NodeHeartbeat(address string, heartbeat time.Time) error

NodeHeartbeat updates the heartbeat column of the node with the given address.

func (*ClusterTx) NodeID

func (c *ClusterTx) NodeID(id int64)

NodeID sets the the node NodeID associated with this cluster transaction.

func (*ClusterTx) NodeIsEmpty

func (c *ClusterTx) NodeIsEmpty(id int64) (string, error)

NodeIsEmpty returns an empty string if the node with the given ID has no containers or images associated with it. Otherwise, it returns a message say what's left.

func (*ClusterTx) NodeName

func (c *ClusterTx) NodeName() (string, error)

NodeName returns the name of the node this method is invoked on.

func (*ClusterTx) NodeOfflineThreshold

func (c *ClusterTx) NodeOfflineThreshold() (time.Duration, error)

NodeOfflineThreshold returns the amount of time that needs to elapse after which a series of unsuccessful heartbeat will make the node be considered offline.

func (*ClusterTx) NodePending

func (c *ClusterTx) NodePending(id int64, pending bool) error

NodePending toggles the pending flag for the node. A node is pending when it's been accepted in the cluster, but has not yet actually joined it.

func (*ClusterTx) NodePendingByAddress

func (c *ClusterTx) NodePendingByAddress(address string) (NodeInfo, error)

NodePendingByAddress returns the pending node with the given network address.

func (*ClusterTx) NodeRemove

func (c *ClusterTx) NodeRemove(id int64) error

NodeRemove removes the node with the given id.

func (*ClusterTx) NodeRename

func (c *ClusterTx) NodeRename(old, new string) error

NodeRename changes the name of an existing node.

Return an error if a node with the same name already exists.

func (*ClusterTx) NodeUpdate

func (c *ClusterTx) NodeUpdate(id int64, name string, address string) error

NodeUpdate updates the name an address of a node.

func (*ClusterTx) Nodes

func (c *ClusterTx) Nodes() ([]NodeInfo, error)

Nodes returns all LXD nodes part of the cluster.

If this LXD instance is not clustered, a list with a single node whose address is 0.0.0.0 is returned.

func (*ClusterTx) NodesCount

func (c *ClusterTx) NodesCount() (int, error)

NodesCount returns the number of nodes in the LXD cluster.

Since there's always at least one node row, even when not-clustered, the return value is greater than zero

func (*ClusterTx) OperationAdd

func (c *ClusterTx) OperationAdd(uuid string) (int64, error)

OperationAdd adds a new operations to the table.

func (*ClusterTx) OperationByUUID

func (c *ClusterTx) OperationByUUID(uuid string) (Operation, error)

OperationByUUID returns the operation with the given UUID.

func (*ClusterTx) OperationRemove

func (c *ClusterTx) OperationRemove(uuid string) error

OperationRemove removes the operation with the given UUID.

func (*ClusterTx) OperationsUUIDs

func (c *ClusterTx) OperationsUUIDs() ([]string, error)

OperationsUUIDs returns the UUIDs of all operations associated with this node.

func (*ClusterTx) StoragePoolConfigAdd

func (c *ClusterTx) StoragePoolConfigAdd(poolID, nodeID int64, config map[string]string) error

StoragePoolConfigAdd adds a new entry in the storage_pools_config table

func (*ClusterTx) StoragePoolConfigs

func (c *ClusterTx) StoragePoolConfigs() (map[string]map[string]string, error)

StoragePoolConfigs returns a map associating each storage pool name to its config values.

The config values are the ones defined for the node this function is run on. They are used by cluster.Join when a new node joins the cluster and its configuration needs to be migrated to the cluster database.

func (*ClusterTx) StoragePoolCreatePending

func (c *ClusterTx) StoragePoolCreatePending(node, name, driver string, conf map[string]string) error

StoragePoolCreatePending creates a new pending storage pool on the node with the given name.

func (*ClusterTx) StoragePoolCreated

func (c *ClusterTx) StoragePoolCreated(name string) error

StoragePoolCreated sets the state of the given pool to "Created".

func (*ClusterTx) StoragePoolErrored

func (c *ClusterTx) StoragePoolErrored(name string) error

StoragePoolErrored sets the state of the given pool to "Errored".

func (*ClusterTx) StoragePoolID

func (c *ClusterTx) StoragePoolID(name string) (int64, error)

StoragePoolID returns the ID of the pool with the given name.

func (*ClusterTx) StoragePoolIDsNotPending

func (c *ClusterTx) StoragePoolIDsNotPending() (map[string]int64, error)

StoragePoolIDsNotPending returns a map associating each storage pool name to its ID.

Pending storage pools are skipped.

func (*ClusterTx) StoragePoolNodeConfigs

func (c *ClusterTx) StoragePoolNodeConfigs(poolID int64) (map[string]map[string]string, error)

StoragePoolNodeConfigs returns the node-specific configuration of all nodes grouped by node name, for the given poolID.

If the storage pool is not defined on all nodes, an error is returned.

func (*ClusterTx) StoragePoolNodeJoin

func (c *ClusterTx) StoragePoolNodeJoin(poolID, nodeID int64) error

StoragePoolNodeJoin adds a new entry in the storage_pools_nodes table.

It should only be used when a new node joins the cluster, when it's safe to assume that the relevant pool has already been created on the joining node, and we just need to track it.

func (*ClusterTx) StorageVolumeNodeAddresses

func (c *ClusterTx) StorageVolumeNodeAddresses(poolID int64, name string, typ int) ([]string, error)

StorageVolumeNodeAddresses returns the addresses of all nodes on which the volume with the given name if defined.

The empty string is used in place of the address of the current node.

func (*ClusterTx) UpdateConfig

func (c *ClusterTx) UpdateConfig(values map[string]string) error

UpdateConfig updates the given LXD cluster configuration keys in the config table. Config keys set to empty values will be deleted.

type ContainerArgs

type ContainerArgs struct {
	// Don't set manually
	Id   int
	Node string

	Description  string
	Architecture int
	BaseImage    string
	Config       map[string]string
	CreationDate time.Time
	LastUsedDate time.Time
	Ctype        ContainerType
	Devices      types.Devices
	Ephemeral    bool
	Name         string
	Profiles     []string
	Stateful     bool
}

ContainerArgs is a value object holding all db-related details about a container.

type ContainerType

type ContainerType int

ContainerType encodes the type of container (either regular or snapshot).

const (
	CTypeRegular  ContainerType = 0
	CTypeSnapshot ContainerType = 1
)

type Dump

type Dump struct {
	// Map table names to the names or their columns.
	Schema map[string][]string

	// Map a table name to all the rows it contains. Each row is a slice
	// of interfaces.
	Data map[string][][]interface{}
}

Dump is a dump of all the user data in lxd.db prior the migration to the cluster db.

func LoadPreClusteringData

func LoadPreClusteringData(tx *sql.Tx) (*Dump, error)

LoadPreClusteringData loads all the data that before the introduction of LXD clustering used to live in the node-level database.

This is used for performing a one-off data migration when a LXD instance is upgraded from a version without clustering to a version that supports clustering, since in those version all data lives in the cluster database (regardless of whether clustering is actually on or off).

type LegacyPatch

type LegacyPatch struct {
	NeedsDB bool                // Whether the patch does any DB-related work
	Hook    func(*sql.DB) error // The actual patch logic
}

LegacyPatch is a "database" update that performs non-database work. They are needed for historical reasons, since there was a time were db updates could do non-db work and depend on functionality external to the db package. See UpdatesApplyAll below.

type Node

type Node struct {
	// contains filtered or unexported fields
}

Node mediates access to LXD's data stored in the node-local SQLite database.

func ForLegacyPatches

func ForLegacyPatches(db *sql.DB) *Node

ForLegacyPatches is a aid for the hack in initializeDbObject, which sets the db-related Deamon attributes upfront, to be backward compatible with the legacy patches that need to interact with the database.

func NewTestNode

func NewTestNode(t *testing.T) (*Node, func())

NewTestNode creates a new Node for testing purposes, along with a function that can be used to clean it up when done.

func (*Node) Begin

func (n *Node) Begin() (*sql.Tx, error)

Begin a new transaction against the local database. Legacy method.

func (*Node) Close

func (n *Node) Close() error

Close the database facade.

func (*Node) DB

func (n *Node) DB() *sql.DB

DB returns the low level database handle to the node-local SQLite database.

FIXME: this is used for compatibility with some legacy code, and should be

dropped once there are no call sites left.

func (*Node) Dir

func (n *Node) Dir() string

Dir returns the directory of the underlying SQLite database file.

func (*Node) Patches

func (n *Node) Patches() ([]string, error)

func (*Node) PatchesMarkApplied

func (n *Node) PatchesMarkApplied(patch string) error

func (*Node) Transaction

func (n *Node) Transaction(f func(*NodeTx) error) error

Transaction creates a new NodeTx object and transactionally executes the node-level database interactions invoked by the given function. If the function returns no error, all database changes are committed to the node-level database, otherwise they are rolled back.

type NodeInfo

type NodeInfo struct {
	ID            int64     // Stable node identifier
	Name          string    // User-assigned name of the node
	Address       string    // Network address of the node
	Description   string    // Node description (optional)
	Schema        int       // Schema version of the LXD code running the node
	APIExtensions int       // Number of API extensions of the LXD code running on the node
	Heartbeat     time.Time // Timestamp of the last heartbeat
}

NodeInfo holds information about a single LXD instance in a cluster.

func (NodeInfo) IsOffline

func (n NodeInfo) IsOffline(threshold time.Duration) bool

IsOffline returns true if the last successful heartbeat time of the node is older than the given threshold.

func (NodeInfo) Version

func (n NodeInfo) Version() [2]int

Version returns the node's version, composed by its schema level and number of extensions.

type NodeTx

type NodeTx struct {
	// contains filtered or unexported fields
}

NodeTx models a single interaction with a LXD node-local database.

It wraps low-level sql.Tx objects and offers a high-level API to fetch and update data.

func NewTestNodeTx

func NewTestNodeTx(t *testing.T) (*NodeTx, func())

NewTestNodeTx returns a fresh NodeTx object, along with a function that can be called to cleanup state when done with it.

func (*NodeTx) Config

func (n *NodeTx) Config() (map[string]string, error)

Config fetches all LXD node-level config keys.

func (*NodeTx) RaftNodeAdd

func (n *NodeTx) RaftNodeAdd(address string) (int64, error)

RaftNodeAdd adds a node to the current list of LXD nodes that are part of the dqlite Raft cluster. It returns the ID of the newly inserted row.

func (*NodeTx) RaftNodeAddress

func (n *NodeTx) RaftNodeAddress(id int64) (string, error)

RaftNodeAddress returns the address of the LXD raft node with the given ID, if any matching row exists.

func (*NodeTx) RaftNodeAddresses

func (n *NodeTx) RaftNodeAddresses() ([]string, error)

RaftNodeAddresses returns the addresses of all LXD nodes that are members of the dqlite Raft cluster (possibly including the local node). If this LXD instance is not running in clustered mode, an empty list is returned.

func (*NodeTx) RaftNodeDelete

func (n *NodeTx) RaftNodeDelete(id int64) error

RaftNodeDelete removes a node from the current list of LXD nodes that are part of the dqlite Raft cluster.

func (*NodeTx) RaftNodeFirst

func (n *NodeTx) RaftNodeFirst(address string) error

RaftNodeFirst adds a the first node if the cluster. It ensures that the database ID is 1, to match the server ID of first raft log entry.

This method is supposed to be called when there are no rows in raft_nodes, and it will replace whatever existing row has ID 1.

func (*NodeTx) RaftNodes

func (n *NodeTx) RaftNodes() ([]RaftNode, error)

RaftNodes returns information about all LXD nodes that are members of the dqlite Raft cluster (possibly including the local node). If this LXD instance is not running in clustered mode, an empty list is returned.

func (*NodeTx) RaftNodesReplace

func (n *NodeTx) RaftNodesReplace(nodes []RaftNode) error

RaftNodesReplace replaces the current list of raft nodes.

func (*NodeTx) Tx

func (n *NodeTx) Tx() *sql.Tx

Tx returns the low level database handle to the node-local SQLite transaction.

FIXME: this is a transitional method needed for compatibility with some

legacy call sites. It should be removed when there are no more
consumers.

func (*NodeTx) UpdateConfig

func (n *NodeTx) UpdateConfig(values map[string]string) error

UpdateConfig updates the given LXD node-level configuration keys in the config table. Config keys set to empty values will be deleted.

type Operation

type Operation struct {
	ID          int64  // Stable database identifier
	UUID        string // User-visible identifier
	NodeAddress string // Address of the node the operation is running on
}

Operation holds information about a single LXD operation running on a node in the cluster.

type RaftNode

type RaftNode struct {
	ID      int64  // Stable node identifier
	Address string // Network address of the node
}

RaftNode holds information about a single node in the dqlite raft cluster.

Directories

Path Synopsis
Package query implements helpers around database/sql to execute various kinds of very common SQL queries.
Package query implements helpers around database/sql to execute various kinds of very common SQL queries.
Package schema offers utilities to create and maintain a database schema.
Package schema offers utilities to create and maintain a database schema.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL