diff --git a/nova/cmd/status.py b/nova/cmd/status.py index 1974feb58b0b..75ae63d07d97 100644 --- a/nova/cmd/status.py +++ b/nova/cmd/status.py @@ -25,8 +25,8 @@ from oslo_config import cfg from oslo_upgradecheck import common_checks from oslo_upgradecheck import upgradecheck import pkg_resources +import sqlalchemy as sa from sqlalchemy import func as sqlfunc -from sqlalchemy import MetaData, Table, select from nova.cmd import common as cmd_common import nova.conf @@ -86,10 +86,10 @@ class UpgradeCommands(upgradecheck.UpgradeCommands): # table, or by only counting compute nodes with a service version of at # least 15 which was the highest service version when Newton was # released. - meta = MetaData(bind=db_session.get_engine(context=context)) - compute_nodes = Table('compute_nodes', meta, autoload=True) - return select([sqlfunc.count()]).select_from(compute_nodes).where( - compute_nodes.c.deleted == 0).scalar() + meta = sa.MetaData(bind=db_session.get_engine(context=context)) + compute_nodes = sa.Table('compute_nodes', meta, autoload=True) + return sa.select([sqlfunc.count()]).select_from(compute_nodes).where( + compute_nodes.c.deleted == 0).scalar() def _check_cellsv2(self): """Checks to see if cells v2 has been setup. @@ -102,7 +102,7 @@ class UpgradeCommands(upgradecheck.UpgradeCommands): this on an initial install. This also has to be careful about checking for compute nodes if there are no host mappings on a fresh install. """ - meta = MetaData() + meta = sa.MetaData() meta.bind = db_session.get_api_engine() cell_mappings = self._get_cell_mappings() @@ -122,8 +122,9 @@ class UpgradeCommands(upgradecheck.UpgradeCommands): 'retry.') return upgradecheck.Result(upgradecheck.Code.FAILURE, msg) - host_mappings = Table('host_mappings', meta, autoload=True) - count = select([sqlfunc.count()]).select_from(host_mappings).scalar() + host_mappings = sa.Table('host_mappings', meta, autoload=True) + count = sa.select([sqlfunc.count()]).select_from(host_mappings)\ + .scalar() if count == 0: # This may be a fresh install in which case there may not be any # compute_nodes in the cell database if the nova-compute service diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index c65dcdc2c952..816bcc63d47b 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -35,26 +35,12 @@ from oslo_utils import importutils from oslo_utils import timeutils from oslo_utils import uuidutils import sqlalchemy as sa -from sqlalchemy import and_ -from sqlalchemy import Boolean -from sqlalchemy.exc import NoSuchTableError -from sqlalchemy import Integer -from sqlalchemy import MetaData -from sqlalchemy import or_ -from sqlalchemy.orm import aliased -from sqlalchemy.orm import joinedload -from sqlalchemy.orm import noload -from sqlalchemy.orm import subqueryload -from sqlalchemy.orm import undefer -from sqlalchemy.schema import Table +from sqlalchemy import exc as sqla_exc +from sqlalchemy import orm +from sqlalchemy import schema from sqlalchemy import sql -from sqlalchemy.sql.expression import asc -from sqlalchemy.sql.expression import cast -from sqlalchemy.sql.expression import desc -from sqlalchemy.sql import false +from sqlalchemy.sql import expression from sqlalchemy.sql import func -from sqlalchemy.sql import null -from sqlalchemy.sql import true from nova import block_device from nova.compute import task_states @@ -94,7 +80,7 @@ def _context_manager_from_context(context): def _joinedload_all(column): elements = column.split('.') - joined = joinedload(elements.pop(0)) + joined = orm.joinedload(elements.pop(0)) for element in elements: joined = joined.joinedload(element) @@ -293,9 +279,10 @@ def model_query( # us to return both our projects and unowned projects. if nova.context.is_user_context(context) and project_only: if project_only == 'allow_none': - query = query.\ - filter(or_(model.project_id == context.project_id, - model.project_id == null())) + query = query.filter(sql.or_( + model.project_id == context.project_id, + model.project_id == sql.null() + )) else: query = query.filter_by(project_id=context.project_id) @@ -367,7 +354,7 @@ class EqualityCondition(object): def clauses(self, field): # method signature requires us to return an iterable even if for OR # operator this will actually be a single clause - return [or_(*[field == value for value in self.values])] + return [sql.or_(*[field == value for value in self.values])] class InequalityCondition(object): @@ -395,9 +382,10 @@ def service_destroy(context, service_id): # TODO(sbauza): Remove the service_id filter in a later release # once we are sure that all compute nodes report the host field model_query(context, models.ComputeNode).\ - filter(or_(models.ComputeNode.service_id == service_id, - models.ComputeNode.host == service['host'])).\ - soft_delete(synchronize_session=False) + filter(sql.or_( + models.ComputeNode.service_id == service_id, + models.ComputeNode.host == service['host'])).\ + soft_delete(synchronize_session=False) @pick_context_manager_reader @@ -434,7 +422,7 @@ def service_get_minimum_version(context, binaries): func.min(models.Service.version)).\ filter(models.Service.binary.in_(binaries)).\ filter(models.Service.deleted == 0).\ - filter(models.Service.forced_down == false()).\ + filter(models.Service.forced_down == sql.false()).\ group_by(models.Service.binary) return dict(min_versions) @@ -615,7 +603,7 @@ def _compute_node_select(context, filters=None, limit=None, marker=None): select = select.limit(limit) # Explicitly order by id, so we're not dependent on the native sort # order of the underlying DB. - select = select.order_by(asc("id")) + select = select.order_by(expression.asc("id")) return select @@ -921,7 +909,7 @@ def compute_node_statistics(context): inner_sel.c.host == services_tbl.c.host, inner_sel.c.service_id == services_tbl.c.id ), - services_tbl.c.disabled == false(), + services_tbl.c.disabled == sql.false(), services_tbl.c.binary == 'nova-compute', services_tbl.c.deleted == 0 ) @@ -1106,9 +1094,9 @@ def virtual_interface_get_by_instance(context, instance_uuid): :param instance_uuid: UUID of the instance to filter on. """ vif_refs = _virtual_interface_query(context).\ - filter_by(instance_uuid=instance_uuid).\ - order_by(asc("created_at"), asc("id")).\ - all() + filter_by(instance_uuid=instance_uuid).\ + order_by(expression.asc("created_at"), expression.asc("id")).\ + all() return vif_refs @@ -1414,7 +1402,7 @@ def instance_get(context, instance_id, columns_to_join=None): def _build_instance_get(context, columns_to_join=None): query = model_query(context, models.Instance, project_only=True).\ options(_joinedload_all('security_groups.rules')).\ - options(joinedload('info_cache')) + options(orm.joinedload('info_cache')) if columns_to_join is None: columns_to_join = ['metadata', 'system_metadata'] for column in columns_to_join: @@ -1422,7 +1410,7 @@ def _build_instance_get(context, columns_to_join=None): # Already always joined above continue if 'extra.' in column: - query = query.options(undefer(column)) + query = query.options(orm.undefer(column)) elif column in ['metadata', 'system_metadata']: # NOTE(melwitt): We use subqueryload() instead of joinedload() for # metadata and system_metadata because of the one-to-many @@ -1432,13 +1420,13 @@ def _build_instance_get(context, columns_to_join=None): # in a large data transfer. Instead, the subqueryload() will # perform additional queries to obtain metadata and system_metadata # for the instance. - query = query.options(subqueryload(column)) + query = query.options(orm.subqueryload(column)) else: - query = query.options(joinedload(column)) + query = query.options(orm.joinedload(column)) # NOTE(alaski) Stop lazy loading of columns not needed. for col in ['metadata', 'system_metadata']: if col not in columns_to_join: - query = query.options(noload(col)) + query = query.options(orm.noload(col)) # NOTE(melwitt): We need to use order_by() so that the # additional queries emitted by subqueryload() include the same ordering as # used by the parent query. @@ -1531,7 +1519,7 @@ def instance_get_all(context, columns_to_join=None): _manual_join_columns(columns_to_join)) query = model_query(context, models.Instance) for column in columns_to_join_new: - query = query.options(joinedload(column)) + query = query.options(orm.joinedload(column)) if not context.is_admin: # If we're not admin context, add appropriate filter.. if context.project_id: @@ -1673,9 +1661,9 @@ def instance_get_all_by_filters_sort(context, filters, limit=None, marker=None, query_prefix = context.session.query(models.Instance) for column in columns_to_join_new: if 'extra.' in column: - query_prefix = query_prefix.options(undefer(column)) + query_prefix = query_prefix.options(orm.undefer(column)) else: - query_prefix = query_prefix.options(joinedload(column)) + query_prefix = query_prefix.options(orm.joinedload(column)) # Note: order_by is done in the sqlalchemy.utils.py paginate_query(), # no need to do it here as well @@ -1695,7 +1683,7 @@ def instance_get_all_by_filters_sort(context, filters, limit=None, marker=None, deleted = filters.pop('deleted') if deleted: if filters.pop('soft_deleted', True): - delete = or_( + delete = sql.or_( models.Instance.deleted == models.Instance.id, models.Instance.vm_state == vm_states.SOFT_DELETED ) @@ -1710,10 +1698,10 @@ def instance_get_all_by_filters_sort(context, filters, limit=None, marker=None, if not filters.pop('soft_deleted', False): # It would be better to have vm_state not be nullable # but until then we test it explicitly as a workaround. - not_soft_deleted = or_( + not_soft_deleted = sql.or_( models.Instance.vm_state != vm_states.SOFT_DELETED, - models.Instance.vm_state == null() - ) + models.Instance.vm_state == sql.null() + ) query_prefix = query_prefix.filter(not_soft_deleted) if 'cleaned' in filters: @@ -1730,14 +1718,14 @@ def instance_get_all_by_filters_sort(context, filters, limit=None, marker=None, query_prefix = query_prefix.filter(models.Tag.tag == first_tag) for tag in tags: - tag_alias = aliased(models.Tag) + tag_alias = orm.aliased(models.Tag) query_prefix = query_prefix.join(tag_alias, models.Instance.tags) query_prefix = query_prefix.filter(tag_alias.tag == tag) if 'tags-any' in filters: tags = filters.pop('tags-any') - tag_alias = aliased(models.Tag) + tag_alias = orm.aliased(models.Tag) query_prefix = query_prefix.join(tag_alias, models.Instance.tags) query_prefix = query_prefix.filter(tag_alias.tag.in_(tags)) @@ -1749,7 +1737,7 @@ def instance_get_all_by_filters_sort(context, filters, limit=None, marker=None, subq = subq.filter(models.Tag.tag == first_tag) for tag in tags: - tag_alias = aliased(models.Tag) + tag_alias = orm.aliased(models.Tag) subq = subq.join(tag_alias, models.Instance.tags) subq = subq.filter(tag_alias.tag == tag) @@ -1768,14 +1756,15 @@ def instance_get_all_by_filters_sort(context, filters, limit=None, marker=None, filters['user_id'] = context.user_id if filters.pop('hidden', False): - query_prefix = query_prefix.filter(models.Instance.hidden == true()) + query_prefix = query_prefix.filter( + models.Instance.hidden == sql.true()) else: # If the query should not include hidden instances, then # filter instances with hidden=False or hidden=NULL because # older records may have no value set. - query_prefix = query_prefix.filter(or_( - models.Instance.hidden == false(), - models.Instance.hidden == null())) + query_prefix = query_prefix.filter(sql.or_( + models.Instance.hidden == sql.false(), + models.Instance.hidden == sql.null())) # Filters for exact matches that we can do along with the SQL query... # For other filters that don't match this, we will do regexp matching @@ -1856,9 +1845,9 @@ def _model_get_uuid_by_sort_filters(context, model, sort_keys, sort_dirs, for skey, sdir, val in zip(sort_keys, sort_dirs, values): # Apply ordering to our query for the key, direction we're processing if sdir == 'desc': - query = query.order_by(desc(getattr(model, skey))) + query = query.order_by(expression.desc(getattr(model, skey))) else: - query = query.order_by(asc(getattr(model, skey))) + query = query.order_by(expression.asc(getattr(model, skey))) # Build a list of equivalence requirements on keys we've already # processed through the loop. In other words, if we're adding @@ -1869,8 +1858,8 @@ def _model_get_uuid_by_sort_filters(context, model, sort_keys, sort_dirs, (getattr(model, sort_keys[equal_attr]) == values[equal_attr])) model_attr = getattr(model, skey) - if isinstance(model_attr.type, Boolean): - model_attr = cast(model_attr, Integer) + if isinstance(model_attr.type, sa.Boolean): + model_attr = expression.cast(model_attr, sa.Integer) val = int(val) if skey == sort_keys[-1]: @@ -1890,11 +1879,11 @@ def _model_get_uuid_by_sort_filters(context, model, sort_keys, sort_dirs, # AND together all the above crit_attrs.append(crit) - criteria.append(and_(*crit_attrs)) + criteria.append(sql.and_(*crit_attrs)) key_index += 1 # OR together all the ANDs - query = query.filter(or_(*criteria)) + query = query.filter(sql.or_(*criteria)) # We can't raise InstanceNotFound because we don't have a uuid to # be looking for, so just return nothing if no match. @@ -2130,12 +2119,13 @@ def instance_get_active_by_window_joined(context, begin, end=None, for column in columns_to_join_new: if 'extra.' in column: - query = query.options(undefer(column)) + query = query.options(orm.undefer(column)) else: - query = query.options(joinedload(column)) + query = query.options(orm.joinedload(column)) - query = query.filter(or_(models.Instance.terminated_at == null(), - models.Instance.terminated_at > begin)) + query = query.filter(sql.or_( + models.Instance.terminated_at == sql.null(), + models.Instance.terminated_at > begin)) if end: query = query.filter(models.Instance.launched_at < end) if project_id: @@ -2165,9 +2155,9 @@ def _instance_get_all_query(context, project_only=False, joins=None): project_only=project_only) for column in joins: if 'extra.' in column: - query = query.options(undefer(column)) + query = query.options(orm.undefer(column)) else: - query = query.options(joinedload(column)) + query = query.options(orm.joinedload(column)) return query @@ -2581,7 +2571,7 @@ def instance_extra_get_by_instance_uuid( columns = ['numa_topology', 'pci_requests', 'flavor', 'vcpu_model', 'trusted_certs', 'resources', 'migration_context'] for column in columns: - query = query.options(undefer(column)) + query = query.options(orm.undefer(column)) instance_extra = query.first() return instance_extra @@ -2875,7 +2865,7 @@ def _block_device_mapping_get_query(context, columns_to_join=None): query = model_query(context, models.BlockDeviceMapping) for column in columns_to_join: - query = query.options(joinedload(column)) + query = query.options(orm.joinedload(column)) return query @@ -3408,10 +3398,13 @@ def migration_get_in_progress_by_host_and_node(context, host, node): # and the instance is in VERIFY_RESIZE state, so the end state # for a resize is actually 'confirmed' or 'reverted'. return model_query(context, models.Migration).\ - filter(or_(and_(models.Migration.source_compute == host, - models.Migration.source_node == node), - and_(models.Migration.dest_compute == host, - models.Migration.dest_node == node))).\ + filter(sql.or_( + sql.and_( + models.Migration.source_compute == host, + models.Migration.source_node == node), + sql.and_( + models.Migration.dest_compute == host, + models.Migration.dest_node == node))).\ filter(~models.Migration.status.in_(['confirmed', 'reverted', 'error', 'failed', 'completed', 'cancelled', @@ -3465,15 +3458,17 @@ def migration_get_all_by_filters(context, filters, query = query.filter(models.Migration.status.in_(status)) if "host" in filters: host = filters["host"] - query = query.filter(or_(models.Migration.source_compute == host, - models.Migration.dest_compute == host)) + query = query.filter(sql.or_( + models.Migration.source_compute == host, + models.Migration.dest_compute == host)) elif "source_compute" in filters: host = filters['source_compute'] query = query.filter(models.Migration.source_compute == host) if "node" in filters: node = filters['node'] - query = query.filter(or_(models.Migration.source_node == node, - models.Migration.dest_node == node)) + query = query.filter(sql.or_( + models.Migration.source_node == node, + models.Migration.dest_node == node)) if "migration_type" in filters: migtype = filters["migration_type"] query = query.filter(models.Migration.migration_type == migtype) @@ -3551,10 +3546,13 @@ def migration_get_in_progress_and_error_by_host_and_node(context, host, node): host and node. """ return model_query(context, models.Migration).\ - filter(or_(and_(models.Migration.source_compute == host, - models.Migration.source_node == node), - and_(models.Migration.dest_compute == host, - models.Migration.dest_node == node))).\ + filter(sql.or_( + sql.and_( + models.Migration.source_compute == host, + models.Migration.source_node == node), + sql.and_( + models.Migration.dest_compute == host, + models.Migration.dest_node == node))).\ filter(~models.Migration.status.in_(['confirmed', 'reverted', 'failed', 'completed', 'cancelled', 'done'])).\ @@ -3738,11 +3736,11 @@ def bw_usage_update( # same record is updated every time. It can be removed after adding # unique constraint to this model. bw_usage = model_query(context, models.BandwidthUsage, - read_deleted='yes').\ - filter_by(start_period=ts_values['start_period']).\ - filter_by(uuid=uuid).\ - filter_by(mac=mac).\ - order_by(asc(models.BandwidthUsage.id)).first() + read_deleted='yes').\ + filter_by(start_period=ts_values['start_period']).\ + filter_by(uuid=uuid).\ + filter_by(mac=mac).\ + order_by(expression.asc(models.BandwidthUsage.id)).first() if bw_usage: bw_usage.update(values) @@ -3770,11 +3768,12 @@ def bw_usage_update( def vol_get_usage_by_time(context, begin): """Return volumes usage that have been updated after a specified time.""" return model_query(context, models.VolumeUsage, read_deleted="yes").\ - filter(or_(models.VolumeUsage.tot_last_refreshed == null(), - models.VolumeUsage.tot_last_refreshed > begin, - models.VolumeUsage.curr_last_refreshed == null(), - models.VolumeUsage.curr_last_refreshed > begin, - )).all() + filter(sql.or_( + models.VolumeUsage.tot_last_refreshed == sql.null(), + models.VolumeUsage.tot_last_refreshed > begin, + models.VolumeUsage.curr_last_refreshed == sql.null(), + models.VolumeUsage.curr_last_refreshed > begin, + )).all() @require_context @@ -3992,8 +3991,9 @@ def instance_fault_get_by_instance_uuids( query = query.join(latest_faults, faults_tbl.c.id == latest_faults.c.max_id) else: - query = query.filter(models.InstanceFault.instance_uuid.in_( - instance_uuids)).order_by(desc("id")) + query = query.filter( + models.InstanceFault.instance_uuid.in_(instance_uuids) + ).order_by(expression.desc("id")) output = {} for instance_uuid in instance_uuids: @@ -4071,18 +4071,18 @@ def action_get_by_request_id(context, instance_uuid, request_id): def _action_get_by_request_id(context, instance_uuid, request_id): result = model_query(context, models.InstanceAction).\ - filter_by(instance_uuid=instance_uuid).\ - filter_by(request_id=request_id).\ - order_by(desc("created_at"), desc("id")).\ - first() + filter_by(instance_uuid=instance_uuid).\ + filter_by(request_id=request_id).\ + order_by(expression.desc("created_at"), expression.desc("id")).\ + first() return result def _action_get_last_created_by_instance_uuid(context, instance_uuid): - result = (model_query(context, models.InstanceAction). - filter_by(instance_uuid=instance_uuid). - order_by(desc("created_at"), desc("id")). - first()) + result = model_query(context, models.InstanceAction).\ + filter_by(instance_uuid=instance_uuid).\ + order_by(expression.desc("created_at"), expression.desc("id")).\ + first() return result @@ -4180,9 +4180,9 @@ def action_event_finish(context, values): def action_events_get(context, action_id): """Get the events by action id.""" events = model_query(context, models.InstanceActionEvent).\ - filter_by(action_id=action_id).\ - order_by(desc("created_at"), desc("id")).\ - all() + filter_by(action_id=action_id).\ + order_by(expression.desc("created_at"), expression.desc("id")).\ + all() return events @@ -4376,9 +4376,9 @@ def _get_fk_stmts(metadata, conn, table, column, records): # Create the shadow table for the referencing table. fk_shadow_tablename = _SHADOW_TABLE_PREFIX + fk_table.name try: - fk_shadow_table = Table(fk_shadow_tablename, metadata, - autoload=True) - except NoSuchTableError: + fk_shadow_table = schema.Table( + fk_shadow_tablename, metadata, autoload=True) + except sqla_exc.NoSuchTableError: # No corresponding shadow table; skip it. continue @@ -4472,8 +4472,8 @@ def _archive_deleted_rows_for_table(metadata, tablename, max_rows, before, rows_archived = 0 deleted_instance_uuids = [] try: - shadow_table = Table(shadow_tablename, metadata, autoload=True) - except NoSuchTableError: + shadow_table = schema.Table(shadow_tablename, metadata, autoload=True) + except sqla_exc.NoSuchTableError: # No corresponding shadow table; skip it. return rows_archived, deleted_instance_uuids, {} @@ -4589,7 +4589,7 @@ def archive_deleted_rows(context=None, max_rows=None, before=None, table_to_rows_archived = collections.defaultdict(int) deleted_instance_uuids = [] total_rows_archived = 0 - meta = MetaData(get_engine(use_slave=True, context=context)) + meta = sa.MetaData(get_engine(use_slave=True, context=context)) meta.reflect() # Get the sorted list of tables in order of foreign key dependency. # Process the parent tables and find their dependent records in order to @@ -4634,7 +4634,7 @@ def _purgeable_tables(metadata): def purge_shadow_tables(context, before_date, status_fn=None): engine = get_engine(context=context) conn = engine.connect() - metadata = MetaData() + metadata = sa.MetaData() metadata.bind = engine metadata.reflect() total_deleted = 0 diff --git a/nova/db/sqlalchemy/api_models.py b/nova/db/sqlalchemy/api_models.py index ae85eddb72e0..74d6455d66de 100644 --- a/nova/db/sqlalchemy/api_models.py +++ b/nova/db/sqlalchemy/api_models.py @@ -13,28 +13,18 @@ from oslo_db.sqlalchemy import models from oslo_log import log as logging -from sqlalchemy import Boolean -from sqlalchemy import Column -from sqlalchemy import DateTime -from sqlalchemy.dialects.mysql import MEDIUMTEXT -from sqlalchemy import Enum +import sqlalchemy as sa +import sqlalchemy.dialects.mysql from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy import Float -from sqlalchemy import ForeignKey -from sqlalchemy import Index -from sqlalchemy import Integer from sqlalchemy import orm -from sqlalchemy.orm import backref from sqlalchemy import schema -from sqlalchemy import String -from sqlalchemy import Text -from sqlalchemy import Unicode LOG = logging.getLogger(__name__) def MediumText(): - return Text().with_variant(MEDIUMTEXT(), 'mysql') + return sa.Text().with_variant( + sqlalchemy.dialects.mysql.MEDIUMTEXT(), 'mysql') class _NovaAPIBase(models.ModelBase, models.TimestampMixin): @@ -52,9 +42,10 @@ class AggregateHost(API_BASE): name="uniq_aggregate_hosts0host0aggregate_id" ), ) - id = Column(Integer, primary_key=True, autoincrement=True) - host = Column(String(255)) - aggregate_id = Column(Integer, ForeignKey('aggregates.id'), nullable=False) + id = sa.Column(sa.Integer, primary_key=True, autoincrement=True) + host = sa.Column(sa.String(255)) + aggregate_id = sa.Column( + sa.Integer, sa.ForeignKey('aggregates.id'), nullable=False) class AggregateMetadata(API_BASE): @@ -64,30 +55,33 @@ class AggregateMetadata(API_BASE): schema.UniqueConstraint("aggregate_id", "key", name="uniq_aggregate_metadata0aggregate_id0key" ), - Index('aggregate_metadata_key_idx', 'key'), + sa.Index('aggregate_metadata_key_idx', 'key'), ) - id = Column(Integer, primary_key=True) - key = Column(String(255), nullable=False) - value = Column(String(255), nullable=False) - aggregate_id = Column(Integer, ForeignKey('aggregates.id'), nullable=False) + id = sa.Column(sa.Integer, primary_key=True) + key = sa.Column(sa.String(255), nullable=False) + value = sa.Column(sa.String(255), nullable=False) + aggregate_id = sa.Column( + sa.Integer, sa.ForeignKey('aggregates.id'), nullable=False) class Aggregate(API_BASE): """Represents a cluster of hosts that exists in this zone.""" __tablename__ = 'aggregates' - __table_args__ = (Index('aggregate_uuid_idx', 'uuid'), - schema.UniqueConstraint( - "name", name="uniq_aggregate0name") - ) - id = Column(Integer, primary_key=True, autoincrement=True) - uuid = Column(String(36)) - name = Column(String(255)) - _hosts = orm.relationship(AggregateHost, - primaryjoin='Aggregate.id == AggregateHost.aggregate_id', - cascade='delete') - _metadata = orm.relationship(AggregateMetadata, - primaryjoin='Aggregate.id == AggregateMetadata.aggregate_id', - cascade='delete') + __table_args__ = ( + sa.Index('aggregate_uuid_idx', 'uuid'), + schema.UniqueConstraint("name", name="uniq_aggregate0name") + ) + id = sa.Column(sa.Integer, primary_key=True, autoincrement=True) + uuid = sa.Column(sa.String(36)) + name = sa.Column(sa.String(255)) + _hosts = orm.relationship( + AggregateHost, + primaryjoin='Aggregate.id == AggregateHost.aggregate_id', + cascade='delete') + _metadata = orm.relationship( + AggregateMetadata, + primaryjoin='Aggregate.id == AggregateMetadata.aggregate_id', + cascade='delete') @property def _extra_keys(self): @@ -111,59 +105,67 @@ class Aggregate(API_BASE): class CellMapping(API_BASE): """Contains information on communicating with a cell""" __tablename__ = 'cell_mappings' - __table_args__ = (Index('uuid_idx', 'uuid'), - schema.UniqueConstraint('uuid', - name='uniq_cell_mappings0uuid')) + __table_args__ = ( + sa.Index('uuid_idx', 'uuid'), + schema.UniqueConstraint('uuid', name='uniq_cell_mappings0uuid'), + ) - id = Column(Integer, primary_key=True) - uuid = Column(String(36), nullable=False) - name = Column(String(255)) - transport_url = Column(Text()) - database_connection = Column(Text()) - disabled = Column(Boolean, default=False) - host_mapping = orm.relationship('HostMapping', - backref=backref('cell_mapping', uselist=False), - foreign_keys=id, - primaryjoin=( - 'CellMapping.id == HostMapping.cell_id')) + id = sa.Column(sa.Integer, primary_key=True) + uuid = sa.Column(sa.String(36), nullable=False) + name = sa.Column(sa.String(255)) + transport_url = sa.Column(sa.Text()) + database_connection = sa.Column(sa.Text()) + disabled = sa.Column(sa.Boolean, default=False) + host_mapping = orm.relationship( + 'HostMapping', + backref=orm.backref('cell_mapping', uselist=False), + foreign_keys=id, + primaryjoin='CellMapping.id == HostMapping.cell_id') class InstanceMapping(API_BASE): """Contains the mapping of an instance to which cell it is in""" __tablename__ = 'instance_mappings' - __table_args__ = (Index('project_id_idx', 'project_id'), - Index('instance_uuid_idx', 'instance_uuid'), - schema.UniqueConstraint('instance_uuid', - name='uniq_instance_mappings0instance_uuid'), - Index('instance_mappings_user_id_project_id_idx', - 'user_id', 'project_id')) + __table_args__ = ( + sa.Index('project_id_idx', 'project_id'), + sa.Index('instance_uuid_idx', 'instance_uuid'), + schema.UniqueConstraint( + 'instance_uuid', name='uniq_instance_mappings0instance_uuid'), + sa.Index( + 'instance_mappings_user_id_project_id_idx', + 'user_id', + 'project_id', + ), + ) - id = Column(Integer, primary_key=True) - instance_uuid = Column(String(36), nullable=False) - cell_id = Column(Integer, ForeignKey('cell_mappings.id'), - nullable=True) - project_id = Column(String(255), nullable=False) + id = sa.Column(sa.Integer, primary_key=True) + instance_uuid = sa.Column(sa.String(36), nullable=False) + cell_id = sa.Column( + sa.Integer, sa.ForeignKey('cell_mappings.id'), nullable=True) + project_id = sa.Column(sa.String(255), nullable=False) # FIXME(melwitt): This should eventually be non-nullable, but we need a # transition period first. - user_id = Column(String(255), nullable=True) - queued_for_delete = Column(Boolean) - cell_mapping = orm.relationship('CellMapping', - backref=backref('instance_mapping', uselist=False), - foreign_keys=cell_id, - primaryjoin=('InstanceMapping.cell_id == CellMapping.id')) + user_id = sa.Column(sa.String(255), nullable=True) + queued_for_delete = sa.Column(sa.Boolean) + cell_mapping = orm.relationship( + 'CellMapping', + backref=orm.backref('instance_mapping', uselist=False), + foreign_keys=cell_id, + primaryjoin='InstanceMapping.cell_id == CellMapping.id') class HostMapping(API_BASE): """Contains mapping of a compute host to which cell it is in""" __tablename__ = "host_mappings" - __table_args__ = (Index('host_idx', 'host'), - schema.UniqueConstraint('host', - name='uniq_host_mappings0host')) + __table_args__ = ( + sa.Index('host_idx', 'host'), + schema.UniqueConstraint('host', name='uniq_host_mappings0host'), + ) - id = Column(Integer, primary_key=True) - cell_id = Column(Integer, ForeignKey('cell_mappings.id'), - nullable=False) - host = Column(String(255), nullable=False) + id = sa.Column(sa.Integer, primary_key=True) + cell_id = sa.Column( + sa.Integer, sa.ForeignKey('cell_mappings.id'), nullable=False) + host = sa.Column(sa.String(255), nullable=False) class RequestSpec(API_BASE): @@ -171,14 +173,14 @@ class RequestSpec(API_BASE): __tablename__ = 'request_specs' __table_args__ = ( - Index('request_spec_instance_uuid_idx', 'instance_uuid'), - schema.UniqueConstraint('instance_uuid', - name='uniq_request_specs0instance_uuid'), - ) + sa.Index('request_spec_instance_uuid_idx', 'instance_uuid'), + schema.UniqueConstraint( + 'instance_uuid', name='uniq_request_specs0instance_uuid'), + ) - id = Column(Integer, primary_key=True) - instance_uuid = Column(String(36), nullable=False) - spec = Column(MediumText(), nullable=False) + id = sa.Column(sa.Integer, primary_key=True) + instance_uuid = sa.Column(sa.String(36), nullable=False) + spec = sa.Column(MediumText(), nullable=False) class Flavors(API_BASE): @@ -188,39 +190,40 @@ class Flavors(API_BASE): schema.UniqueConstraint("flavorid", name="uniq_flavors0flavorid"), schema.UniqueConstraint("name", name="uniq_flavors0name")) - id = Column(Integer, primary_key=True) - name = Column(String(255), nullable=False) - memory_mb = Column(Integer, nullable=False) - vcpus = Column(Integer, nullable=False) - root_gb = Column(Integer) - ephemeral_gb = Column(Integer) - flavorid = Column(String(255), nullable=False) - swap = Column(Integer, nullable=False, default=0) - rxtx_factor = Column(Float, default=1) - vcpu_weight = Column(Integer) - disabled = Column(Boolean, default=False) - is_public = Column(Boolean, default=True) - description = Column(Text) + id = sa.Column(sa.Integer, primary_key=True) + name = sa.Column(sa.String(255), nullable=False) + memory_mb = sa.Column(sa.Integer, nullable=False) + vcpus = sa.Column(sa.Integer, nullable=False) + root_gb = sa.Column(sa.Integer) + ephemeral_gb = sa.Column(sa.Integer) + flavorid = sa.Column(sa.String(255), nullable=False) + swap = sa.Column(sa.Integer, nullable=False, default=0) + rxtx_factor = sa.Column(sa.Float, default=1) + vcpu_weight = sa.Column(sa.Integer) + disabled = sa.Column(sa.Boolean, default=False) + is_public = sa.Column(sa.Boolean, default=True) + description = sa.Column(sa.Text) class FlavorExtraSpecs(API_BASE): """Represents additional specs as key/value pairs for a flavor""" __tablename__ = 'flavor_extra_specs' __table_args__ = ( - Index('flavor_extra_specs_flavor_id_key_idx', 'flavor_id', 'key'), + sa.Index('flavor_extra_specs_flavor_id_key_idx', 'flavor_id', 'key'), schema.UniqueConstraint('flavor_id', 'key', name='uniq_flavor_extra_specs0flavor_id0key'), {'mysql_collate': 'utf8_bin'}, ) - id = Column(Integer, primary_key=True) - key = Column(String(255), nullable=False) - value = Column(String(255)) - flavor_id = Column(Integer, ForeignKey('flavors.id'), nullable=False) - flavor = orm.relationship(Flavors, backref='extra_specs', - foreign_keys=flavor_id, - primaryjoin=( - 'FlavorExtraSpecs.flavor_id == Flavors.id')) + id = sa.Column(sa.Integer, primary_key=True) + key = sa.Column(sa.String(255), nullable=False) + value = sa.Column(sa.String(255)) + flavor_id = sa.Column( + sa.Integer, sa.ForeignKey('flavors.id'), nullable=False) + flavor = orm.relationship( + Flavors, backref='extra_specs', + foreign_keys=flavor_id, + primaryjoin='FlavorExtraSpecs.flavor_id == Flavors.id') class FlavorProjects(API_BASE): @@ -229,13 +232,14 @@ class FlavorProjects(API_BASE): __table_args__ = (schema.UniqueConstraint('flavor_id', 'project_id', name='uniq_flavor_projects0flavor_id0project_id'),) - id = Column(Integer, primary_key=True) - flavor_id = Column(Integer, ForeignKey('flavors.id'), nullable=False) - project_id = Column(String(255), nullable=False) - flavor = orm.relationship(Flavors, backref='projects', - foreign_keys=flavor_id, - primaryjoin=( - 'FlavorProjects.flavor_id == Flavors.id')) + id = sa.Column(sa.Integer, primary_key=True) + flavor_id = sa.Column( + sa.Integer, sa.ForeignKey('flavors.id'), nullable=False) + project_id = sa.Column(sa.String(255), nullable=False) + flavor = orm.relationship( + Flavors, backref='projects', + foreign_keys=flavor_id, + primaryjoin='FlavorProjects.flavor_id == Flavors.id') class BuildRequest(API_BASE): @@ -243,19 +247,19 @@ class BuildRequest(API_BASE): __tablename__ = 'build_requests' __table_args__ = ( - Index('build_requests_instance_uuid_idx', 'instance_uuid'), - Index('build_requests_project_id_idx', 'project_id'), - schema.UniqueConstraint('instance_uuid', - name='uniq_build_requests0instance_uuid'), - ) + sa.Index('build_requests_instance_uuid_idx', 'instance_uuid'), + sa.Index('build_requests_project_id_idx', 'project_id'), + schema.UniqueConstraint( + 'instance_uuid', name='uniq_build_requests0instance_uuid'), + ) - id = Column(Integer, primary_key=True) + id = sa.Column(sa.Integer, primary_key=True) # TODO(mriedem): instance_uuid should be nullable=False - instance_uuid = Column(String(36)) - project_id = Column(String(255), nullable=False) - instance = Column(MediumText()) - block_device_mappings = Column(MediumText()) - tags = Column(Text()) + instance_uuid = sa.Column(sa.String(36)) + project_id = sa.Column(sa.String(255), nullable=False) + instance = sa.Column(MediumText()) + block_device_mappings = sa.Column(MediumText()) + tags = sa.Column(sa.Text()) # TODO(alaski): Drop these from the db in Ocata # columns_to_drop = ['request_spec_id', 'user_id', 'display_name', # 'instance_metadata', 'progress', 'vm_state', 'task_state', @@ -269,19 +273,18 @@ class KeyPair(API_BASE): """Represents a public key pair for ssh / WinRM.""" __tablename__ = 'key_pairs' __table_args__ = ( - schema.UniqueConstraint("user_id", "name", - name="uniq_key_pairs0user_id0name"), + schema.UniqueConstraint( + "user_id", "name", name="uniq_key_pairs0user_id0name"), ) - id = Column(Integer, primary_key=True, nullable=False) - name = Column(String(255), nullable=False) - - user_id = Column(String(255), nullable=False) - - fingerprint = Column(String(255)) - public_key = Column(Text()) - type = Column(Enum('ssh', 'x509', name='keypair_types'), - nullable=False, server_default='ssh') + id = sa.Column(sa.Integer, primary_key=True, nullable=False) + name = sa.Column(sa.String(255), nullable=False) + user_id = sa.Column(sa.String(255), nullable=False) + fingerprint = sa.Column(sa.String(255)) + public_key = sa.Column(sa.Text()) + type = sa.Column( + sa.Enum('ssh', 'x509', name='keypair_types'), + nullable=False, server_default='ssh') # TODO(stephenfin): Remove this as it's now unused post-placement split @@ -292,8 +295,8 @@ class ResourceClass(API_BASE): schema.UniqueConstraint("name", name="uniq_resource_classes0name"), ) - id = Column(Integer, primary_key=True, nullable=False) - name = Column(String(255), nullable=False) + id = sa.Column(sa.Integer, primary_key=True, nullable=False) + name = sa.Column(sa.String(255), nullable=False) # TODO(stephenfin): Remove this as it's now unused post-placement split @@ -302,29 +305,28 @@ class ResourceProvider(API_BASE): __tablename__ = "resource_providers" __table_args__ = ( - Index('resource_providers_uuid_idx', 'uuid'), - schema.UniqueConstraint('uuid', - name='uniq_resource_providers0uuid'), - Index('resource_providers_name_idx', 'name'), - Index('resource_providers_root_provider_id_idx', - 'root_provider_id'), - Index('resource_providers_parent_provider_id_idx', - 'parent_provider_id'), - schema.UniqueConstraint('name', - name='uniq_resource_providers0name') + sa.Index('resource_providers_uuid_idx', 'uuid'), + schema.UniqueConstraint('uuid', name='uniq_resource_providers0uuid'), + sa.Index('resource_providers_name_idx', 'name'), + sa.Index( + 'resource_providers_root_provider_id_idx', 'root_provider_id'), + sa.Index( + 'resource_providers_parent_provider_id_idx', 'parent_provider_id'), + schema.UniqueConstraint( + 'name', name='uniq_resource_providers0name') ) - id = Column(Integer, primary_key=True, nullable=False) - uuid = Column(String(36), nullable=False) - name = Column(Unicode(200), nullable=True) - generation = Column(Integer, default=0) + id = sa.Column(sa.Integer, primary_key=True, nullable=False) + uuid = sa.Column(sa.String(36), nullable=False) + name = sa.Column(sa.Unicode(200), nullable=True) + generation = sa.Column(sa.Integer, default=0) # Represents the root of the "tree" that the provider belongs to - root_provider_id = Column(Integer, ForeignKey('resource_providers.id'), - nullable=True) + root_provider_id = sa.Column( + sa.Integer, sa.ForeignKey('resource_providers.id'), nullable=True) # The immediate parent provider of this provider, or NULL if there is no # parent. If parent_provider_id == NULL then root_provider_id == id - parent_provider_id = Column(Integer, ForeignKey('resource_providers.id'), - nullable=True) + parent_provider_id = sa.Column( + sa.Integer, sa.ForeignKey('resource_providers.id'), nullable=True) # TODO(stephenfin): Remove this as it's now unused post-placement split @@ -333,29 +335,34 @@ class Inventory(API_BASE): __tablename__ = "inventories" __table_args__ = ( - Index('inventories_resource_provider_id_idx', - 'resource_provider_id'), - Index('inventories_resource_class_id_idx', - 'resource_class_id'), - Index('inventories_resource_provider_resource_class_idx', - 'resource_provider_id', 'resource_class_id'), - schema.UniqueConstraint('resource_provider_id', 'resource_class_id', - name='uniq_inventories0resource_provider_resource_class') + sa.Index( + 'inventories_resource_provider_id_idx', 'resource_provider_id'), + sa.Index( + 'inventories_resource_class_id_idx', 'resource_class_id'), + sa.Index( + 'inventories_resource_provider_resource_class_idx', + 'resource_provider_id', + 'resource_class_id', + ), + schema.UniqueConstraint( + 'resource_provider_id', + 'resource_class_id', + name='uniq_inventories0resource_provider_resource_class' + ), ) - id = Column(Integer, primary_key=True, nullable=False) - resource_provider_id = Column(Integer, nullable=False) - resource_class_id = Column(Integer, nullable=False) - total = Column(Integer, nullable=False) - reserved = Column(Integer, nullable=False) - min_unit = Column(Integer, nullable=False) - max_unit = Column(Integer, nullable=False) - step_size = Column(Integer, nullable=False) - allocation_ratio = Column(Float, nullable=False) + id = sa.Column(sa.Integer, primary_key=True, nullable=False) + resource_provider_id = sa.Column(sa.Integer, nullable=False) + resource_class_id = sa.Column(sa.Integer, nullable=False) + total = sa.Column(sa.Integer, nullable=False) + reserved = sa.Column(sa.Integer, nullable=False) + min_unit = sa.Column(sa.Integer, nullable=False) + max_unit = sa.Column(sa.Integer, nullable=False) + step_size = sa.Column(sa.Integer, nullable=False) + allocation_ratio = sa.Column(sa.Float, nullable=False) resource_provider = orm.relationship( "ResourceProvider", - primaryjoin=('Inventory.resource_provider_id == ' - 'ResourceProvider.id'), + primaryjoin='Inventory.resource_provider_id == ResourceProvider.id', foreign_keys=resource_provider_id) @@ -365,23 +372,24 @@ class Allocation(API_BASE): __tablename__ = "allocations" __table_args__ = ( - Index('allocations_resource_provider_class_used_idx', - 'resource_provider_id', 'resource_class_id', - 'used'), - Index('allocations_resource_class_id_idx', - 'resource_class_id'), - Index('allocations_consumer_id_idx', 'consumer_id') + sa.Index( + 'allocations_resource_provider_class_used_idx', + 'resource_provider_id', + 'resource_class_id', + 'used', + ), + sa.Index('allocations_resource_class_id_idx', 'resource_class_id'), + sa.Index('allocations_consumer_id_idx', 'consumer_id') ) - id = Column(Integer, primary_key=True, nullable=False) - resource_provider_id = Column(Integer, nullable=False) - consumer_id = Column(String(36), nullable=False) - resource_class_id = Column(Integer, nullable=False) - used = Column(Integer, nullable=False) + id = sa.Column(sa.Integer, primary_key=True, nullable=False) + resource_provider_id = sa.Column(sa.Integer, nullable=False) + consumer_id = sa.Column(sa.String(36), nullable=False) + resource_class_id = sa.Column(sa.Integer, nullable=False) + used = sa.Column(sa.Integer, nullable=False) resource_provider = orm.relationship( "ResourceProvider", - primaryjoin=('Allocation.resource_provider_id == ' - 'ResourceProvider.id'), + primaryjoin='Allocation.resource_provider_id == ResourceProvider.id', foreign_keys=resource_provider_id) @@ -391,12 +399,13 @@ class ResourceProviderAggregate(API_BASE): __tablename__ = 'resource_provider_aggregates' __table_args__ = ( - Index('resource_provider_aggregates_aggregate_id_idx', - 'aggregate_id'), + sa.Index( + 'resource_provider_aggregates_aggregate_id_idx', 'aggregate_id'), ) - resource_provider_id = Column(Integer, primary_key=True, nullable=False) - aggregate_id = Column(Integer, primary_key=True, nullable=False) + resource_provider_id = sa.Column( + sa.Integer, primary_key=True, nullable=False) + aggregate_id = sa.Column(sa.Integer, primary_key=True, nullable=False) # TODO(stephenfin): Remove this as it's now unused post-placement split @@ -407,33 +416,34 @@ class PlacementAggregate(API_BASE): schema.UniqueConstraint("uuid", name="uniq_placement_aggregates0uuid"), ) - id = Column(Integer, primary_key=True, autoincrement=True) - uuid = Column(String(36), index=True) + id = sa.Column(sa.Integer, primary_key=True, autoincrement=True) + uuid = sa.Column(sa.String(36), index=True) class InstanceGroupMember(API_BASE): """Represents the members for an instance group.""" __tablename__ = 'instance_group_member' __table_args__ = ( - Index('instance_group_member_instance_idx', 'instance_uuid'), + sa.Index('instance_group_member_instance_idx', 'instance_uuid'), ) - id = Column(Integer, primary_key=True, nullable=False) - instance_uuid = Column(String(255)) - group_id = Column(Integer, ForeignKey('instance_groups.id'), - nullable=False) + id = sa.Column(sa.Integer, primary_key=True, nullable=False) + instance_uuid = sa.Column(sa.String(255)) + group_id = sa.Column( + sa.Integer, sa.ForeignKey('instance_groups.id'), nullable=False) class InstanceGroupPolicy(API_BASE): """Represents the policy type for an instance group.""" __tablename__ = 'instance_group_policy' __table_args__ = ( - Index('instance_group_policy_policy_idx', 'policy'), + sa.Index('instance_group_policy_policy_idx', 'policy'), ) - id = Column(Integer, primary_key=True, nullable=False) - policy = Column(String(255)) - group_id = Column(Integer, ForeignKey('instance_groups.id'), - nullable=False) - rules = Column(Text) + + id = sa.Column(sa.Integer, primary_key=True, nullable=False) + policy = sa.Column(sa.String(255)) + group_id = sa.Column( + sa.Integer, sa.ForeignKey('instance_groups.id'), nullable=False) + rules = sa.Column(sa.Text) class InstanceGroup(API_BASE): @@ -448,15 +458,17 @@ class InstanceGroup(API_BASE): schema.UniqueConstraint('uuid', name='uniq_instance_groups0uuid'), ) - id = Column(Integer, primary_key=True, autoincrement=True) - user_id = Column(String(255)) - project_id = Column(String(255)) - uuid = Column(String(36), nullable=False) - name = Column(String(255)) - _policies = orm.relationship(InstanceGroupPolicy, - primaryjoin='InstanceGroup.id == InstanceGroupPolicy.group_id') - _members = orm.relationship(InstanceGroupMember, - primaryjoin='InstanceGroup.id == InstanceGroupMember.group_id') + id = sa.Column(sa.Integer, primary_key=True, autoincrement=True) + user_id = sa.Column(sa.String(255)) + project_id = sa.Column(sa.String(255)) + uuid = sa.Column(sa.String(36), nullable=False) + name = sa.Column(sa.String(255)) + _policies = orm.relationship( + InstanceGroupPolicy, + primaryjoin='InstanceGroup.id == InstanceGroupPolicy.group_id') + _members = orm.relationship( + InstanceGroupMember, + primaryjoin='InstanceGroup.id == InstanceGroupMember.group_id') @property def policy(self): @@ -482,41 +494,43 @@ class Quota(API_BASE): deployment is used. If the row is present but the hard limit is Null, then the resource is unlimited. """ - __tablename__ = 'quotas' __table_args__ = ( - schema.UniqueConstraint("project_id", "resource", - name="uniq_quotas0project_id0resource" + schema.UniqueConstraint( + "project_id", + "resource", + name="uniq_quotas0project_id0resource" ), ) - id = Column(Integer, primary_key=True) - project_id = Column(String(255)) - - resource = Column(String(255), nullable=False) - hard_limit = Column(Integer) + id = sa.Column(sa.Integer, primary_key=True) + project_id = sa.Column(sa.String(255)) + resource = sa.Column(sa.String(255), nullable=False) + hard_limit = sa.Column(sa.Integer) class ProjectUserQuota(API_BASE): """Represents a single quota override for a user with in a project.""" __tablename__ = 'project_user_quotas' - uniq_name = "uniq_project_user_quotas0user_id0project_id0resource" __table_args__ = ( - schema.UniqueConstraint("user_id", "project_id", "resource", - name=uniq_name), - Index('project_user_quotas_project_id_idx', - 'project_id'), - Index('project_user_quotas_user_id_idx', - 'user_id',) + schema.UniqueConstraint( + "user_id", + "project_id", + "resource", + name="uniq_project_user_quotas0user_id0project_id0resource", + ), + sa.Index( + 'project_user_quotas_project_id_idx', 'project_id'), + sa.Index( + 'project_user_quotas_user_id_idx', 'user_id',) ) - id = Column(Integer, primary_key=True, nullable=False) - project_id = Column(String(255), nullable=False) - user_id = Column(String(255), nullable=False) - - resource = Column(String(255), nullable=False) - hard_limit = Column(Integer) + id = sa.Column(sa.Integer, primary_key=True, nullable=False) + project_id = sa.Column(sa.String(255), nullable=False) + user_id = sa.Column(sa.String(255), nullable=False) + resource = sa.Column(sa.String(255), nullable=False) + hard_limit = sa.Column(sa.Integer) class QuotaClass(API_BASE): @@ -529,14 +543,14 @@ class QuotaClass(API_BASE): __tablename__ = 'quota_classes' __table_args__ = ( - Index('quota_classes_class_name_idx', 'class_name'), + sa.Index('quota_classes_class_name_idx', 'class_name'), ) - id = Column(Integer, primary_key=True) + id = sa.Column(sa.Integer, primary_key=True) - class_name = Column(String(255)) + class_name = sa.Column(sa.String(255)) - resource = Column(String(255)) - hard_limit = Column(Integer) + resource = sa.Column(sa.String(255)) + hard_limit = sa.Column(sa.Integer) class QuotaUsage(API_BASE): @@ -544,23 +558,22 @@ class QuotaUsage(API_BASE): __tablename__ = 'quota_usages' __table_args__ = ( - Index('quota_usages_project_id_idx', 'project_id'), - Index('quota_usages_user_id_idx', 'user_id'), + sa.Index('quota_usages_project_id_idx', 'project_id'), + sa.Index('quota_usages_user_id_idx', 'user_id'), ) - id = Column(Integer, primary_key=True) - project_id = Column(String(255)) - user_id = Column(String(255)) - resource = Column(String(255), nullable=False) - - in_use = Column(Integer, nullable=False) - reserved = Column(Integer, nullable=False) + id = sa.Column(sa.Integer, primary_key=True) + project_id = sa.Column(sa.String(255)) + user_id = sa.Column(sa.String(255)) + resource = sa.Column(sa.String(255), nullable=False) + in_use = sa.Column(sa.Integer, nullable=False) + reserved = sa.Column(sa.Integer, nullable=False) @property def total(self): return self.in_use + self.reserved - until_refresh = Column(Integer) + until_refresh = sa.Column(sa.Integer) class Reservation(API_BASE): @@ -568,23 +581,21 @@ class Reservation(API_BASE): __tablename__ = 'reservations' __table_args__ = ( - Index('reservations_project_id_idx', 'project_id'), - Index('reservations_uuid_idx', 'uuid'), - Index('reservations_expire_idx', 'expire'), - Index('reservations_user_id_idx', 'user_id'), + sa.Index('reservations_project_id_idx', 'project_id'), + sa.Index('reservations_uuid_idx', 'uuid'), + sa.Index('reservations_expire_idx', 'expire'), + sa.Index('reservations_user_id_idx', 'user_id'), ) - id = Column(Integer, primary_key=True, nullable=False) - uuid = Column(String(36), nullable=False) - - usage_id = Column(Integer, ForeignKey('quota_usages.id'), nullable=False) - - project_id = Column(String(255)) - user_id = Column(String(255)) - resource = Column(String(255)) - - delta = Column(Integer, nullable=False) - expire = Column(DateTime) + id = sa.Column(sa.Integer, primary_key=True, nullable=False) + uuid = sa.Column(sa.String(36), nullable=False) + usage_id = sa.Column( + sa.Integer, sa.ForeignKey('quota_usages.id'), nullable=False) + project_id = sa.Column(sa.String(255)) + user_id = sa.Column(sa.String(255)) + resource = sa.Column(sa.String(255)) + delta = sa.Column(sa.Integer, nullable=False) + expire = sa.Column(sa.DateTime) usage = orm.relationship( "QuotaUsage", foreign_keys=usage_id, @@ -599,8 +610,9 @@ class Trait(API_BASE): schema.UniqueConstraint('name', name='uniq_traits0name'), ) - id = Column(Integer, primary_key=True, nullable=False, autoincrement=True) - name = Column(Unicode(255), nullable=False) + id = sa.Column( + sa.Integer, primary_key=True, nullable=False, autoincrement=True) + name = sa.Column(sa.Unicode(255), nullable=False) # TODO(stephenfin): Remove this as it's now unused post-placement split @@ -609,16 +621,18 @@ class ResourceProviderTrait(API_BASE): __tablename__ = "resource_provider_traits" __table_args__ = ( - Index('resource_provider_traits_resource_provider_trait_idx', + sa.Index('resource_provider_traits_resource_provider_trait_idx', 'resource_provider_id', 'trait_id'), ) - trait_id = Column(Integer, ForeignKey('traits.id'), primary_key=True, - nullable=False) - resource_provider_id = Column(Integer, - ForeignKey('resource_providers.id'), - primary_key=True, - nullable=False) + trait_id = sa.Column( + sa.Integer, sa.ForeignKey('traits.id'), primary_key=True, + nullable=False) + resource_provider_id = sa.Column( + sa.Integer, + sa.ForeignKey('resource_providers.id'), + primary_key=True, + nullable=False) # TODO(stephenfin): Remove this as it's unused @@ -633,8 +647,9 @@ class Project(API_BASE): ), ) - id = Column(Integer, primary_key=True, nullable=False, autoincrement=True) - external_id = Column(String(255), nullable=False) + id = sa.Column( + sa.Integer, primary_key=True, nullable=False, autoincrement=True) + external_id = sa.Column(sa.String(255), nullable=False) # TODO(stephenfin): Remove this as it's unused @@ -643,14 +658,12 @@ class User(API_BASE): __tablename__ = 'users' __table_args__ = ( - schema.UniqueConstraint( - 'external_id', - name='uniq_users0external_id', - ), + schema.UniqueConstraint('external_id', name='uniq_users0external_id'), ) - id = Column(Integer, primary_key=True, nullable=False, autoincrement=True) - external_id = Column(String(255), nullable=False) + id = sa.Column( + sa.Integer, primary_key=True, nullable=False, autoincrement=True) + external_id = sa.Column(sa.String(255), nullable=False) # TODO(stephenfin): Remove this as it's unused @@ -659,16 +672,22 @@ class Consumer(API_BASE): __tablename__ = 'consumers' __table_args__ = ( - Index('consumers_project_id_uuid_idx', 'project_id', 'uuid'), - Index('consumers_project_id_user_id_uuid_idx', 'project_id', 'user_id', - 'uuid'), + sa.Index('consumers_project_id_uuid_idx', 'project_id', 'uuid'), + sa.Index( + 'consumers_project_id_user_id_uuid_idx', + 'project_id', + 'user_id', + 'uuid', + ), schema.UniqueConstraint('uuid', name='uniq_consumers0uuid'), ) - id = Column(Integer, primary_key=True, nullable=False, autoincrement=True) - uuid = Column(String(36), nullable=False) - project_id = Column(Integer, nullable=False) - user_id = Column(Integer, nullable=False) + id = sa.Column( + sa.Integer, primary_key=True, nullable=False, autoincrement=True) + uuid = sa.Column(sa.String(36), nullable=False) + project_id = sa.Column(sa.Integer, nullable=False) + user_id = sa.Column(sa.Integer, nullable=False) # FIXME(mriedem): Change this to server_default=text("0") to match the # 059_add_consumer_generation script once bug 1776527 is fixed. - generation = Column(Integer, nullable=False, server_default="0", default=0) + generation = sa.Column( + sa.Integer, nullable=False, server_default="0", default=0) diff --git a/nova/db/sqlalchemy/models.py b/nova/db/sqlalchemy/models.py index 120ce54ee720..08edcaedd016 100644 --- a/nova/db/sqlalchemy/models.py +++ b/nova/db/sqlalchemy/models.py @@ -22,21 +22,21 @@ SQLAlchemy models for nova data. from oslo_config import cfg from oslo_db.sqlalchemy import models from oslo_utils import timeutils -from sqlalchemy import (Column, Index, Integer, BigInteger, Enum, String, - schema, Unicode) -from sqlalchemy.dialects.mysql import MEDIUMTEXT -from sqlalchemy.ext.declarative import declarative_base +import sqlalchemy as sa +import sqlalchemy.dialects.mysql +from sqlalchemy.ext import declarative from sqlalchemy import orm -from sqlalchemy import ForeignKey, DateTime, Boolean, Text, Float +from sqlalchemy import schema from nova.db.sqlalchemy import types CONF = cfg.CONF -BASE = declarative_base() +BASE = declarative.declarative_base() def MediumText(): - return Text().with_variant(MEDIUMTEXT(), 'mysql') + return sa.Text().with_variant( + sqlalchemy.dialects.mysql.MEDIUMTEXT(), 'mysql') class NovaBase(models.TimestampMixin, @@ -82,20 +82,20 @@ class Service(BASE, NovaBase, models.SoftDeleteMixin): name="uniq_services0host0topic0deleted"), schema.UniqueConstraint("host", "binary", "deleted", name="uniq_services0host0binary0deleted"), - Index('services_uuid_idx', 'uuid', unique=True), + sa.Index('services_uuid_idx', 'uuid', unique=True), ) - id = Column(Integer, primary_key=True) - uuid = Column(String(36), nullable=True) - host = Column(String(255)) - binary = Column(String(255)) - topic = Column(String(255)) - report_count = Column(Integer, nullable=False, default=0) - disabled = Column(Boolean, default=False) - disabled_reason = Column(String(255)) - last_seen_up = Column(DateTime, nullable=True) - forced_down = Column(Boolean, default=False) - version = Column(Integer, default=0) + id = sa.Column(sa.Integer, primary_key=True) + uuid = sa.Column(sa.String(36), nullable=True) + host = sa.Column(sa.String(255)) + binary = sa.Column(sa.String(255)) + topic = sa.Column(sa.String(255)) + report_count = sa.Column(sa.Integer, nullable=False, default=0) + disabled = sa.Column(sa.Boolean, default=False) + disabled_reason = sa.Column(sa.String(255)) + last_seen_up = sa.Column(sa.DateTime, nullable=True) + forced_down = sa.Column(sa.Boolean, default=False) + version = sa.Column(sa.Integer, default=0) instance = orm.relationship( "Instance", @@ -112,38 +112,38 @@ class ComputeNode(BASE, NovaBase, models.SoftDeleteMixin): __tablename__ = 'compute_nodes' __table_args__ = ( - Index('compute_nodes_uuid_idx', 'uuid', unique=True), + sa.Index('compute_nodes_uuid_idx', 'uuid', unique=True), schema.UniqueConstraint( 'host', 'hypervisor_hostname', 'deleted', name="uniq_compute_nodes0host0hypervisor_hostname0deleted"), ) - id = Column(Integer, primary_key=True) - service_id = Column(Integer, nullable=True) + id = sa.Column(sa.Integer, primary_key=True) + service_id = sa.Column(sa.Integer, nullable=True) # FIXME(sbauza: Host field is nullable because some old Juno compute nodes # can still report stats from an old ResourceTracker without setting this # field. # This field has to be set non-nullable in a later cycle (probably Lxxx) # once we are sure that all compute nodes in production report it. - host = Column(String(255), nullable=True) - uuid = Column(String(36), nullable=True) - vcpus = Column(Integer, nullable=False) - memory_mb = Column(Integer, nullable=False) - local_gb = Column(Integer, nullable=False) - vcpus_used = Column(Integer, nullable=False) - memory_mb_used = Column(Integer, nullable=False) - local_gb_used = Column(Integer, nullable=False) - hypervisor_type = Column(MediumText(), nullable=False) - hypervisor_version = Column(Integer, nullable=False) - hypervisor_hostname = Column(String(255)) + host = sa.Column(sa.String(255), nullable=True) + uuid = sa.Column(sa.String(36), nullable=True) + vcpus = sa.Column(sa.Integer, nullable=False) + memory_mb = sa.Column(sa.Integer, nullable=False) + local_gb = sa.Column(sa.Integer, nullable=False) + vcpus_used = sa.Column(sa.Integer, nullable=False) + memory_mb_used = sa.Column(sa.Integer, nullable=False) + local_gb_used = sa.Column(sa.Integer, nullable=False) + hypervisor_type = sa.Column(MediumText(), nullable=False) + hypervisor_version = sa.Column(sa.Integer, nullable=False) + hypervisor_hostname = sa.Column(sa.String(255)) # Free Ram, amount of activity (resize, migration, boot, etc) and # the number of running VM's are a good starting point for what's # important when making scheduling decisions. - free_ram_mb = Column(Integer) - free_disk_gb = Column(Integer) - current_workload = Column(Integer) - running_vms = Column(Integer) + free_ram_mb = sa.Column(sa.Integer) + free_disk_gb = sa.Column(sa.Integer) + current_workload = sa.Column(sa.Integer) + running_vms = sa.Column(sa.Integer) # Note(masumotok): Expected Strings example: # @@ -155,77 +155,79 @@ class ComputeNode(BASE, NovaBase, models.SoftDeleteMixin): # Points are "json translatable" and it must have all dictionary keys # above, since it is copied from tag of getCapabilities() # (See libvirt.virtConnection). - cpu_info = Column(MediumText(), nullable=False) - disk_available_least = Column(Integer) - host_ip = Column(types.IPAddress()) - supported_instances = Column(Text) - metrics = Column(Text) + cpu_info = sa.Column(MediumText(), nullable=False) + disk_available_least = sa.Column(sa.Integer) + host_ip = sa.Column(types.IPAddress()) + supported_instances = sa.Column(sa.Text) + metrics = sa.Column(sa.Text) # Note(yongli): json string PCI Stats # '[{"vendor_id":"8086", "product_id":"1234", "count":3 }, ...]' - pci_stats = Column(Text) + pci_stats = sa.Column(sa.Text) # extra_resources is a json string containing arbitrary # data about additional resources. - extra_resources = Column(Text) + extra_resources = sa.Column(sa.Text) # json-encode string containing compute node statistics - stats = Column(Text, default='{}') + stats = sa.Column(sa.Text, default='{}') # json-encoded dict that contains NUMA topology as generated by # objects.NUMATopology._to_json() - numa_topology = Column(Text) + numa_topology = sa.Column(sa.Text) # allocation ratios provided by the RT - ram_allocation_ratio = Column(Float, nullable=True) - cpu_allocation_ratio = Column(Float, nullable=True) - disk_allocation_ratio = Column(Float, nullable=True) - mapped = Column(Integer, nullable=True, default=0) + ram_allocation_ratio = sa.Column(sa.Float, nullable=True) + cpu_allocation_ratio = sa.Column(sa.Float, nullable=True) + disk_allocation_ratio = sa.Column(sa.Float, nullable=True) + mapped = sa.Column(sa.Integer, nullable=True, default=0) class Certificate(BASE, NovaBase, models.SoftDeleteMixin): """Represents a x509 certificate.""" __tablename__ = 'certificates' __table_args__ = ( - Index('certificates_project_id_deleted_idx', 'project_id', 'deleted'), - Index('certificates_user_id_deleted_idx', 'user_id', 'deleted') + sa.Index( + 'certificates_project_id_deleted_idx', 'project_id', 'deleted', + ), + sa.Index('certificates_user_id_deleted_idx', 'user_id', 'deleted') ) - id = Column(Integer, primary_key=True) + id = sa.Column(sa.Integer, primary_key=True) - user_id = Column(String(255)) - project_id = Column(String(255)) - file_name = Column(String(255)) + user_id = sa.Column(sa.String(255)) + project_id = sa.Column(sa.String(255)) + file_name = sa.Column(sa.String(255)) class Instance(BASE, NovaBase, models.SoftDeleteMixin): """Represents a guest VM.""" __tablename__ = 'instances' __table_args__ = ( - Index('uuid', 'uuid', unique=True), - Index('instances_project_id_idx', 'project_id'), - Index('instances_project_id_deleted_idx', + sa.Index('uuid', 'uuid', unique=True), + sa.Index('instances_project_id_idx', 'project_id'), + sa.Index('instances_project_id_deleted_idx', 'project_id', 'deleted'), - Index('instances_reservation_id_idx', + sa.Index('instances_reservation_id_idx', 'reservation_id'), - Index('instances_terminated_at_launched_at_idx', + sa.Index('instances_terminated_at_launched_at_idx', 'terminated_at', 'launched_at'), - Index('instances_uuid_deleted_idx', + sa.Index('instances_uuid_deleted_idx', 'uuid', 'deleted'), - Index('instances_task_state_updated_at_idx', + sa.Index('instances_task_state_updated_at_idx', 'task_state', 'updated_at'), - Index('instances_host_node_deleted_idx', + sa.Index('instances_host_node_deleted_idx', 'host', 'node', 'deleted'), - Index('instances_host_deleted_cleaned_idx', + sa.Index('instances_host_deleted_cleaned_idx', 'host', 'deleted', 'cleaned'), - Index('instances_deleted_created_at_idx', + sa.Index('instances_deleted_created_at_idx', 'deleted', 'created_at'), - Index('instances_updated_at_project_id_idx', + sa.Index('instances_updated_at_project_id_idx', 'updated_at', 'project_id'), schema.UniqueConstraint('uuid', name='uniq_instances0uuid'), ) injected_files = [] - id = Column(Integer, primary_key=True, autoincrement=True) + id = sa.Column(sa.Integer, primary_key=True, autoincrement=True) @property def name(self): @@ -253,106 +255,107 @@ class Instance(BASE, NovaBase, models.SoftDeleteMixin): def _extra_keys(self): return ['name'] - user_id = Column(String(255)) - project_id = Column(String(255)) + user_id = sa.Column(sa.String(255)) + project_id = sa.Column(sa.String(255)) - image_ref = Column(String(255)) - kernel_id = Column(String(255)) - ramdisk_id = Column(String(255)) - hostname = Column(String(255)) + image_ref = sa.Column(sa.String(255)) + kernel_id = sa.Column(sa.String(255)) + ramdisk_id = sa.Column(sa.String(255)) + hostname = sa.Column(sa.String(255)) - launch_index = Column(Integer) - key_name = Column(String(255)) - key_data = Column(MediumText()) + launch_index = sa.Column(sa.Integer) + key_name = sa.Column(sa.String(255)) + key_data = sa.Column(MediumText()) - power_state = Column(Integer) - vm_state = Column(String(255)) - task_state = Column(String(255)) + power_state = sa.Column(sa.Integer) + vm_state = sa.Column(sa.String(255)) + task_state = sa.Column(sa.String(255)) - memory_mb = Column(Integer) - vcpus = Column(Integer) - root_gb = Column(Integer) - ephemeral_gb = Column(Integer) - ephemeral_key_uuid = Column(String(36)) + memory_mb = sa.Column(sa.Integer) + vcpus = sa.Column(sa.Integer) + root_gb = sa.Column(sa.Integer) + ephemeral_gb = sa.Column(sa.Integer) + ephemeral_key_uuid = sa.Column(sa.String(36)) # This is not related to hostname, above. It refers # to the nova node. - host = Column(String(255)) + host = sa.Column(sa.String(255)) # To identify the "ComputeNode" which the instance resides in. # This equals to ComputeNode.hypervisor_hostname. - node = Column(String(255)) + node = sa.Column(sa.String(255)) # *not* flavorid, this is the internal primary_key - instance_type_id = Column(Integer) + instance_type_id = sa.Column(sa.Integer) - user_data = Column(MediumText()) + user_data = sa.Column(MediumText()) - reservation_id = Column(String(255)) + reservation_id = sa.Column(sa.String(255)) - launched_at = Column(DateTime) - terminated_at = Column(DateTime) + launched_at = sa.Column(sa.DateTime) + terminated_at = sa.Column(sa.DateTime) # This always refers to the availability_zone kwarg passed in /servers and # provided as an API option, not at all related to the host AZ the instance # belongs to. - availability_zone = Column(String(255)) + availability_zone = sa.Column(sa.String(255)) # User editable field for display in user-facing UIs - display_name = Column(String(255)) - display_description = Column(String(255)) + display_name = sa.Column(sa.String(255)) + display_description = sa.Column(sa.String(255)) # To remember on which host an instance booted. # An instance may have moved to another host by live migration. - launched_on = Column(MediumText()) + launched_on = sa.Column(MediumText()) # locked is superseded by locked_by and locked is not really # necessary but still used in API code so it remains. - locked = Column(Boolean) - locked_by = Column(Enum('owner', 'admin', name='instances0locked_by')) + locked = sa.Column(sa.Boolean) + locked_by = sa.Column( + sa.Enum('owner', 'admin', name='instances0locked_by')) - os_type = Column(String(255)) - architecture = Column(String(255)) - vm_mode = Column(String(255)) - uuid = Column(String(36), nullable=False) + os_type = sa.Column(sa.String(255)) + architecture = sa.Column(sa.String(255)) + vm_mode = sa.Column(sa.String(255)) + uuid = sa.Column(sa.String(36), nullable=False) - root_device_name = Column(String(255)) - default_ephemeral_device = Column(String(255)) - default_swap_device = Column(String(255)) - config_drive = Column(String(255)) + root_device_name = sa.Column(sa.String(255)) + default_ephemeral_device = sa.Column(sa.String(255)) + default_swap_device = sa.Column(sa.String(255)) + config_drive = sa.Column(sa.String(255)) # User editable field meant to represent what ip should be used # to connect to the instance - access_ip_v4 = Column(types.IPAddress()) - access_ip_v6 = Column(types.IPAddress()) + access_ip_v4 = sa.Column(types.IPAddress()) + access_ip_v6 = sa.Column(types.IPAddress()) - auto_disk_config = Column(Boolean()) - progress = Column(Integer) + auto_disk_config = sa.Column(sa.Boolean()) + progress = sa.Column(sa.Integer) # EC2 instance_initiated_shutdown_terminate # True: -> 'terminate' # False: -> 'stop' # Note(maoy): currently Nova will always stop instead of terminate # no matter what the flag says. So we set the default to False. - shutdown_terminate = Column(Boolean(), default=False) + shutdown_terminate = sa.Column(sa.Boolean(), default=False) # EC2 disable_api_termination - disable_terminate = Column(Boolean(), default=False) + disable_terminate = sa.Column(sa.Boolean(), default=False) # OpenStack compute cell name. This will only be set at the top of # the cells tree and it'll be a full cell name such as 'api!hop1!hop2' # TODO(stephenfin): Remove this - cell_name = Column(String(255)) + cell_name = sa.Column(sa.String(255)) # NOTE(pumaranikar): internal_id attribute is no longer used (bug 1441242) # Hence, removing from object layer in current release (Ocata) and will # treated as deprecated. The column can be removed from schema with # a migration at the start of next release. - # internal_id = Column(Integer) + # internal_id = sa.Column(sa.Integer) # Records whether an instance has been deleted from disk - cleaned = Column(Integer, default=0) + cleaned = sa.Column(sa.Integer, default=0) - hidden = Column(Boolean, default=False) + hidden = sa.Column(sa.Boolean, default=False) class InstanceInfoCache(BASE, NovaBase, models.SoftDeleteMixin): @@ -363,12 +366,12 @@ class InstanceInfoCache(BASE, NovaBase, models.SoftDeleteMixin): schema.UniqueConstraint( "instance_uuid", name="uniq_instance_info_caches0instance_uuid"),) - id = Column(Integer, primary_key=True, autoincrement=True) + id = sa.Column(sa.Integer, primary_key=True, autoincrement=True) # text column used for storing a json object of network data for api - network_info = Column(MediumText()) + network_info = sa.Column(MediumText()) - instance_uuid = Column(String(36), ForeignKey('instances.uuid'), + instance_uuid = sa.Column(sa.String(36), sa.ForeignKey('instances.uuid'), nullable=False) instance = orm.relationship(Instance, backref=orm.backref('info_cache', uselist=False), @@ -379,21 +382,21 @@ class InstanceInfoCache(BASE, NovaBase, models.SoftDeleteMixin): class InstanceExtra(BASE, NovaBase, models.SoftDeleteMixin): __tablename__ = 'instance_extra' __table_args__ = ( - Index('instance_extra_idx', 'instance_uuid'),) - id = Column(Integer, primary_key=True, autoincrement=True) - instance_uuid = Column(String(36), ForeignKey('instances.uuid'), + sa.Index('instance_extra_idx', 'instance_uuid'),) + id = sa.Column(sa.Integer, primary_key=True, autoincrement=True) + instance_uuid = sa.Column(sa.String(36), sa.ForeignKey('instances.uuid'), nullable=False) - device_metadata = orm.deferred(Column(Text)) - numa_topology = orm.deferred(Column(Text)) - pci_requests = orm.deferred(Column(Text)) - flavor = orm.deferred(Column(Text)) - vcpu_model = orm.deferred(Column(Text)) - migration_context = orm.deferred(Column(Text)) - keypairs = orm.deferred(Column(Text)) - trusted_certs = orm.deferred(Column(Text)) + device_metadata = orm.deferred(sa.Column(sa.Text)) + numa_topology = orm.deferred(sa.Column(sa.Text)) + pci_requests = orm.deferred(sa.Column(sa.Text)) + flavor = orm.deferred(sa.Column(sa.Text)) + vcpu_model = orm.deferred(sa.Column(sa.Text)) + migration_context = orm.deferred(sa.Column(sa.Text)) + keypairs = orm.deferred(sa.Column(sa.Text)) + trusted_certs = orm.deferred(sa.Column(sa.Text)) # NOTE(Luyao): 'vpmems' is still in the database # and can be removed in the future release. - resources = orm.deferred(Column(Text)) + resources = orm.deferred(sa.Column(sa.Text)) instance = orm.relationship(Instance, backref=orm.backref('extra', uselist=False), @@ -419,19 +422,19 @@ class InstanceTypes(BASE, NovaBase, models.SoftDeleteMixin): ) # Internal only primary key/id - id = Column(Integer, primary_key=True) - name = Column(String(255)) - memory_mb = Column(Integer, nullable=False) - vcpus = Column(Integer, nullable=False) - root_gb = Column(Integer) - ephemeral_gb = Column(Integer) + id = sa.Column(sa.Integer, primary_key=True) + name = sa.Column(sa.String(255)) + memory_mb = sa.Column(sa.Integer, nullable=False) + vcpus = sa.Column(sa.Integer, nullable=False) + root_gb = sa.Column(sa.Integer) + ephemeral_gb = sa.Column(sa.Integer) # Public facing id will be renamed public_id - flavorid = Column(String(255)) - swap = Column(Integer, nullable=False, default=0) - rxtx_factor = Column(Float, default=1) - vcpu_weight = Column(Integer) - disabled = Column(Boolean, default=False) - is_public = Column(Boolean, default=True) + flavorid = sa.Column(sa.String(255)) + swap = sa.Column(sa.Integer, nullable=False, default=0) + rxtx_factor = sa.Column(sa.Float, default=1) + vcpu_weight = sa.Column(sa.Integer) + disabled = sa.Column(sa.Boolean, default=False) + is_public = sa.Column(sa.Boolean, default=True) class Quota(BASE, NovaBase, models.SoftDeleteMixin): @@ -450,12 +453,12 @@ class Quota(BASE, NovaBase, models.SoftDeleteMixin): name="uniq_quotas0project_id0resource0deleted" ), ) - id = Column(Integer, primary_key=True) + id = sa.Column(sa.Integer, primary_key=True) - project_id = Column(String(255)) + project_id = sa.Column(sa.String(255)) - resource = Column(String(255), nullable=False) - hard_limit = Column(Integer) + resource = sa.Column(sa.String(255), nullable=False) + hard_limit = sa.Column(sa.Integer) class ProjectUserQuota(BASE, NovaBase, models.SoftDeleteMixin): @@ -466,18 +469,18 @@ class ProjectUserQuota(BASE, NovaBase, models.SoftDeleteMixin): __table_args__ = ( schema.UniqueConstraint("user_id", "project_id", "resource", "deleted", name=uniq_name), - Index('project_user_quotas_project_id_deleted_idx', + sa.Index('project_user_quotas_project_id_deleted_idx', 'project_id', 'deleted'), - Index('project_user_quotas_user_id_deleted_idx', + sa.Index('project_user_quotas_user_id_deleted_idx', 'user_id', 'deleted') ) - id = Column(Integer, primary_key=True, nullable=False) + id = sa.Column(sa.Integer, primary_key=True, nullable=False) - project_id = Column(String(255), nullable=False) - user_id = Column(String(255), nullable=False) + project_id = sa.Column(sa.String(255), nullable=False) + user_id = sa.Column(sa.String(255), nullable=False) - resource = Column(String(255), nullable=False) - hard_limit = Column(Integer) + resource = sa.Column(sa.String(255), nullable=False) + hard_limit = sa.Column(sa.Integer) class QuotaClass(BASE, NovaBase, models.SoftDeleteMixin): @@ -490,14 +493,14 @@ class QuotaClass(BASE, NovaBase, models.SoftDeleteMixin): __tablename__ = 'quota_classes' __table_args__ = ( - Index('ix_quota_classes_class_name', 'class_name'), + sa.Index('ix_quota_classes_class_name', 'class_name'), ) - id = Column(Integer, primary_key=True) + id = sa.Column(sa.Integer, primary_key=True) - class_name = Column(String(255)) + class_name = sa.Column(sa.String(255)) - resource = Column(String(255)) - hard_limit = Column(Integer) + resource = sa.Column(sa.String(255)) + hard_limit = sa.Column(sa.Integer) class QuotaUsage(BASE, NovaBase, models.SoftDeleteMixin): @@ -505,23 +508,23 @@ class QuotaUsage(BASE, NovaBase, models.SoftDeleteMixin): __tablename__ = 'quota_usages' __table_args__ = ( - Index('ix_quota_usages_project_id', 'project_id'), - Index('ix_quota_usages_user_id_deleted', 'user_id', 'deleted'), + sa.Index('ix_quota_usages_project_id', 'project_id'), + sa.Index('ix_quota_usages_user_id_deleted', 'user_id', 'deleted'), ) - id = Column(Integer, primary_key=True) + id = sa.Column(sa.Integer, primary_key=True) - project_id = Column(String(255)) - user_id = Column(String(255)) - resource = Column(String(255), nullable=False) + project_id = sa.Column(sa.String(255)) + user_id = sa.Column(sa.String(255)) + resource = sa.Column(sa.String(255), nullable=False) - in_use = Column(Integer, nullable=False) - reserved = Column(Integer, nullable=False) + in_use = sa.Column(sa.Integer, nullable=False) + reserved = sa.Column(sa.Integer, nullable=False) @property def total(self): return self.in_use + self.reserved - until_refresh = Column(Integer) + until_refresh = sa.Column(sa.Integer) class Reservation(BASE, NovaBase, models.SoftDeleteMixin): @@ -529,22 +532,23 @@ class Reservation(BASE, NovaBase, models.SoftDeleteMixin): __tablename__ = 'reservations' __table_args__ = ( - Index('ix_reservations_project_id', 'project_id'), - Index('reservations_uuid_idx', 'uuid'), - Index('reservations_deleted_expire_idx', 'deleted', 'expire'), - Index('ix_reservations_user_id_deleted', 'user_id', 'deleted'), + sa.Index('ix_reservations_project_id', 'project_id'), + sa.Index('reservations_uuid_idx', 'uuid'), + sa.Index('reservations_deleted_expire_idx', 'deleted', 'expire'), + sa.Index('ix_reservations_user_id_deleted', 'user_id', 'deleted'), ) - id = Column(Integer, primary_key=True, nullable=False) - uuid = Column(String(36), nullable=False) + id = sa.Column(sa.Integer, primary_key=True, nullable=False) + uuid = sa.Column(sa.String(36), nullable=False) - usage_id = Column(Integer, ForeignKey('quota_usages.id'), nullable=False) + usage_id = sa.Column( + sa.Integer, sa.ForeignKey('quota_usages.id'), nullable=False) - project_id = Column(String(255)) - user_id = Column(String(255)) - resource = Column(String(255)) + project_id = sa.Column(sa.String(255)) + user_id = sa.Column(sa.String(255)) + resource = sa.Column(sa.String(255)) - delta = Column(Integer, nullable=False) - expire = Column(DateTime) + delta = sa.Column(sa.Integer, nullable=False) + expire = sa.Column(sa.DateTime) usage = orm.relationship( "QuotaUsage", @@ -559,49 +563,49 @@ class Snapshot(BASE, NovaBase, models.SoftDeleteMixin): """Represents a block storage device that can be attached to a VM.""" __tablename__ = 'snapshots' __table_args__ = () - id = Column(String(36), primary_key=True, nullable=False) - deleted = Column(String(36), default="") + id = sa.Column(sa.String(36), primary_key=True, nullable=False) + deleted = sa.Column(sa.String(36), default="") @property def volume_name(self): return CONF.volume_name_template % self.volume_id - user_id = Column(String(255)) - project_id = Column(String(255)) + user_id = sa.Column(sa.String(255)) + project_id = sa.Column(sa.String(255)) - volume_id = Column(String(36), nullable=False) - status = Column(String(255)) - progress = Column(String(255)) - volume_size = Column(Integer) - scheduled_at = Column(DateTime) + volume_id = sa.Column(sa.String(36), nullable=False) + status = sa.Column(sa.String(255)) + progress = sa.Column(sa.String(255)) + volume_size = sa.Column(sa.Integer) + scheduled_at = sa.Column(sa.DateTime) - display_name = Column(String(255)) - display_description = Column(String(255)) + display_name = sa.Column(sa.String(255)) + display_description = sa.Column(sa.String(255)) class BlockDeviceMapping(BASE, NovaBase, models.SoftDeleteMixin): """Represents block device mapping that is defined by EC2.""" __tablename__ = "block_device_mapping" __table_args__ = ( - Index('snapshot_id', 'snapshot_id'), - Index('volume_id', 'volume_id'), - Index('block_device_mapping_instance_uuid_device_name_idx', + sa.Index('snapshot_id', 'snapshot_id'), + sa.Index('volume_id', 'volume_id'), + sa.Index('block_device_mapping_instance_uuid_device_name_idx', 'instance_uuid', 'device_name'), - Index('block_device_mapping_instance_uuid_volume_id_idx', + sa.Index('block_device_mapping_instance_uuid_volume_id_idx', 'instance_uuid', 'volume_id'), - Index('block_device_mapping_instance_uuid_idx', 'instance_uuid'), + sa.Index('block_device_mapping_instance_uuid_idx', 'instance_uuid'), schema.UniqueConstraint('uuid', name='uniq_block_device_mapping0uuid'), ) - id = Column(Integer, primary_key=True, autoincrement=True) + id = sa.Column(sa.Integer, primary_key=True, autoincrement=True) - instance_uuid = Column(String(36), ForeignKey('instances.uuid')) + instance_uuid = sa.Column(sa.String(36), sa.ForeignKey('instances.uuid')) # NOTE(mdbooth): The REST API for BDMs includes a UUID field. That uuid # refers to an image, volume, or snapshot which will be used in the # initialisation of the BDM. It is only relevant during the API call, and # is not persisted directly. This is the UUID of the BDM itself. # FIXME(danms): This should eventually be non-nullable, but we need a # transition period first. - uuid = Column(String(36)) + uuid = sa.Column(sa.String(36)) instance = orm.relationship(Instance, backref=orm.backref('block_device_mapping'), foreign_keys=instance_uuid, @@ -611,51 +615,52 @@ class BlockDeviceMapping(BASE, NovaBase, models.SoftDeleteMixin): 'BlockDeviceMapping.deleted==' '0)') - source_type = Column(String(255)) - destination_type = Column(String(255)) - guest_format = Column(String(255)) - device_type = Column(String(255)) - disk_bus = Column(String(255)) + source_type = sa.Column(sa.String(255)) + destination_type = sa.Column(sa.String(255)) + guest_format = sa.Column(sa.String(255)) + device_type = sa.Column(sa.String(255)) + disk_bus = sa.Column(sa.String(255)) - boot_index = Column(Integer) + boot_index = sa.Column(sa.Integer) - device_name = Column(String(255)) + device_name = sa.Column(sa.String(255)) # default=False for compatibility of the existing code. # With EC2 API, # default True for ami specified device. # default False for created with other timing. # TODO(sshturm) add default in db - delete_on_termination = Column(Boolean, default=False) + delete_on_termination = sa.Column(sa.Boolean, default=False) - snapshot_id = Column(String(36)) + snapshot_id = sa.Column(sa.String(36)) - volume_id = Column(String(36)) - volume_size = Column(Integer) + volume_id = sa.Column(sa.String(36)) + volume_size = sa.Column(sa.Integer) - volume_type = Column(String(255)) + volume_type = sa.Column(sa.String(255)) - image_id = Column(String(36)) + image_id = sa.Column(sa.String(36)) # for no device to suppress devices. - no_device = Column(Boolean) + no_device = sa.Column(sa.Boolean) - connection_info = Column(MediumText()) + connection_info = sa.Column(MediumText()) - tag = Column(String(255)) + tag = sa.Column(sa.String(255)) - attachment_id = Column(String(36)) + attachment_id = sa.Column(sa.String(36)) class SecurityGroupInstanceAssociation(BASE, NovaBase, models.SoftDeleteMixin): __tablename__ = 'security_group_instance_association' __table_args__ = ( - Index('security_group_instance_association_instance_uuid_idx', + sa.Index('security_group_instance_association_instance_uuid_idx', 'instance_uuid'), ) - id = Column(Integer, primary_key=True, nullable=False) - security_group_id = Column(Integer, ForeignKey('security_groups.id')) - instance_uuid = Column(String(36), ForeignKey('instances.uuid')) + id = sa.Column(sa.Integer, primary_key=True, nullable=False) + security_group_id = sa.Column( + sa.Integer, sa.ForeignKey('security_groups.id')) + instance_uuid = sa.Column(sa.String(36), sa.ForeignKey('instances.uuid')) class SecurityGroup(BASE, NovaBase, models.SoftDeleteMixin): @@ -666,12 +671,12 @@ class SecurityGroup(BASE, NovaBase, models.SoftDeleteMixin): name='uniq_security_groups0project_id0' 'name0deleted'), ) - id = Column(Integer, primary_key=True) + id = sa.Column(sa.Integer, primary_key=True) - name = Column(String(255)) - description = Column(String(255)) - user_id = Column(String(255)) - project_id = Column(String(255)) + name = sa.Column(sa.String(255)) + description = sa.Column(sa.String(255)) + user_id = sa.Column(sa.String(255)) + project_id = sa.Column(sa.String(255)) instances = orm.relationship(Instance, secondary="security_group_instance_association", @@ -695,23 +700,24 @@ class SecurityGroupIngressRule(BASE, NovaBase, models.SoftDeleteMixin): """Represents a rule in a security group.""" __tablename__ = 'security_group_rules' __table_args__ = () - id = Column(Integer, primary_key=True) + id = sa.Column(sa.Integer, primary_key=True) - parent_group_id = Column(Integer, ForeignKey('security_groups.id')) + parent_group_id = sa.Column( + sa.Integer, sa.ForeignKey('security_groups.id')) parent_group = orm.relationship("SecurityGroup", backref="rules", foreign_keys=parent_group_id, primaryjoin='and_(' 'SecurityGroupIngressRule.parent_group_id == SecurityGroup.id,' 'SecurityGroupIngressRule.deleted == 0)') - protocol = Column(String(255)) - from_port = Column(Integer) - to_port = Column(Integer) - cidr = Column(types.CIDR()) + protocol = sa.Column(sa.String(255)) + from_port = sa.Column(sa.Integer) + to_port = sa.Column(sa.Integer) + cidr = sa.Column(types.CIDR()) # Note: This is not the parent SecurityGroup. It's SecurityGroup we're # granting access for. - group_id = Column(Integer, ForeignKey('security_groups.id')) + group_id = sa.Column(sa.Integer, sa.ForeignKey('security_groups.id')) grantee_group = orm.relationship("SecurityGroup", foreign_keys=group_id, primaryjoin='and_(' @@ -724,11 +730,11 @@ class SecurityGroupIngressRule(BASE, NovaBase, models.SoftDeleteMixin): class SecurityGroupIngressDefaultRule(BASE, NovaBase, models.SoftDeleteMixin): __tablename__ = 'security_group_default_rules' __table_args__ = () - id = Column(Integer, primary_key=True, nullable=False) - protocol = Column(String(5)) # "tcp", "udp" or "icmp" - from_port = Column(Integer) - to_port = Column(Integer) - cidr = Column(types.CIDR()) + id = sa.Column(sa.Integer, primary_key=True, nullable=False) + protocol = sa.Column(sa.String(5)) # "tcp", "udp" or "icmp" + from_port = sa.Column(sa.Integer) + to_port = sa.Column(sa.Integer) + cidr = sa.Column(types.CIDR()) # TODO(stephenfin): Remove this in the V release or later, once we're sure we @@ -737,12 +743,12 @@ class ProviderFirewallRule(BASE, NovaBase, models.SoftDeleteMixin): """Represents a rule in a security group.""" __tablename__ = 'provider_fw_rules' __table_args__ = () - id = Column(Integer, primary_key=True, nullable=False) + id = sa.Column(sa.Integer, primary_key=True, nullable=False) - protocol = Column(String(5)) # "tcp", "udp", or "icmp" - from_port = Column(Integer) - to_port = Column(Integer) - cidr = Column(types.CIDR()) + protocol = sa.Column(sa.String(5)) # "tcp", "udp", or "icmp" + from_port = sa.Column(sa.Integer) + to_port = sa.Column(sa.Integer) + cidr = sa.Column(types.CIDR()) # NOTE(alaski): This table exists in the nova_api database and its usage here @@ -754,15 +760,15 @@ class KeyPair(BASE, NovaBase, models.SoftDeleteMixin): schema.UniqueConstraint("user_id", "name", "deleted", name="uniq_key_pairs0user_id0name0deleted"), ) - id = Column(Integer, primary_key=True, nullable=False) + id = sa.Column(sa.Integer, primary_key=True, nullable=False) - name = Column(String(255), nullable=False) + name = sa.Column(sa.String(255), nullable=False) - user_id = Column(String(255)) + user_id = sa.Column(sa.String(255)) - fingerprint = Column(String(255)) - public_key = Column(MediumText()) - type = Column(Enum('ssh', 'x509', name='keypair_types'), + fingerprint = sa.Column(sa.String(255)) + public_key = sa.Column(MediumText()) + type = sa.Column(sa.Enum('ssh', 'x509', name='keypair_types'), nullable=False, server_default='ssh') @@ -770,43 +776,43 @@ class Migration(BASE, NovaBase, models.SoftDeleteMixin): """Represents a running host-to-host migration.""" __tablename__ = 'migrations' __table_args__ = ( - Index('migrations_instance_uuid_and_status_idx', 'deleted', + sa.Index('migrations_instance_uuid_and_status_idx', 'deleted', 'instance_uuid', 'status'), - Index('migrations_by_host_nodes_and_status_idx', 'deleted', + sa.Index('migrations_by_host_nodes_and_status_idx', 'deleted', 'source_compute', 'dest_compute', 'source_node', 'dest_node', 'status'), - Index('migrations_uuid', 'uuid', unique=True), - Index('migrations_updated_at_idx', 'updated_at'), + sa.Index('migrations_uuid', 'uuid', unique=True), + sa.Index('migrations_updated_at_idx', 'updated_at'), ) - id = Column(Integer, primary_key=True, nullable=False) + id = sa.Column(sa.Integer, primary_key=True, nullable=False) # NOTE(tr3buchet): the ____compute variables are instance['host'] - source_compute = Column(String(255)) - dest_compute = Column(String(255)) + source_compute = sa.Column(sa.String(255)) + dest_compute = sa.Column(sa.String(255)) # nodes are equivalent to a compute node's 'hypervisor_hostname' - source_node = Column(String(255)) - dest_node = Column(String(255)) + source_node = sa.Column(sa.String(255)) + dest_node = sa.Column(sa.String(255)) # NOTE(tr3buchet): dest_host, btw, is an ip address - dest_host = Column(String(255)) - old_instance_type_id = Column(Integer()) - new_instance_type_id = Column(Integer()) - instance_uuid = Column(String(36), ForeignKey('instances.uuid')) - uuid = Column(String(36), nullable=True) + dest_host = sa.Column(sa.String(255)) + old_instance_type_id = sa.Column(sa.Integer()) + new_instance_type_id = sa.Column(sa.Integer()) + instance_uuid = sa.Column(sa.String(36), sa.ForeignKey('instances.uuid')) + uuid = sa.Column(sa.String(36), nullable=True) # TODO(_cerberus_): enum - status = Column(String(255)) - migration_type = Column(Enum('migration', 'resize', 'live-migration', + status = sa.Column(sa.String(255)) + migration_type = sa.Column(sa.Enum('migration', 'resize', 'live-migration', 'evacuation', name='migration_type'), nullable=True) - hidden = Column(Boolean, default=False) - memory_total = Column(BigInteger, nullable=True) - memory_processed = Column(BigInteger, nullable=True) - memory_remaining = Column(BigInteger, nullable=True) - disk_total = Column(BigInteger, nullable=True) - disk_processed = Column(BigInteger, nullable=True) - disk_remaining = Column(BigInteger, nullable=True) - cross_cell_move = Column(Boolean, default=False) + hidden = sa.Column(sa.Boolean, default=False) + memory_total = sa.Column(sa.BigInteger, nullable=True) + memory_processed = sa.Column(sa.BigInteger, nullable=True) + memory_remaining = sa.Column(sa.BigInteger, nullable=True) + disk_total = sa.Column(sa.BigInteger, nullable=True) + disk_processed = sa.Column(sa.BigInteger, nullable=True) + disk_remaining = sa.Column(sa.BigInteger, nullable=True) + cross_cell_move = sa.Column(sa.Boolean, default=False) - user_id = Column(String(255), nullable=True) - project_id = Column(String(255), nullable=True) + user_id = sa.Column(sa.String(255), nullable=True) + project_id = sa.Column(sa.String(255), nullable=True) instance = orm.relationship("Instance", foreign_keys=instance_uuid, primaryjoin='and_(Migration.instance_uuid == ' @@ -822,50 +828,50 @@ class Network(BASE, NovaBase, models.SoftDeleteMixin): __table_args__ = ( schema.UniqueConstraint("vlan", "deleted", name="uniq_networks0vlan0deleted"), - Index('networks_bridge_deleted_idx', 'bridge', 'deleted'), - Index('networks_host_idx', 'host'), - Index('networks_project_id_deleted_idx', 'project_id', 'deleted'), - Index('networks_uuid_project_id_deleted_idx', 'uuid', + sa.Index('networks_bridge_deleted_idx', 'bridge', 'deleted'), + sa.Index('networks_host_idx', 'host'), + sa.Index('networks_project_id_deleted_idx', 'project_id', 'deleted'), + sa.Index('networks_uuid_project_id_deleted_idx', 'uuid', 'project_id', 'deleted'), - Index('networks_vlan_deleted_idx', 'vlan', 'deleted'), - Index('networks_cidr_v6_idx', 'cidr_v6') + sa.Index('networks_vlan_deleted_idx', 'vlan', 'deleted'), + sa.Index('networks_cidr_v6_idx', 'cidr_v6') ) - id = Column(Integer, primary_key=True, nullable=False) - label = Column(String(255)) + id = sa.Column(sa.Integer, primary_key=True, nullable=False) + label = sa.Column(sa.String(255)) - injected = Column(Boolean, default=False) - cidr = Column(types.CIDR()) - cidr_v6 = Column(types.CIDR()) - multi_host = Column(Boolean, default=False) + injected = sa.Column(sa.Boolean, default=False) + cidr = sa.Column(types.CIDR()) + cidr_v6 = sa.Column(types.CIDR()) + multi_host = sa.Column(sa.Boolean, default=False) - gateway_v6 = Column(types.IPAddress()) - netmask_v6 = Column(types.IPAddress()) - netmask = Column(types.IPAddress()) - bridge = Column(String(255)) - bridge_interface = Column(String(255)) - gateway = Column(types.IPAddress()) - broadcast = Column(types.IPAddress()) - dns1 = Column(types.IPAddress()) - dns2 = Column(types.IPAddress()) + gateway_v6 = sa.Column(types.IPAddress()) + netmask_v6 = sa.Column(types.IPAddress()) + netmask = sa.Column(types.IPAddress()) + bridge = sa.Column(sa.String(255)) + bridge_interface = sa.Column(sa.String(255)) + gateway = sa.Column(types.IPAddress()) + broadcast = sa.Column(types.IPAddress()) + dns1 = sa.Column(types.IPAddress()) + dns2 = sa.Column(types.IPAddress()) - vlan = Column(Integer) - vpn_public_address = Column(types.IPAddress()) - vpn_public_port = Column(Integer) - vpn_private_address = Column(types.IPAddress()) - dhcp_start = Column(types.IPAddress()) + vlan = sa.Column(sa.Integer) + vpn_public_address = sa.Column(types.IPAddress()) + vpn_public_port = sa.Column(sa.Integer) + vpn_private_address = sa.Column(types.IPAddress()) + dhcp_start = sa.Column(types.IPAddress()) - rxtx_base = Column(Integer) + rxtx_base = sa.Column(sa.Integer) - project_id = Column(String(255)) - priority = Column(Integer) - host = Column(String(255)) - uuid = Column(String(36)) + project_id = sa.Column(sa.String(255)) + priority = sa.Column(sa.Integer) + host = sa.Column(sa.String(255)) + uuid = sa.Column(sa.String(36)) - mtu = Column(Integer) - dhcp_server = Column(types.IPAddress()) - enable_dhcp = Column(Boolean, default=True) - share_address = Column(Boolean, default=False) + mtu = sa.Column(sa.Integer) + dhcp_server = sa.Column(types.IPAddress()) + enable_dhcp = sa.Column(sa.Boolean, default=True) + share_address = sa.Column(sa.Boolean, default=False) class VirtualInterface(BASE, NovaBase, models.SoftDeleteMixin): @@ -874,16 +880,16 @@ class VirtualInterface(BASE, NovaBase, models.SoftDeleteMixin): __table_args__ = ( schema.UniqueConstraint("address", "deleted", name="uniq_virtual_interfaces0address0deleted"), - Index('virtual_interfaces_network_id_idx', 'network_id'), - Index('virtual_interfaces_instance_uuid_fkey', 'instance_uuid'), - Index('virtual_interfaces_uuid_idx', 'uuid'), + sa.Index('virtual_interfaces_network_id_idx', 'network_id'), + sa.Index('virtual_interfaces_instance_uuid_fkey', 'instance_uuid'), + sa.Index('virtual_interfaces_uuid_idx', 'uuid'), ) - id = Column(Integer, primary_key=True, nullable=False) - address = Column(String(255)) - network_id = Column(Integer) - instance_uuid = Column(String(36), ForeignKey('instances.uuid')) - uuid = Column(String(36)) - tag = Column(String(255)) + id = sa.Column(sa.Integer, primary_key=True, nullable=False) + address = sa.Column(sa.String(255)) + network_id = sa.Column(sa.Integer) + instance_uuid = sa.Column(sa.String(36), sa.ForeignKey('instances.uuid')) + uuid = sa.Column(sa.String(36)) + tag = sa.Column(sa.String(255)) # TODO(stephenfin): Remove this in the V release or later, once we're sure we @@ -894,35 +900,36 @@ class FixedIp(BASE, NovaBase, models.SoftDeleteMixin): __table_args__ = ( schema.UniqueConstraint( "address", "deleted", name="uniq_fixed_ips0address0deleted"), - Index('fixed_ips_virtual_interface_id_fkey', 'virtual_interface_id'), - Index('network_id', 'network_id'), - Index('address', 'address'), - Index('fixed_ips_instance_uuid_fkey', 'instance_uuid'), - Index('fixed_ips_host_idx', 'host'), - Index('fixed_ips_network_id_host_deleted_idx', 'network_id', 'host', + sa.Index( + 'fixed_ips_virtual_interface_id_fkey', 'virtual_interface_id'), + sa.Index('network_id', 'network_id'), + sa.Index('address', 'address'), + sa.Index('fixed_ips_instance_uuid_fkey', 'instance_uuid'), + sa.Index('fixed_ips_host_idx', 'host'), + sa.Index('fixed_ips_network_id_host_deleted_idx', 'network_id', 'host', 'deleted'), - Index('fixed_ips_address_reserved_network_id_deleted_idx', + sa.Index('fixed_ips_address_reserved_network_id_deleted_idx', 'address', 'reserved', 'network_id', 'deleted'), - Index('fixed_ips_deleted_allocated_idx', 'address', 'deleted', + sa.Index('fixed_ips_deleted_allocated_idx', 'address', 'deleted', 'allocated'), - Index('fixed_ips_deleted_allocated_updated_at_idx', 'deleted', + sa.Index('fixed_ips_deleted_allocated_updated_at_idx', 'deleted', 'allocated', 'updated_at') ) - id = Column(Integer, primary_key=True) - address = Column(types.IPAddress()) - network_id = Column(Integer) - virtual_interface_id = Column(Integer) - instance_uuid = Column(String(36), ForeignKey('instances.uuid')) + id = sa.Column(sa.Integer, primary_key=True) + address = sa.Column(types.IPAddress()) + network_id = sa.Column(sa.Integer) + virtual_interface_id = sa.Column(sa.Integer) + instance_uuid = sa.Column(sa.String(36), sa.ForeignKey('instances.uuid')) # associated means that a fixed_ip has its instance_id column set # allocated means that a fixed_ip has its virtual_interface_id column set # TODO(sshturm) add default in db - allocated = Column(Boolean, default=False) + allocated = sa.Column(sa.Boolean, default=False) # leased means dhcp bridge has leased the ip # TODO(sshturm) add default in db - leased = Column(Boolean, default=False) + leased = sa.Column(sa.Boolean, default=False) # TODO(sshturm) add default in db - reserved = Column(Boolean, default=False) - host = Column(String(255)) + reserved = sa.Column(sa.Boolean, default=False) + host = sa.Column(sa.String(255)) network = orm.relationship(Network, backref=orm.backref('fixed_ips'), foreign_keys=network_id, @@ -954,21 +961,21 @@ class FloatingIp(BASE, NovaBase, models.SoftDeleteMixin): __table_args__ = ( schema.UniqueConstraint("address", "deleted", name="uniq_floating_ips0address0deleted"), - Index('fixed_ip_id', 'fixed_ip_id'), - Index('floating_ips_host_idx', 'host'), - Index('floating_ips_project_id_idx', 'project_id'), - Index('floating_ips_pool_deleted_fixed_ip_id_project_id_idx', + sa.Index('fixed_ip_id', 'fixed_ip_id'), + sa.Index('floating_ips_host_idx', 'host'), + sa.Index('floating_ips_project_id_idx', 'project_id'), + sa.Index('floating_ips_pool_deleted_fixed_ip_id_project_id_idx', 'pool', 'deleted', 'fixed_ip_id', 'project_id') ) - id = Column(Integer, primary_key=True) - address = Column(types.IPAddress()) - fixed_ip_id = Column(Integer) - project_id = Column(String(255)) - host = Column(String(255)) - auto_assigned = Column(Boolean, default=False) + id = sa.Column(sa.Integer, primary_key=True) + address = sa.Column(types.IPAddress()) + fixed_ip_id = sa.Column(sa.Integer) + project_id = sa.Column(sa.String(255)) + host = sa.Column(sa.String(255)) + auto_assigned = sa.Column(sa.Boolean, default=False) # TODO(sshturm) add default in db - pool = Column(String(255)) - interface = Column(String(255)) + pool = sa.Column(sa.String(255)) + interface = sa.Column(sa.String(255)) fixed_ip = orm.relationship(FixedIp, backref=orm.backref('floating_ips'), foreign_keys=fixed_ip_id, @@ -983,14 +990,14 @@ class DNSDomain(BASE, NovaBase, models.SoftDeleteMixin): """Represents a DNS domain with availability zone or project info.""" __tablename__ = 'dns_domains' __table_args__ = ( - Index('dns_domains_project_id_idx', 'project_id'), - Index('dns_domains_domain_deleted_idx', 'domain', 'deleted'), + sa.Index('dns_domains_project_id_idx', 'project_id'), + sa.Index('dns_domains_domain_deleted_idx', 'domain', 'deleted'), ) - deleted = Column(Boolean, default=False) - domain = Column(String(255), primary_key=True) - scope = Column(String(255)) - availability_zone = Column(String(255)) - project_id = Column(String(255)) + deleted = sa.Column(sa.Boolean, default=False) + domain = sa.Column(sa.String(255), primary_key=True) + scope = sa.Column(sa.String(255)) + availability_zone = sa.Column(sa.String(255)) + project_id = sa.Column(sa.String(255)) # TODO(stephenfin): Remove in V or later @@ -1002,14 +1009,14 @@ class ConsolePool(BASE, NovaBase, models.SoftDeleteMixin): "host", "console_type", "compute_host", "deleted", name="uniq_console_pools0host0console_type0compute_host0deleted"), ) - id = Column(Integer, primary_key=True) - address = Column(types.IPAddress()) - username = Column(String(255)) - password = Column(String(255)) - console_type = Column(String(255)) - public_hostname = Column(String(255)) - host = Column(String(255)) - compute_host = Column(String(255)) + id = sa.Column(sa.Integer, primary_key=True) + address = sa.Column(types.IPAddress()) + username = sa.Column(sa.String(255)) + password = sa.Column(sa.String(255)) + console_type = sa.Column(sa.String(255)) + public_hostname = sa.Column(sa.String(255)) + host = sa.Column(sa.String(255)) + compute_host = sa.Column(sa.String(255)) # TODO(stephenfin): Remove in V or later @@ -1017,14 +1024,14 @@ class Console(BASE, NovaBase, models.SoftDeleteMixin): """Represents a console session for an instance.""" __tablename__ = 'consoles' __table_args__ = ( - Index('consoles_instance_uuid_idx', 'instance_uuid'), + sa.Index('consoles_instance_uuid_idx', 'instance_uuid'), ) - id = Column(Integer, primary_key=True) - instance_name = Column(String(255)) - instance_uuid = Column(String(36), ForeignKey('instances.uuid')) - password = Column(String(255)) - port = Column(Integer) - pool_id = Column(Integer, ForeignKey('console_pools.id')) + id = sa.Column(sa.Integer, primary_key=True) + instance_name = sa.Column(sa.String(255)) + instance_uuid = sa.Column(sa.String(36), sa.ForeignKey('instances.uuid')) + password = sa.Column(sa.String(255)) + port = sa.Column(sa.Integer) + pool_id = sa.Column(sa.Integer, sa.ForeignKey('console_pools.id')) pool = orm.relationship(ConsolePool, backref=orm.backref('consoles')) @@ -1032,12 +1039,12 @@ class InstanceMetadata(BASE, NovaBase, models.SoftDeleteMixin): """Represents a user-provided metadata key/value pair for an instance.""" __tablename__ = 'instance_metadata' __table_args__ = ( - Index('instance_metadata_instance_uuid_idx', 'instance_uuid'), + sa.Index('instance_metadata_instance_uuid_idx', 'instance_uuid'), ) - id = Column(Integer, primary_key=True) - key = Column(String(255)) - value = Column(String(255)) - instance_uuid = Column(String(36), ForeignKey('instances.uuid')) + id = sa.Column(sa.Integer, primary_key=True) + key = sa.Column(sa.String(255)) + value = sa.Column(sa.String(255)) + instance_uuid = sa.Column(sa.String(36), sa.ForeignKey('instances.uuid')) instance = orm.relationship(Instance, backref="metadata", foreign_keys=instance_uuid, primaryjoin='and_(' @@ -1050,13 +1057,13 @@ class InstanceSystemMetadata(BASE, NovaBase, models.SoftDeleteMixin): """Represents a system-owned metadata key/value pair for an instance.""" __tablename__ = 'instance_system_metadata' __table_args__ = ( - Index('instance_uuid', 'instance_uuid'), + sa.Index('instance_uuid', 'instance_uuid'), ) - id = Column(Integer, primary_key=True) - key = Column(String(255), nullable=False) - value = Column(String(255)) - instance_uuid = Column(String(36), - ForeignKey('instances.uuid'), + id = sa.Column(sa.Integer, primary_key=True) + key = sa.Column(sa.String(255), nullable=False) + value = sa.Column(sa.String(255)) + instance_uuid = sa.Column(sa.String(36), + sa.ForeignKey('instances.uuid'), nullable=False) instance = orm.relationship(Instance, backref="system_metadata", @@ -1073,10 +1080,10 @@ class InstanceTypeProjects(BASE, NovaBase, models.SoftDeleteMixin): name="uniq_instance_type_projects0instance_type_id0project_id0deleted" ), ) - id = Column(Integer, primary_key=True) - instance_type_id = Column(Integer, ForeignKey('instance_types.id'), - nullable=False) - project_id = Column(String(255)) + id = sa.Column(sa.Integer, primary_key=True) + instance_type_id = sa.Column( + sa.Integer, sa.ForeignKey('instance_types.id'), nullable=False) + project_id = sa.Column(sa.String(255)) instance_type = orm.relationship(InstanceTypes, backref="projects", foreign_keys=instance_type_id, @@ -1091,7 +1098,7 @@ class InstanceTypeExtraSpecs(BASE, NovaBase, models.SoftDeleteMixin): """Represents additional specs as key/value pairs for an instance_type.""" __tablename__ = 'instance_type_extra_specs' __table_args__ = ( - Index('instance_type_extra_specs_instance_type_id_key_idx', + sa.Index('instance_type_extra_specs_instance_type_id_key_idx', 'instance_type_id', 'key'), schema.UniqueConstraint( "instance_type_id", "key", "deleted", @@ -1100,16 +1107,19 @@ class InstanceTypeExtraSpecs(BASE, NovaBase, models.SoftDeleteMixin): ), {'mysql_collate': 'utf8_bin'}, ) - id = Column(Integer, primary_key=True) - key = Column(String(255)) - value = Column(String(255)) - instance_type_id = Column(Integer, ForeignKey('instance_types.id'), - nullable=False) - instance_type = orm.relationship(InstanceTypes, backref="extra_specs", - foreign_keys=instance_type_id, - primaryjoin='and_(' - 'InstanceTypeExtraSpecs.instance_type_id == InstanceTypes.id,' - 'InstanceTypeExtraSpecs.deleted == 0)') + id = sa.Column(sa.Integer, primary_key=True) + key = sa.Column(sa.String(255)) + value = sa.Column(sa.String(255)) + instance_type_id = sa.Column( + sa.Integer, sa.ForeignKey('instance_types.id'), nullable=False) + instance_type = orm.relationship( + InstanceTypes, backref="extra_specs", + foreign_keys=instance_type_id, + primaryjoin=( + 'and_(' + 'InstanceTypeExtraSpecs.instance_type_id == InstanceTypes.id,' + 'InstanceTypeExtraSpecs.deleted == 0)'), + ) # TODO(stephenfin): Remove this in the U release or later, once we're sure we @@ -1124,16 +1134,16 @@ class Cell(BASE, NovaBase, models.SoftDeleteMixin): "name", "deleted", name="uniq_cells0name0deleted" ), ) - id = Column(Integer, primary_key=True) + id = sa.Column(sa.Integer, primary_key=True) # Name here is the 'short name' of a cell. For instance: 'child1' - name = Column(String(255)) - api_url = Column(String(255)) + name = sa.Column(sa.String(255)) + api_url = sa.Column(sa.String(255)) - transport_url = Column(String(255), nullable=False) + transport_url = sa.Column(sa.String(255), nullable=False) - weight_offset = Column(Float(), default=0.0) - weight_scale = Column(Float(), default=1.0) - is_parent = Column(Boolean()) + weight_offset = sa.Column(sa.Float(), default=0.0) + weight_scale = sa.Column(sa.Float(), default=1.0) + is_parent = sa.Column(sa.Boolean()) # NOTE(alaski): This table exists in the nova_api database and its usage here @@ -1146,9 +1156,10 @@ class AggregateHost(BASE, NovaBase, models.SoftDeleteMixin): name="uniq_aggregate_hosts0host0aggregate_id0deleted" ), ) - id = Column(Integer, primary_key=True, autoincrement=True) - host = Column(String(255)) - aggregate_id = Column(Integer, ForeignKey('aggregates.id'), nullable=False) + id = sa.Column(sa.Integer, primary_key=True, autoincrement=True) + host = sa.Column(sa.String(255)) + aggregate_id = sa.Column( + sa.Integer, sa.ForeignKey('aggregates.id'), nullable=False) # NOTE(alaski): This table exists in the nova_api database and its usage here @@ -1160,13 +1171,14 @@ class AggregateMetadata(BASE, NovaBase, models.SoftDeleteMixin): schema.UniqueConstraint("aggregate_id", "key", "deleted", name="uniq_aggregate_metadata0aggregate_id0key0deleted" ), - Index('aggregate_metadata_key_idx', 'key'), - Index('aggregate_metadata_value_idx', 'value'), + sa.Index('aggregate_metadata_key_idx', 'key'), + sa.Index('aggregate_metadata_value_idx', 'value'), ) - id = Column(Integer, primary_key=True) - key = Column(String(255), nullable=False) - value = Column(String(255), nullable=False) - aggregate_id = Column(Integer, ForeignKey('aggregates.id'), nullable=False) + id = sa.Column(sa.Integer, primary_key=True) + key = sa.Column(sa.String(255), nullable=False) + value = sa.Column(sa.String(255), nullable=False) + aggregate_id = sa.Column( + sa.Integer, sa.ForeignKey('aggregates.id'), nullable=False) # NOTE(alaski): This table exists in the nova_api database and its usage here @@ -1174,10 +1186,10 @@ class AggregateMetadata(BASE, NovaBase, models.SoftDeleteMixin): class Aggregate(BASE, NovaBase, models.SoftDeleteMixin): """Represents a cluster of hosts that exists in this zone.""" __tablename__ = 'aggregates' - __table_args__ = (Index('aggregate_uuid_idx', 'uuid'),) - id = Column(Integer, primary_key=True, autoincrement=True) - uuid = Column(String(36)) - name = Column(String(255)) + __table_args__ = (sa.Index('aggregate_uuid_idx', 'uuid'),) + id = sa.Column(sa.Integer, primary_key=True, autoincrement=True) + uuid = sa.Column(sa.String(36)) + name = sa.Column(sa.String(255)) _hosts = orm.relationship(AggregateHost, primaryjoin='and_(' 'Aggregate.id == AggregateHost.aggregate_id,' @@ -1215,18 +1227,18 @@ class AgentBuild(BASE, NovaBase, models.SoftDeleteMixin): """Represents an agent build.""" __tablename__ = 'agent_builds' __table_args__ = ( - Index('agent_builds_hypervisor_os_arch_idx', 'hypervisor', 'os', + sa.Index('agent_builds_hypervisor_os_arch_idx', 'hypervisor', 'os', 'architecture'), schema.UniqueConstraint("hypervisor", "os", "architecture", "deleted", name="uniq_agent_builds0hypervisor0os0architecture0deleted"), ) - id = Column(Integer, primary_key=True) - hypervisor = Column(String(255)) - os = Column(String(255)) - architecture = Column(String(255)) - version = Column(String(255)) - url = Column(String(255)) - md5hash = Column(String(255)) + id = sa.Column(sa.Integer, primary_key=True) + hypervisor = sa.Column(sa.String(255)) + os = sa.Column(sa.String(255)) + architecture = sa.Column(sa.String(255)) + version = sa.Column(sa.String(255)) + url = sa.Column(sa.String(255)) + md5hash = sa.Column(sa.String(255)) # TODO(stephenfin): Remove this in the W release or later, once we're sure we @@ -1235,81 +1247,84 @@ class BandwidthUsage(BASE, NovaBase, models.SoftDeleteMixin): """Cache for instance bandwidth usage data pulled from the hypervisor.""" __tablename__ = 'bw_usage_cache' __table_args__ = ( - Index('bw_usage_cache_uuid_start_period_idx', 'uuid', + sa.Index('bw_usage_cache_uuid_start_period_idx', 'uuid', 'start_period'), ) - id = Column(Integer, primary_key=True, nullable=False) - uuid = Column(String(36)) - mac = Column(String(255)) - start_period = Column(DateTime, nullable=False) - last_refreshed = Column(DateTime) - bw_in = Column(BigInteger) - bw_out = Column(BigInteger) - last_ctr_in = Column(BigInteger) - last_ctr_out = Column(BigInteger) + id = sa.Column(sa.Integer, primary_key=True, nullable=False) + uuid = sa.Column(sa.String(36)) + mac = sa.Column(sa.String(255)) + start_period = sa.Column(sa.DateTime, nullable=False) + last_refreshed = sa.Column(sa.DateTime) + bw_in = sa.Column(sa.BigInteger) + bw_out = sa.Column(sa.BigInteger) + last_ctr_in = sa.Column(sa.BigInteger) + last_ctr_out = sa.Column(sa.BigInteger) class VolumeUsage(BASE, NovaBase, models.SoftDeleteMixin): """Cache for volume usage data pulled from the hypervisor.""" __tablename__ = 'volume_usage_cache' __table_args__ = () - id = Column(Integer, primary_key=True, nullable=False) - volume_id = Column(String(36), nullable=False) - instance_uuid = Column(String(36)) - project_id = Column(String(36)) - user_id = Column(String(64)) - availability_zone = Column(String(255)) - tot_last_refreshed = Column(DateTime) - tot_reads = Column(BigInteger, default=0) - tot_read_bytes = Column(BigInteger, default=0) - tot_writes = Column(BigInteger, default=0) - tot_write_bytes = Column(BigInteger, default=0) - curr_last_refreshed = Column(DateTime) - curr_reads = Column(BigInteger, default=0) - curr_read_bytes = Column(BigInteger, default=0) - curr_writes = Column(BigInteger, default=0) - curr_write_bytes = Column(BigInteger, default=0) + id = sa.Column(sa.Integer, primary_key=True, nullable=False) + volume_id = sa.Column(sa.String(36), nullable=False) + instance_uuid = sa.Column(sa.String(36)) + project_id = sa.Column(sa.String(36)) + user_id = sa.Column(sa.String(64)) + availability_zone = sa.Column(sa.String(255)) + tot_last_refreshed = sa.Column(sa.DateTime) + tot_reads = sa.Column(sa.BigInteger, default=0) + tot_read_bytes = sa.Column(sa.BigInteger, default=0) + tot_writes = sa.Column(sa.BigInteger, default=0) + tot_write_bytes = sa.Column(sa.BigInteger, default=0) + curr_last_refreshed = sa.Column(sa.DateTime) + curr_reads = sa.Column(sa.BigInteger, default=0) + curr_read_bytes = sa.Column(sa.BigInteger, default=0) + curr_writes = sa.Column(sa.BigInteger, default=0) + curr_write_bytes = sa.Column(sa.BigInteger, default=0) class S3Image(BASE, NovaBase, models.SoftDeleteMixin): """Compatibility layer for the S3 image service talking to Glance.""" __tablename__ = 's3_images' __table_args__ = () - id = Column(Integer, primary_key=True, nullable=False, autoincrement=True) - uuid = Column(String(36), nullable=False) + id = sa.Column( + sa.Integer, primary_key=True, nullable=False, autoincrement=True) + uuid = sa.Column(sa.String(36), nullable=False) class VolumeIdMapping(BASE, NovaBase, models.SoftDeleteMixin): """Compatibility layer for the EC2 volume service.""" __tablename__ = 'volume_id_mappings' __table_args__ = () - id = Column(Integer, primary_key=True, nullable=False, autoincrement=True) - uuid = Column(String(36), nullable=False) + id = sa.Column( + sa.Integer, primary_key=True, nullable=False, autoincrement=True) + uuid = sa.Column(sa.String(36), nullable=False) class SnapshotIdMapping(BASE, NovaBase, models.SoftDeleteMixin): """Compatibility layer for the EC2 snapshot service.""" __tablename__ = 'snapshot_id_mappings' __table_args__ = () - id = Column(Integer, primary_key=True, nullable=False, autoincrement=True) - uuid = Column(String(36), nullable=False) + id = sa.Column( + sa.Integer, primary_key=True, nullable=False, autoincrement=True) + uuid = sa.Column(sa.String(36), nullable=False) class InstanceFault(BASE, NovaBase, models.SoftDeleteMixin): __tablename__ = 'instance_faults' __table_args__ = ( - Index('instance_faults_host_idx', 'host'), - Index('instance_faults_instance_uuid_deleted_created_at_idx', + sa.Index('instance_faults_host_idx', 'host'), + sa.Index('instance_faults_instance_uuid_deleted_created_at_idx', 'instance_uuid', 'deleted', 'created_at') ) - id = Column(Integer, primary_key=True, nullable=False) - instance_uuid = Column(String(36), - ForeignKey('instances.uuid')) - code = Column(Integer(), nullable=False) - message = Column(String(255)) - details = Column(MediumText()) - host = Column(String(255)) + id = sa.Column(sa.Integer, primary_key=True, nullable=False) + instance_uuid = sa.Column(sa.String(36), + sa.ForeignKey('instances.uuid')) + code = sa.Column(sa.Integer(), nullable=False) + message = sa.Column(sa.String(255)) + details = sa.Column(MediumText()) + host = sa.Column(sa.String(255)) class InstanceAction(BASE, NovaBase, models.SoftDeleteMixin): @@ -1320,22 +1335,23 @@ class InstanceAction(BASE, NovaBase, models.SoftDeleteMixin): """ __tablename__ = 'instance_actions' __table_args__ = ( - Index('instance_uuid_idx', 'instance_uuid'), - Index('request_id_idx', 'request_id'), - Index('instance_actions_instance_uuid_updated_at_idx', + sa.Index('instance_uuid_idx', 'instance_uuid'), + sa.Index('request_id_idx', 'request_id'), + sa.Index('instance_actions_instance_uuid_updated_at_idx', 'instance_uuid', 'updated_at') ) - id = Column(Integer, primary_key=True, nullable=False, autoincrement=True) - action = Column(String(255)) - instance_uuid = Column(String(36), - ForeignKey('instances.uuid')) - request_id = Column(String(255)) - user_id = Column(String(255)) - project_id = Column(String(255)) - start_time = Column(DateTime, default=timeutils.utcnow) - finish_time = Column(DateTime) - message = Column(String(255)) + id = sa.Column( + sa.Integer, primary_key=True, nullable=False, autoincrement=True) + action = sa.Column(sa.String(255)) + instance_uuid = sa.Column(sa.String(36), + sa.ForeignKey('instances.uuid')) + request_id = sa.Column(sa.String(255)) + user_id = sa.Column(sa.String(255)) + project_id = sa.Column(sa.String(255)) + start_time = sa.Column(sa.DateTime, default=timeutils.utcnow) + finish_time = sa.Column(sa.DateTime) + message = sa.Column(sa.String(255)) class InstanceActionEvent(BASE, NovaBase, models.SoftDeleteMixin): @@ -1343,25 +1359,27 @@ class InstanceActionEvent(BASE, NovaBase, models.SoftDeleteMixin): __tablename__ = 'instance_actions_events' __table_args__ = () - id = Column(Integer, primary_key=True, nullable=False, autoincrement=True) - event = Column(String(255)) - action_id = Column(Integer, ForeignKey('instance_actions.id')) - start_time = Column(DateTime, default=timeutils.utcnow) - finish_time = Column(DateTime) - result = Column(String(255)) - traceback = Column(Text) - host = Column(String(255)) - details = Column(Text) + id = sa.Column( + sa.Integer, primary_key=True, nullable=False, autoincrement=True) + event = sa.Column(sa.String(255)) + action_id = sa.Column(sa.Integer, sa.ForeignKey('instance_actions.id')) + start_time = sa.Column(sa.DateTime, default=timeutils.utcnow) + finish_time = sa.Column(sa.DateTime) + result = sa.Column(sa.String(255)) + traceback = sa.Column(sa.Text) + host = sa.Column(sa.String(255)) + details = sa.Column(sa.Text) class InstanceIdMapping(BASE, NovaBase, models.SoftDeleteMixin): """Compatibility layer for the EC2 instance service.""" __tablename__ = 'instance_id_mappings' __table_args__ = ( - Index('ix_instance_id_mappings_uuid', 'uuid'), + sa.Index('ix_instance_id_mappings_uuid', 'uuid'), ) - id = Column(Integer, primary_key=True, nullable=False, autoincrement=True) - uuid = Column(String(36), nullable=False) + id = sa.Column( + sa.Integer, primary_key=True, nullable=False, autoincrement=True) + uuid = sa.Column(sa.String(36), nullable=False) class TaskLog(BASE, NovaBase, models.SoftDeleteMixin): @@ -1372,21 +1390,22 @@ class TaskLog(BASE, NovaBase, models.SoftDeleteMixin): 'task_name', 'host', 'period_beginning', 'period_ending', name="uniq_task_log0task_name0host0period_beginning0period_ending" ), - Index('ix_task_log_period_beginning', 'period_beginning'), - Index('ix_task_log_host', 'host'), - Index('ix_task_log_period_ending', 'period_ending'), + sa.Index('ix_task_log_period_beginning', 'period_beginning'), + sa.Index('ix_task_log_host', 'host'), + sa.Index('ix_task_log_period_ending', 'period_ending'), ) - id = Column(Integer, primary_key=True, nullable=False, autoincrement=True) - task_name = Column(String(255), nullable=False) - state = Column(String(255), nullable=False) - host = Column(String(255), nullable=False) - period_beginning = Column(DateTime, default=timeutils.utcnow, + id = sa.Column( + sa.Integer, primary_key=True, nullable=False, autoincrement=True) + task_name = sa.Column(sa.String(255), nullable=False) + state = sa.Column(sa.String(255), nullable=False) + host = sa.Column(sa.String(255), nullable=False) + period_beginning = sa.Column(sa.DateTime, default=timeutils.utcnow, nullable=False) - period_ending = Column(DateTime, default=timeutils.utcnow, + period_ending = sa.Column(sa.DateTime, default=timeutils.utcnow, nullable=False) - message = Column(String(255), nullable=False) - task_items = Column(Integer(), default=0) - errors = Column(Integer(), default=0) + message = sa.Column(sa.String(255), nullable=False) + task_items = sa.Column(sa.Integer(), default=0) + errors = sa.Column(sa.Integer(), default=0) # NOTE(alaski): This table exists in the nova_api database and its usage here @@ -1395,11 +1414,11 @@ class InstanceGroupMember(BASE, NovaBase, models.SoftDeleteMixin): """Represents the members for an instance group.""" __tablename__ = 'instance_group_member' __table_args__ = ( - Index('instance_group_member_instance_idx', 'instance_id'), + sa.Index('instance_group_member_instance_idx', 'instance_id'), ) - id = Column(Integer, primary_key=True, nullable=False) - instance_id = Column(String(255)) - group_id = Column(Integer, ForeignKey('instance_groups.id'), + id = sa.Column(sa.Integer, primary_key=True, nullable=False) + instance_id = sa.Column(sa.String(255)) + group_id = sa.Column(sa.Integer, sa.ForeignKey('instance_groups.id'), nullable=False) @@ -1409,11 +1428,11 @@ class InstanceGroupPolicy(BASE, NovaBase, models.SoftDeleteMixin): """Represents the policy type for an instance group.""" __tablename__ = 'instance_group_policy' __table_args__ = ( - Index('instance_group_policy_policy_idx', 'policy'), + sa.Index('instance_group_policy_policy_idx', 'policy'), ) - id = Column(Integer, primary_key=True, nullable=False) - policy = Column(String(255)) - group_id = Column(Integer, ForeignKey('instance_groups.id'), + id = sa.Column(sa.Integer, primary_key=True, nullable=False) + policy = sa.Column(sa.String(255)) + group_id = sa.Column(sa.Integer, sa.ForeignKey('instance_groups.id'), nullable=False) @@ -1432,11 +1451,11 @@ class InstanceGroup(BASE, NovaBase, models.SoftDeleteMixin): name="uniq_instance_groups0uuid0deleted"), ) - id = Column(Integer, primary_key=True, autoincrement=True) - user_id = Column(String(255)) - project_id = Column(String(255)) - uuid = Column(String(36), nullable=False) - name = Column(String(255)) + id = sa.Column(sa.Integer, primary_key=True, autoincrement=True) + user_id = sa.Column(sa.String(255)) + project_id = sa.Column(sa.String(255)) + uuid = sa.Column(sa.String(36), nullable=False) + name = sa.Column(sa.String(255)) _policies = orm.relationship(InstanceGroupPolicy, primaryjoin='and_(' 'InstanceGroup.id == InstanceGroupPolicy.group_id,' 'InstanceGroupPolicy.deleted == 0,' @@ -1460,45 +1479,45 @@ class PciDevice(BASE, NovaBase, models.SoftDeleteMixin): """ __tablename__ = 'pci_devices' __table_args__ = ( - Index('ix_pci_devices_compute_node_id_deleted', + sa.Index('ix_pci_devices_compute_node_id_deleted', 'compute_node_id', 'deleted'), - Index('ix_pci_devices_instance_uuid_deleted', + sa.Index('ix_pci_devices_instance_uuid_deleted', 'instance_uuid', 'deleted'), - Index('ix_pci_devices_compute_node_id_parent_addr_deleted', + sa.Index('ix_pci_devices_compute_node_id_parent_addr_deleted', 'compute_node_id', 'parent_addr', 'deleted'), schema.UniqueConstraint( "compute_node_id", "address", "deleted", name="uniq_pci_devices0compute_node_id0address0deleted") ) - id = Column(Integer, primary_key=True) - uuid = Column(String(36)) - compute_node_id = Column(Integer, ForeignKey('compute_nodes.id'), + id = sa.Column(sa.Integer, primary_key=True) + uuid = sa.Column(sa.String(36)) + compute_node_id = sa.Column(sa.Integer, sa.ForeignKey('compute_nodes.id'), nullable=False) # physical address of device domain:bus:slot.func (0000:09:01.1) - address = Column(String(12), nullable=False) + address = sa.Column(sa.String(12), nullable=False) - vendor_id = Column(String(4), nullable=False) - product_id = Column(String(4), nullable=False) - dev_type = Column(String(8), nullable=False) - dev_id = Column(String(255)) + vendor_id = sa.Column(sa.String(4), nullable=False) + product_id = sa.Column(sa.String(4), nullable=False) + dev_type = sa.Column(sa.String(8), nullable=False) + dev_id = sa.Column(sa.String(255)) # label is abstract device name, that is used to unify devices with the # same functionality with different addresses or host. - label = Column(String(255), nullable=False) + label = sa.Column(sa.String(255), nullable=False) - status = Column(String(36), nullable=False) + status = sa.Column(sa.String(36), nullable=False) # the request_id is used to identify a device that is allocated for a # particular request - request_id = Column(String(36), nullable=True) + request_id = sa.Column(sa.String(36), nullable=True) - extra_info = Column(Text) + extra_info = sa.Column(sa.Text) - instance_uuid = Column(String(36)) + instance_uuid = sa.Column(sa.String(36)) - numa_node = Column(Integer, nullable=True) + numa_node = sa.Column(sa.Integer, nullable=True) - parent_addr = Column(String(12), nullable=True) + parent_addr = sa.Column(sa.String(12), nullable=True) instance = orm.relationship(Instance, backref="pci_devices", foreign_keys=instance_uuid, primaryjoin='and_(' @@ -1511,10 +1530,10 @@ class Tag(BASE, models.ModelBase): __tablename__ = "tags" __table_args__ = ( - Index('tags_tag_idx', 'tag'), + sa.Index('tags_tag_idx', 'tag'), ) - resource_id = Column(String(36), primary_key=True, nullable=False) - tag = Column(Unicode(80), primary_key=True, nullable=False) + resource_id = sa.Column(sa.String(36), primary_key=True, nullable=False) + tag = sa.Column(sa.Unicode(80), primary_key=True, nullable=False) instance = orm.relationship( "Instance", @@ -1532,19 +1551,19 @@ class ResourceProvider(BASE, models.ModelBase): __tablename__ = "resource_providers" __table_args__ = ( - Index('resource_providers_uuid_idx', 'uuid'), + sa.Index('resource_providers_uuid_idx', 'uuid'), schema.UniqueConstraint('uuid', name='uniq_resource_providers0uuid'), - Index('resource_providers_name_idx', 'name'), + sa.Index('resource_providers_name_idx', 'name'), schema.UniqueConstraint('name', name='uniq_resource_providers0name') ) - id = Column(Integer, primary_key=True, nullable=False) - uuid = Column(String(36), nullable=False) - name = Column(Unicode(200), nullable=True) - generation = Column(Integer, default=0) - can_host = Column(Integer, default=0) + id = sa.Column(sa.Integer, primary_key=True, nullable=False) + uuid = sa.Column(sa.String(36), nullable=False) + name = sa.Column(sa.Unicode(200), nullable=True) + generation = sa.Column(sa.Integer, default=0) + can_host = sa.Column(sa.Integer, default=0) # NOTE(alaski): This table exists in the nova_api database and its usage here @@ -1554,25 +1573,25 @@ class Inventory(BASE, models.ModelBase): __tablename__ = "inventories" __table_args__ = ( - Index('inventories_resource_provider_id_idx', + sa.Index('inventories_resource_provider_id_idx', 'resource_provider_id'), - Index('inventories_resource_class_id_idx', + sa.Index('inventories_resource_class_id_idx', 'resource_class_id'), - Index('inventories_resource_provider_resource_class_idx', + sa.Index('inventories_resource_provider_resource_class_idx', 'resource_provider_id', 'resource_class_id'), schema.UniqueConstraint('resource_provider_id', 'resource_class_id', name='uniq_inventories0resource_provider_resource_class') ) - id = Column(Integer, primary_key=True, nullable=False) - resource_provider_id = Column(Integer, nullable=False) - resource_class_id = Column(Integer, nullable=False) - total = Column(Integer, nullable=False) - reserved = Column(Integer, nullable=False) - min_unit = Column(Integer, nullable=False) - max_unit = Column(Integer, nullable=False) - step_size = Column(Integer, nullable=False) - allocation_ratio = Column(Float, nullable=False) + id = sa.Column(sa.Integer, primary_key=True, nullable=False) + resource_provider_id = sa.Column(sa.Integer, nullable=False) + resource_class_id = sa.Column(sa.Integer, nullable=False) + total = sa.Column(sa.Integer, nullable=False) + reserved = sa.Column(sa.Integer, nullable=False) + min_unit = sa.Column(sa.Integer, nullable=False) + max_unit = sa.Column(sa.Integer, nullable=False) + step_size = sa.Column(sa.Integer, nullable=False) + allocation_ratio = sa.Column(sa.Float, nullable=False) resource_provider = orm.relationship( "ResourceProvider", primaryjoin=('and_(Inventory.resource_provider_id == ' @@ -1587,19 +1606,19 @@ class Allocation(BASE, models.ModelBase): __tablename__ = "allocations" __table_args__ = ( - Index('allocations_resource_provider_class_used_idx', + sa.Index('allocations_resource_provider_class_used_idx', 'resource_provider_id', 'resource_class_id', 'used'), - Index('allocations_resource_class_id_idx', + sa.Index('allocations_resource_class_id_idx', 'resource_class_id'), - Index('allocations_consumer_id_idx', 'consumer_id') + sa.Index('allocations_consumer_id_idx', 'consumer_id') ) - id = Column(Integer, primary_key=True, nullable=False) - resource_provider_id = Column(Integer, nullable=False) - consumer_id = Column(String(36), nullable=False) - resource_class_id = Column(Integer, nullable=False) - used = Column(Integer, nullable=False) + id = sa.Column(sa.Integer, primary_key=True, nullable=False) + resource_provider_id = sa.Column(sa.Integer, nullable=False) + consumer_id = sa.Column(sa.String(36), nullable=False) + resource_class_id = sa.Column(sa.Integer, nullable=False) + used = sa.Column(sa.Integer, nullable=False) # NOTE(alaski): This table exists in the nova_api database and its usage here @@ -1609,12 +1628,13 @@ class ResourceProviderAggregate(BASE, models.ModelBase): __tablename__ = 'resource_provider_aggregates' __table_args__ = ( - Index('resource_provider_aggregates_aggregate_id_idx', + sa.Index('resource_provider_aggregates_aggregate_id_idx', 'aggregate_id'), ) - resource_provider_id = Column(Integer, primary_key=True, nullable=False) - aggregate_id = Column(Integer, primary_key=True, nullable=False) + resource_provider_id = sa.Column( + sa.Integer, primary_key=True, nullable=False) + aggregate_id = sa.Column(sa.Integer, primary_key=True, nullable=False) class ConsoleAuthToken(BASE, NovaBase): @@ -1622,23 +1642,25 @@ class ConsoleAuthToken(BASE, NovaBase): __tablename__ = 'console_auth_tokens' __table_args__ = ( - Index('console_auth_tokens_instance_uuid_idx', 'instance_uuid'), - Index('console_auth_tokens_host_expires_idx', 'host', 'expires'), - Index('console_auth_tokens_token_hash_idx', 'token_hash'), - Index('console_auth_tokens_token_hash_instance_uuid_idx', 'token_hash', - 'instance_uuid'), + sa.Index('console_auth_tokens_instance_uuid_idx', 'instance_uuid'), + sa.Index('console_auth_tokens_host_expires_idx', 'host', 'expires'), + sa.Index('console_auth_tokens_token_hash_idx', 'token_hash'), + sa.Index( + 'console_auth_tokens_token_hash_instance_uuid_idx', 'token_hash', + 'instance_uuid', + ), schema.UniqueConstraint("token_hash", name="uniq_console_auth_tokens0token_hash") ) - id = Column(Integer, primary_key=True, nullable=False) - token_hash = Column(String(255), nullable=False) - console_type = Column(String(255), nullable=False) - host = Column(String(255), nullable=False) - port = Column(Integer, nullable=False) - internal_access_path = Column(String(255)) - instance_uuid = Column(String(36), nullable=False) - expires = Column(Integer, nullable=False) - access_url_base = Column(String(255)) + id = sa.Column(sa.Integer, primary_key=True, nullable=False) + token_hash = sa.Column(sa.String(255), nullable=False) + console_type = sa.Column(sa.String(255), nullable=False) + host = sa.Column(sa.String(255), nullable=False) + port = sa.Column(sa.Integer, nullable=False) + internal_access_path = sa.Column(sa.String(255)) + instance_uuid = sa.Column(sa.String(36), nullable=False) + expires = sa.Column(sa.Integer, nullable=False) + access_url_base = sa.Column(sa.String(255)) instance = orm.relationship( "Instance", diff --git a/nova/objects/aggregate.py b/nova/objects/aggregate.py index 548fc038e598..368c102f5df5 100644 --- a/nova/objects/aggregate.py +++ b/nova/objects/aggregate.py @@ -16,8 +16,7 @@ from oslo_db import exception as db_exc from oslo_log import log as logging from oslo_utils import excutils from oslo_utils import uuidutils -from sqlalchemy.orm import contains_eager -from sqlalchemy.orm import joinedload +from sqlalchemy import orm from nova.compute import utils as compute_utils from nova.db.sqlalchemy import api as db_api @@ -36,8 +35,8 @@ DEPRECATED_FIELDS = ['deleted', 'deleted_at'] @db_api.api_context_manager.reader def _aggregate_get_from_db(context, aggregate_id): query = context.session.query(api_models.Aggregate).\ - options(joinedload('_hosts')).\ - options(joinedload('_metadata')) + options(orm.joinedload('_hosts')).\ + options(orm.joinedload('_metadata')) query = query.filter(api_models.Aggregate.id == aggregate_id) aggregate = query.first() @@ -51,8 +50,8 @@ def _aggregate_get_from_db(context, aggregate_id): @db_api.api_context_manager.reader def _aggregate_get_from_db_by_uuid(context, aggregate_uuid): query = context.session.query(api_models.Aggregate).\ - options(joinedload('_hosts')).\ - options(joinedload('_metadata')) + options(orm.joinedload('_hosts')).\ + options(orm.joinedload('_metadata')) query = query.filter(api_models.Aggregate.uuid == aggregate_uuid) aggregate = query.first() @@ -415,8 +414,8 @@ class Aggregate(base.NovaPersistentObject, base.NovaObject): @db_api.api_context_manager.reader def _get_all_from_db(context): query = context.session.query(api_models.Aggregate).\ - options(joinedload('_hosts')).\ - options(joinedload('_metadata')) + options(orm.joinedload('_hosts')).\ + options(orm.joinedload('_metadata')) return query.all() @@ -424,8 +423,8 @@ def _get_all_from_db(context): @db_api.api_context_manager.reader def _get_by_host_from_db(context, host, key=None): query = context.session.query(api_models.Aggregate).\ - options(joinedload('_hosts')).\ - options(joinedload('_metadata')) + options(orm.joinedload('_hosts')).\ + options(orm.joinedload('_metadata')) query = query.join('_hosts') query = query.filter(api_models.AggregateHost.host == host) @@ -445,8 +444,8 @@ def _get_by_metadata_from_db(context, key=None, value=None): query = query.filter(api_models.AggregateMetadata.key == key) if value is not None: query = query.filter(api_models.AggregateMetadata.value == value) - query = query.options(contains_eager("_metadata")) - query = query.options(joinedload("_hosts")) + query = query.options(orm.contains_eager("_metadata")) + query = query.options(orm.joinedload("_hosts")) return query.all() @@ -477,8 +476,8 @@ def _get_non_matching_by_metadata_keys_from_db(context, ignored_keys, query = query.filter(~api_models.AggregateMetadata.key.in_( ignored_keys)) - query = query.options(contains_eager("_metadata")) - query = query.options(joinedload("_hosts")) + query = query.options(orm.contains_eager("_metadata")) + query = query.options(orm.joinedload("_hosts")) return query.all() diff --git a/nova/objects/cell_mapping.py b/nova/objects/cell_mapping.py index 63e3648d5fbf..7633ad0e7591 100644 --- a/nova/objects/cell_mapping.py +++ b/nova/objects/cell_mapping.py @@ -14,9 +14,8 @@ from urllib import parse as urlparse from oslo_log import log as logging from oslo_utils import versionutils -from sqlalchemy.sql.expression import asc -from sqlalchemy.sql import false -from sqlalchemy.sql import true +from sqlalchemy import sql +from sqlalchemy.sql import expression import nova.conf from nova.db.sqlalchemy import api as db_api @@ -250,7 +249,7 @@ class CellMappingList(base.ObjectListBase, base.NovaObject): @db_api.api_context_manager.reader def _get_all_from_db(context): return context.session.query(api_models.CellMapping).order_by( - asc(api_models.CellMapping.id)).all() + expression.asc(api_models.CellMapping.id)).all() @base.remotable_classmethod def get_all(cls, context): @@ -261,12 +260,13 @@ class CellMappingList(base.ObjectListBase, base.NovaObject): @db_api.api_context_manager.reader def _get_by_disabled_from_db(context, disabled): if disabled: - return context.session.query(api_models.CellMapping).filter_by( - disabled=true()).order_by(asc(api_models.CellMapping.id)).all() + return context.session.query(api_models.CellMapping)\ + .filter_by(disabled=sql.true())\ + .order_by(expression.asc(api_models.CellMapping.id)).all() else: - return context.session.query(api_models.CellMapping).filter_by( - disabled=false()).order_by(asc( - api_models.CellMapping.id)).all() + return context.session.query(api_models.CellMapping)\ + .filter_by(disabled=sql.false())\ + .order_by(expression.asc(api_models.CellMapping.id)).all() @base.remotable_classmethod def get_by_disabled(cls, context, disabled): diff --git a/nova/objects/compute_node.py b/nova/objects/compute_node.py index cf5d3ca8d881..6de7822cdecb 100644 --- a/nova/objects/compute_node.py +++ b/nova/objects/compute_node.py @@ -12,12 +12,11 @@ # License for the specific language governing permissions and limitations # under the License. - from oslo_serialization import jsonutils from oslo_utils import uuidutils from oslo_utils import versionutils -from sqlalchemy import or_ -from sqlalchemy.sql import null +import sqlalchemy as sa +from sqlalchemy import sql import nova.conf from nova.db import api as db @@ -500,13 +499,13 @@ def _get_node_empty_ratio(context, max_count): Results are limited by ``max_count``. """ - return context.session.query(models.ComputeNode).filter(or_( + return context.session.query(models.ComputeNode).filter(sa.or_( models.ComputeNode.ram_allocation_ratio == '0.0', models.ComputeNode.cpu_allocation_ratio == '0.0', models.ComputeNode.disk_allocation_ratio == '0.0', - models.ComputeNode.ram_allocation_ratio == null(), - models.ComputeNode.cpu_allocation_ratio == null(), - models.ComputeNode.disk_allocation_ratio == null() + models.ComputeNode.ram_allocation_ratio == sql.null(), + models.ComputeNode.cpu_allocation_ratio == sql.null(), + models.ComputeNode.disk_allocation_ratio == sql.null() )).filter(models.ComputeNode.deleted == 0).limit(max_count).all() diff --git a/nova/objects/flavor.py b/nova/objects/flavor.py index c590fc143225..546b525dadb9 100644 --- a/nova/objects/flavor.py +++ b/nova/objects/flavor.py @@ -15,10 +15,10 @@ from oslo_db import exception as db_exc from oslo_db.sqlalchemy import utils as sqlalchemyutils from oslo_utils import versionutils -from sqlalchemy import or_ -from sqlalchemy.orm import joinedload -from sqlalchemy.sql.expression import asc -from sqlalchemy.sql import true +import sqlalchemy as sa +from sqlalchemy import orm +from sqlalchemy import sql +from sqlalchemy.sql import expression import nova.conf from nova.db.sqlalchemy import api as db_api @@ -55,9 +55,9 @@ def _dict_with_extra_specs(flavor_model): @db_api.api_context_manager.reader def _get_projects_from_db(context, flavorid): db_flavor = context.session.query(api_models.Flavors).\ - filter_by(flavorid=flavorid).\ - options(joinedload('projects')).\ - first() + filter_by(flavorid=flavorid).\ + options(orm.joinedload('projects')).\ + first() if not db_flavor: raise exception.FlavorNotFound(flavor_id=flavorid) return [x['project_id'] for x in db_flavor['projects']] @@ -272,13 +272,13 @@ class Flavor(base.NovaPersistentObject, base.NovaObject, @db_api.api_context_manager.reader def _flavor_get_query_from_db(context): query = context.session.query(api_models.Flavors).\ - options(joinedload('extra_specs')) + options(orm.joinedload('extra_specs')) if not context.is_admin: - the_filter = [api_models.Flavors.is_public == true()] + the_filter = [api_models.Flavors.is_public == sql.true()] the_filter.extend([ api_models.Flavors.projects.any(project_id=context.project_id) ]) - query = query.filter(or_(*the_filter)) + query = query.filter(sa.or_(*the_filter)) return query @staticmethod @@ -309,7 +309,7 @@ class Flavor(base.NovaPersistentObject, base.NovaObject, """Returns a dict describing specific flavor_id.""" result = Flavor._flavor_get_query_from_db(context).\ filter_by(flavorid=flavor_id).\ - order_by(asc(api_models.Flavors.id)).\ + order_by(expression.asc(api_models.Flavors.id)).\ first() if not result: raise exception.FlavorNotFound(flavor_id=flavor_id) @@ -609,7 +609,7 @@ def _flavor_get_all_from_db(context, inactive, filters, sort_key, sort_dir, the_filter.extend([api_models.Flavors.projects.any( project_id=context.project_id)]) if len(the_filter) > 1: - query = query.filter(or_(*the_filter)) + query = query.filter(sa.or_(*the_filter)) else: query = query.filter(the_filter[0]) marker_row = None diff --git a/nova/objects/host_mapping.py b/nova/objects/host_mapping.py index bde342302b5b..52f39be70bf6 100644 --- a/nova/objects/host_mapping.py +++ b/nova/objects/host_mapping.py @@ -11,7 +11,7 @@ # under the License. from oslo_db import exception as db_exc -from sqlalchemy.orm import joinedload +from sqlalchemy import orm from nova import context from nova.db.sqlalchemy import api as db_api @@ -89,9 +89,9 @@ class HostMapping(base.NovaTimestampObject, base.NovaObject): @staticmethod @db_api.api_context_manager.reader def _get_by_host_from_db(context, host): - db_mapping = (context.session.query(api_models.HostMapping) - .options(joinedload('cell_mapping')) - .filter(api_models.HostMapping.host == host)).first() + db_mapping = context.session.query(api_models.HostMapping)\ + .options(orm.joinedload('cell_mapping'))\ + .filter(api_models.HostMapping.host == host).first() if not db_mapping: raise exception.HostMappingNotFound(name=host) return db_mapping @@ -160,7 +160,7 @@ class HostMappingList(base.ObjectListBase, base.NovaObject): @db_api.api_context_manager.reader def _get_from_db(context, cell_id=None): query = (context.session.query(api_models.HostMapping) - .options(joinedload('cell_mapping'))) + .options(orm.joinedload('cell_mapping'))) if cell_id: query = query.filter(api_models.HostMapping.cell_id == cell_id) return query.all() diff --git a/nova/objects/instance.py b/nova/objects/instance.py index d50efc515934..0c43f0f2753c 100644 --- a/nova/objects/instance.py +++ b/nova/objects/instance.py @@ -20,10 +20,9 @@ from oslo_log import log as logging from oslo_serialization import jsonutils from oslo_utils import timeutils from oslo_utils import versionutils -from sqlalchemy import or_ -from sqlalchemy.sql import false +import sqlalchemy as sa +from sqlalchemy import sql from sqlalchemy.sql import func -from sqlalchemy.sql import null from nova import availability_zones as avail_zone from nova.compute import task_states @@ -1516,9 +1515,9 @@ class InstanceList(base.ObjectListBase, base.NovaObject): # NOTE(melwitt): Copied from nova/db/sqlalchemy/api.py: # It would be better to have vm_state not be nullable # but until then we test it explicitly as a workaround. - not_soft_deleted = or_( + not_soft_deleted = sa.or_( models.Instance.vm_state != vm_states.SOFT_DELETED, - models.Instance.vm_state == null() + models.Instance.vm_state == sql.null() ) project_query = context.session.query( func.count(models.Instance.id), @@ -1531,8 +1530,10 @@ class InstanceList(base.ObjectListBase, base.NovaObject): # non-hidden version of the instance in another cell database and the # API will only show one of them, so we don't count the hidden copy. project_query = project_query.filter( - or_(models.Instance.hidden == false(), - models.Instance.hidden == null())) + sa.or_( + models.Instance.hidden == sql.false(), + models.Instance.hidden == sql.null(), + )) project_result = project_query.first() fields = ('instances', 'cores', 'ram') diff --git a/nova/objects/instance_group.py b/nova/objects/instance_group.py index 831e832670cd..9e4f8e0b7e51 100644 --- a/nova/objects/instance_group.py +++ b/nova/objects/instance_group.py @@ -19,8 +19,7 @@ from oslo_log import log as logging from oslo_serialization import jsonutils from oslo_utils import uuidutils from oslo_utils import versionutils -from sqlalchemy.orm import contains_eager -from sqlalchemy.orm import joinedload +from sqlalchemy import orm from nova.compute import utils as compute_utils from nova.db.sqlalchemy import api as db_api @@ -37,8 +36,8 @@ LOG = logging.getLogger(__name__) def _instance_group_get_query(context, id_field=None, id=None): query = context.session.query(api_models.InstanceGroup).\ - options(joinedload('_policies')).\ - options(joinedload('_members')) + options(orm.joinedload('_policies')).\ + options(orm.joinedload('_members')) if not context.is_admin: query = query.filter_by(project_id=context.project_id) if id and id_field: @@ -89,7 +88,7 @@ def _instance_group_members_add_by_uuid(context, group_uuid, members): outerjoin(api_models.InstanceGroupMember, api_models.InstanceGroupMember.instance_uuid.in_(set(members))).\ filter(api_models.InstanceGroup.uuid == group_uuid).\ - options(contains_eager('_members')).first() + options(orm.contains_eager('_members')).first() if not group: raise exception.InstanceGroupNotFound(group_uuid=group_uuid) return _instance_group_model_add(context, api_models.InstanceGroupMember, diff --git a/nova/objects/instance_mapping.py b/nova/objects/instance_mapping.py index 1358a67008f6..7da9c5df61ce 100644 --- a/nova/objects/instance_mapping.py +++ b/nova/objects/instance_mapping.py @@ -14,11 +14,10 @@ import collections from oslo_log import log as logging from oslo_utils import versionutils +from sqlalchemy import orm from sqlalchemy.orm import exc as orm_exc -from sqlalchemy.orm import joinedload -from sqlalchemy.sql import false +from sqlalchemy import sql from sqlalchemy.sql import func -from sqlalchemy.sql import or_ from nova import context as nova_context from nova.db.sqlalchemy import api as db_api @@ -99,11 +98,10 @@ class InstanceMapping(base.NovaTimestampObject, base.NovaObject): @staticmethod @db_api.api_context_manager.reader def _get_by_instance_uuid_from_db(context, instance_uuid): - db_mapping = (context.session.query(api_models.InstanceMapping) - .options(joinedload('cell_mapping')) - .filter( - api_models.InstanceMapping.instance_uuid == - instance_uuid)).first() + db_mapping = context.session.query(api_models.InstanceMapping)\ + .options(orm.joinedload('cell_mapping'))\ + .filter(api_models.InstanceMapping.instance_uuid == instance_uuid)\ + .first() if not db_mapping: raise exception.InstanceMappingNotFound(uuid=instance_uuid) @@ -313,10 +311,9 @@ class InstanceMappingList(base.ObjectListBase, base.NovaObject): @staticmethod @db_api.api_context_manager.reader def _get_by_project_id_from_db(context, project_id): - return (context.session.query(api_models.InstanceMapping) - .options(joinedload('cell_mapping')) - .filter( - api_models.InstanceMapping.project_id == project_id)).all() + return context.session.query(api_models.InstanceMapping)\ + .options(orm.joinedload('cell_mapping'))\ + .filter(api_models.InstanceMapping.project_id == project_id).all() @base.remotable_classmethod def get_by_project_id(cls, context, project_id): @@ -328,9 +325,9 @@ class InstanceMappingList(base.ObjectListBase, base.NovaObject): @staticmethod @db_api.api_context_manager.reader def _get_by_cell_id_from_db(context, cell_id): - return (context.session.query(api_models.InstanceMapping) - .options(joinedload('cell_mapping')) - .filter(api_models.InstanceMapping.cell_id == cell_id)).all() + return context.session.query(api_models.InstanceMapping)\ + .options(orm.joinedload('cell_mapping'))\ + .filter(api_models.InstanceMapping.cell_id == cell_id).all() @base.remotable_classmethod def get_by_cell_id(cls, context, cell_id): @@ -341,10 +338,10 @@ class InstanceMappingList(base.ObjectListBase, base.NovaObject): @staticmethod @db_api.api_context_manager.reader def _get_by_instance_uuids_from_db(context, uuids): - return (context.session.query(api_models.InstanceMapping) - .options(joinedload('cell_mapping')) - .filter(api_models.InstanceMapping.instance_uuid.in_(uuids)) - .all()) + return context.session.query(api_models.InstanceMapping)\ + .options(orm.joinedload('cell_mapping'))\ + .filter(api_models.InstanceMapping.instance_uuid.in_(uuids))\ + .all() @base.remotable_classmethod def get_by_instance_uuids(cls, context, uuids): @@ -376,11 +373,11 @@ class InstanceMappingList(base.ObjectListBase, base.NovaObject): # queued_for_delete was not run) and False (cases when the online # data migration for queued_for_delete was run) are assumed to mean # that the instance is not queued for deletion. - query = (query.filter(or_( - api_models.InstanceMapping.queued_for_delete == false(), + query = (query.filter(sql.or_( + api_models.InstanceMapping.queued_for_delete == sql.false(), api_models.InstanceMapping.queued_for_delete.is_(None))) .join('cell_mapping') - .options(joinedload('cell_mapping')) + .options(orm.joinedload('cell_mapping')) .filter(api_models.CellMapping.uuid == cell_uuid)) if limit is not None: query = query.limit(limit) diff --git a/nova/quota.py b/nova/quota.py index 29a0fc05e806..4c680bd1c153 100644 --- a/nova/quota.py +++ b/nova/quota.py @@ -20,10 +20,7 @@ import copy from oslo_log import log as logging from oslo_utils import importutils -from sqlalchemy.sql import and_ -from sqlalchemy.sql import false -from sqlalchemy.sql import null -from sqlalchemy.sql import or_ +from sqlalchemy import sql import nova.conf from nova import context as nova_context @@ -1077,13 +1074,13 @@ def _user_id_queued_for_delete_populated(context, project_id=None): :returns: True if user_id is set for all non-deleted instances and queued_for_delete is set for all instances, else False """ - user_id_not_populated = and_( - api_models.InstanceMapping.user_id == null(), - api_models.InstanceMapping.queued_for_delete == false()) + user_id_not_populated = sql.and_( + api_models.InstanceMapping.user_id == sql.null(), + api_models.InstanceMapping.queued_for_delete == sql.false()) # If either queued_for_delete or user_id are unmigrated, we will return # False. - unmigrated_filter = or_( - api_models.InstanceMapping.queued_for_delete == null(), + unmigrated_filter = sql.or_( + api_models.InstanceMapping.queued_for_delete == sql.null(), user_id_not_populated) query = context.session.query(api_models.InstanceMapping).filter( unmigrated_filter) diff --git a/nova/tests/functional/db/test_archive.py b/nova/tests/functional/db/test_archive.py index 73f602fadceb..27ff5d5d5aed 100644 --- a/nova/tests/functional/db/test_archive.py +++ b/nova/tests/functional/db/test_archive.py @@ -18,9 +18,8 @@ import re from dateutil import parser as dateutil_parser from oslo_utils import fixture as osloutils_fixture from oslo_utils import timeutils +import sqlalchemy as sa from sqlalchemy import func -from sqlalchemy import MetaData -from sqlalchemy import select from nova import context from nova.db import api as db @@ -179,13 +178,13 @@ class TestDatabaseArchive(integrated_helpers._IntegratedTestBase): def _get_table_counts(self): engine = sqlalchemy_api.get_engine() conn = engine.connect() - meta = MetaData(engine) + meta = sa.MetaData(engine) meta.reflect() shadow_tables = sqlalchemy_api._purgeable_tables(meta) results = {} for table in shadow_tables: r = conn.execute( - select([func.count()]).select_from(table)).fetchone() + sa.select([func.count()]).select_from(table)).fetchone() results[table.name] = r[0] return results diff --git a/nova/tests/unit/db/test_db_api.py b/nova/tests/unit/db/test_db_api.py index c814e46a122a..ccce7106afda 100644 --- a/nova/tests/unit/db/test_db_api.py +++ b/nova/tests/unit/db/test_db_api.py @@ -36,16 +36,12 @@ from oslo_utils import fixture as utils_fixture from oslo_utils.fixture import uuidsentinel from oslo_utils import timeutils from oslo_utils import uuidutils -from sqlalchemy import Column -from sqlalchemy.exc import OperationalError -from sqlalchemy.exc import SQLAlchemyError +import sqlalchemy as sa +from sqlalchemy import exc as sqla_exc from sqlalchemy import inspect -from sqlalchemy import Integer -from sqlalchemy import MetaData from sqlalchemy.orm import query from sqlalchemy.orm import session as sqla_session from sqlalchemy import sql -from sqlalchemy import Table from nova import block_device from nova.compute import rpcapi as compute_rpcapi @@ -173,7 +169,7 @@ class DbTestCase(test.TestCase): class HelperTestCase(test.TestCase): - @mock.patch.object(sqlalchemy_api, 'joinedload') + @mock.patch('sqlalchemy.orm.joinedload') def test_joinedload_helper(self, mock_jl): query = sqlalchemy_api._joinedload_all('foo.bar.baz') @@ -190,7 +186,7 @@ class HelperTestCase(test.TestCase): self.assertEqual(column3.joinedload.return_value, query) - @mock.patch.object(sqlalchemy_api, 'joinedload') + @mock.patch('sqlalchemy.orm.joinedload') def test_joinedload_helper_single(self, mock_jl): query = sqlalchemy_api._joinedload_all('foo') @@ -1757,8 +1753,8 @@ class InstanceTestCase(test.TestCase, ModelsObjectComparatorMixin): instances = db.instance_get_all_by_filters_sort(self.ctxt, filters) self.assertEqual([], instances) - @mock.patch('nova.db.sqlalchemy.api.undefer') - @mock.patch('nova.db.sqlalchemy.api.joinedload') + @mock.patch('sqlalchemy.orm.undefer') + @mock.patch('sqlalchemy.orm.joinedload') def test_instance_get_all_by_filters_extra_columns(self, mock_joinedload, mock_undefer): @@ -1768,8 +1764,8 @@ class InstanceTestCase(test.TestCase, ModelsObjectComparatorMixin): mock_joinedload.assert_called_once_with('info_cache') mock_undefer.assert_called_once_with('extra.pci_requests') - @mock.patch('nova.db.sqlalchemy.api.undefer') - @mock.patch('nova.db.sqlalchemy.api.joinedload') + @mock.patch('sqlalchemy.orm.undefer') + @mock.patch('sqlalchemy.orm.joinedload') def test_instance_get_active_by_window_extra_columns(self, mock_joinedload, mock_undefer): @@ -2942,8 +2938,9 @@ class InstanceExtraTestCase(test.TestCase): self.ctxt, self.instance['uuid'], columns=['numa_topology', 'vcpu_model', 'trusted_certs', 'resources']) - self.assertRaises(SQLAlchemyError, - extra.__getitem__, 'pci_requests') + self.assertRaises( + sqla_exc.SQLAlchemyError, + extra.__getitem__, 'pci_requests') self.assertIn('numa_topology', extra) self.assertIn('vcpu_model', extra) self.assertIn('trusted_certs', extra) @@ -5899,7 +5896,7 @@ class ArchiveTestCase(test.TestCase, ModelsObjectComparatorMixin): def setUp(self): super(ArchiveTestCase, self).setUp() self.engine = get_engine() - self.metadata = MetaData(self.engine) + self.metadata = sa.MetaData(self.engine) self.conn = self.engine.connect() self.instance_id_mappings = models.InstanceIdMapping.__table__ self.shadow_instance_id_mappings = sqlalchemyutils.get_table( @@ -5931,7 +5928,7 @@ class ArchiveTestCase(test.TestCase, ModelsObjectComparatorMixin): except for specificially named exceptions, are empty. This makes sure that archiving isn't moving unexpected content. """ - metadata = MetaData(bind=self.engine) + metadata = sa.MetaData(bind=self.engine) metadata.reflect() for table in metadata.tables: if table.startswith("shadow_") and table not in exceptions: @@ -5943,7 +5940,7 @@ class ArchiveTestCase(test.TestCase, ModelsObjectComparatorMixin): Shadow tables should have an identical schema to the main table. """ - metadata = MetaData(bind=self.engine) + metadata = sa.MetaData(bind=self.engine) metadata.reflect() for table_name in metadata.tables: # some tables don't have shadow tables so skip these @@ -5961,8 +5958,8 @@ class ArchiveTestCase(test.TestCase, ModelsObjectComparatorMixin): shadow_table_name = f'shadow_{table_name}' - table = Table(table_name, metadata, autoload=True) - shadow_table = Table(shadow_table_name, metadata, autoload=True) + table = sa.Table(table_name, metadata, autoload=True) + shadow_table = sa.Table(shadow_table_name, metadata, autoload=True) columns = {c.name: c for c in table.columns} shadow_columns = {c.name: c for c in shadow_table.columns} @@ -6159,7 +6156,7 @@ class ArchiveTestCase(test.TestCase, ModelsObjectComparatorMixin): ins_stmt = main_table.insert().values(uuid=uuidstr) try: self.conn.execute(ins_stmt) - except (db_exc.DBError, OperationalError): + except (db_exc.DBError, sqla_exc.OperationalError): # This table has constraints that require a table-specific # insert, so skip it. return 2 @@ -6640,12 +6637,12 @@ class TestSqlalchemyTypesRepr( super(TestSqlalchemyTypesRepr, self).setUp() self.engine = enginefacade.writer.get_engine() - meta = MetaData(bind=self.engine) - self.table = Table( + meta = sa.MetaData(bind=self.engine) + self.table = sa.Table( 'cidr_tbl', meta, - Column('id', Integer, primary_key=True), - Column('addr', col_types.CIDR()) + sa.Column('id', sa.Integer, primary_key=True), + sa.Column('addr', col_types.CIDR()) ) self.table.create() self.addCleanup(meta.drop_all)