[ovirt-devel] rounding microseconds in vm conf update
Juan Hernández
jhernand at redhat.com
Thu Jun 22 08:31:55 UTC 2017
On 06/21/2017 10:35 PM, Valentina Makarova wrote:
> Hello!
>
> Ovirt sdk process updating of vm template with rounding of microseconds
> in creation_time.
> And vm is marked as vm which has a newer configuration because of this,
> but there is not a new configuration, all difference between current
> configuration and next_run configuration is creation_time. It is not
> correct.
> For example, diff between curl get-request for this state of vm and
> next_run state is:
> [ovirt-system-tests]$ diff current_state.txt next_state.txt
> 55c55
> < <creation_time>2017-06-14T06:18:03*.987*-04:00</creation_time>
> ---
>> <creation_time>2017-06-14T06:18:03*.000*-04:00</creation_time>
> 76a77
>
The SDKs don't round anything, they use the same precision than the engine.
Is that with the latest version of the engine? There was a bug related
to this which was fixed in 4.2 already:
Updating a VM with 'next_run=true' returns the current memory instead
of the next run memory
https://bugzilla.redhat.com/1417201
The reason for that is that the 'creation_time' is stored with different
precision in the database and in the OVF file.
> And example how to request update for reach rounding is a test in
> ovirt_system_test:
>
> @ovirtlago.testlib.with_ovirt_api
> def update_round(api):
> vm = api.vms.get('vm0') #there vm.creation_time.isoformat() is a
> real datetime with microseconds
> vm.update() #after this vm.creation_time.isoformat() contains a
> real datetime with microseconds,
> #but vm becames vm with newer configuration and
> # next_run creation time becomes rounded to seconds
>
> Does anyone have idea how to fix this?
>
The ideal way to avoid this kind of problems is to update objects
sending only the attributes that you really want to update. With version
3 of the SDK the only way to do that is to explicitly clear the
attributes that you don't want to send before calling the 'update' method:
# Set the attributes that you want to update:
vm.set_description('Update description')
...
# Clear the 'creation_time' attribute so that it won't be sent
# as part of the update:
vm.set_creation_time(None)
# Send the update request:
vm.update()
With version 4 of the SDK it is simpler, as you need/should send only
the attributes that you want to update:
vm_service.update(
vm=types.Vm(
description='Updated description',
...
)
)
More information about the Devel
mailing list