LXD 4.15 has been released

Introduction

The LXD team is very excited to announce the release of LXD 4.15!

This is an exciting release with new features for just about everyone.
The headline feature is no doubt the ability to hot add/remove network interfaces in LXD virtual machines, making it that much closer to our container experience.
But there are also various command line improvements, improved auditing capabilities and cluster features.

Enjoy!

New features and highlights

Network interface hotplug in VMs

It’s now possible to add up to 4 additional network interfaces to a running virtual machine.
Existing network interfaces can also be removed from a running virtual machine.

This relies on PCI hotplug and so requires the guest operating system to properly handle it.

Configurable shutdown timeout

A new configuration key core.shutdown_timeout that controls the number of minutes to wait for existing operations to complete when LXD is instructed to shutdown.

This allows to override the default of 5 minutes. It can be shortened in environments where interrupting long lasting lxc exec sessions isn’t a problem. Or can be lengthened for environments where you do want all existing operations to complete prior to LXD exitting.

New persistent warnings (time skew, apparmor and virtiofsd)

Additional warnings have been added to the warnings API introduce in LXD 4.14.

Those are:

  • Cluster time skew detection (done through heartbeats)
  • Lack or broken AppArmor support
  • Lack or broken virtiofs support

The new warnings will show up in lxc warning list when appropriate and can be acknowledged with lxc warning ack. They will also clear once the source of the warning is gone (for example after running NTP on a system with a time skew).

Location field in /dev/lxd API

Guests with access to the /dev/lxd API can now find what server they’re running on when running on top of a LXD cluster. This can be useful for the configuration of high availability services within the instance by allowing it to tell whether a peer is running on the same host or not (and so whether they would likely go down at the same time).

root@shell01:~# curl -s --unix-socket /dev/lxd/sock lxd/1.0 | jq .location
"abydos"

New type and name columns in lxc config trust list

Following the addition of the server certificate type in LXD 4.14. We’ve now reworked the output of lxc config trust list to show both the customizable name and type of each certificates.

stgraber@castiana:~$ lxc config trust list
+--------+--------------------+----------------+--------------+------------------------------+------------------------------+
|  TYPE  |        NAME        |  COMMON NAME   | FINGERPRINT  |          ISSUE DATE          |         EXPIRY DATE          |
+--------+--------------------+----------------+--------------+------------------------------+------------------------------+
| client | nsec-ansible01     | root@ansible01 | f256b2ab81a0 | Mar 21, 2021 at 6:50pm (UTC) | Mar 19, 2031 at 6:50pm (UTC) |
+--------+--------------------+----------------+--------------+------------------------------+------------------------------+
| client | stgraber-ansible01 | root@ansible01 | 58ea2754fe55 | Dec 16, 2020 at 3:07am (UTC) | Dec 14, 2030 at 3:07am (UTC) |
+--------+--------------------+----------------+--------------+------------------------------+------------------------------+
| server | abydos             | root@abydos    | 1a9ab6d52b76 | Dec 14, 2020 at 5:58pm (UTC) | Dec 12, 2030 at 5:58pm (UTC) |
+--------+--------------------+----------------+--------------+------------------------------+------------------------------+
| server | langara            | root@langara   | e3e4701ef455 | Dec 14, 2020 at 5:58pm (UTC) | Dec 12, 2030 at 5:58pm (UTC) |
+--------+--------------------+----------------+--------------+------------------------------+------------------------------+
| server | orilla             | root@orilla    | d015dc8484da | Dec 14, 2020 at 5:58pm (UTC) | Dec 12, 2030 at 5:58pm (UTC) |
+--------+--------------------+----------------+--------------+------------------------------+------------------------------+

Cluster members acting as database stand-by now visible

LXD clusters have the first 3 servers act as database servers, then the next 2 act as stand-by database servers with the remaining servers acting just as clients with the roles being dynamically switched in the cluster as machine go up and down.

None of that has changed but it’s now possible to tell what servers are acting as stand-by database.
All servers that participate in the database now have the database flag set to YES in lxc cluster list, then running lxc cluster show will indicate either database or database-standby in the roles list.

lxc monitor --pretty now supported with lifecycle events

A compact version of lxc monitor --type=lifecycle is now available by using the --pretty flag, similar to what was already supported for --type=logging.

stgraber@castiana:~$ lxc monitor --type=lifecycle --pretty
INFO[06-04|13:34:46] Action: instance-restarted, Source: /1.0/instances/redoc 

New --expire flag for lxc publish

A new --expire flag taking a timestamp is now available in lxc publish.
This is then used to override any expiry already present in the instance’s image metadata.

Requestor now recorded in lifecycle events

Lifecycle events now have a new requestor section which provides the protocol and user information of whoever triggered the action.

location: none
metadata:
  action: instance-restarted
  requestor:
    protocol: unix
    username: stgraber
  source: /1.0/instances/redoc
timestamp: "2021-06-04T13:33:05.33764627-04:00"
type: lifecycle

Proxy header support on main API endpoint

A new core.https_trusted_proxy configuration option was added which can be set to a comma separated list of IP addresses of reverse proxy servers fronting the LXD API.

With this, you can now have something like HAProxy in front of a LXD cluster, dispatching requests throughout the cluster while retaining the ability to see the client’s IP address in LXD’s logs.

Full swagger coverage of REST API

We’re finally done adding metadata to our entire REST API and have deprecated the old markdown API documentation in favor of our Swagger specification.

The result can be seen here: https://linuxcontainers.org/lxd/api/master/

Complete changelog

Here is a complete list of all changes in this release:

Full commit list
  • lxd/main/init/interactive: Clear config.Cluster.ClusterPassword after setting up trust
  • lxc/config_trust: Add type and name columns
  • [Doc] fix description of PATCH warning in rest-api.md
  • tests: Update for trust list change
  • i18n: Update translation templates
  • [Doc] Fix remove duplicated sentences in doc/network-acls.md
  • lxd/images: Improve logging
  • lxd/api/1/0: Whitespace
  • lxd/api/1/0: Update d.gateway.HeartbeatOfflineThreshold when cluster.offline_threshold is changed
  • lxd/cluster/config: Add minThreshold to offlineThresholdValidator
  • lxd/cluster/gateway: Add HeartbeatOfflineThreshold var
  • lxd/cluster/heartbeat: Improve logging and errors in HeartbeatNode
  • lxd/cluster/heartbeat: Actually use taskCtx in HeartbeatNode for HTTP request base
  • lxd/cluster/heartbeat: Don’t re-run Update as this throws away discovered node liveness times
  • lxd/cluster/heartbeat: tx.SetNodeHeartbeat to actual last heartbeat time
  • lxd/cluster/heartbeat: Update Send to support dynamic spread duration
  • lxd/cluster/heartbeat: Adds heartbeatInterval function
  • lxd/cluster/heartbeat: Updates HeartbeatTask to use gateway.heartbeatInterval
  • lxd/cluster/heartbeat: Removes heartbeatInterval constant
  • lxd/cluster/heartbeat: Updates heartbeat to use interval derived from offline threshold
  • lxd/daemon: Populate d.gateway.HeartbeatOfflineThreshold on init
  • lxd/daemon: Adds taskClusterHeartbeat var and populates it
  • lxd/cluster/heartbeat: Logging improvements
  • lxc: Update interactive editor fail message to indicate ctrl+c can be used to abort change
  • i18n: Update translation templates
  • shared/api: Add swagger metadata for instance backups
  • lxd/instances: Swagger for backups
  • lxd: Support for reading cluster certificate from file
  • doc: cluster_certificate_path documentation
  • shared/api: Add swagger metadata for image metadata
  • lxd/instances: Swagger for instance metadata
  • doc/rest-api: Refresh swagger YAML
  • lxd/images: Fix typo in swagger
  • lxd/network/openvswitch: Adds shared unquote function
  • lxd/network/openvswitch: Replace strconv.Unquote with unquote
  • lxd/network/driver/bridge: Reuse consistent bridgeLink var rather than keep creating new vars
  • lxd/network/driver/bridge: Bring up vxlan tunnel link
  • lxd/network/driver/bridge: Use clearer naming for different link types
  • lxd/network/driver/bridge: Don’t use Link suffix for var names that don’t represent links
  • lxd/instances: Unmount shiftfs on startup failures
  • lxd/cluster: Add core.shutdown_timeout
  • lxd/api/cluster: Check if LXD closing down in rebalanceMemberRoles
  • lxd/api/cluster: Call rebalanceMemberRoles from internalClusterRaftNodeDelete
  • lxd/cluster/gateway: Logging improvements
  • lxd/daemon: Logging improvements
  • lxd/images: Logging improvements
  • shared/api: Add swagger metadata for instances
  • lxd/instances: Swagger for instances
  • doc/rest-api: Refresh swagger YAML
  • lxd/cluster/gateway: Add heartbeatCancelLock and heartbeatCancel vars
  • lxd/cluster/heartbeat: Introduces heartbeatMode type and constants for heartbeat modes
  • lxd/cluster/heartbeat: Updates heartbeat to accept mode argument
  • lxd/cluster/heartbeat: Make end of heartbeat log message include local address for clarity
  • lxd/cluster/heartbeat: Adds heartbeatRestart function
  • lxd/cluster: g.heartbeat() usage
  • lxd/cluster/gateway: Call g.heartbeatRestart from HandlerFuncs when handling a heartbeat
  • lxd/cluster/heartbeat/test: Fixes TestHeartbeat so that it waits for join notification heartbeats to occur
  • lxd/daemon/images: imageDownloadLock typo
  • lxd: Support for core.shotdown_timeout
  • doc: Add core.shutdown_timeout
  • lxd/storage/ceph: Always return VolumeUsage
  • doc/production-setup: Cover name leakage
  • lxd/apparmor/instance: Deref OVMF path
  • lxd/device/pci: Adds DeviceIOMMUGroup function
  • lxd/device/nic/physical: Pass pciIOMMUGroup number to VM driver
  • lxd/device/nic/sriov: Pass pciIOMMUGroup number to VM driver
  • lxd/instance/drivers/qmp/commands: Adds AddNIC function
  • lxd/instance/drivers/driver/qemu: Adds one missing op.Done call and removes 2 unnecessary ones
  • lxd/instance/drivers/driver/qemu/templates: Correct comment on qemuPCIPhysical
  • lxd/instance/drivers/driver/qemu/templates: Remove NIC specific templates
  • lxd/instance/drivers/driver/qemu: Remove -chroot flag usage
  • lxd/instance/drivers/driver/qemu: Converts NICs to be added via QMP rather than static config
  • lxd/instance/drivers/driver/qemu: Remove old pid file on start if exists
  • lxd/cluster/heartbeat: Fix heartbeatInterval()
  • lxd/instance/qemu: queues is uint64
  • lxd: Support for location in devlxd api
  • lxd/instance/qemu: Support for location in writeInstanceData
  • lxd-agent: Support for location in devlxd api
  • lxd/instance/qemu: Support for security.devlxd default (true) value
  • doc/environment: Documents LXD_CONF and LXD_GLOBAL_CONF env vars
  • lxd/ip/link: MTU is an acronym and so should be uppercased in SetMtu function name
  • lxd/ip/link: Renames Mtu field to MTU as it is an acronym
  • lxd/device/device/utils/network: SetMTU usage
  • lxd/network/network/utils: Removes InterfaceSetMTU
  • lxd/network/network/utils: Adds InterfaceStatus function
  • lxd/device/infiniband/physical: SetMTU usage
  • lxd/device/infiniband/sriov: SetMTU usage
  • lxd/device/nic/macvlan: SetMTU usage
  • lxd/device/nic/physical: SetMTU usage
  • lxd/device/nic/sriov: SetMTU usage
  • lxd/network/driver/ovn: SetMTU usage
  • lxd/network/driver/bridge: SetMTU usage
  • lxd/network/network/utils/sriov: Updates sriovGetFreeVFInterface to use InterfaceStatus
  • lxd/network/driver/physical: SetMTU usage
  • lxd/network/driver/physical: Check that physical parent interface has no global unicast IPs configured on it before starting
  • lxd/network/driver/ovn: Updates startUplinkPortPhysical to check uplink has no global unicast IPs configured
  • lxd/instance/drivers/driver/qemu: Don’t set multifunction=off as this upsets ccw driver
  • lxd/instances/get: Renames doContainersGet to doInstancesGet
  • lxd/instances/get: Remove some of the container specific terminology in doInstancesGet
  • lxd/instances/get: Remove potential source of nil pointer dereference panic in doInstancesGet
  • lxd/instance: Don’t use RawOperation
  • lxd/operations: Remove code duplication
  • lxd/operations: Close forwarded websocket
  • shared/network: Fix channel handling in WebsocketProxy
  • client: Update for WebsocketProxy change
  • lxd/instance/drivers/qmp/commands: Adds Reset function
  • lxd/instance/drivers/driver/qemu: Updates getMonitorEventHandler to handle guest RESET events
  • lxd/instance/drivers/driver/qemu: Workaround QEMU bug that prevents QMP added devices from using their bootindex setting
  • lxc: Use consistent messaging when offering to respawn interactive editor
  • i18n: Update translation templates
  • lxd/operations: Spacing
  • lxd/operations: Fix bug in operationsGet and operationsGetByType that was overwriting list entries with loop iterator pointer
  • lxc/cluster: Always use default project in list-tokens command
  • lxd/db: Expose database stand-by role on cluster members
  • lxd/main/init/interactive: Don’t attempt to connect to all join token candidates
  • lxd/operations/operations: Use structured logging in Cancel
  • lxd/images: Include operation ID in error in imageValidSecret
  • lxd/certificates: Include operation ID in error in clusterMemberJoinTokenValid
  • lxd/api/cluster: Delete any existing join token operation for potential member in clusterNodesPost
  • shared/subprocess/proc: Add exit code to error message
  • lxd/images: Maintain image public indicator when copying to member in imageSyncBetweenNodes
  • lxd/images: Improve logging in imageSyncBetweenNodes
  • lxd/images: Improve error message in imageSyncBetweenNodes
  • lxd/daemon/images: Adds ImageDownloadArgs type
  • lxd/daemon/images: Updates ImageDownload to accept ImageDownloadArgs argument
  • lxd/images: Updates imgPostRemoteInfo to use d.ImageDownload
  • lxd/images: Updates imgPostURLInfo to use d.ImageDownload
  • lxd/images: Improves error message in imagesPost
  • lxd/images: Updates autoUpdateImage to use d.ImageDownload
  • lxd/instances/post: Updates createFromImage to use ImageDownload
  • lxd/images: Don’t generate args for every member in imageSyncBetweenNodes
  • shared/subprocess/proc: Adds context support to Wait
  • lxd/instance/drivers/qemu: p.Wait() usage
  • lxd/network/driver/bridge: Check dnsmasq process remains running after being started
  • shared/subprocess: Fix tests to use p.Wait() with context
  • tests: Support for database stand-by role on cluster members
  • lxd/instance/drivers/qmp/commands: Improve comment on SendFile to aid searchability
  • lxd/instance/drivers/driver/qemu: Only add bootindex if bootIndexes is non-empty
  • lxd/instance/drivers/driver/qemu: bus name is populated later so these lines do nothing
  • lxd/instance/drivers/driver/qemu: Switch to using monitor.SendFile to pass macvlan file descriptor to QEMU
  • lxd/instance/drivers/driver/qemu: Updates addNetDevConfig to remove unused args and allow preconfiguring of port to be used
  • lxd: Move ResolveWarningsByNodeAndType to separate package
  • lxd/db: Add time skew warning type
  • README: Update IRC
  • lxd/cluster: Add cluster time skew warning
  • lxd-agent/main/agent: Log when rebooting
  • lxd-agent/main/agent: Mount shares after vsock listener
  • lxd/device/disk: VM directory share improvements
  • lxd/instance/drivers/driver/qemu/templates: Always use virtfs-proxy-helper for 9p disk directory shares
  • lxd/instance/drivers/driver/qemu: Return consistent error in setupNvram for missing EFI firmware file
  • lxd/instance/drivers/driver/qemu: Log where lxd-agent is being installed from in generateConfigShare
  • lxd/instance/drivers/driver/qemy: Always use virtfs-proxy-helper for 9p directory shares
  • lxd/device/disk: Populate readonly mount option even for block device type disks
  • lxd/instance/drivers/driver/qemu: Convert readonly mount option to readonly template boolean in addDriveConfig
  • lxd/instance/drivers/driver/qemu/templates: Add support for readonly block device disks
  • lxd/instance/drivers/driver/lxc: Add revert to deviceStart
  • lxd/instance/drivers/driver/lxc: Add revert to updateDevices
  • lxd/instance/drivers/driver/qemu: Add revert to updateDevices
  • lxd/instance/drivers/qmp/commands: Adds revert to AddNIC
  • lxd/device/disk: Add DiskVirtiofsdSockMountOpt constant
  • lxd/device/disk: Add vmVirtfsProxyHelperPaths and vmVirtiofsdPaths functions
  • lxd/device/disk: Update startVM to use d.vmVirtiofsdPaths and d.vmVirtfsProxyHelperPaths
  • lxd/device/disk: Comment improvement in startVM
  • lxd/device/disk: Check virtfs-proxy-helper has bound successfully in startVM
  • lxd/device/disk: d.vmVirtiofsdPaths and d.vmVirtfsProxyHelperPaths usage in stopVM
  • lxd/instance/drivers/driver/qemu: Update addDriveDirConfig to handle getting virtiofsd socket path from disk device mount options
  • lxd/instance/drivers/driver/qemu: Improve comments in addDriveDirConfig
  • lxd/instance/drivers/driver/qemu: Ensure bootindex is generated in a stable manner in deviceBootPriorities
  • shared/api: Support for lxc monitor --pretty lifecycle events
  • lxc: Support for lxc monitor --pretty lifecycle events
  • lxd: Move warning creation to the end of init()
  • lxd/db: Add WarningAppArmorNotAvailable
  • lxd/sys: Have OS.Init() return warnings
  • lxd/sys: Add AppArmor warning
  • lxd/device/errors: Add UnsupportedError type and update ErrUnsupportedDevType to use it
  • lxd/device/device/utils/disk: Add DiskVMVirtiofsdStart and DiskVMVirtiofsdStop functions
  • lxd/device/disk: Remove unnecessary log context field in startVM
  • lxd/device/disk: Switch to using DiskVMVirtiofsdStart and DiskVMVirtiofsdStop functions for virtiofsd management
  • lxd/instance/drivers/driver/qemu: Switch to using device.DiskVMVirtiofsdStart and device.DiskVMVirtiofsdStop for config drive virtiofsd management
  • lxd/instance/drivers/driver/qemu: Add comment about 9p vs virtio-fs config drive shares in generateQemuConfigFile
  • lxd/instance/drivers/driver/qemu: Clean up comments in removeDiskDevices and removeUnixDevices
  • lxd/apparmor/instance/qemu: Allow rw access to instance devicesPath
  • lxd/apparmor/instance/qemu: Make the difference between external device paths and devices in the instance devices path clearer
  • lxd/instance/qemu: Remove duplicate key
  • lxd/apparmor/instance: Switch to externalDevPaths template var
  • lxd/apparmor/instance: Populate VM devicesPath var
  • lxd/instance/drivers/driver/qemu: Don’t add config disk path in the instance’s devices directory to the external devPaths var
  • lxc/publish: Fix ETag race condition
  • lxd/storage/drivers/driver/zfs/utils: Retry ZFS recursive delete command
  • tests: Test publishing ephemeral instance
  • Revert “lxd/network/driver/physical: Check that physical parent interface has no global unicast IPs configured on it before starting”
  • lxd/network/driver/ovn: Don’t prevent the use of a physical uplink with IP addresses if the parent is a bridge
  • lxd/device/device/utils/disk: Adds DiskMountClear function
  • lxd/instance/drivers/driver/qemu: Add configDriveMountPath and configDriveMountPathClear helper functions
  • lxd/instance/drivers/driver/qemu: Comment
  • lxd/instance/drivers/driver/qemu: Improve error in onStop
  • lxd/instance/drivers/driver/qemu: Call device.DiskVMVirtiofsdStop and d.configDriveMountPathClear in cleanupDevices
  • lxd/instance/drivers/driver/qemu: Bind mount config directory into instance devices directory as readonly
  • lxd/instance/drivers/driver/qemu: Clearer var naming in generateQemuConfigFile
  • lxd/instance/drivers/driver/qemu: Update 9p config drive share to use readonly bind mount in generateQemuConfigFile
  • lxd/instance/drivers/driver/qemu: addDriveDirConfig comment tweak
  • lxd/storage/drivers/driver/zfs/volumes: Retry zvol deactivation if ZFS ignores us in UnmountVolume
  • lxd/device/disk: Update startContainer to mount pool volume before calling createDevice
  • lxd/device/disk: Update startVM to mount directories as bind mounts
  • lxd/device/disk: Rename reverter argument to revert in mountPoolVolume for consistency
  • lxd/device/disk: Detect unsupported non-filesystem volumes for containers in mountPoolVolume
  • lxd/device/disk: Update createDevice to accept revert and pool volume source path override
  • lxd/device/disk: Ensure that host-side device mounts are cleaned up in postStop
  • lxd/device/disk: Rework wait for virtfs-proxy-helper socket in startVM for clarity
  • lxd/device/disk: Remove check that prevents use of virtiofsd for readonly disks in startVM
  • lxd/instance/drivers/driver/qemu: Remove check in addDriveDirConfig that prevents virtiofsd for readonly shares
  • doc: mention /var/snap/lxd/common/lxd for snap users
  • lxc cluster add shouldn’t have any alias
  • doc: mention /var/snap/lxd/common/lxd for snap users
  • lxd: print the join token on a separate line
  • tests: fix token extraction of lxc cluster add
  • i18n: Update translation templates
  • lxd/lxd: Record requestor as part of lifecycle events
  • lxd: Pass request to OperationCreate
  • lxd-agent: Pass request to OperationCreate
  • lxd/resources: Add swagger documentation for storage
  • shared/api: Add swagger metadata to storage pools
  • lxd/cluster: Add core.https_trusted_proxy
  • lxd/storage: Add swagger documentation for pools
  • shared/api: Split storage volume backup
  • shared/api: Add swagger metadata to storage volumes
  • doc/rest-api: Refresh swagger YAML
  • lxd/storage/drivers/driver/zfs/volumes: Include unmount action in the revert hook returned from CreateVolumeFromBackup
  • lxd/storage/backend/lxd: Improve error context returned when applying imported root disk quota
  • lxd/instances/post: Improve post hook failed context in error
  • lxd/instance/drivers/driver/qemu: Adds start and stop debug logging
  • lxd/instance/drivers/driver/qemu: Clarifies return values of pid function
  • lxd/instance/drivers/driver/qemu: Updated d.pid usage
  • lxd/instance/drivers/driver/qemu: Comment clean up in Stop
  • lxd/instance/drivers/driver/qemu: Dont start device cleanup in onStop until QEMU process has ended
  • lxc/publish: add --expire flag
  • lxd/instance/drivers/driver/qemu: Increase max wait time for qemu process to exit
  • lxd/images: pass publish expiration date to Export(); fallback to metadata.yaml expiration date
  • lxd/instance/instance_interface.go: add expiration date parameter to Export()
  • lxd/instance/drivers/driver_lxc: Export(): handle expiration date
  • lxd/instance/drivers/driver_qemu: Export(): handle expiration date
  • i18n: update translation templates
  • lxd/instance/drivers/driver/qemu: Fix logger in onStop
  • lxd/cluster/heartbeat: Don’t send heartbeat from member that doesn’t know its own address
  • lxd/endpoints: Update endpoints Config doc
  • lxd/cluster/heartbeat: Get local cluster address from node.ClusterAddress in heartbeat
  • lxd/storage: Add swagger documentation for volumes
  • shared/api: Add swagger metadata for storage volume state
  • lxd/storage: Add swagger documentation for volume state
  • shared/api: Add swagger metadata for storage volume snapshots
  • lxd/storage: Add swagger documentation for volume snapshots
  • lxd/storage: Fix operation type for snapshot rename
  • shared/api: Add swagger metadata for storage volume backups
  • lxd/storage: Add swagger documentation for volume backups
  • lxd/swagger: Remove partial coverage warning
  • lxd/swagger: Fix bad typing
  • doc/rest-api: Strip and point to swagger
  • doc/rest-api: Refresh swagger YAML
  • lxd/db/warnings: Adds UpsertWarningLocalNode helper function
  • lxd/warnings/warnings: Adds ResolveWarningsByLocalNodeAndType helper function
  • lxd/daemon: d.cluster.UpsertWarningLocalNode and warnings.ResolveWarningsByLocalNodeAndType usage
  • lxd/cluster/gateway: Only create persistent warning for cluster time skew when cluster is operational
  • lxd/db/warnings: Convert Warning struct’s TypeCode and Status to their custom types
  • lxd/cgroup/init: db.Warning usage
  • lxd/sys/apparmor: db.Warning usage
  • lxd/db/warnings: db.Warning field usage in UpsertWarning
  • lxd/db/warnings: Improve error in UpdateWarningStatus
  • lxd/db/warnings: Renames UpdateWarningMessage to UpdateWarningState
  • lxd/db/warnings: Improve error in UpdateWarningState
  • lxd/db/warnings: Switch to tx.UpdateWarningState and fix bug preventing reoccurring warning to reactivate resolved warning
  • lxd/daemon: w.TypeCode usage
  • README: Add liblz4-dev dependency when building from source
  • doc: btrfs-tools was replaced by btrfs-progs after Bionic
  • doc: bzr isn’t used anymore
  • lxc/remote: accept fingerprint as input on confirming new remote
  • doc/rest-api: Linkify API doc
  • lxd/db: Add warning type WarningMissingVirtiofsd
  • lxd/warnings: Add more resolver functions
  • lxd/device: Add and use ErrMissingVirtiofsd
  • lxd/instance/drivers: Add missing virtiofsd warning
  • lxd/device: Add virtiofsd warning
  • lxd/main_init_interactive: accept fingerprint as input on confirming cluster join
  • i18n: update translation templates
  • lxd/main_init_interactive: replace empty validator for choosing cluster config with nil
  • lxd/endpoints: Support HAProxy protocol header
  • lxd: Support HAProxy protocol header
  • doc: Add core.https_trusted_proxy
  • lxd/main_init_interactive: accept token as input on cluster join
  • api: server_trusted_proxy
  • lxd/instance/drivers/qmp/commands: Updates revert in AddNIC for consistency/clarity
  • lxd/instance/drivers/qmp/commands: Adds RemoveNIC function
  • lxd/instance/drivers/qmp/commands: Adds QueryPCI function and associated types
  • lxd/device/nic: Enable VM hotplug for macvlan, bridged, p2p, physical and sriov NIC types
  • lxd/instance/drivers/driver/common: Removes unnecessary check in runHooks
  • lxd/instance/drivers/driver/qemu/bus: Adds busDevicePortPrefix constant and uses it
  • lxd/instance/drivers/driver/qemu/templates: Uses busDevicePortPrefix constant indirectly
  • lxd/instance/drivers/driver/qemu: Allocate 4 additional PCI slots for hotplugging in generateQemuConfigFile
  • lxd/instance/drivers/driver/qemu: Adds qemuPCIDeviceIDStart constant
  • lxd/instance/drivers/driver/qemu: Update addCPUMemoryConfig to just return cpu count if nil stringbuilder supplied
  • lxd/instance/drivers/driver/qemu: Adds qemuNetDevIDPrefix and qemuDeviceIDPrefix constants
  • lxd/instance/drivers/driver/qemu: qemuDeviceIDPrefix and qemuNetDevIDPrefix usage
  • lxd/instance/drivers/driver/qemu: Adds deviceAttachNIC function
  • lxd/instance/drivers/driver/qemu: Handle hotplugging NICs by using d.deviceAttachNIC from deviceStart
  • lxd/instance/drivers/driver/qemu: Add revert to deviceStart
  • lxd/instance/drivers/driver/qemu: Adds deviceDetachNIC function
  • lxd/instance/drivers/driver/qemu: Updates deviceStop to hot unplug NICs
  • lxc/config_trust: Support stdin and allow name override
  • i18n: Update translation templates
  • i18n: Update translations from weblate

Try it for yourself

This new LXD release is already available for you to try on our demo service.

Downloads

The release tarballs can be found on our download page.

Binary builds are also available for:

  • Linux: snap install lxd
  • MacOS: brew install lxc
  • Windows: choco install lxc
3 Likes

https://www.youtube.com/watch?v=vZOVC2kxfMk

LXD 4.15 is available in latest/candidate for snap users already and will be rolling out to all stable users early next week.