Don't query database with an empty list of tags for creation

It raises IntegrityError: NOT NULL constraint failed: tags.resource_id

Closes-Bug: #1486041

Change-Id: I9fe43e50ef38bda7b81d0ff201a623742a39b824
This commit is contained in:
Sergey Nikitin 2015-08-18 16:39:31 +03:00
parent e7f183569b
commit 8ffe9e9a8c
2 changed files with 22 additions and 2 deletions

View File

@ -6413,8 +6413,10 @@ def instance_tag_set(context, instance_uuid, tags):
models.Tag.tag.in_(to_delete)).delete(
synchronize_session=False)
data = [{'resource_id': instance_uuid, 'tag': tag} for tag in to_add]
session.execute(models.Tag.__table__.insert(), data)
if to_add:
data = [
{'resource_id': instance_uuid, 'tag': tag} for tag in to_add]
session.execute(models.Tag.__table__.insert(), data)
return session.query(models.Tag).filter_by(
resource_id=instance_uuid).all()

View File

@ -8818,6 +8818,24 @@ class TestDBInstanceTags(test.TestCase):
expected = [(uuid, tag3), (uuid, tag4), (uuid, tag2)]
self.assertEqual(set(expected), set(tags))
@mock.patch('nova.db.sqlalchemy.models.Tag.__table__.insert',
return_value=models.Tag.__table__.insert())
def test_instance_tag_set_empty_add(self, mock_insert):
uuid = self._create_instance()
tag1 = 'tag1'
tag2 = 'tag2'
db.instance_tag_set(self.context, uuid, [tag1, tag2])
# Check insert() was called to insert 'tag1' and 'tag2'
mock_insert.assert_called_once_with()
mock_insert.reset_mock()
db.instance_tag_set(self.context, uuid, [tag1])
# Check insert() wasn't called because there are no tags for creation
mock_insert.assert_not_called()
@mock.patch('sqlalchemy.orm.query.Query.delete')
def test_instance_tag_set_empty_delete(self, mock_delete):
uuid = self._create_instance()