Fix drivers_private_data update on deleted entries

The drivers_private_data is expected to be able to
save new entries using the same keys as previously deleted
entries.

Before performing an update, it retrieves all entries
related to the same entity to check if it needs to
perform an update (including on deleted entries) or a
new insertion.

Unfortunately, the misinterpretation of a parameter in the
manila DB API led to a bug that prevented deleted entries
to be retrieved.

This bugfix replaces the query ensuring that all entries
(active and deleted) are retrieved so the update validation
works.

Closes-bug: #1721123

Change-Id: Id94544c9b8a534d7f0fe4e16bc57546002e33373
This commit is contained in:
Rodrigo Barbieri 2017-10-03 15:15:00 -03:00
parent e741319d57
commit ebac41d631
3 changed files with 38 additions and 4 deletions

View File

@ -3505,9 +3505,8 @@ def driver_private_data_update(context, entity_id, details,
with session.begin(): with session.begin():
# Process existing data # Process existing data
# NOTE(u_glide): read_deleted=None means here 'read all' original_data = session.query(models.DriverPrivateData).filter_by(
original_data = _driver_private_data_query( entity_uuid=entity_id).all()
session, context, entity_id, read_deleted=None).all()
for data_ref in original_data: for data_ref in original_data:
in_new_details = data_ref['key'] in new_details in_new_details = data_ref['key'] in new_details

View File

@ -1644,11 +1644,39 @@ class DriverPrivateDataDatabaseAPITestCase(test.TestCase):
self.assertEqual({}, initial_data) self.assertEqual({}, initial_data)
self.assertEqual(valid, actual_data) self.assertEqual(valid, actual_data)
def test_update_with_duplicate(self): @ddt.data({'with_deleted': True, 'append': False},
{'with_deleted': True, 'append': True},
{'with_deleted': False, 'append': False},
{'with_deleted': False, 'append': True})
@ddt.unpack
def test_update_with_more_values(self, with_deleted, append):
test_id = self._get_driver_test_data()
details = {"tee": "too"}
more_details = {"foo": "bar"}
result = {"tee": "too", "foo": "bar"}
db_api.driver_private_data_update(self.ctxt, test_id, details)
if with_deleted:
db_api.driver_private_data_delete(self.ctxt, test_id)
if append:
more_details.update(details)
if with_deleted and not append:
result.pop("tee")
db_api.driver_private_data_update(self.ctxt, test_id, more_details)
actual_result = db_api.driver_private_data_get(self.ctxt,
test_id)
self.assertEqual(result, actual_result)
@ddt.data(True, False)
def test_update_with_duplicate(self, with_deleted):
test_id = self._get_driver_test_data() test_id = self._get_driver_test_data()
details = {"tee": "too"} details = {"tee": "too"}
db_api.driver_private_data_update(self.ctxt, test_id, details) db_api.driver_private_data_update(self.ctxt, test_id, details)
if with_deleted:
db_api.driver_private_data_delete(self.ctxt, test_id)
db_api.driver_private_data_update(self.ctxt, test_id, details) db_api.driver_private_data_update(self.ctxt, test_id, details)
actual_result = db_api.driver_private_data_get(self.ctxt, actual_result = db_api.driver_private_data_get(self.ctxt,

View File

@ -0,0 +1,7 @@
---
fixes:
- |
Fixed the database update query for the
drivers' private data store that was failing
to update any rows marked as deleted.