]> review.fuel-infra Code Review - openstack-build/cinder-build.git/commit
Fix saving tz aware datetimes in Versioned Objects
authorGorka Eguileor <geguileo@redhat.com>
Fri, 26 Jun 2015 14:05:04 +0000 (16:05 +0200)
committerGorka Eguileor <geguileo@redhat.com>
Sun, 12 Jul 2015 12:16:36 +0000 (14:16 +0200)
commitcf33a85efb3a3adddc60d05424012847123bfd95
tree5668b28a0610bc167ccbfb08d55d6cb2523def02
parent7ff1397c7a1a354cdffb96fe36716ef72828db93
Fix saving tz aware datetimes in Versioned Objects

Currently we cannot save date fields in Versioned Objects because they
are timezone aware and our database is not.

If we look at our objects definition, we are not giving any value to
tzinfo_aware argument, so it takes DateTime default value (True).

In our sqlalchemy model definitions we are defining our datetime fields
as Column(DateTime) which will take sqlalchemy default: class
sqlalchemy.types.DateTime(timezone=False)

In most cases we are accessing those fields directly through the DB
methods, so we don't see the problem, but if we were to modify any of
those fields using versioned object, for example scheduled_at, and then
save the object we'll get an exception:

 File ".../sqlalchemy/sql/type_api.py", line 278, in compare_values
 return x == y
 TypeError: can't compare offset-naive and offset-aware datetimes

Because we are trying to save a timezone aware date to a timezone
unaware DB field.

Following Dan's advice we create a specific cinder_obj_get_changes,
instead of overwriting obj_get_changes, that returns all datefields as
timezone naive UTC datetimes ready for saving.

Change-Id: Ie7b0249e3f6850e7c70d23fc53cfaf27fe04afbb
Closes-Bug: #1469120
cinder/objects/backup.py
cinder/objects/base.py
cinder/objects/snapshot.py
cinder/objects/volume.py
cinder/tests/unit/objects/test_base.py [new file with mode: 0644]