Merge "db: Correct 'nullable' mismatches on models"

This commit is contained in:
Zuul 2022-01-26 16:29:44 +00:00 committed by Gerrit Code Review
commit f6cb333c13
2 changed files with 91 additions and 35 deletions

View File

@ -97,7 +97,8 @@ class Service(BASE, CinderBase):
# failed-over or not-configured
replication_status = sa.Column(sa.String(36), default="not-capable")
active_backend_id = sa.Column(sa.String(255))
frozen = sa.Column(sa.Boolean, nullable=False, default=False)
# TODO(stephenfin): Add nullable=False
frozen = sa.Column(sa.Boolean, default=False)
cluster = relationship(
'Cluster',
@ -186,8 +187,9 @@ class ConsistencyGroup(BASE, CinderBase):
id = sa.Column(sa.String(36), primary_key=True)
user_id = sa.Column(sa.String(255), nullable=False)
project_id = sa.Column(sa.String(255), nullable=False)
# TODO(stephenfin): Add nullable=False
user_id = sa.Column(sa.String(255))
project_id = sa.Column(sa.String(255))
cluster_name = sa.Column(sa.String(255), nullable=True)
host = sa.Column(sa.String(255))
@ -207,8 +209,9 @@ class Group(BASE, CinderBase):
id = sa.Column(sa.String(36), primary_key=True)
user_id = sa.Column(sa.String(255), nullable=False)
project_id = sa.Column(sa.String(255), nullable=False)
# TODO(stephenfin): Add nullable=False
user_id = sa.Column(sa.String(255))
project_id = sa.Column(sa.String(255))
cluster_name = sa.Column(sa.String(255))
host = sa.Column(sa.String(255))
@ -231,8 +234,10 @@ class CGSnapshot(BASE, CinderBase):
id = sa.Column(sa.String(36), primary_key=True)
consistencygroup_id = sa.Column(sa.String(36), index=True)
user_id = sa.Column(sa.String(255), nullable=False)
project_id = sa.Column(sa.String(255), nullable=False)
# TODO(stephenfin): Add nullable=False
user_id = sa.Column(sa.String(255))
project_id = sa.Column(sa.String(255))
name = sa.Column(sa.String(255))
description = sa.Column(sa.String(255))
@ -327,7 +332,7 @@ class Volume(BASE, CinderBase):
provider_geometry = sa.Column(sa.String(255))
provider_id = sa.Column(sa.String(255))
volume_type_id = sa.Column(sa.String(36))
volume_type_id = sa.Column(sa.String(36), nullable=False)
source_volid = sa.Column(sa.String(36))
encryption_key_id = sa.Column(sa.String(36))
@ -477,7 +482,7 @@ class GroupType(BASE, CinderBase):
__tablename__ = "group_types"
id = sa.Column(sa.String(36), primary_key=True)
name = sa.Column(sa.String(255))
name = sa.Column(sa.String(255), nullable=False)
description = sa.Column(sa.String(255))
is_public = sa.Column(sa.Boolean, default=True)
groups = relationship(
@ -531,8 +536,9 @@ class VolumeTypeProjects(BASE, CinderBase):
)
id = sa.Column(sa.Integer, primary_key=True)
# TODO(stephenfin): Add nullable=False
volume_type_id = sa.Column(
sa.String, sa.ForeignKey('volume_types.id'), nullable=False
sa.String(36), sa.ForeignKey('volume_types.id'),
)
project_id = sa.Column(sa.String(255))
deleted = sa.Column(sa.Integer, default=0)
@ -562,8 +568,9 @@ class GroupTypeProjects(BASE, CinderBase):
)
id = sa.Column(sa.Integer, primary_key=True)
# TODO(stephenfin): Add nullable=False
group_type_id = sa.Column(
sa.String, sa.ForeignKey('group_types.id'), nullable=False
sa.String(36), sa.ForeignKey('group_types.id'),
)
project_id = sa.Column(sa.String(255))
@ -631,7 +638,9 @@ class DefaultVolumeTypes(BASE, CinderBase):
__tablename__ = "default_volume_types"
volume_type_id = sa.Column(
sa.String, sa.ForeignKey('volume_types.id'), nullable=False, index=True
sa.String(36),
sa.ForeignKey('volume_types.id'),
index=True,
)
project_id = sa.Column(sa.String(255), primary_key=True)
volume_type = relationship(
@ -743,7 +752,7 @@ class Quota(BASE, CinderBase):
project_id = sa.Column(sa.String(255), index=True)
resource = sa.Column(sa.String(255))
resource = sa.Column(sa.String(255), nullable=False)
hard_limit = sa.Column(sa.Integer, nullable=True)
# TODO: (X release): Remove allocated, belonged to nested quotas
allocated = sa.Column(sa.Integer, default=0)
@ -784,8 +793,8 @@ class QuotaUsage(BASE, CinderBase):
project_id = sa.Column(sa.String(255), index=True)
resource = sa.Column(sa.String(300), index=True)
in_use = sa.Column(sa.Integer)
reserved = sa.Column(sa.Integer)
in_use = sa.Column(sa.Integer, nullable=False)
reserved = sa.Column(sa.Integer, nullable=False)
@property
def total(self):
@ -827,8 +836,9 @@ class Reservation(BASE, CinderBase):
project_id = sa.Column(sa.String(255), index=True)
resource = sa.Column(sa.String(255))
delta = sa.Column(sa.Integer)
expire = sa.Column(sa.DateTime, nullable=False)
delta = sa.Column(sa.Integer, nullable=False)
# TODO(stephenfin): Add nullable=False
expire = sa.Column(sa.DateTime(timezone=False))
usage = relationship(
"QuotaUsage",
@ -880,7 +890,7 @@ class Snapshot(BASE, CinderBase):
display_description = sa.Column(sa.String(255))
encryption_key_id = sa.Column(sa.String(36))
volume_type_id = sa.Column(sa.String(36))
volume_type_id = sa.Column(sa.String(36), nullable=False)
provider_location = sa.Column(sa.String(255))
provider_id = sa.Column(sa.String(255))
@ -944,8 +954,9 @@ class Backup(BASE, CinderBase):
def name(self):
return CONF.backup_name_template % self.id
user_id = sa.Column(sa.String(255), nullable=False)
project_id = sa.Column(sa.String(255), nullable=False)
# TODO(stephenfin): Add nullable=False
user_id = sa.Column(sa.String(255))
project_id = sa.Column(sa.String(255))
volume_id = sa.Column(sa.String(36), nullable=False)
host = sa.Column(sa.String(255))
@ -1003,12 +1014,27 @@ class Encryption(BASE, CinderBase):
__tablename__ = 'encryption'
encryption_id = sa.Column(sa.String(36), primary_key=True)
# NOTE (smcginnis): nullable=True triggers this to not set a default
# value, but since it's a primary key the resulting schema will end up
# still being NOT NULL. This is avoiding a case in MySQL where it will
# otherwise set this to NOT NULL DEFAULT ''. May be harmless, but
# inconsistent with previous schema.
encryption_id = sa.Column(
sa.String(36),
primary_key=True,
nullable=True,
)
cipher = sa.Column(sa.String(255))
key_size = sa.Column(sa.Integer)
provider = sa.Column(sa.String(255))
control_location = sa.Column(sa.String(255))
volume_type_id = sa.Column(sa.String(36), sa.ForeignKey('volume_types.id'))
# NOTE(joel-coffman): The volume_type_id must be unique or else the
# referenced volume type becomes ambiguous. That is, specifying the
# volume type is not sufficient to identify a particular encryption
# scheme unless each volume type is associated with at most one
# encryption scheme.
# TODO(stephenfin): Make this a foreign key
volume_type_id = sa.Column(sa.String(36), nullable=False)
volume_type = relationship(
VolumeType,
backref="encryption",
@ -1026,7 +1052,10 @@ class Transfer(BASE, CinderBase):
id = sa.Column(sa.String(36), primary_key=True)
volume_id = sa.Column(
sa.String(36), sa.ForeignKey('volumes.id'), index=True
sa.String(36),
sa.ForeignKey('volumes.id'),
nullable=False,
index=True,
)
display_name = sa.Column(sa.String(255))
salt = sa.Column(sa.String(255))
@ -1094,10 +1123,13 @@ class ImageVolumeCacheEntry(BASE, models.ModelBase):
host = sa.Column(sa.String(255), index=True, nullable=False)
cluster_name = sa.Column(sa.String(255), nullable=True)
image_id = sa.Column(sa.String(36), index=True, nullable=False)
image_updated_at = sa.Column(sa.DateTime, nullable=False)
# TODO(stephenfin): Add nullable=False
image_updated_at = sa.Column(sa.DateTime)
volume_id = sa.Column(sa.String(36), nullable=False)
size = sa.Column(sa.Integer, nullable=False)
last_used = sa.Column(sa.DateTime, default=lambda: timeutils.utcnow())
last_used = sa.Column(
sa.DateTime, nullable=False, default=lambda: timeutils.utcnow(),
)
class Worker(BASE, CinderBase):

View File

@ -105,24 +105,48 @@ class TestObjectVersions(test.TestCase):
# db model and object match.
def _check_table_matched(db_model, cls):
for column in db_model.__table__.columns:
# Ignore columns that aren't reflected by the model
if column.name not in cls.fields:
continue
# NOTE(jdg): Model and Object don't match intentionally here
if (column.name in cls.fields and
(column.name == 'uuid' and name == 'Service')):
if name == 'Service' and column.name == 'uuid':
continue
# NOTE(xyang): Skip the comparison of the colume name
# group_type_id in table Group because group_type_id
# is in the object Group but it is stored in a different
# table in the database, not in the Group table.
if (column.name in cls.fields and
(column.name != 'group_type_id' and name != 'Group')):
self.assertEqual(
column.nullable,
cls.fields[column.name].nullable,
'Column %(c)s in table %(t)s not match.'
% {'c': column.name,
't': name})
if name == 'Group' and column.name == 'group_type_id':
continue
# TODO(stephenfin): Model and Object don't match here, but it
# wasn't intentional
if (name, column.name) in {
('Backup', 'project_id'),
('Backup', 'user_id'),
('BackupImport', 'project_id'),
('BackupImport', 'user_id'),
('CGSnapshot', 'project_id'),
('CGSnapshot', 'user_id'),
('ConsistencyGroup', 'project_id'),
('ConsistencyGroup', 'user_id'),
('Group', 'user_id'),
('Group', 'project_id'),
('GroupType', 'name'),
('Service', 'frozen'),
('Snapshot', 'volume_type_id'),
('Volume', 'volume_type_id'),
}:
continue
self.assertEqual(
column.nullable,
cls.fields[column.name].nullable,
'Column %(c)s in table %(t)s not match.' % {
'c': column.name, 't': name,
},
)
classes = base.CinderObjectRegistry.obj_classes()
for name, cls in classes.items():