db

package
v0.0.0-...-f4e8587 Latest Latest
Warning

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

Go to latest
Published: Jul 25, 2019 License: Apache-2.0 Imports: 28 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 (
	// ErrAlreadyDefined hapens when the given entry already exists,
	// for example a container.
	ErrAlreadyDefined = fmt.Errorf("The container/snapshot already exists")

	// ErrNoSuchObject 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.
	ErrNoSuchObject = fmt.Errorf("No such object")
)
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",
}

ImageSourceProtocol maps image source protocol codes to human-readable names.

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",
	"zfs.pool_name",
	"lvm.thinpool",
	"lvm.vg_name",
}

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

Functions

func ConfigValueSet

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

ConfigValueSet is a convenience to set a cluster-level key/value config pair in a single transaction.

func ContainerConfigClear

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

ContainerConfigClear removes any config associated with the container with the given ID.

func ContainerConfigInsert

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

ContainerConfigInsert inserts a new config for the container with the given ID.

func ContainerProfilesInsert

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

ContainerProfilesInsert associates the container with the given ID with the profiles with the given names in the given project.

func ContainerUpdate

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

ContainerUpdate updates the description, architecture and ephemeral flag of the container with the given ID.

func DevicesAdd

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

DevicesAdd adds a new device.

func NetworkConfigClear

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

NetworkConfigClear resets the config of the network with the given ID associated with the node with the given ID.

func NetworkUpdateDescription

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

NetworkUpdateDescription updates the description of the network with the given ID.

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

ProfileConfigAdd adds a config to the profile with the given ID.

func ProfileConfigClear

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

ProfileConfigClear resets the config of the profile with the given ID.

func ProfileDescriptionUpdate

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

ProfileDescriptionUpdate updates the description of the profile with the given ID.

func ProfileToAPI

func ProfileToAPI(profile *Profile) *api.Profile

ProfileToAPI is a convenience to convert a Profile db struct into an API profile struct.

func ProfilesExpandConfig

func ProfilesExpandConfig(config map[string]string, profiles []api.Profile) map[string]string

ProfilesExpandConfig expands the given container config with the config values of the given profiles.

func ProfilesExpandDevices

func ProfilesExpandDevices(devices types.Devices, profiles []api.Profile) types.Devices

ProfilesExpandDevices expands the given container devices with the devices defined in the given profiles.

func StoragePoolConfigClear

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

StoragePoolConfigClear deletes the storage pool config.

func StoragePoolUpdateDescription

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

StoragePoolUpdateDescription updates 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

StorageVolumeConfigAdd adds a new storage volume config into database.

func StorageVolumeConfigClear

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

StorageVolumeConfigClear deletes storage volume config.

func StorageVolumeDescriptionUpdate

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

StorageVolumeDescriptionUpdate updates the description of a storage volume.

func TxCommit

func TxCommit(tx *sql.Tx) error

TxCommit commits the given transaction.

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 ForLocalInspectionWithPreparedStmts

func ForLocalInspectionWithPreparedStmts(db *sql.DB) (*Cluster, error)

ForLocalInspectionWithPreparedStmts is the same as ForLocalInspection but it also prepares the statements used in auto-generated database code.

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, store dqlite.ServerStore, address, dir string, timeout time.Duration, options ...dqlite.DriverOption) (*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). - dir: Base LXD database directory (e.g. /var/lib/lxd/database)

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

CertUpdate updates the certificate with the given fingerprint.

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) ContainerBackupCreate

func (c *Cluster) ContainerBackupCreate(args ContainerBackupArgs) error

ContainerBackupCreate creates a new backup

func (*Cluster) ContainerBackupID

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

ContainerBackupID returns the ID of the container backup with the given name.

func (*Cluster) ContainerBackupRemove

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

ContainerBackupRemove removes the container backup with the given name from the database.

func (*Cluster) ContainerBackupRename

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

ContainerBackupRename renames a container backup from the given current name to the new one.

func (*Cluster) ContainerBackupsGetExpired

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

ContainerBackupsGetExpired returns a list of expired container backups.

func (*Cluster) ContainerConfig

func (c *Cluster) ContainerConfig(id 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)

ContainerConfigGet returns the value of the given key in the configuration of the container with the given ID.

func (*Cluster) ContainerConfigRemove

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

ContainerConfigRemove removes the given key from the config of the container with the given ID.

func (*Cluster) ContainerCreationUpdate

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

ContainerCreationUpdate updates the cration_date field of the container with the given ID.

func (*Cluster) ContainerGetBackup

func (c *Cluster) ContainerGetBackup(project, name string) (ContainerBackupArgs, error)

ContainerGetBackup returns the backup with the given name.

func (*Cluster) ContainerGetBackups

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

ContainerGetBackups returns the names of all backups of the container with the given name.

func (*Cluster) ContainerGetSnapshots

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

ContainerGetSnapshots returns the names of all snapshots of the container in the given project with the given name.

func (*Cluster) ContainerID

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

ContainerID returns the ID of the container with the given name.

func (*Cluster) ContainerLastUsedUpdate

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

ContainerLastUsedUpdate updates the last_use_date field of the container with the given ID.

func (*Cluster) ContainerNextSnapshot

func (c *Cluster) ContainerNextSnapshot(project string, name string, pattern string) int

ContainerNextSnapshot returns the index the next snapshot of the container with the given name and pattern should have.

func (*Cluster) ContainerPool

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

ContainerPool returns the storage pool of a given container.

This is a non-transactional variant of ClusterTx.ContainerPool().

func (*Cluster) ContainerProfiles

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

ContainerProfiles returns a list of profiles for a given container ID.

func (*Cluster) ContainerProjectAndName

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

ContainerProjectAndName returns the project and the name of the container with the given ID.

func (*Cluster) ContainerRemove

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

ContainerRemove removes the container with the given name from the database.

func (*Cluster) ContainerSetState

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

ContainerSetState sets the the power state of the container with the given ID.

func (*Cluster) ContainerSetStateful

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

ContainerSetStateful toggles the stateful flag of the container with the given ID.

func (*Cluster) ContainersNodeList

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

ContainersNodeList returns the names of all the containers of the given type running on the local node.

func (*Cluster) ContainersResetState

func (c *Cluster) ContainersResetState() error

ContainersResetState resets the power state of all containers.

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(project, qName string, isprofile bool) (types.Devices, error)

Devices returns the devices matching the given filters.

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(project, name string, imageID int, desc string) error

ImageAliasAdd inserts an alias ento the database.

func (*Cluster) ImageAliasDelete

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

ImageAliasDelete deletes the alias with the given name.

func (*Cluster) ImageAliasGet

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

ImageAliasGet returns the alias with the given name in the given project.

func (*Cluster) ImageAliasRename

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

ImageAliasRename renames the alias with the given ID.

func (*Cluster) ImageAliasUpdate

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

ImageAliasUpdate updates the alias with the given ID.

func (*Cluster) ImageAliasesGet

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

ImageAliasesGet returns the names of the aliases of all images.

func (*Cluster) ImageAliasesMove

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

ImageAliasesMove changes the image ID associated with an alias.

func (*Cluster) ImageAssociateNode

func (c *Cluster) ImageAssociateNode(project, 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

ImageDelete deletes the image with the given ID.

func (*Cluster) ImageExists

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

ImageExists returns whether an image with the given fingerprint exists.

func (*Cluster) ImageGet

func (c *Cluster) ImageGet(project, 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) ImageGetFromAnyProject

func (c *Cluster) ImageGetFromAnyProject(fingerprint string) (int, *api.Image, error)

ImageGetFromAnyProject returns an image matching the given fingerprint, if it exists in any project.

func (*Cluster) ImageGetNodesWithImage

func (c *Cluster) ImageGetNodesWithImage(fingerprint string) ([]string, error)

ImageGetNodesWithImage returns the addresses of online nodes which already have the image.

func (*Cluster) ImageGetNodesWithoutImage

func (c *Cluster) ImageGetNodesWithoutImage(fingerprint string) ([]string, error)

ImageGetNodesWithoutImage returns the addresses of online nodes which don't have the image.

func (*Cluster) ImageGetPoolNamesFromIDs

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

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

func (*Cluster) ImageGetPools

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

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

func (*Cluster) ImageInsert

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

ImageInsert inserts a new image.

func (*Cluster) ImageIsReferencedByOtherProjects

func (c *Cluster) ImageIsReferencedByOtherProjects(project string, fingerprint string) (bool, error)

ImageIsReferencedByOtherProjects returns true if the image with the given fingerprint is referenced by projects other than the given one.

func (*Cluster) ImageLastAccessInit

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

ImageLastAccessInit inits the last_use_date field of the image with the given fingerprint.

func (*Cluster) ImageLastAccessUpdate

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

ImageLastAccessUpdate updates the last_use_date field of the image with the given fingerprint.

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)

ImageSourceGet returns the image source with the given ID.

func (*Cluster) ImageSourceGetCachedFingerprint

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

ImageSourceGetCachedFingerprint tries 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(id int, server string, protocol string, certificate string, alias string) error

ImageSourceInsert inserts a new image source.

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

ImageUpdate updates the image with the given ID.

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(project string, public bool) ([]string, error)

ImagesGet returns the names of all images (optionally only the public ones).

func (*Cluster) ImagesGetByNodeID

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

ImagesGetByNodeID returns all images that the LXD node instance has with the given node id.

func (*Cluster) ImagesGetExpired

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

ImagesGetExpired returns the names of all images that have expired since the given time.

func (*Cluster) ImagesGetOnCurrentNode

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

ImagesGetOnCurrentNode returns all images that the current LXD node instance has.

func (*Cluster) ImportPreClusteringData

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

ImportPreClusteringData imports the data loaded with LoadPreClusteringData.

func (*Cluster) LegacyContainersList

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

LegacyContainersList returns the names of all the containers of the given type.

NOTE: this is a pre-projects legacy API that is used only by patches. Don't use it for new code.

func (*Cluster) NetworkConfigGet

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

NetworkConfigGet returns the config map of the network with the given ID.

func (*Cluster) NetworkCreate

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

NetworkCreate creates a new network.

func (*Cluster) NetworkDelete

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

NetworkDelete deletes the network with the given name.

func (*Cluster) NetworkGet

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

NetworkGet returns the network with the given name.

func (*Cluster) NetworkGetInterface

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

NetworkGetInterface returns the network associated with the interface with the given name.

func (*Cluster) NetworkRename

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

NetworkRename renames a network.

func (*Cluster) NetworkUpdate

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

NetworkUpdate updates the network with the given name.

func (*Cluster) Networks

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

Networks returns the names of existing networks.

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

ProfileCleanupLeftover removes unreferenced profiles.

func (*Cluster) ProfileConfig

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

ProfileConfig gets the profile configuration map from the DB.

func (*Cluster) ProfileContainersGet

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

ProfileContainersGet gets the names of the containers associated with the profile with the given name.

func (*Cluster) ProfileGet

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

ProfileGet returns the profile with the given name.

func (*Cluster) Profiles

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

Profiles returns a string list of profiles.

func (*Cluster) ProfilesGet

func (c *Cluster) ProfilesGet(project string, names []string) ([]api.Profile, error)

ProfilesGet returns the profiles with the given names in the given project.

func (*Cluster) SetDefaultTimeout

func (c *Cluster) SetDefaultTimeout(timeout time.Duration)

SetDefaultTimeout sets the default go-dqlite driver timeout.

func (*Cluster) StoragePoolConfigGet

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

StoragePoolConfigGet returns the config of a storage pool.

func (*Cluster) StoragePoolCreate

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

StoragePoolCreate creates new storage pool.

func (*Cluster) StoragePoolDelete

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

StoragePoolDelete deletes storage pool.

func (*Cluster) StoragePoolGet

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

StoragePoolGet returns a single storage pool.

func (*Cluster) StoragePoolGetID

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

StoragePoolGetID returns the id of a single storage pool.

func (*Cluster) StoragePoolInsertZfsDriver

func (c *Cluster) StoragePoolInsertZfsDriver() error

StoragePoolInsertZfsDriver replaces the driver of all storage pools without a driver, setting it to 'zfs'.

func (*Cluster) StoragePoolNodeVolumeGetType

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

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

func (*Cluster) StoragePoolNodeVolumeGetTypeByProject

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

StoragePoolNodeVolumeGetTypeByProject gets a single storage volume attached to a given storage pool of a given type, on the current node in the given project.

func (*Cluster) StoragePoolNodeVolumeGetTypeID

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

StoragePoolNodeVolumeGetTypeID get the 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)

StoragePoolNodeVolumesGet returns 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)

StoragePoolNodeVolumesGetType returns 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

StoragePoolUpdate updates a storage pool.

func (*Cluster) StoragePoolVolumeCreate

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

StoragePoolVolumeCreate creates a new storage volume attached to a given storage pool.

func (*Cluster) StoragePoolVolumeDelete

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

StoragePoolVolumeDelete deletes the storage volume attached to a given storage pool.

func (*Cluster) StoragePoolVolumeGetType

func (c *Cluster) StoragePoolVolumeGetType(project string, 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(project string, 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(project, oldVolumeName string, newVolumeName string, volumeType int, poolID int64) error

StoragePoolVolumeRename renames the storage volume attached to a given storage pool.

func (*Cluster) StoragePoolVolumeSnapshotsGetType

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

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

func (*Cluster) StoragePoolVolumeUpdate

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

StoragePoolVolumeUpdate updates the storage volume attached to a given storage pool.

func (*Cluster) StoragePoolVolumesGet

func (c *Cluster) StoragePoolVolumesGet(project string, 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) ([]string, error)

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

func (*Cluster) StoragePoolVolumesGetType

func (c *Cluster) StoragePoolVolumesGetType(project string, 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)

StoragePools returns the names of all storage pools.

func (*Cluster) StoragePoolsGetDrivers

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

StoragePoolsGetDrivers returns 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

StorageVolumeCleanupImages removes the volumes with the given fingerprints.

func (*Cluster) StorageVolumeConfigGet

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

StorageVolumeConfigGet gets the config of a storage volume.

func (*Cluster) StorageVolumeDescriptionGet

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

StorageVolumeDescriptionGet gets the description of a storage volume.

func (*Cluster) StorageVolumeIsAvailable

func (c *Cluster) StorageVolumeIsAvailable(pool, volume string) (bool, error)

StorageVolumeIsAvailable checks that if a custom volume available for being attached.

Always return true for non-Ceph volumes.

For Ceph volumes, return true if the volume is either not attached to any other container, or attached to containers on this node.

func (*Cluster) StorageVolumeMoveToLVMThinPoolNameKey

func (c *Cluster) StorageVolumeMoveToLVMThinPoolNameKey() error

StorageVolumeMoveToLVMThinPoolNameKey upgrades the config keys of LVM volumes.

func (*Cluster) StorageVolumeNextSnapshot

func (c *Cluster) StorageVolumeNextSnapshot(name string, typ int) int

StorageVolumeNextSnapshot returns the index the next snapshot of the storage volume with the given name should have.

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) 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) ContainerConfigInsert

func (c *ClusterTx) ContainerConfigInsert(id int, config map[string]string) error

ContainerConfigInsert inserts a new config for the container with the given ID.

func (*ClusterTx) ContainerConfigRef

func (c *ClusterTx) ContainerConfigRef(filter ContainerFilter) (map[string]map[string]map[string]string, error)

ContainerConfigRef returns entities used by containers.

func (*ClusterTx) ContainerConfigUpdate

func (c *ClusterTx) ContainerConfigUpdate(id int, values map[string]string) error

ContainerConfigUpdate inserts/updates/deletes the provided keys

func (*ClusterTx) ContainerCreate

func (c *ClusterTx) ContainerCreate(object Container) (int64, error)

ContainerCreate adds a new container to the database.

func (*ClusterTx) ContainerDelete

func (c *ClusterTx) ContainerDelete(project string, name string) error

ContainerDelete deletes the container matching the given key parameters.

func (*ClusterTx) ContainerDevicesRef

func (c *ClusterTx) ContainerDevicesRef(filter ContainerFilter) (map[string]map[string]map[string]map[string]string, error)

ContainerDevicesRef returns entities used by containers.

func (*ClusterTx) ContainerExists

func (c *ClusterTx) ContainerExists(project string, name string) (bool, error)

ContainerExists checks if a container with the given key exists.

func (*ClusterTx) ContainerGet

func (c *ClusterTx) ContainerGet(project string, name string) (*Container, error)

ContainerGet returns the container with the given key.

func (*ClusterTx) ContainerGetSnapshotsFull

func (c *ClusterTx) ContainerGetSnapshotsFull(project string, name string) ([]Container, error)

ContainerGetSnapshotsFull returns all container objects for snapshots of a given container

func (*ClusterTx) ContainerID

func (c *ClusterTx) ContainerID(project string, name string) (int64, error)

ContainerID return the ID of the container with the given key.

func (*ClusterTx) ContainerList

func (c *ClusterTx) ContainerList(filter ContainerFilter) ([]Container, error)

ContainerList returns all available containers.

func (*ClusterTx) ContainerListExpanded

func (c *ClusterTx) ContainerListExpanded() ([]Container, error)

ContainerListExpanded loads all containers across all projects and expands their config and devices using the profiles they are associated to.

func (*ClusterTx) ContainerNames

func (c *ClusterTx) ContainerNames(project string) ([]string, error)

ContainerNames returns the names of all containers the given project.

func (*ClusterTx) ContainerNodeAddress

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

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

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

func (*ClusterTx) ContainerNodeList

func (c *ClusterTx) ContainerNodeList() ([]Container, error)

ContainerNodeList returns all container objects on the local node.

func (*ClusterTx) ContainerNodeMove

func (c *ClusterTx) ContainerNodeMove(oldName, newName, newNode string) error

ContainerNodeMove changes the node associated with a container.

It's meant to be used when moving a non-running container backed by ceph from one cluster node to another.

func (*ClusterTx) ContainerNodeProjectList

func (c *ClusterTx) ContainerNodeProjectList(project string) ([]Container, error)

ContainerNodeProjectList returns all container objects on the local node within the given project.

func (*ClusterTx) ContainerPool

func (c *ClusterTx) ContainerPool(project, containerName string) (string, error)

ContainerPool returns the storage pool of a given container.

func (*ClusterTx) ContainerProfilesRef

func (c *ClusterTx) ContainerProfilesRef(filter ContainerFilter) (map[string]map[string][]string, error)

ContainerProfilesRef returns entities used by containers.

func (*ClusterTx) ContainerRename

func (c *ClusterTx) ContainerRename(project string, name string, to string) error

ContainerRename renames the container matching the given key parameters.

func (*ClusterTx) ContainersByNodeName

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

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

func (*ClusterTx) ContainersListByNodeAddress

func (c *ClusterTx) ContainersListByNodeAddress(project string) (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) 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) NetworksNodeConfig

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

NetworksNodeConfig returns a map associating each network name to its node-specific config values (i.e. the ones where node_id is not NULL).

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) NodeIsOutdated

func (c *ClusterTx) NodeIsOutdated() (bool, error)

NodeIsOutdated returns true if there's some cluster node having an API or schema version greater than the node this method is invoked on.

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) NodeUpdateVersion

func (c *ClusterTx) NodeUpdateVersion(id int64, version [2]int) error

NodeUpdateVersion updates the schema and API version of the node with the given id. This is used only in tests.

func (*ClusterTx) NodeWithLeastContainers

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

NodeWithLeastContainers returns the name of the non-offline node with with the least number of containers (either already created or being created with an operation).

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(project, uuid string, typ OperationType) (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) OperationNodes

func (c *ClusterTx) OperationNodes(project string) ([]string, error)

OperationNodes returns a list of nodes that have running operations

func (*ClusterTx) OperationRemove

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

OperationRemove removes the operation with the given UUID.

func (*ClusterTx) Operations

func (c *ClusterTx) Operations() ([]Operation, error)

Operations returns all operations associated with this node.

func (*ClusterTx) OperationsUUIDs

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

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

func (*ClusterTx) ProfileConfigRef

func (c *ClusterTx) ProfileConfigRef(filter ProfileFilter) (map[string]map[string]map[string]string, error)

ProfileConfigRef returns entities used by profiles.

func (*ClusterTx) ProfileCreate

func (c *ClusterTx) ProfileCreate(object Profile) (int64, error)

ProfileCreate adds a new profile to the database.

func (*ClusterTx) ProfileDelete

func (c *ClusterTx) ProfileDelete(project string, name string) error

ProfileDelete deletes the profile matching the given key parameters.

func (*ClusterTx) ProfileDevicesRef

func (c *ClusterTx) ProfileDevicesRef(filter ProfileFilter) (map[string]map[string]map[string]map[string]string, error)

ProfileDevicesRef returns entities used by profiles.

func (*ClusterTx) ProfileExists

func (c *ClusterTx) ProfileExists(project string, name string) (bool, error)

ProfileExists checks if a profile with the given key exists.

func (*ClusterTx) ProfileGet

func (c *ClusterTx) ProfileGet(project string, name string) (*Profile, error)

ProfileGet returns the profile with the given key.

func (*ClusterTx) ProfileID

func (c *ClusterTx) ProfileID(project string, name string) (int64, error)

ProfileID return the ID of the profile with the given key.

func (*ClusterTx) ProfileList

func (c *ClusterTx) ProfileList(filter ProfileFilter) ([]Profile, error)

ProfileList returns all available profiles.

func (*ClusterTx) ProfileRename

func (c *ClusterTx) ProfileRename(project string, name string, to string) error

ProfileRename renames the profile matching the given key parameters.

func (*ClusterTx) ProfileURIs

func (c *ClusterTx) ProfileURIs(filter ProfileFilter) ([]string, error)

ProfileURIs returns all available profile URIs.

func (*ClusterTx) ProfileUsedByRef

func (c *ClusterTx) ProfileUsedByRef(filter ProfileFilter) (map[string]map[string][]string, error)

ProfileUsedByRef returns entities used by profiles.

func (*ClusterTx) ProjectConfigRef

func (c *ClusterTx) ProjectConfigRef(filter ProjectFilter) (map[string]map[string]string, error)

ProjectConfigRef returns entities used by projects.

func (*ClusterTx) ProjectCreate

func (c *ClusterTx) ProjectCreate(object api.ProjectsPost) (int64, error)

ProjectCreate adds a new project to the database.

func (*ClusterTx) ProjectDelete

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

ProjectDelete deletes the project matching the given key parameters.

func (*ClusterTx) ProjectExists

func (c *ClusterTx) ProjectExists(name string) (bool, error)

ProjectExists checks if a project with the given key exists.

func (*ClusterTx) ProjectGet

func (c *ClusterTx) ProjectGet(name string) (*api.Project, error)

ProjectGet returns the project with the given key.

func (*ClusterTx) ProjectHasImages

func (c *ClusterTx) ProjectHasImages(name string) (bool, error)

ProjectHasImages is a helper to check if a project has the images feature enabled.

func (*ClusterTx) ProjectHasProfiles

func (c *ClusterTx) ProjectHasProfiles(name string) (bool, error)

ProjectHasProfiles is a helper to check if a project has the profiles feature enabled.

func (*ClusterTx) ProjectID

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

ProjectID return the ID of the project with the given key.

func (*ClusterTx) ProjectList

func (c *ClusterTx) ProjectList(filter ProjectFilter) ([]api.Project, error)

ProjectList returns all available projects.

func (*ClusterTx) ProjectMap

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

ProjectMap returns the names and ids of all available projects.

func (*ClusterTx) ProjectNames

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

ProjectNames returns the names of all available projects.

func (*ClusterTx) ProjectRename

func (c *ClusterTx) ProjectRename(name string, to string) error

ProjectRename renames the project matching the given key parameters.

func (*ClusterTx) ProjectURIs

func (c *ClusterTx) ProjectURIs(filter ProjectFilter) ([]string, error)

ProjectURIs returns all available project URIs.

func (*ClusterTx) ProjectUpdate

func (c *ClusterTx) ProjectUpdate(name string, object api.ProjectPut) error

ProjectUpdate updates the project matching the given key parameters.

func (*ClusterTx) ProjectUsedByRef

func (c *ClusterTx) ProjectUsedByRef(filter ProjectFilter) (map[string][]string, error)

ProjectUsedByRef returns entities used by projects.

func (*ClusterTx) SnapshotIDsAndNames

func (c *ClusterTx) SnapshotIDsAndNames(name string) (map[int]string, error)

SnapshotIDsAndNames returns a map of snapshot IDs to snapshot names for the container with the given name.

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) 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) StoragePoolDriver

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

StoragePoolDriver returns the driver of the pool with the given ID.

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) StoragePoolNodeJoinCeph

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

StoragePoolNodeJoinCeph updates internal state to reflect that nodeID is joining a cluster where poolID is a ceph pool.

func (*ClusterTx) StoragePoolsNodeConfig

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

StoragePoolsNodeConfig returns a map associating each storage pool name to its node-specific config values (i.e. the ones where node_id is not NULL).

func (*ClusterTx) StorageVolumeNodeAddresses

func (c *ClusterTx) StorageVolumeNodeAddresses(poolID int64, project, 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 Container

type Container struct {
	ID           int
	Project      string `db:"primary=yes&join=projects.name"`
	Name         string `db:"primary=yes"`
	Node         string `db:"join=nodes.name"`
	Type         int
	Architecture int
	Ephemeral    bool
	CreationDate time.Time
	Stateful     bool
	LastUseDate  time.Time
	Description  string `db:"coalesce=''"`
	Config       map[string]string
	Devices      map[string]map[string]string
	Profiles     []string
	ExpiryDate   time.Time
}

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

type ContainerArgs

type ContainerArgs struct {
	// Don't set manually
	ID    int
	Node  string
	Ctype ContainerType

	// Creation only
	Project      string
	BaseImage    string
	CreationDate time.Time

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

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

func ContainerToArgs

func ContainerToArgs(container *Container) ContainerArgs

ContainerToArgs is a convenience to convert the new Container db struct into the legacy ContainerArgs.

type ContainerBackupArgs

type ContainerBackupArgs struct {
	// Don't set manually
	ID int

	ContainerID      int
	Name             string
	CreationDate     time.Time
	ExpiryDate       time.Time
	ContainerOnly    bool
	OptimizedStorage bool
}

ContainerBackupArgs is a value object holding all db-related details about a backup.

type ContainerFilter

type ContainerFilter struct {
	Project string
	Name    string
	Node    string
	Parent  string
	Type    int
}

ContainerFilter can be used to filter results yielded by ContainerList.

type ContainerType

type ContainerType int

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

const (
	CTypeRegular  ContainerType = 0
	CTypeSnapshot ContainerType = 1
)

Numerical codes for container types.

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 the local 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 {
	Hook func(*sql.Tx) 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)

Patches returns the names of all patches currently applied on this node.

func (*Node) PatchesMarkApplied

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

PatchesMarkApplied marks the patch with the given name as applied on this node.

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 of 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
	Type        OperationType // Type of the operation
}

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

type OperationType

type OperationType int64

OperationType is a numeric code indentifying the type of an Operation.

const (
	OperationUnknown OperationType = iota
	OperationClusterBootstrap
	OperationClusterJoin
	OperationBackupCreate
	OperationBackupRename
	OperationBackupRestore
	OperationBackupRemove
	OperationConsoleShow
	OperationContainerCreate
	OperationContainerUpdate
	OperationContainerRename
	OperationContainerMigrate
	OperationContainerLiveMigrate
	OperationContainerFreeze
	OperationContainerUnfreeze
	OperationContainerDelete
	OperationContainerStart
	OperationContainerStop
	OperationContainerRestart
	OperationCommandExec
	OperationSnapshotCreate
	OperationSnapshotRename
	OperationSnapshotRestore
	OperationSnapshotTransfer
	OperationSnapshotUpdate
	OperationSnapshotDelete
	OperationImageDownload
	OperationImageDelete
	OperationImageToken
	OperationImageRefresh
	OperationVolumeCopy
	OperationVolumeCreate
	OperationVolumeMigrate
	OperationVolumeMove
	OperationVolumeSnapshotCreate
	OperationVolumeSnapshotDelete
	OperationVolumeSnapshotUpdate
	OperationProjectRename
	OperationImagesExpire
	OperationImagesPruneLeftover
	OperationImagesUpdate
	OperationImagesSynchronize
	OperationLogsExpire
	OperationInstanceTypesUpdate
	OperationBackupsExpire
	OperationSnapshotsExpire
)

Possible values for OperationType

WARNING: The type codes are stored in the database, so this list of

definitions should be normally append-only. Any other change
requires a database update.

func (OperationType) Description

func (t OperationType) Description() string

Description return a human-readable description of the operation type.

func (OperationType) Permission

func (t OperationType) Permission() string

Permission returns the needed RBAC permission to cancel the oepration

type Profile

type Profile struct {
	ID          int
	Project     string `db:"primary=yes&join=projects.name"`
	Name        string `db:"primary=yes"`
	Description string `db:"coalesce=''"`
	Config      map[string]string
	Devices     map[string]map[string]string
	UsedBy      []string
}

Profile is a value object holding db-related details about a profile.

type ProfileFilter

type ProfileFilter struct {
	Project string
	Name    string
}

ProfileFilter can be used to filter results yielded by ProfileList.

type ProjectFilter

type ProjectFilter struct {
	Name string // If non-empty, return only the project with this name.
}

ProjectFilter can be used to filter results yielded by ProjectList.

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.

type StorageVolumeArgs

type StorageVolumeArgs struct {
	Name string

	// At least one of Type or TypeName must be set.
	Type     int
	TypeName string

	// At least one of PoolID or PoolName must be set.
	PoolID   int64
	PoolName string

	Snapshot bool

	Config       map[string]string
	Description  string
	CreationDate time.Time
}

StorageVolumeArgs is a value object holding all db-related details about a storage volume.

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