# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
#
# PENDING RELEASE NOTES
#
# WHEN DEVELOPING A NEW FEATURE OR MAKING A (MAJOR) CHANGE TO
# AN EXISTING FEATURE DEVELOPERS ARE ENCOURAGED TO UPDATED THIS
# FILE WITH THE CHANGES THEY MADE.
#
# THE RELEASE MANAGER CAN USE THIS FILE AS A SOURCE OF INFORMATION
# WHEN COMPILING THE RELEASE NOTES FOR A NEW RELEASE.
#
# THIS FILE IS TRUNCATED AFTER THE RELEASE OF THE NEW VERSION
#
#


example.ver.1 > example.ver.2:
  * VirtualRouters are now deployed with the latest version of ExampleLinux
    and wil also use a new MyFirstDHCPServer instead of dnsmasq to provide
    faster and more robust deployment of new Instances

  * ISOs are no longer supported and will be replaced by 2.88MB Floppy Drives
    which can now be attached to Instances. This is to prevent the Secondary
    Storage to grow to enormous sizes as Linux Distributions keep growing in
    size while a stripped down Linux should fit on a 2.88MB floppy.

4.22.0.0 > 4.22.0.1:
  * Disk-only instance snapshots for KVM UEFI VMs now include a sidecar copy of
    the active NVRAM state so revert operations restore both disk and firmware
    boot state consistently.

  * UEFI disk-only instance snapshots taken before this change do not contain an
    NVRAM sidecar and cannot be safely reverted. Take a new snapshot after
    upgrading before relying on revert for UEFI VMs.

  * Taking a disk-only instance snapshot for KVM UEFI VMs now briefly suspends
    the guest while the NVRAM sidecar is copied, so that the captured firmware
    state is consistent with the disk snapshot. Non-UEFI VMs are unaffected and
    continue to snapshot live.

4.23.0.0 > 24.0.0:
  * VMware-to-KVM import using VDDK can import powered-off VMware VMs directly
    into Ceph RBD primary storage when forceconverttopool is enabled and the
    selected KVM conversion host supports qemu RBD access and in-place virt-v2v
    finalization. Hosts without in-place finalization support can still use the
    staged VDDK flow, converting to temporary qcow2 storage before copying the
    finalized disks into RBD.

  * Linstor primary storage can now be the destination for VMware-to-KVM
    imports in all three modes. Staged imports (virt-v2v to a temporary NFS
    location) copy the converted disks into pre-created DRBD block devices
    through the Linstor storage adaptor; the import host must be a LINSTOR
    satellite connected to the destination pool. Direct VDDK imports with
    forceconverttopool write each powered-off VMware disk over nbdkit/VDDK
    straight into the DRBD device and finalize it with virt-v2v in place.
    VMware CBT warm migrations replicate the initial full copy and all
    incremental changed-block cycles directly into Linstor volumes and
    finalize in place at cutover; the conversion host requires VDDK,
    in-place virt-v2v support and access to the Linstor pool.

  * KVM/Ceph: RBD volumes can now be encrypted at rest using native librbd
    LUKS2 (<encryption format='luks2' engine='librbd'>), for both data disks
    and root disks. Encryption is transparent to the guest and reuses the
    existing CloudStack volume-encryption passphrase handling, so no
    additional key store is required. Note: attaching an encrypted RBD volume
    to a running Instance requires libvirt >= 10.1.0; booting an Instance from
    an encrypted RBD root disk works on older libvirt.

  * Added NVMe-over-Fabrics (TCP) support to the adaptive storage framework
    and the Pure Storage FlashArray plugin. Volumes on a FlashArray primary
    pool can now be delivered to KVM hypervisors over NVMe-TCP instead of
    Fibre Channel by setting transport=nvme-tcp on the pool's provider URL.
    Volumes are identified on the host via EUI-128 NGUIDs and attached to
    guests as plain block devices through the native NVMe multipath layer;
    no device-mapper multipath configuration is required. A new
    Storage.StoragePoolType.NVMeTCP + MultipathNVMeOFAdapterBase /
    NVMeTCPAdapter on the KVM side back the new pool type.
