Esempio n. 1
0
class BuildRequest(BASE):
    """Represents the information passed to the scheduler."""

    __tablename__ = 'build_requests'
    __table_args__ = (
        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 = sa.Column(sa.Integer, primary_key=True)
    # TODO(mriedem): instance_uuid should be nullable=False
    instance_uuid = sa.Column(sa.String(36))
    project_id = sa.Column(sa.String(255), nullable=False)
    instance = sa.Column(types.MediumText())
    block_device_mappings = sa.Column(types.MediumText())
    tags = sa.Column(sa.Text())
Esempio n. 2
0
class InstanceFault(BASE, NovaBase, models.SoftDeleteMixin):
    __tablename__ = 'instance_faults'
    __table_args__ = (
        sa.Index('instance_faults_host_idx', 'host'),
        sa.Index('instance_faults_instance_uuid_deleted_created_at_idx',
                 'instance_uuid', 'deleted', 'created_at'))

    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(types.MediumText())
    host = sa.Column(sa.String(255))
Esempio n. 3
0
class RequestSpec(BASE):
    """Represents the information passed to the scheduler."""

    __tablename__ = 'request_specs'
    __table_args__ = (
        sa.Index('request_spec_instance_uuid_idx', 'instance_uuid'),
        schema.UniqueConstraint('instance_uuid',
                                name='uniq_request_specs0instance_uuid'),
    )

    id = sa.Column(sa.Integer, primary_key=True)
    instance_uuid = sa.Column(sa.String(36), nullable=False)
    spec = sa.Column(types.MediumText(), nullable=False)
Esempio n. 4
0
class InstanceInfoCache(BASE, NovaBase, models.SoftDeleteMixin):
    """Represents a cache of information about an instance
    """
    __tablename__ = 'instance_info_caches'
    __table_args__ = (schema.UniqueConstraint(
        "instance_uuid", name="uniq_instance_info_caches0instance_uuid"), )
    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 = sa.Column(types.MediumText())

    instance_uuid = sa.Column(sa.String(36),
                              sa.ForeignKey('instances.uuid'),
                              nullable=False)
    instance = orm.relationship(Instance,
                                backref=orm.backref('info_cache',
                                                    uselist=False),
                                foreign_keys=instance_uuid,
                                primaryjoin=instance_uuid == Instance.uuid)
Esempio n. 5
0
class BlockDeviceMapping(BASE, NovaBase, models.SoftDeleteMixin):
    """Represents block device mapping that is defined by EC2."""
    __tablename__ = "block_device_mapping"
    __table_args__ = (
        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'),
        sa.Index('block_device_mapping_instance_uuid_volume_id_idx',
                 'instance_uuid', 'volume_id'),
        sa.Index('block_device_mapping_instance_uuid_idx', 'instance_uuid'),
        schema.UniqueConstraint('uuid', name='uniq_block_device_mapping0uuid'),
    )
    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)

    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 = sa.Column(sa.String(36))
    instance = orm.relationship(Instance,
                                backref=orm.backref('block_device_mapping'),
                                foreign_keys=instance_uuid,
                                primaryjoin='and_(BlockDeviceMapping.'
                                'instance_uuid=='
                                'Instance.uuid,'
                                'BlockDeviceMapping.deleted=='
                                '0)')

    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 = sa.Column(sa.Integer)

    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 = sa.Column(sa.Boolean, default=False)

    snapshot_id = sa.Column(sa.String(36))

    volume_id = sa.Column(sa.String(36))
    volume_size = sa.Column(sa.Integer)

    volume_type = sa.Column(sa.String(255))

    image_id = sa.Column(sa.String(36))

    # for no device to suppress devices.
    no_device = sa.Column(sa.Boolean)

    connection_info = sa.Column(types.MediumText())

    tag = sa.Column(sa.String(255))

    attachment_id = sa.Column(sa.String(36))
Esempio n. 6
0
class Instance(BASE, NovaBase, models.SoftDeleteMixin):
    """Represents a guest VM."""
    __tablename__ = 'instances'
    __table_args__ = (
        sa.Index('uuid', 'uuid', unique=True),
        sa.Index('instances_project_id_idx', 'project_id'),
        sa.Index('instances_project_id_deleted_idx', 'project_id', 'deleted'),
        sa.Index('instances_reservation_id_idx', 'reservation_id'),
        sa.Index('instances_terminated_at_launched_at_idx', 'terminated_at',
                 'launched_at'),
        sa.Index('instances_uuid_deleted_idx', 'uuid', 'deleted'),
        sa.Index('instances_task_state_updated_at_idx', 'task_state',
                 'updated_at'),
        sa.Index('instances_host_node_deleted_idx', 'host', 'node', 'deleted'),
        sa.Index('instances_host_deleted_cleaned_idx', 'host', 'deleted',
                 'cleaned'),
        sa.Index('instances_deleted_created_at_idx', 'deleted', 'created_at'),
        sa.Index('instances_updated_at_project_id_idx', 'updated_at',
                 'project_id'),
        schema.UniqueConstraint('uuid', name='uniq_instances0uuid'),
    )
    injected_files = []

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)

    @property
    def name(self):
        try:
            base_name = CONF.instance_name_template % self.id
        except TypeError:
            # Support templates like "uuid-%(uuid)s", etc.
            info = {}
            # NOTE(russellb): Don't use self.iteritems() here, as it will
            # result in infinite recursion on the name property.
            for column in iter(orm.object_mapper(self).columns):
                key = column.name
                # prevent recursion if someone specifies %(name)s
                # %(name)s will not be valid.
                if key == 'name':
                    continue
                info[key] = self[key]
            try:
                base_name = CONF.instance_name_template % info
            except KeyError:
                base_name = self.uuid
        return base_name

    @property
    def _extra_keys(self):
        return ['name']

    user_id = sa.Column(sa.String(255))
    project_id = sa.Column(sa.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 = sa.Column(sa.Integer)
    key_name = sa.Column(sa.String(255))
    key_data = sa.Column(types.MediumText())

    power_state = sa.Column(sa.Integer)
    vm_state = sa.Column(sa.String(255))
    task_state = sa.Column(sa.String(255))

    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 = sa.Column(sa.String(255))
    # To identify the "ComputeNode" which the instance resides in.
    # This equals to ComputeNode.hypervisor_hostname.
    node = sa.Column(sa.String(255))

    # *not* flavorid, this is the internal primary_key
    instance_type_id = sa.Column(sa.Integer)

    user_data = sa.Column(types.MediumText())

    reservation_id = sa.Column(sa.String(255))

    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 = sa.Column(sa.String(255))

    # User editable field for display in user-facing UIs
    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 = sa.Column(types.MediumText())

    # locked is superseded by locked_by and locked is not really
    # necessary but still used in API code so it remains.
    locked = sa.Column(sa.Boolean)
    locked_by = sa.Column(sa.Enum('owner', 'admin',
                                  name='instances0locked_by'))

    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 = 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 = sa.Column(types.IPAddress())
    access_ip_v6 = sa.Column(types.IPAddress())

    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 = sa.Column(sa.Boolean(), default=False)

    # EC2 disable_api_termination
    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 = 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 = sa.Column(sa.Integer)

    # Records whether an instance has been deleted from disk
    cleaned = sa.Column(sa.Integer, default=0)

    hidden = sa.Column(sa.Boolean, default=False)
Esempio n. 7
0
class ComputeNode(BASE, NovaBase, models.SoftDeleteMixin):
    """Represents a running compute service on a host."""

    __tablename__ = 'compute_nodes'
    __table_args__ = (
        sa.Index('compute_nodes_uuid_idx', 'uuid', unique=True),
        schema.UniqueConstraint(
            'host',
            'hypervisor_hostname',
            'deleted',
            name="uniq_compute_nodes0host0hypervisor_hostname0deleted"),
    )
    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 = 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(types.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 = 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:
    #
    # '{"arch":"x86_64",
    #   "model":"Nehalem",
    #   "topology":{"sockets":1, "threads":2, "cores":3},
    #   "features":["tdtscp", "xtpr"]}'
    #
    # Points are "json translatable" and it must have all dictionary keys
    # above, since it is copied from <cpu> tag of getCapabilities()
    # (See libvirt.virtConnection).
    cpu_info = sa.Column(types.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 = sa.Column(sa.Text)

    # extra_resources is a json string containing arbitrary
    # data about additional resources.
    extra_resources = sa.Column(sa.Text)

    # json-encode string containing compute node statistics
    stats = sa.Column(sa.Text, default='{}')

    # json-encoded dict that contains NUMA topology as generated by
    # objects.NUMATopology._to_json()
    numa_topology = sa.Column(sa.Text)

    # allocation ratios provided by the RT
    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)
Esempio n. 8
0
def upgrade(migrate_engine):
    meta = sa.MetaData()
    meta.bind = migrate_engine

    cell_mappings = sa.Table(
        'cell_mappings',
        meta,
        sa.Column('created_at', sa.DateTime),
        sa.Column('updated_at', sa.DateTime),
        sa.Column('id', sa.Integer, primary_key=True, nullable=False),
        sa.Column('uuid', sa.String(length=36), nullable=False),
        sa.Column('name', sa.String(length=255)),
        sa.Column('transport_url', sa.Text()),
        sa.Column('database_connection', sa.Text()),
        # NOTE(stephenfin): These were originally added by sqlalchemy-migrate
        # which did not generate the constraints
        sa.Column('disabled',
                  sa.Boolean(create_constraint=False),
                  default=False),
        UniqueConstraint('uuid', name='uniq_cell_mappings0uuid'),
        sa.Index('uuid_idx', 'uuid'),
        mysql_engine='InnoDB',
        mysql_charset='utf8')

    host_mappings = sa.Table('host_mappings',
                             meta,
                             sa.Column('created_at', sa.DateTime),
                             sa.Column('updated_at', sa.DateTime),
                             sa.Column('id',
                                       sa.Integer,
                                       primary_key=True,
                                       nullable=False),
                             sa.Column('cell_id', sa.Integer, nullable=False),
                             sa.Column('host',
                                       sa.String(length=255),
                                       nullable=False),
                             UniqueConstraint('host',
                                              name='uniq_host_mappings0host'),
                             sa.Index('host_idx', 'host'),
                             ForeignKeyConstraint(
                                 columns=['cell_id'],
                                 refcolumns=[cell_mappings.c.id]),
                             mysql_engine='InnoDB',
                             mysql_charset='utf8')

    instance_mappings = sa.Table(
        'instance_mappings',
        meta,
        sa.Column('created_at', sa.DateTime),
        sa.Column('updated_at', sa.DateTime),
        sa.Column('id', sa.Integer, primary_key=True, nullable=False),
        sa.Column('instance_uuid', sa.String(length=36), nullable=False),
        sa.Column('cell_id', sa.Integer, nullable=True),
        sa.Column('project_id', sa.String(length=255), nullable=False),
        # NOTE(stephenfin): These were originally added by sqlalchemy-migrate
        # which did not generate the constraints
        sa.Column('queued_for_delete',
                  sa.Boolean(create_constraint=False),
                  default=False),
        sa.Column('user_id', sa.String(length=255), nullable=True),
        UniqueConstraint('instance_uuid',
                         name='uniq_instance_mappings0instance_uuid'),
        sa.Index('instance_uuid_idx', 'instance_uuid'),
        sa.Index('project_id_idx', 'project_id'),
        sa.Index('instance_mappings_user_id_project_id_idx', 'user_id',
                 'project_id'),
        ForeignKeyConstraint(columns=['cell_id'],
                             refcolumns=[cell_mappings.c.id]),
        mysql_engine='InnoDB',
        mysql_charset='utf8')

    flavors = sa.Table('flavors',
                       meta,
                       sa.Column('created_at', sa.DateTime),
                       sa.Column('updated_at', sa.DateTime),
                       sa.Column('name', sa.String(length=255),
                                 nullable=False),
                       sa.Column('id',
                                 sa.Integer,
                                 primary_key=True,
                                 nullable=False),
                       sa.Column('memory_mb', sa.Integer, nullable=False),
                       sa.Column('vcpus', sa.Integer, nullable=False),
                       sa.Column('swap', sa.Integer, nullable=False),
                       sa.Column('vcpu_weight', sa.Integer),
                       sa.Column('flavorid',
                                 sa.String(length=255),
                                 nullable=False),
                       sa.Column('rxtx_factor', sa.Float),
                       sa.Column('root_gb', sa.Integer),
                       sa.Column('ephemeral_gb', sa.Integer),
                       sa.Column('disabled', sa.Boolean),
                       sa.Column('is_public', sa.Boolean),
                       sa.Column('description', sa.Text()),
                       UniqueConstraint('flavorid',
                                        name='uniq_flavors0flavorid'),
                       UniqueConstraint('name', name='uniq_flavors0name'),
                       mysql_engine='InnoDB',
                       mysql_charset='utf8')

    flavor_extra_specs = sa.Table(
        'flavor_extra_specs',
        meta,
        sa.Column('created_at', sa.DateTime),
        sa.Column('updated_at', sa.DateTime),
        sa.Column('id', sa.Integer, primary_key=True, nullable=False),
        sa.Column('flavor_id', sa.Integer, nullable=False),
        sa.Column('key', sa.String(length=255), nullable=False),
        sa.Column('value', sa.String(length=255)),
        UniqueConstraint('flavor_id',
                         'key',
                         name='uniq_flavor_extra_specs0flavor_id0key'),
        sa.Index('flavor_extra_specs_flavor_id_key_idx', 'flavor_id', 'key'),
        ForeignKeyConstraint(columns=['flavor_id'], refcolumns=[flavors.c.id]),
        mysql_engine='InnoDB',
        mysql_charset='utf8')

    flavor_projects = sa.Table(
        'flavor_projects',
        meta,
        sa.Column('created_at', sa.DateTime),
        sa.Column('updated_at', sa.DateTime),
        sa.Column('id', sa.Integer, primary_key=True, nullable=False),
        sa.Column('flavor_id', sa.Integer, nullable=False),
        sa.Column('project_id', sa.String(length=255), nullable=False),
        UniqueConstraint('flavor_id',
                         'project_id',
                         name='uniq_flavor_projects0flavor_id0project_id'),
        ForeignKeyConstraint(columns=['flavor_id'], refcolumns=[flavors.c.id]),
        mysql_engine='InnoDB',
        mysql_charset='utf8')

    request_specs = sa.Table(
        'request_specs',
        meta,
        sa.Column('created_at', sa.DateTime),
        sa.Column('updated_at', sa.DateTime),
        sa.Column('id', sa.Integer, primary_key=True, nullable=False),
        sa.Column('instance_uuid', sa.String(36), nullable=False),
        sa.Column('spec', types.MediumText(), nullable=False),
        UniqueConstraint('instance_uuid',
                         name='uniq_request_specs0instance_uuid'),
        sa.Index('request_spec_instance_uuid_idx', 'instance_uuid'),
        mysql_engine='InnoDB',
        mysql_charset='utf8')

    build_requests = sa.Table(
        'build_requests',
        meta,
        sa.Column('created_at', sa.DateTime),
        sa.Column('updated_at', sa.DateTime),
        sa.Column('id', sa.Integer, primary_key=True, nullable=False),
        sa.Column('request_spec_id', sa.Integer, nullable=True),
        sa.Column('project_id', sa.String(length=255), nullable=False),
        sa.Column('user_id', sa.String(length=255), nullable=True),
        sa.Column('display_name', sa.String(length=255)),
        sa.Column('instance_metadata', sa.Text),
        sa.Column('progress', sa.Integer),
        sa.Column('vm_state', sa.String(length=255)),
        sa.Column('task_state', sa.String(length=255)),
        sa.Column('image_ref', sa.String(length=255)),
        sa.Column('access_ip_v4', InetSmall()),
        sa.Column('access_ip_v6', InetSmall()),
        sa.Column('info_cache', sa.Text),
        sa.Column('security_groups', sa.Text, nullable=True),
        sa.Column('config_drive', sa.Boolean, default=False, nullable=True),
        sa.Column('key_name', sa.String(length=255)),
        sa.Column('locked_by',
                  sa.Enum('owner', 'admin', name='build_requests0locked_by')),
        sa.Column('instance_uuid', sa.String(length=36)),
        sa.Column('instance', types.MediumText()),
        sa.Column('block_device_mappings', types.MediumText()),
        sa.Column('tags', sa.Text()),
        UniqueConstraint('instance_uuid',
                         name='uniq_build_requests0instance_uuid'),
        sa.Index('build_requests_project_id_idx', 'project_id'),
        sa.Index('build_requests_instance_uuid_idx', 'instance_uuid'),
        mysql_engine='InnoDB',
        mysql_charset='utf8')

    keypairs = sa.Table('key_pairs',
                        meta,
                        sa.Column('created_at', sa.DateTime),
                        sa.Column('updated_at', sa.DateTime),
                        sa.Column('id',
                                  sa.Integer,
                                  primary_key=True,
                                  nullable=False),
                        sa.Column('name', sa.String(255), nullable=False),
                        sa.Column('user_id', sa.String(255), nullable=False),
                        sa.Column('fingerprint', sa.String(255)),
                        sa.Column('public_key', sa.Text()),
                        sa.Column('type',
                                  sa.Enum('ssh',
                                          'x509',
                                          metadata=meta,
                                          name='keypair_types'),
                                  nullable=False,
                                  server_default=keypair.KEYPAIR_TYPE_SSH),
                        UniqueConstraint('user_id',
                                         'name',
                                         name='uniq_key_pairs0user_id0name'),
                        mysql_engine='InnoDB',
                        mysql_charset='utf8')

    projects = sa.Table(
        'projects',
        meta,
        sa.Column('id',
                  sa.Integer,
                  primary_key=True,
                  nullable=False,
                  autoincrement=True),
        sa.Column('external_id', sa.String(length=255), nullable=False),
        sa.Column('created_at', sa.DateTime),
        sa.Column('updated_at', sa.DateTime),
        UniqueConstraint('external_id', name='uniq_projects0external_id'),
        mysql_engine='InnoDB',
        mysql_charset='latin1',
    )

    users = sa.Table(
        'users',
        meta,
        sa.Column('id',
                  sa.Integer,
                  primary_key=True,
                  nullable=False,
                  autoincrement=True),
        sa.Column('external_id', sa.String(length=255), nullable=False),
        sa.Column('created_at', sa.DateTime),
        sa.Column('updated_at', sa.DateTime),
        UniqueConstraint('external_id', name='uniq_users0external_id'),
        mysql_engine='InnoDB',
        mysql_charset='latin1',
    )

    resource_classes = sa.Table('resource_classes',
                                meta,
                                sa.Column('id',
                                          sa.Integer,
                                          primary_key=True,
                                          nullable=False),
                                sa.Column('name',
                                          sa.String(length=255),
                                          nullable=False),
                                sa.Column('created_at', sa.DateTime),
                                sa.Column('updated_at', sa.DateTime),
                                UniqueConstraint(
                                    'name', name='uniq_resource_classes0name'),
                                mysql_engine='InnoDB',
                                mysql_charset='latin1')

    nameargs = {}
    if migrate_engine.name == 'mysql':
        nameargs['collation'] = 'utf8_bin'

    resource_providers = sa.Table(
        'resource_providers',
        meta,
        sa.Column('created_at', sa.DateTime),
        sa.Column('updated_at', sa.DateTime),
        sa.Column('id', sa.Integer, primary_key=True, nullable=False),
        sa.Column('uuid', sa.String(36), nullable=False),
        sa.Column('name', sa.Unicode(200, **nameargs), nullable=True),
        sa.Column('generation', sa.Integer, default=0),
        sa.Column('can_host', sa.Integer, default=0),
        sa.Column('root_provider_id', sa.Integer,
                  sa.ForeignKey('resource_providers.id')),
        sa.Column('parent_provider_id', sa.Integer,
                  sa.ForeignKey('resource_providers.id')),
        UniqueConstraint('uuid', name='uniq_resource_providers0uuid'),
        UniqueConstraint('name', name='uniq_resource_providers0name'),
        sa.Index('resource_providers_name_idx', 'name'),
        sa.Index('resource_providers_uuid_idx', 'uuid'),
        sa.Index('resource_providers_root_provider_id_idx',
                 'root_provider_id'),
        sa.Index('resource_providers_parent_provider_id_idx',
                 'parent_provider_id'),
        mysql_engine='InnoDB',
        mysql_charset='latin1')

    inventories = sa.Table(
        'inventories',
        meta,
        sa.Column('created_at', sa.DateTime),
        sa.Column('updated_at', sa.DateTime),
        sa.Column('id', sa.Integer, primary_key=True, nullable=False),
        sa.Column('resource_provider_id', sa.Integer, nullable=False),
        sa.Column('resource_class_id', sa.Integer, nullable=False),
        sa.Column('total', sa.Integer, nullable=False),
        sa.Column('reserved', sa.Integer, nullable=False),
        sa.Column('min_unit', sa.Integer, nullable=False),
        sa.Column('max_unit', sa.Integer, nullable=False),
        sa.Column('step_size', sa.Integer, nullable=False),
        sa.Column('allocation_ratio', sa.Float, nullable=False),
        sa.Index('inventories_resource_provider_id_idx',
                 'resource_provider_id'),
        sa.Index('inventories_resource_provider_resource_class_idx',
                 'resource_provider_id', 'resource_class_id'),
        sa.Index('inventories_resource_class_id_idx', 'resource_class_id'),
        UniqueConstraint(
            'resource_provider_id',
            'resource_class_id',
            name='uniq_inventories0resource_provider_resource_class'),
        mysql_engine='InnoDB',
        mysql_charset='latin1')

    traits = sa.Table(
        'traits',
        meta,
        sa.Column('created_at', sa.DateTime),
        sa.Column('updated_at', sa.DateTime),
        sa.Column('id',
                  sa.Integer,
                  primary_key=True,
                  nullable=False,
                  autoincrement=True),
        sa.Column('name', sa.Unicode(255, **nameargs), nullable=False),
        UniqueConstraint('name', name='uniq_traits0name'),
        mysql_engine='InnoDB',
        mysql_charset='latin1',
    )

    allocations = sa.Table(
        'allocations',
        meta,
        sa.Column('created_at', sa.DateTime),
        sa.Column('updated_at', sa.DateTime),
        sa.Column('id', sa.Integer, primary_key=True, nullable=False),
        sa.Column('resource_provider_id', sa.Integer, nullable=False),
        sa.Column('consumer_id', sa.String(36), nullable=False),
        sa.Column('resource_class_id', sa.Integer, nullable=False),
        sa.Column('used', sa.Integer, nullable=False),
        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'),
        mysql_engine='InnoDB',
        mysql_charset='latin1')

    consumers = sa.Table(
        'consumers',
        meta,
        sa.Column('created_at', sa.DateTime),
        sa.Column('updated_at', sa.DateTime),
        sa.Column('id',
                  sa.Integer,
                  primary_key=True,
                  nullable=False,
                  autoincrement=True),
        sa.Column('uuid', sa.String(length=36), nullable=False),
        sa.Column('project_id', sa.Integer, nullable=False),
        sa.Column('user_id', sa.Integer, nullable=False),
        sa.Column('generation',
                  sa.Integer,
                  default=0,
                  server_default=sa.text('0'),
                  nullable=False),
        sa.Index('consumers_project_id_uuid_idx', 'project_id', 'uuid'),
        sa.Index('consumers_project_id_user_id_uuid_idx', 'project_id',
                 'user_id', 'uuid'),
        UniqueConstraint('uuid', name='uniq_consumers0uuid'),
        mysql_engine='InnoDB',
        mysql_charset='latin1',
    )

    resource_provider_aggregates = sa.Table(
        'resource_provider_aggregates',
        meta,
        sa.Column('created_at', sa.DateTime),
        sa.Column('updated_at', sa.DateTime),
        sa.Column('resource_provider_id',
                  sa.Integer,
                  primary_key=True,
                  nullable=False),
        sa.Column('aggregate_id', sa.Integer, primary_key=True,
                  nullable=False),
        sa.Index('resource_provider_aggregates_aggregate_id_idx',
                 'aggregate_id'),
        mysql_engine='InnoDB',
        mysql_charset='latin1')

    resource_provider_traits = sa.Table(
        'resource_provider_traits',
        meta,
        sa.Column('created_at', sa.DateTime),
        sa.Column('updated_at', sa.DateTime),
        sa.Column('trait_id',
                  sa.Integer,
                  sa.ForeignKey('traits.id'),
                  primary_key=True,
                  nullable=False),
        sa.Column('resource_provider_id',
                  sa.Integer,
                  primary_key=True,
                  nullable=False),
        sa.Index('resource_provider_traits_resource_provider_trait_idx',
                 'resource_provider_id', 'trait_id'),
        ForeignKeyConstraint(columns=['resource_provider_id'],
                             refcolumns=[resource_providers.c.id]),
        mysql_engine='InnoDB',
        mysql_charset='latin1',
    )

    placement_aggregates = sa.Table('placement_aggregates',
                                    meta,
                                    sa.Column('created_at', sa.DateTime),
                                    sa.Column('updated_at', sa.DateTime),
                                    sa.Column('id',
                                              sa.Integer,
                                              primary_key=True,
                                              nullable=False),
                                    sa.Column('uuid',
                                              sa.String(length=36),
                                              index=True),
                                    UniqueConstraint(
                                        'uuid',
                                        name='uniq_placement_aggregates0uuid'),
                                    mysql_engine='InnoDB',
                                    mysql_charset='latin1')

    aggregates = sa.Table('aggregates',
                          meta,
                          sa.Column('created_at', sa.DateTime),
                          sa.Column('updated_at', sa.DateTime),
                          sa.Column('id',
                                    sa.Integer,
                                    primary_key=True,
                                    nullable=False),
                          sa.Column('uuid', sa.String(length=36)),
                          sa.Column('name', sa.String(length=255)),
                          sa.Index('aggregate_uuid_idx', 'uuid'),
                          UniqueConstraint('name', name='uniq_aggregate0name'),
                          mysql_engine='InnoDB',
                          mysql_charset='utf8')

    aggregate_hosts = sa.Table(
        'aggregate_hosts',
        meta,
        sa.Column('created_at', sa.DateTime),
        sa.Column('updated_at', sa.DateTime),
        sa.Column('id', sa.Integer, primary_key=True, nullable=False),
        sa.Column('host', sa.String(length=255)),
        sa.Column('aggregate_id',
                  sa.Integer,
                  sa.ForeignKey('aggregates.id'),
                  nullable=False),
        UniqueConstraint('host',
                         'aggregate_id',
                         name='uniq_aggregate_hosts0host0aggregate_id'),
        mysql_engine='InnoDB',
        mysql_charset='utf8')

    aggregate_metadata = sa.Table(
        'aggregate_metadata',
        meta,
        sa.Column('created_at', sa.DateTime),
        sa.Column('updated_at', sa.DateTime),
        sa.Column('id', sa.Integer, primary_key=True, nullable=False),
        sa.Column('aggregate_id',
                  sa.Integer,
                  sa.ForeignKey('aggregates.id'),
                  nullable=False),
        sa.Column('key', sa.String(length=255), nullable=False),
        sa.Column('value', sa.String(length=255), nullable=False),
        UniqueConstraint('aggregate_id',
                         'key',
                         name='uniq_aggregate_metadata0aggregate_id0key'),
        sa.Index('aggregate_metadata_key_idx', 'key'),
        mysql_engine='InnoDB',
        mysql_charset='utf8')

    groups = sa.Table(
        'instance_groups',
        meta,
        sa.Column('created_at', sa.DateTime),
        sa.Column('updated_at', sa.DateTime),
        sa.Column('id', sa.Integer, primary_key=True, nullable=False),
        sa.Column('user_id', sa.String(length=255)),
        sa.Column('project_id', sa.String(length=255)),
        sa.Column('uuid', sa.String(length=36), nullable=False),
        sa.Column('name', sa.String(length=255)),
        UniqueConstraint('uuid', name='uniq_instance_groups0uuid'),
        mysql_engine='InnoDB',
        mysql_charset='utf8',
    )

    group_policy = sa.Table(
        'instance_group_policy',
        meta,
        sa.Column('created_at', sa.DateTime),
        sa.Column('updated_at', sa.DateTime),
        sa.Column('id', sa.Integer, primary_key=True, nullable=False),
        sa.Column('policy', sa.String(length=255)),
        sa.Column('group_id',
                  sa.Integer,
                  sa.ForeignKey('instance_groups.id'),
                  nullable=False),
        sa.Column('rules', sa.Text),
        sa.Index('instance_group_policy_policy_idx', 'policy'),
        mysql_engine='InnoDB',
        mysql_charset='utf8',
    )

    group_member = sa.Table(
        'instance_group_member',
        meta,
        sa.Column('created_at', sa.DateTime),
        sa.Column('updated_at', sa.DateTime),
        sa.Column('id', sa.Integer, primary_key=True, nullable=False),
        sa.Column('instance_uuid', sa.String(length=255)),
        sa.Column('group_id',
                  sa.Integer,
                  sa.ForeignKey('instance_groups.id'),
                  nullable=False),
        sa.Index('instance_group_member_instance_idx', 'instance_uuid'),
        mysql_engine='InnoDB',
        mysql_charset='utf8',
    )

    quota_classes = sa.Table(
        'quota_classes',
        meta,
        sa.Column('created_at', sa.DateTime),
        sa.Column('updated_at', sa.DateTime),
        sa.Column('id', sa.Integer, primary_key=True, nullable=False),
        sa.Column('class_name', sa.String(length=255)),
        sa.Column('resource', sa.String(length=255)),
        sa.Column('hard_limit', sa.Integer),
        sa.Index('quota_classes_class_name_idx', 'class_name'),
        mysql_engine='InnoDB',
        mysql_charset='utf8',
    )

    quota_usages = sa.Table(
        'quota_usages',
        meta,
        sa.Column('created_at', sa.DateTime),
        sa.Column('updated_at', sa.DateTime),
        sa.Column('id', sa.Integer, primary_key=True, nullable=False),
        sa.Column('project_id', sa.String(length=255)),
        sa.Column('resource', sa.String(length=255), nullable=False),
        sa.Column('in_use', sa.Integer, nullable=False),
        sa.Column('reserved', sa.Integer, nullable=False),
        sa.Column('until_refresh', sa.Integer),
        sa.Column('user_id', sa.String(length=255)),
        sa.Index('quota_usages_project_id_idx', 'project_id'),
        sa.Index('quota_usages_user_id_idx', 'user_id'),
        mysql_engine='InnoDB',
        mysql_charset='utf8',
    )

    quotas = sa.Table(
        'quotas',
        meta,
        sa.Column('id', sa.Integer, primary_key=True, nullable=False),
        sa.Column('created_at', sa.DateTime),
        sa.Column('updated_at', sa.DateTime),
        sa.Column('project_id', sa.String(length=255)),
        sa.Column('resource', sa.String(length=255), nullable=False),
        sa.Column('hard_limit', sa.Integer),
        UniqueConstraint('project_id',
                         'resource',
                         name='uniq_quotas0project_id0resource'),
        mysql_engine='InnoDB',
        mysql_charset='utf8',
    )

    project_user_quotas = sa.Table(
        'project_user_quotas',
        meta,
        sa.Column('id', sa.Integer, primary_key=True, nullable=False),
        sa.Column('created_at', sa.DateTime),
        sa.Column('updated_at', sa.DateTime),
        sa.Column('user_id', sa.String(length=255), nullable=False),
        sa.Column('project_id', sa.String(length=255), nullable=False),
        sa.Column('resource', sa.String(length=255), nullable=False),
        sa.Column('hard_limit', sa.Integer, nullable=True),
        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'),
        mysql_engine='InnoDB',
        mysql_charset='utf8',
    )

    reservations = sa.Table(
        'reservations',
        meta,
        sa.Column('created_at', sa.DateTime),
        sa.Column('updated_at', sa.DateTime),
        sa.Column('id', sa.Integer, primary_key=True, nullable=False),
        sa.Column('uuid', sa.String(length=36), nullable=False),
        sa.Column('usage_id',
                  sa.Integer,
                  sa.ForeignKey('quota_usages.id'),
                  nullable=False),
        sa.Column('project_id', sa.String(length=255)),
        sa.Column('resource', sa.String(length=255)),
        sa.Column('delta', sa.Integer, nullable=False),
        sa.Column('expire', sa.DateTime),
        sa.Column('user_id', sa.String(length=255)),
        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'),
        mysql_engine='InnoDB',
        mysql_charset='utf8',
    )

    tables = [
        cell_mappings,
        host_mappings,
        instance_mappings,
        flavors,
        flavor_extra_specs,
        flavor_projects,
        request_specs,
        build_requests,
        keypairs,
        projects,
        users,
        resource_classes,
        resource_providers,
        inventories,
        traits,
        allocations,
        consumers,
        resource_provider_aggregates,
        resource_provider_traits,
        placement_aggregates,
        aggregates,
        aggregate_hosts,
        aggregate_metadata,
        groups,
        group_policy,
        group_member,
        quota_classes,
        quota_usages,
        quotas,
        project_user_quotas,
        reservations,
    ]
    for table in tables:
        table.create(checkfirst=True)