Merge "db: Correct 'nullable' mismatches on models"
This commit is contained in:
commit
f6cb333c13
|
@ -97,7 +97,8 @@ class Service(BASE, CinderBase):
|
||||||
# failed-over or not-configured
|
# failed-over or not-configured
|
||||||
replication_status = sa.Column(sa.String(36), default="not-capable")
|
replication_status = sa.Column(sa.String(36), default="not-capable")
|
||||||
active_backend_id = sa.Column(sa.String(255))
|
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 = relationship(
|
||||||
'Cluster',
|
'Cluster',
|
||||||
|
@ -186,8 +187,9 @@ class ConsistencyGroup(BASE, CinderBase):
|
||||||
|
|
||||||
id = sa.Column(sa.String(36), primary_key=True)
|
id = sa.Column(sa.String(36), primary_key=True)
|
||||||
|
|
||||||
user_id = sa.Column(sa.String(255), nullable=False)
|
# TODO(stephenfin): Add nullable=False
|
||||||
project_id = sa.Column(sa.String(255), 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)
|
cluster_name = sa.Column(sa.String(255), nullable=True)
|
||||||
host = sa.Column(sa.String(255))
|
host = sa.Column(sa.String(255))
|
||||||
|
@ -207,8 +209,9 @@ class Group(BASE, CinderBase):
|
||||||
|
|
||||||
id = sa.Column(sa.String(36), primary_key=True)
|
id = sa.Column(sa.String(36), primary_key=True)
|
||||||
|
|
||||||
user_id = sa.Column(sa.String(255), nullable=False)
|
# TODO(stephenfin): Add nullable=False
|
||||||
project_id = sa.Column(sa.String(255), nullable=False)
|
user_id = sa.Column(sa.String(255))
|
||||||
|
project_id = sa.Column(sa.String(255))
|
||||||
|
|
||||||
cluster_name = sa.Column(sa.String(255))
|
cluster_name = sa.Column(sa.String(255))
|
||||||
host = 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)
|
id = sa.Column(sa.String(36), primary_key=True)
|
||||||
|
|
||||||
consistencygroup_id = sa.Column(sa.String(36), index=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))
|
name = sa.Column(sa.String(255))
|
||||||
description = 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_geometry = sa.Column(sa.String(255))
|
||||||
provider_id = 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))
|
source_volid = sa.Column(sa.String(36))
|
||||||
encryption_key_id = sa.Column(sa.String(36))
|
encryption_key_id = sa.Column(sa.String(36))
|
||||||
|
|
||||||
|
@ -477,7 +482,7 @@ class GroupType(BASE, CinderBase):
|
||||||
__tablename__ = "group_types"
|
__tablename__ = "group_types"
|
||||||
|
|
||||||
id = sa.Column(sa.String(36), primary_key=True)
|
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))
|
description = sa.Column(sa.String(255))
|
||||||
is_public = sa.Column(sa.Boolean, default=True)
|
is_public = sa.Column(sa.Boolean, default=True)
|
||||||
groups = relationship(
|
groups = relationship(
|
||||||
|
@ -531,8 +536,9 @@ class VolumeTypeProjects(BASE, CinderBase):
|
||||||
)
|
)
|
||||||
|
|
||||||
id = sa.Column(sa.Integer, primary_key=True)
|
id = sa.Column(sa.Integer, primary_key=True)
|
||||||
|
# TODO(stephenfin): Add nullable=False
|
||||||
volume_type_id = sa.Column(
|
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))
|
project_id = sa.Column(sa.String(255))
|
||||||
deleted = sa.Column(sa.Integer, default=0)
|
deleted = sa.Column(sa.Integer, default=0)
|
||||||
|
@ -562,8 +568,9 @@ class GroupTypeProjects(BASE, CinderBase):
|
||||||
)
|
)
|
||||||
|
|
||||||
id = sa.Column(sa.Integer, primary_key=True)
|
id = sa.Column(sa.Integer, primary_key=True)
|
||||||
|
# TODO(stephenfin): Add nullable=False
|
||||||
group_type_id = sa.Column(
|
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))
|
project_id = sa.Column(sa.String(255))
|
||||||
|
|
||||||
|
@ -631,7 +638,9 @@ class DefaultVolumeTypes(BASE, CinderBase):
|
||||||
__tablename__ = "default_volume_types"
|
__tablename__ = "default_volume_types"
|
||||||
|
|
||||||
volume_type_id = sa.Column(
|
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)
|
project_id = sa.Column(sa.String(255), primary_key=True)
|
||||||
volume_type = relationship(
|
volume_type = relationship(
|
||||||
|
@ -743,7 +752,7 @@ class Quota(BASE, CinderBase):
|
||||||
|
|
||||||
project_id = sa.Column(sa.String(255), index=True)
|
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)
|
hard_limit = sa.Column(sa.Integer, nullable=True)
|
||||||
# TODO: (X release): Remove allocated, belonged to nested quotas
|
# TODO: (X release): Remove allocated, belonged to nested quotas
|
||||||
allocated = sa.Column(sa.Integer, default=0)
|
allocated = sa.Column(sa.Integer, default=0)
|
||||||
|
@ -784,8 +793,8 @@ class QuotaUsage(BASE, CinderBase):
|
||||||
project_id = sa.Column(sa.String(255), index=True)
|
project_id = sa.Column(sa.String(255), index=True)
|
||||||
resource = sa.Column(sa.String(300), index=True)
|
resource = sa.Column(sa.String(300), index=True)
|
||||||
|
|
||||||
in_use = sa.Column(sa.Integer)
|
in_use = sa.Column(sa.Integer, nullable=False)
|
||||||
reserved = sa.Column(sa.Integer)
|
reserved = sa.Column(sa.Integer, nullable=False)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def total(self):
|
def total(self):
|
||||||
|
@ -827,8 +836,9 @@ class Reservation(BASE, CinderBase):
|
||||||
project_id = sa.Column(sa.String(255), index=True)
|
project_id = sa.Column(sa.String(255), index=True)
|
||||||
resource = sa.Column(sa.String(255))
|
resource = sa.Column(sa.String(255))
|
||||||
|
|
||||||
delta = sa.Column(sa.Integer)
|
delta = sa.Column(sa.Integer, nullable=False)
|
||||||
expire = sa.Column(sa.DateTime, nullable=False)
|
# TODO(stephenfin): Add nullable=False
|
||||||
|
expire = sa.Column(sa.DateTime(timezone=False))
|
||||||
|
|
||||||
usage = relationship(
|
usage = relationship(
|
||||||
"QuotaUsage",
|
"QuotaUsage",
|
||||||
|
@ -880,7 +890,7 @@ class Snapshot(BASE, CinderBase):
|
||||||
display_description = sa.Column(sa.String(255))
|
display_description = sa.Column(sa.String(255))
|
||||||
|
|
||||||
encryption_key_id = sa.Column(sa.String(36))
|
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_location = sa.Column(sa.String(255))
|
||||||
provider_id = sa.Column(sa.String(255))
|
provider_id = sa.Column(sa.String(255))
|
||||||
|
@ -944,8 +954,9 @@ class Backup(BASE, CinderBase):
|
||||||
def name(self):
|
def name(self):
|
||||||
return CONF.backup_name_template % self.id
|
return CONF.backup_name_template % self.id
|
||||||
|
|
||||||
user_id = sa.Column(sa.String(255), nullable=False)
|
# TODO(stephenfin): Add nullable=False
|
||||||
project_id = sa.Column(sa.String(255), 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)
|
volume_id = sa.Column(sa.String(36), nullable=False)
|
||||||
host = sa.Column(sa.String(255))
|
host = sa.Column(sa.String(255))
|
||||||
|
@ -1003,12 +1014,27 @@ class Encryption(BASE, CinderBase):
|
||||||
|
|
||||||
__tablename__ = 'encryption'
|
__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))
|
cipher = sa.Column(sa.String(255))
|
||||||
key_size = sa.Column(sa.Integer)
|
key_size = sa.Column(sa.Integer)
|
||||||
provider = sa.Column(sa.String(255))
|
provider = sa.Column(sa.String(255))
|
||||||
control_location = 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(
|
volume_type = relationship(
|
||||||
VolumeType,
|
VolumeType,
|
||||||
backref="encryption",
|
backref="encryption",
|
||||||
|
@ -1026,7 +1052,10 @@ class Transfer(BASE, CinderBase):
|
||||||
|
|
||||||
id = sa.Column(sa.String(36), primary_key=True)
|
id = sa.Column(sa.String(36), primary_key=True)
|
||||||
volume_id = sa.Column(
|
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))
|
display_name = sa.Column(sa.String(255))
|
||||||
salt = 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)
|
host = sa.Column(sa.String(255), index=True, nullable=False)
|
||||||
cluster_name = sa.Column(sa.String(255), nullable=True)
|
cluster_name = sa.Column(sa.String(255), nullable=True)
|
||||||
image_id = sa.Column(sa.String(36), index=True, nullable=False)
|
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)
|
volume_id = sa.Column(sa.String(36), nullable=False)
|
||||||
size = sa.Column(sa.Integer, 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):
|
class Worker(BASE, CinderBase):
|
||||||
|
|
|
@ -105,24 +105,48 @@ class TestObjectVersions(test.TestCase):
|
||||||
# db model and object match.
|
# db model and object match.
|
||||||
def _check_table_matched(db_model, cls):
|
def _check_table_matched(db_model, cls):
|
||||||
for column in db_model.__table__.columns:
|
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
|
# NOTE(jdg): Model and Object don't match intentionally here
|
||||||
if (column.name in cls.fields and
|
if name == 'Service' and column.name == 'uuid':
|
||||||
(column.name == 'uuid' and name == 'Service')):
|
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# NOTE(xyang): Skip the comparison of the colume name
|
# NOTE(xyang): Skip the comparison of the colume name
|
||||||
# group_type_id in table Group because group_type_id
|
# group_type_id in table Group because group_type_id
|
||||||
# is in the object Group but it is stored in a different
|
# is in the object Group but it is stored in a different
|
||||||
# table in the database, not in the Group table.
|
# table in the database, not in the Group table.
|
||||||
if (column.name in cls.fields and
|
if name == 'Group' and column.name == 'group_type_id':
|
||||||
(column.name != 'group_type_id' and name != 'Group')):
|
continue
|
||||||
self.assertEqual(
|
|
||||||
column.nullable,
|
# TODO(stephenfin): Model and Object don't match here, but it
|
||||||
cls.fields[column.name].nullable,
|
# wasn't intentional
|
||||||
'Column %(c)s in table %(t)s not match.'
|
if (name, column.name) in {
|
||||||
% {'c': column.name,
|
('Backup', 'project_id'),
|
||||||
't': name})
|
('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()
|
classes = base.CinderObjectRegistry.obj_classes()
|
||||||
for name, cls in classes.items():
|
for name, cls in classes.items():
|
||||||
|
|
Loading…
Reference in New Issue