diff --git a/watcher/db/sqlalchemy/api.py b/watcher/db/sqlalchemy/api.py index f5eaecbcf..7f0dc33ba 100644 --- a/watcher/db/sqlalchemy/api.py +++ b/watcher/db/sqlalchemy/api.py @@ -306,6 +306,13 @@ class Connection(api.BaseConnection): if not values.get('uuid'): values['uuid'] = utils.generate_uuid() + query = model_query(models.AuditTemplate) + query = query.filter_by(name=values.get('name'), + deleted_at=None) + + if len(query.all()) > 0: + raise exception.AuditTemplateAlreadyExists(uuid=values['uuid']) + audit_template = models.AuditTemplate() audit_template.update(values) @@ -347,14 +354,10 @@ class Connection(api.BaseConnection): def get_audit_template_by_name(self, context, audit_template_name): query = model_query(models.AuditTemplate) - query = query.filter_by(name=audit_template_name) + query = query.filter_by(name=audit_template_name, + deleted_at=None) try: - audit_template = query.one() - if not context.show_deleted: - if audit_template.deleted_at is not None: - raise exception.AuditTemplateNotFound( - audit_template=audit_template_name) - return audit_template + return query.one() except exc.MultipleResultsFound: raise exception.Conflict( _('Multiple audit templates exist with the same name.' diff --git a/watcher/db/sqlalchemy/models.py b/watcher/db/sqlalchemy/models.py index 7ae7e53cf..633f76057 100644 --- a/watcher/db/sqlalchemy/models.py +++ b/watcher/db/sqlalchemy/models.py @@ -116,7 +116,6 @@ class AuditTemplate(Base): __tablename__ = 'audit_templates' __table_args__ = ( schema.UniqueConstraint('uuid', name='uniq_audit_templates0uuid'), - schema.UniqueConstraint('name', name='uniq_audit_templates0name'), table_args() ) id = Column(Integer, primary_key=True) diff --git a/watcher/tests/api/v1/test_audit_templates.py b/watcher/tests/api/v1/test_audit_templates.py index 5844c931e..eb4023948 100644 --- a/watcher/tests/api/v1/test_audit_templates.py +++ b/watcher/tests/api/v1/test_audit_templates.py @@ -19,6 +19,7 @@ from six.moves.urllib import parse as urlparse from wsme import types as wtypes from watcher.api.controllers.v1 import audit_template as api_audit_template +from watcher.common import exception from watcher.common import utils from watcher.db import api as db_api from watcher import objects @@ -496,11 +497,10 @@ class TestDelete(api_base.FunctionalTest): self.assertTrue(response.json['error_message']) self.context.show_deleted = True - audit_template = objects.AuditTemplate.get_by_name( - self.context, self.audit_template.name) - - return_deleted_at = timeutils.strtime(audit_template['deleted_at']) - self.assertEqual(timeutils.strtime(test_time), return_deleted_at) + self.assertRaises(exception.AuditTemplateNotFound, + objects.AuditTemplate.get_by_name, + self.context, + self.audit_template.name) def test_delete_audit_template_not_found(self): uuid = utils.generate_uuid() diff --git a/watcher/tests/db/sqlalchemy/test_types.py b/watcher/tests/db/sqlalchemy/test_types.py index bcbb63675..701a4f4fd 100644 --- a/watcher/tests/db/sqlalchemy/test_types.py +++ b/watcher/tests/db/sqlalchemy/test_types.py @@ -35,6 +35,7 @@ class SqlAlchemyCustomTypesTestCase(base.DbTestCase): .filter_by(uuid=audit_template1_id).one() self.assertEqual({}, audit_template1.extra) + def test_JSONEncodedDict_extra_value(self): # Create audit_template with extra audit_template2_id = w_utils.generate_uuid() self.dbapi.create_audit_template({'uuid': audit_template2_id,