LXD 5.16 has been released

Introduction

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

This month’s release includes several new features from our roadmap as well as some convenience improvements and the usual raft of bug fixes.

Enjoy!

New features and highlights

ISO volumes

It is now possible to upload ISO image files as custom storage volumes.
These can then be attached to a virtual machine as a bootable CD disk allowing simplified installation of custom operating systems from a “library” of custom ISO volumes.

lxc storage volume import default /home/user/foo.iso foo-os
lxc storage volume list default
+-----------------+---------+-------------+--------------+---------+
|      TYPE       |  NAME   | DESCRIPTION | CONTENT-TYPE | USED BY |
+-----------------+---------+-------------+--------------+---------+
| custom          | foo-os  |             | iso          | 0       |
+-----------------+---------+-------------+--------------+---------+

lxc init my-vm --vm --empty
lxc config device add my-vm iso disk pool=default source=foo-os boot.priority=10
lxc start my-vm --console

For more information please see https://documentation.ubuntu.com/lxd/en/latest/howto/instances_create/#launch-a-vm-that-boots-from-an-iso

IPAM information

LXD deployments allocate and consume IP addresses for a variety of purposes. But until now there was no simple way for external systems (such as IPAM applications) to identify and track the usage of these addresses.

Although LXD already has logic to expose IP usage via BGP, DNS zones, and lease APIs (for networks), an API to aggregate all of this information was missing.

With this release a new unified endpoint has been introduced that will eliminate the need for external systems to aggregate the information manually, improving integration efficiency and overall user experience.

As well as the new /1.0/network-allocations endpoint there is also an accompanying CLI command lxc network list-allocations:

List network allocations for all projects:

bash
lxc network list-allocations --all-projects
+------------------------------------------------------------+--------------------------------------------+-----------------------+-------+-------------------+
|                          USED BY                           |                  ADDRESS                   |         TYPE          |  NAT  | HARDWARE ADDRESS  |
+------------------------------------------------------------+--------------------------------------------+-----------------------+-------+-------------------+
| /1.0/networks/lxdbr0                                       | 10.21.203.1/24                             | network               | true  |                   |
+------------------------------------------------------------+--------------------------------------------+-----------------------+-------+-------------------+
| /1.0/networks/lxdbr0                                       | fd42:ffdb:caff:baf7::1/64                  | network               | true  |                   |
+------------------------------------------------------------+--------------------------------------------+-----------------------+-------+-------------------+
| /1.0/instances/c1                                          | fd42:ffdb:caff:baf7:216:3eff:feb8:6e23/128 | instance              | true  | 00:16:3e:b8:6e:23 |
+------------------------------------------------------------+--------------------------------------------+-----------------------+-------+-------------------+
| /1.0/instances/v1                                          | fd42:ffdb:caff:baf7:216:3eff:fe45:65e9/128 | instance              | true  | 00:16:3e:45:65:e9 |
+------------------------------------------------------------+--------------------------------------------+-----------------------+-------+-------------------+
| /1.0/instances/v1                                          | 10.21.203.5/32                             | instance              | true  | 00:16:3e:45:65:e9 |
+------------------------------------------------------------+--------------------------------------------+-----------------------+-------+-------------------+
| /1.0/instances/c1                                          | 10.21.203.4/32                             | instance              | true  | 00:16:3e:b8:6e:23 |
+------------------------------------------------------------+--------------------------------------------+-----------------------+-------+-------------------+
| /1.0/networks/lxdbr0/forwards/10.0.0.1                     | 10.0.0.1/32                                | network-forward       | false |                   |
+------------------------------------------------------------+--------------------------------------------+-----------------------+-------+-------------------+
| /1.0/networks/lxdbr1                                       | 10.165.149.1/24                            | network               | false |                   |
+------------------------------------------------------------+--------------------------------------------+-----------------------+-------+-------------------+
| /1.0/networks/lxdbr1                                       | fd42:6161:6804:2524::1/64                  | network               | true  |                   |
+------------------------------------------------------------+--------------------------------------------+-----------------------+-------+-------------------+
| /1.0/networks/ovn1?project=foo                             | 10.42.131.1/24                             | network               | true  |                   |
+------------------------------------------------------------+--------------------------------------------+-----------------------+-------+-------------------+
| /1.0/networks/ovn1?project=foo                             | fd42:24a:2eb6:d0c9::1/64                   | network               | true  |                   |
+------------------------------------------------------------+--------------------------------------------+-----------------------+-------+-------------------+
| /1.0/instances/c2?project=foo                              | 10.42.131.2/32                             | instance              | true  | 00:16:3e:0c:b5:d2 |
+------------------------------------------------------------+--------------------------------------------+-----------------------+-------+-------------------+
| /1.0/instances/c2?project=foo                              | fd42:24a:2eb6:d0c9:216:3eff:fe0c:b5d2/128  | instance              | true  | 00:16:3e:0c:b5:d2 |
+------------------------------------------------------------+--------------------------------------------+-----------------------+-------+-------------------+
| /1.0/networks/ovn1/load-balancers/10.21.203.20?project=foo | 10.21.203.20/32                            | network-load-balancer | false |                   |
+------------------------------------------------------------+--------------------------------------------+-----------------------+-------+-------------------+

For more information please see https://documentation.ubuntu.com/lxd/en/latest/howto/network_ipam/

Ability to modify entity properties directly from lxc set commands

Some entity types in LXD have the concept of properties which are separate from that entity’s configuration options. Previously the only way to modify these properties was to do so interactively with the lxc * edit commands or via a combination of lxc * show piped to sed/awk and then back into the appropriate lxc * edit command.

Now it is possible to modify an entity property directly with the lxc * set commands by supplying the --property flag:

lxc init ubuntu:22.04 c1
lxc snapshot c1
lxc config set c1/snap0 expires_at="2023-08-01T00:00:00Z" --property
lxc config show c1/snap0 | grep expires_at
expires_at: 2023-08-01T00:00:00Z

See https://documentation.ubuntu.com/lxd/en/latest/howto/instances_configure/#configure-instance-properties for more information.

Allow the selection of cluster groups when moving instances

It is now possible to specify a cluster group with the --target flag when copying or moving instances.
Previously it was only possible to specify a particular cluster member, but now LXD will use its placement logic to select an appropriate member within the group specified.

lxc cluster group create group1
lxc cluster group create group2
lxc cluster group add server1 group1
lxc cluster group add server2 group2
lxc cluster group add server3 group2
lxc init ubuntu:22.04 c1 --target=@group1 # Will select server1
lxc move c1 --target=@group2 # Will select a either server2 or server3

Virtual-machine vsock ID allocation improvements

LXD uses the vsock protocol to allow it to communicate with the lxd-agent process running inside virtual-machine guests. In this release there has been a lot of work to improve the way that LXD assigns a free vsock ID to each virtual-machine in order for it to coexist with other virtual machine managers.

Previously the vsock ID was based on the virtual-machine’s internal instance ID and was incrementing from a low number. This caused issues if multiple instances of LXD were being run inside separate containers, as they could both end up allocating the same vsock ID for VMs they managed (as they had no knowledge of the other LXD deployment). Additionally it was possible that the allocated vsock ID was already in use by another virtual machine management system.

In this release LXD has the following improvements to vsock allocation:

  1. A stable random number generator is seeded using the instance’s UUID.
  2. A vsock ID is allocated using the stable random number generator (in order for it to be optimistically predictable if possible).
  3. LXD will check if the vsock ID is free, and if so it will open a vsock handle using that ID, and then pass it to the the underlying QEMU so that it never becomes available for use between LXD allocating it and QEMU starting up.
  4. If the vsock ID is unavailable the next stable random ID is tried in sequence, and so on until an available one is found or a timeout is reached.
  5. The vsock ID succesfully used is recorded so that LXD can try and optimistically use that one next time the VM boots.

Go client ExecInstance() RecordOutput improvements

The LXD Go client has had its ExecInstance() function improved to make it more convenient to capture output from non-interactive commands.

Now if the RecordOutput exec field is set to true and either/both the StdOut and StdErr argument fields are non-nil then the command output is downloaded from the LXD server and streamed to the appropriate io.WriteCloser specified. Once complete the command output files are removed from the LXD server.

Snap package virtual-machine firmware regression fix

In LXD 5.15 the version of EDK firmware bundled in the snap package contained a regression that prevented booting virtual-machine guests using older distributions on AMD hosts (we know of issues with at least Ubuntu 18.04 and CentOS 7). This regression has now been patched in the snap package to allow these instances to boot.

New release signing key

Due to the move of LXD under the Canonical organisation this release and future releases of LXD will be signed by Thomas Parrott, using this key .

Complete changelog

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

Full commit list
  • doc: clean up doc about NUMA node IDs
  • github: move dependency review (~0s) to Code tests job
  • lxd/filter: Support custom filter operators
  • shared/filter: Move filter to shared package
  • lxd: update filter usages
  • github: Check all .md files even those at the root
  • github: inclusive naming should fail on error
  • CONTRIBUTING: ignore the offensive name of our primary git branch
  • lxd/instance/drivers/driver/qemu: Fix VMs on filesystems that do not support direct I/O
  • lxd/shared: Add utility function to parse the target query param
  • lxd/project: Add functions to validate projects cluster member and group restrictions
  • lxd/db: Return a not found error if there isn’t any node with least amount of instances
  • github: Wait 30s for ceph to initialize
  • lxc/rebuild: Don’t stop all instances on force
  • github: use shellcheck package (22.04 has 0.8.0)
  • lxd/api/cluster: Handle error if no evacuation target can be found
  • lxd/api: Restructure the cluster permission checks and use central functions for the instances endoint
  • doc/instance options: clarify usage of security.csm
  • lxd/api: Allow the basic selection of cluster groups when moving instances
  • lxd/api: Add the scriptlet scheduler for the movement of instances
  • tests/cluster: Add tests for instance movement
  • doc/cluster: Add comment on how to move instances to cluster groups using the target flag
  • lxd/instance/rebuild: Fix getSourceImageFromInstanceSource usage
  • lxc/rebuild: Restart instance if it was stopped
  • tests: Update for force rebuild change
  • github: Simplify test suite invocation command line
  • doc: add missing information from website to docs
  • lxc/storage/volume/show: Add missing documentation in help message
  • lxc/storage/volume/edit: Add missing documentation in help message
  • lxc/storage/volume/set: Add missing documentation in help message
  • lxc/storage/volume/get: Add missing documentation in help message
  • lxc/storage/volume/info: Add missing documentation in help message
  • lxc/storage/volume/unset: Add missing documentation in help message
  • i18n: Update translation templates
  • github: Adds storage bucket tests
  • lxd/instance_instance_types: the memory part is in GiB
  • lxc/image: use MiB instead of MB as we divide by 1024 (!= 1000)
  • lxc/launch: use aws:t2.micro as t1.micro is no longer available
  • lxd/archive: DeviceTotalMemory() uses /proc/meminfo which uses kB as a power of 2
  • lxd/storage/util: use a power of 2 unit for address space limit
  • lxd/storage/drivers/utils: fix comment to reflect how much is actually copied
  • lxd/api/internal/test: Use [GM]iB instead of [GM]B units
  • lxd/storage/drivers/volume: Use [GM]iB instead of [GM]B units
  • doc/howto/instances_create: the memory part in the instance type is in GiB
  • doc/*: use power of 2 units for memory/storage (MB -> MiB, GB -> GiB)
  • test/*: use a power of 2 units for memory/storage
  • test/suites/storage_driver_cephfs: we no longer test on 4.x kernels
  • test/suites/projects: tune disk limits to be slightly above the required size
  • test/suites/projects: fix typos
  • test/suites/projects: use || false for expected failures
  • test/suites/container_devices_disk: rbd’s --size only support M/G/T suffixes
  • i18n: Update translation templates
  • github: Enable cephfs tests
  • lxc/delete: Allow deleting multiple snapshots
  • test: Test deleting multiple instance snapshots
  • lxc/storage_bucket: Add missing target flag for bucket key list command
  • doc: exclude pages from search index
  • lxd/storage/drivers: Don’t add filesystem suffix to VM images
  • lxd/storage/drivers: Drop block options from VM block volumes
  • lxd/patches: Drop filesystem suffix from ZFS image volumes
  • lxd/storage/drivers: Drop FS suffix on VM image block volumes
  • lxd: Fix deviceEventListener resource scheduling when joining cluster
  • lxd/storage_buckets: Forward response for bucket key list if target is remote
  • i18n: Update translation templates
  • doc: change favicon
  • lxd/instance/drivers: Ensure root disk device
  • test: Test assigning empty profile to instance
  • lxd/instance/drivers/qemu: Use uint32 for vsock Context ID
  • lxd/instance/drivers/qemu: Add function to retrieve the vsock Context ID
  • lxd/instance/drivers/qemu: Pick a random vsock Context ID
  • lxd/storage/drivers/btrfs: Add reverter for volume snapshotting
  • lxd/storage/drivers/btrfs: Change misleading comment in snapshot creation
  • lxd/storage/drivers/btrfs: Expect volatile files when performing snapshots
  • lxd/storage/drivers/btrfs: Mark btrfsIsSubVolume as deprecated
  • lxd/storage/drivers/btrfs: Expect volatile files when performing snapshots
  • lxd/storage/drivers/btrfs: Use IsSubvolume consistently
  • lxd/storage/backend: Use project as a prefix for bucket volume names
  • lxd/api: Pass project name when activating a bucket
  • lxd/storage/pool_interface: Update ActivateBucket function
  • lxd/storage/mock: Update ActivateBucket function
  • lxd/patches: Add patch for bucket names prefix
  • lxd/storage/backend_patches: Patch bucket names
  • lxd/storage/driver/btrfs: Add empty patch reference
  • lxd/storage/driver/ceph: Add empty patch reference
  • lxd/storage/driver/cephfs: Add empty patch reference
  • lxd/storage/driver/cephobject: Add empty patch reference
  • lxd/storage/driver/dir: Add empty patch reference
  • lxd/storage/driver/lvm: Add empty patch reference
  • lxd/storage/driver/zfs: Add empty patch reference
  • lxd/storage/driver_common: Trim project name in bucket name validation
  • lxd/storage/utils: Prefix bucket volume name with project name
  • lxd/storage/driver_cephobject_buckets: Trim project prefix from storage bucket names
  • lxd/db: Add new content type “iso”
  • lxd/storage: Add ContentTypeISO
  • lxd/storage/drivers: Add IsContentBlock()
  • lxd/storage/drivers: Handle volume disk path of ContentTypeISO
  • lxd/storage: Add CreateCustomVolumeFromISO
  • lxd/storage: Disallow some actions on ContentTypeISO volumes
  • lxd/storage: Support copying ISO storage volumes
  • lxd/storage: Handle migration of custom ISO volumes
  • lxd/storage/drivers/common: Handle ContentTypeISO
  • lxd/storage/drivers/generic: Handle ContentTypeISO
  • lxd/storage/drivers/dir: Handle ContentTypeISO
  • lxd/storage/drivers/btrfs: Handle ContentTypeISO
  • lxd/storage/drivers/ceph: Handle ContentTypeISO
  • lxd/storage/drivers/lvm: Handle ContentTypeISO
  • lxd/storage/drivers/zfs: Handle ContentTypeISO
  • qemu: Set media=cdrom for ISO 9660 images
  • lxd/device/disk: Handle ISO custom volumes
  • api: Add custom_volume_iso API extension
  • lxd: Handle creating custom volumes from ISO
  • client: Add CreateStoragePoolVolumeFromISO
  • lxc: Support importing ISO images
  • test: Add storage volume import tests
  • i18n: Update translations
  • doc/explanation: Add iso content type
  • doc/howto/storage_volumes: Add custom ISO volumes
  • doc/howto: Launch VM and boot from ISO
  • lxd/storage: Rephrase restriction of snapshots
  • doc/cloud-init: fix link to cloud-init docs
  • oidc: Don’t fail if server is not reachable
  • lxd/device/veth: Fix MTU handling
  • lxd/device/tap: Fix MTU handling
  • tests: Update for bridged host MTU behavior
  • added a heading in the client/operations file that was missing
  • some functions in the client/lxd.go file were missing the documentation headings
  • Added a heading in the client/lxd_candid.go file that was missing
  • Added a heading in the client/lxd_containers.go file that was missing
  • doc/howto/instances_create: give an example of VM launch with a bigger root disk
  • doc/howto/instances_create: s/a Ubuntu/an Ubuntu/
  • doc/howto: replace images: by ubuntu: remote where applicable
  • doc: Fix typo in edit a profile section
  • doc: add a 404 page
  • doc: update header
  • doc: update links
  • SECURITY.md: update security policy
  • actions: fix main branch name in GitHub check
  • gomod: Rename go module
  • client: Rename imports to new go module
  • lxd: Rename imports to new go module
  • shared: Rename imports to new go module
  • lxc: Rename imports to new go module
  • test: Rename imports to new go module
  • cmd: Rename imports to new go module
  • test: Fix checks after module rename
  • doc: generate rest-api.yaml
  • lxd/instance/drivers/qemu: Skip container config keys
  • doc: update header for mobile compatibility
  • README: Update links to new locations
  • doc: Update links to new locations
  • lxd: Update links and addresses to new locations
  • code of conduct: update email address
  • doc: fix broken links
  • actions: make linkcheck fail
  • In the lxd_instance.go file, I added the heading to the rebuildInstance() function
  • In the lxd_instance.go file, I added the heading to the tryRebuildInstance() function
  • In the lxd_instance.go file, I added the heading to the tryCreateInstance() function
  • In the lxd_instance.go file, I added the heading to the tryMigrateInstance() function
  • added headings in the lxd_oidc.go file functions that were missing
  • added headings in the lxd_storage_volumes.go file functions that were missing
  • added headings in the util.go file function that was missing
  • lxd/api/cluster: Remove obsolete group delete/create for post
  • tests/cluster/groups: Add test for cluster group edits via PUT
  • Correct sysinfo system call header level
  • Makefile: update bug address in .po files
  • i18n: Update translation templates
  • lxd/device/disk: Disable hot plugging of directory disks from VMs
  • lxd/instance/drivers/qemu: Remove obsolete directory disk check
  • lxd/device/disk: Use functions to check for Ceph RBD or FS
  • added multiple headings in the files of lxc directory
  • added multiple headings in the action.go file of lxc directory
  • added multiple headings in the alias.go file of lxc directory
  • lxd/instance/drivers: Update system unit documentation
  • lxd/instance/drivers/qemu: Restructure live updateable keys prefix check
  • doc/metrics: mention that metrics authentication can be disabled (not recommended)
  • github: Move documentation builds to the end of the documentation test workflow
  • github: Move lxc client builds to test workflow
  • github: Removes unused builds.yaml
  • github: Use ubuntu 22.04 in commits workflow
  • test: Sleep for 2s when making clustering event hub changes
  • github: Add launchpad snap package workflow
  • github: Remove newline from fromJson call
  • github: Run launchpad build workflow when Tests workflow succeeds on main branch
  • Added headings in the cluster_group.go file of the LXC directory
  • Added headings in the cluster_role.go file of the LXC directory
  • lxd/db: Return instance type from GetInstancesByMemberAddress
  • lxd: Add instance type to instances of offline cluster members
  • lxd/storage/drivers/zfs: Don’t delete the target volume when migrating
  • doc/metadata: update link to our logo
  • doc/contributing: the default branch was renamed to ‘main’
  • lxd/resources: update link to systemd github repo
  • lxd/migrate: update link to doc (new path and branch name)
  • lxd/main_cluster: update link to online doc
  • grafana: update link to online doc and dashboard ID
  • doc/metrics: update link to Grafana dashboard
  • lxd/util/http/test: Update hostname s/linuxcontainers.org/example.com/
  • shared/api/url/test: Update hostname s/linuxcontainers.org/example.com/
  • shared/cert: replace org name by “LXD”
  • lxd: Check project permissions when importing from backup
  • lxd/instance/drivers/qemu: Skip every other vsock syscall error except ENODEV
  • test: Check project limits when importing instances
  • lxd/firewall/drivers: Optimize xtables network forward rule generation.
  • lxd/firewall/drivers: Optimise nftables network forward rule generation.
  • test/suites: Updates network forward suite for optimised xtables rules.
  • test/suites: Updates network forward suite for optimised nftables rules.
  • doc/metadata: Drop now unused file
  • Added the headings in multiple functions of the config.go file
  • github: Adds launchpad snap build trigger to tests workflow
  • doc/storage: clarify when to specify storage volume type
  • github: Testing logic for LP push
  • doc: use systemctl reload instead of snap restart
  • github: Fix vars
  • github: investigate gh vars
  • github: Push to LP when tests pass from a push on the canonical/lxd repo
  • github: Remove builds workflow
  • gomod: Update dependencies
  • lxd/migrate: Fix go routine leak in disconnect if client never connects
  • shared/subprocess/proc: Fix go routine leak in start
  • test: Cleanup instances at end of metrics test
  • gomod: Updates dependencies
  • github: Add stable-5.0 LP push support to test workflow
  • lxd/instance: Prevent MAC/address conflict for imported instances
  • tests: Add container export/import address conflict test
  • lxd/storage/drivers/zfs: Fix content type detection for custom block volumes
  • test: Test recovering custom block volumes
  • doc: update to use the ubuntu: image server
  • doc/storage/zfs: clarify ZFS block mode
  • doc: update information about provided/supported images
  • lxd/instance/driver/qemu: Use happy path style
  • shared/ws/mirror: Remove unused MirrorWithHooks and use MirrorRead and MirrorWrite in Mirror function
  • client/lxd/instances: Don’t wait for remote viewer to finish when LXD connection finishes in ConsoleInstanceDynamic
  • lxd/instance/console: Improve logging in connectVGA
  • lxd/instance/console: Improve logging in doConsole
  • client/lxd: Use ws.Mirror in ConsoleContainer functions
  • test: Reset rsync compression mode in migration
  • test: Force delete instance in migration
  • test: Fix lxc-to-lxd tests
  • test: Enable lxd-to-lxd test
  • github: Install lxc-utils for lxc-to-lxd test
  • lxc-to-lxd/transfer: When remote websocket reaches EOF close connection to rsync
  • lxc-to-lxd/utils: Use abort function earlier on
  • lxc-to-lxd/utils: Detect and fail if negotiated rsync features don’t match
  • lxd/storage/drivers/generic/vfs: Improve logging in genericVFSCreateVolumeFromMigration
  • lxd/storage/drivers/driver/ceph: Update MigrationTypes to support rsync xattrs
  • shared/ws/mirror: Don’t send normal close message at end of MirrorWrite
  • shared/ws/mirror: Setup defer to close channel first
  • lxd-migrate/transfer: Pass context into rsyncSend
  • lxd-migrate/utils: Improve errors in transferRootfs
  • lxd-migrate/utils: Use abort cleanup function earlier and more often
  • lxd-migrate/utils: Detect and fail if negotiated rsync features don’t match
  • lxd-migrate/transfer: When remote websocket reaches EOF close connection to rsync
  • lxd/instance/drivers/qemu: Occupy vsock Context ID through syscall
  • test/storage_buckets: replace which by command -v
  • lxc/profile: Add refresh option for copy
  • doc: Add busybox-static requirement for running test suite
  • test: Fix flaky clustering image refresh
  • ceph: Detect custom ISO volumes
  • btrfs: Use suffixed volume name when deleting custom ISO volumes
  • lvm: Detect custom ISO volumes
  • zfs: Detect custom ISO volumes
  • generic: Detect custom ISO volumes
  • volume: Get mount path for custom ISO volumes
  • patches: Rename existing custom ISO volumes
  • storage: Detect unknown ISO custom volumes
  • test: Extend ISO import test
  • test: Recover custom ISO volume
  • client: Add getInstanceExecOutputLogFile and deleteInstanceExecOutputLogFile
  • workflows: Remove golangci-lint install from workflow.
  • client: stream the content of the exec log file to stdout/stderr within the ExecInstance func
  • i18n: Update translation templates
  • tests: add tests for lxc profile copy with refresh flag
  • Makefile: Install latest golangci-lint if not already installed.
  • lxd: Fix gosimple false positive.
  • shared: Remove BuildNameToCertificate.
  • lxd/util: Remove BuildNameToCertificate.
  • shared/netutils: Move C code to top of file (gci).
  • shared/linux: Move C code to top of file (gci).
  • shared/idmap: Move C code to top of file (gci).
  • lxd/storage/quota: Move C code to top of file (gci).
  • lxd/seccomp: Move C code to top of file (gci).
  • lxd: Move C code to top of files (gci).
  • lxc-to-lxd: Move C code to top of file (gci).
  • lxd/storage/utils: Add util to get bucket from DB
  • lxd/backup/config: Add field bucket to the backup config
  • lxd/storage/pool_interface: Add ImportBucket function to the Pool interface
  • lxd/storage/backend_mock: Add ImportBucket function
  • lxd/storage/backend_lxd: Detect and import unknown buckets
  • lxd/api_internal_recover: Add bucket recovery
  • lxd/storage/s3/policy: Add function to retrieve role from policy
  • lxd/storage/backend_lxd: Recover bucket keys during bucket recovery
  • test/suites/backup: Add test for bucket recovery
  • test/main: Add bucket recover test
  • lxd/api_internal_recover: Skip unsupported storage drivers during recovery
  • doc: Use JSON object as term instead of dict
  • shared/api: Use JSON object as term instead of dict
  • doc/rest-api: Refresh swagger YAML
  • lxd/operations: Use JSON object as term instead of dict
  • doc/rest-api: Refresh swagger YAML
  • doc: explicitly state title of related link
  • i18n: Update translations from weblate
  • lxc/cluster_group: Added lxc cluster group add
  • doc: Added lxc cluster group add
  • test: Added tests for lxc cluster group add
  • i18n: Update translations
  • doc/getting started: add a tutorial based on the LXD demo
  • lxc: Add stringTo{ Type }HookFunc utils func
  • test: Add unit tests for utils_properties.go
  • lxc: Update get/set/unset command for cluster properties
  • lxc: Update get/set/unset command for instance properties
  • lxc: Update get/set/unset command for network ACL properties
  • lxc: Update get/set/unset command for network forward properties
  • lxc: Update get/set/unset command for network load-balancer properties
  • lxc: Update get/set/unset command for network peer properties
  • lxc: Update get/set/unset command for network zone properties
  • lxc: Update get/set/unset command for network properties
  • lxc: Update get/set/unset command for profile properties
  • lxc: Update get/set/unset command for project properties
  • lxc: Update get/set/unset command for storage bucket properties
  • lxc: Update get/set/unset command for storage volume properties
  • lxc: Update get/set/unset command for storage properties
  • zfs: Add lxd:content_type user property
  • zfs: Get content type from lxd:content_type property
  • patches: Add patchZfsSetContentTypeUserProperty
  • test: Recover zfs block_mode custom volumes
  • lxd/network/common: Prevent unspecified network forward address
  • tests: Check unspecified network forward addresses
  • doc: Clarify documentation on restricted.cluster.target key
  • lxd/shared/instancewriter: Use right header key for tar ACLs
  • tests: Add file ACL test for image publishing
  • test: get/set/unset of instance properties
  • doc: Update the doc to describe how to get/set/unset instance properties
  • i18n: Update translation files
  • lxc: Show storage volume info regardless of state
  • doc: Specifies the type of OIDC authentication flow more explicitly.
  • gomod: Update dependencies
  • lxd/db: Move GetStoragePoolVolumeWithID to ClusterTx
  • lxd/db: Fix URI of TypeStorageVolumeBackup entities
  • lxd/db: Fix column name in storage volume query
  • api: Add network_allocations API extension
  • shared/api: Add new NetworkAllocations API type
  • lxd/client: Add GetNetworkAllocations function
  • lxd/db: Drop unused Cluster.storageVolumeConfigGet
  • lxd: Implement networkAllocationsGet API endpoint
  • lxc: Add network list-allocations command
  • test: Display IPAM information and check it is correct
  • doc: generate rest-api.yaml
  • doc: Add IPAM howto section
  • i18n: Update translation files
  • doc/clustering: update MicroCloud information
  • github: Pin curl at 7.81.0-1ubuntu1.10
  • doc/lxd-migrate: add an example for importing to a VM
  • lxd/instance/drivers/driver/lxc: make limits.memory.swap work properly
  • doc/metrics: add missing line break
  • inclusive identities
  • lxd/db: Return nodeID in GetStoragePoolVolumeWithID
  • lxd/db: Add function to get expired storage volume backups
  • lxd: Add hourly job pruning expired storage volume backups
  • operationtype: Change description of BackupsExpire
  • test: Check backup volume expiry
  • Revert “github: pin curl to older version”
  • lxd/network/allocations: Handle networks that don’t implement the Leases functionality
  • lxd/network/allocations: Renames getDefaultCIDRAddr to ipToCIDR for clarity
  • lxd/network/allocations: Use better wrapped errors in networkAllocationsGet
  • test: Fix integration tests to support network allocation listing with a tabular format
  • shared/api/network/addresses: Reworks NetworkAllocations struct to allow for the concept of NAT being enabled/disabled on a per-IP family basis
  • lxd/network/allocations: Fixes networkAllocationsGet NAT output
  • lxc/network-allocations: Output a tabular format instead of JSON format
  • i18n: Update translation files
  • doc/rest-api: Refresh swagger YAML
  • doc: Update lxc network list-allocations output format

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
9 Likes

LXD 5.16 is now available in the latest/candidate channel and will be rolled out to stable users next week.

3 Likes

Great, thanks, testing the new version in Lab

2 Likes

Would there be YouTube video for the release?

There won’t be release videos for the time being, hopefully we can start doing them again in the future. But I have demonstrated each new feature/change in the release notes above and am happy to answer any questions you have about them.

LXD 5.16 will remain in the latest/candidate channel and will not be pushed to latest/stable.

The latest/stable channel will jump straight to LXD 5.17 when that is released.

This is because during testing of latest/candidate some minor issues were identified and fixed, however the build of LXD on arm64 in that channel was delayed due to unrelated changes happening in Launchpad (which builds the snaps for LXD) occurring at the time.

We did not want to push the architectures that had built correctly to latest/stable to avoid causing problems with users running mixed architecture clusters that included arm64.

These changes in Launchpad have now been rolled back and the latest/candidate channel now contains the latest LXD 5.16 build (including cherry-picks) for all architectures.

However to be safe we will not be promoting 5.16 to latest/stable until we are confident that we can quickly deploy any cherry-pick builds required for all architectures.

We continue to work with the Launchpad team to resolve the issue.

4 Likes

2 posts were split to a new topic: Is it possible to lock an instance?