Hi everyone,
Today I've merged the last patch of a feature that changes the disks
entities in oVirt.
Up until now any disk entity (image, LUN etc.) contained properties of
whether it is a boot disk and what disk interface it should be connected
with (IDE, VirtIO etc.).
The old design might have made some sense in earlier versions since back
then it was not possible for a disk to be connected to a few VMs at once.
in later versions, with the introduction of sharable disk and the
introduction of a disk snapshot attachment to a VM this made less sense and
created a very big limitation given the fact that you could not have a disk
connected as a bootable to on VM and not bootable on another or connected
to one VM via IDE and to the other with VirtIO.
From version 4.0 as a part of a larger scale refactoring of the disk
entities throughout oVirt, the boot and interface properties are now
defined per VM and in light of this do not exist for a floating disk (i.e.
a disk which is not connected to any VM) and thus have to be specified upon
creating/attaching a disk for a VM.
Before I'll get to the changes and specifics, I'd like to ask all you
developers and users that if you encounter any faults or exceptions
(especially surrounding the %Disk% entities and specifically DiskVmElement)
please contact me or better yet - open a bug and assign to me.
This change pretty much involves every storage related flow in oVirt and
while I've verified extensively there'll always be corner cases that might
fail.
Now you're probably asking for the bottom line, given those changes what
will change in the "outer" behavior of oVirt?
The Webadmin changes are quite intuitive, you will notice when creating a
new floating disk the mentioned properties need not be specified and since
they do not exist before a disk is attached to a VM they will need to be
specified upon the attachment (see screenshot).
Note that as mentioned above the properties defined will be specific ONLY
for that VM and of course the same limitation that once existed still apply
such as matters of maximum number of controllers, single bootable disk per
VM and so on.
The real API change is in the REST, a new type called DiskAttachment was
introduced to define how a disk is connected to a VM, I'll give some
examples to clarify as most of you will probably have to change your
scripts accordingly:
*Creation of a floating disk*
No change here just note that bootable and interface properties will be
ignored
*Creation of a VM disk*
Will now be done through api/vms/{vm_id}/diskattachments - the request body
should contain the diskattachment containing the bootable and interface
properties and the disk inside it (as in the old API, no disk ID should be
specified):
<disk_attachment>
<disk>
<alias>Alias</alias>
<provisioned_size>1073741824</provisioned_size>
<format>cow</format>
<storage_domains>
<storage_domain id="53ef639c-0b27-46e0-827e-b64ebfffe28f"/>
</storage_domains>
</disk>
<bootable>false</bootable>
<interface>virtio</interface>
</disk_attachment>
*Attach a disk to VM*
Will be through api/vms/{vm_id}/diskattachments - the request body should
contain the diskattachment containing the bootable and interface properties
and the disk inside it with ID only:
<disk_attachment>
<disk id="8871306b-56da-4443-bd05-2a1974580517"/>
<bootable>false</bootable>
<interface>virtio</interface>
</disk_attachment>
*Update a VM disk*
Will be through api/vms/{vm_id}/diskattachments/{disk_id} - the request
body should contain the diskattachment containing the bootable and
interface properties if they need updating and the disk inside it with
properties that need updating, this will change the interface to IDE, make
the disk bootable and update the disk alias:
<disk_attachment id="8871306b-56da-4443-bd05-2a1974580517">
<bootable>true</bootable>
<interface>IDE</interface>
<disk>
<alias>MyNewAlias</alias>
</disk>
</disk_attachment>
*"Getting" a disk*
When getting a disk which is not attach to a VM via api/disks or
api/disks/{disk_id} the aforementioned properties will not appear simply
because of the fact that they do not exist anymore, for disks attached to a
VM via api/vms/{vm_id}/disks or api/vms/{vm_id}/disks/{disk_id} the
behavior will stay the same.
This pretty much sums it all, I'd like to thank jhernandaz for the great
help with the REST part and to derez and amureini for their help in
reviewing.
Please don't hesitate to contact me if you have any questions.