2015-02-19 10:46:02 -05:00
|
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
|
|
# not use this file except in compliance with the License. You may obtain
|
|
|
|
# a copy of the License at
|
|
|
|
#
|
|
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
#
|
|
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
|
|
# License for the specific language governing permissions and limitations
|
|
|
|
# under the License.
|
|
|
|
|
|
|
|
|
|
|
|
from oslo_db.sqlalchemy import models
|
2015-07-14 16:48:40 +02:00
|
|
|
from sqlalchemy import Boolean
|
2015-02-19 10:46:02 -05:00
|
|
|
from sqlalchemy import Column
|
2015-12-17 15:05:57 -05:00
|
|
|
from sqlalchemy import Enum
|
2015-02-19 10:46:02 -05:00
|
|
|
from sqlalchemy.ext.declarative import declarative_base
|
2015-07-14 16:48:40 +02:00
|
|
|
from sqlalchemy import Float
|
2015-02-23 11:51:35 -05:00
|
|
|
from sqlalchemy import ForeignKey
|
2015-02-19 10:46:02 -05:00
|
|
|
from sqlalchemy import Index
|
|
|
|
from sqlalchemy import Integer
|
2015-12-17 15:05:57 -05:00
|
|
|
from sqlalchemy import orm
|
2016-03-18 18:03:59 -04:00
|
|
|
from sqlalchemy.orm import backref
|
2015-02-19 10:46:02 -05:00
|
|
|
from sqlalchemy import schema
|
|
|
|
from sqlalchemy import String
|
|
|
|
from sqlalchemy import Text
|
2016-05-12 09:25:16 -07:00
|
|
|
from sqlalchemy import Unicode
|
2015-02-19 10:46:02 -05:00
|
|
|
|
|
|
|
|
|
|
|
class _NovaAPIBase(models.ModelBase, models.TimestampMixin):
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
API_BASE = declarative_base(cls=_NovaAPIBase)
|
|
|
|
|
|
|
|
|
2016-03-01 13:38:19 -06:00
|
|
|
class AggregateHost(API_BASE):
|
|
|
|
"""Represents a host that is member of an aggregate."""
|
|
|
|
__tablename__ = 'aggregate_hosts'
|
|
|
|
__table_args__ = (schema.UniqueConstraint(
|
|
|
|
"host", "aggregate_id",
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
|
|
|
class AggregateMetadata(API_BASE):
|
|
|
|
"""Represents a metadata key/value pair for an aggregate."""
|
|
|
|
__tablename__ = 'aggregate_metadata'
|
|
|
|
__table_args__ = (
|
|
|
|
schema.UniqueConstraint("aggregate_id", "key",
|
|
|
|
name="uniq_aggregate_metadata0aggregate_id0key"
|
|
|
|
),
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
|
|
|
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')
|
|
|
|
_metadata = orm.relationship(AggregateMetadata,
|
|
|
|
primaryjoin='Aggregate.id == AggregateMetadata.aggregate_id')
|
|
|
|
|
|
|
|
@property
|
|
|
|
def _extra_keys(self):
|
|
|
|
return ['hosts', 'metadetails', 'availability_zone']
|
|
|
|
|
|
|
|
@property
|
|
|
|
def hosts(self):
|
|
|
|
return [h.host for h in self._hosts]
|
|
|
|
|
|
|
|
@property
|
|
|
|
def metadetails(self):
|
|
|
|
return {m.key: m.value for m in self._metadata}
|
|
|
|
|
|
|
|
@property
|
|
|
|
def availability_zone(self):
|
|
|
|
if 'availability_zone' not in self.metadetails:
|
|
|
|
return None
|
|
|
|
return self.metadetails['availability_zone']
|
|
|
|
|
|
|
|
|
2015-02-19 10:46:02 -05:00
|
|
|
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'))
|
|
|
|
|
|
|
|
id = Column(Integer, primary_key=True)
|
|
|
|
uuid = Column(String(36), nullable=False)
|
|
|
|
name = Column(String(255))
|
|
|
|
transport_url = Column(Text())
|
|
|
|
database_connection = Column(Text())
|
2016-03-18 18:03:59 -04:00
|
|
|
host_mapping = orm.relationship('HostMapping',
|
|
|
|
backref=backref('cell_mapping', uselist=False),
|
|
|
|
foreign_keys=id,
|
|
|
|
primaryjoin=(
|
|
|
|
'CellMapping.id == HostMapping.cell_id'))
|
2015-02-23 11:51:35 -05:00
|
|
|
|
|
|
|
|
|
|
|
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'))
|
|
|
|
|
|
|
|
id = Column(Integer, primary_key=True)
|
|
|
|
instance_uuid = Column(String(36), nullable=False)
|
|
|
|
cell_id = Column(Integer, ForeignKey('cell_mappings.id'),
|
2016-02-10 15:07:55 -05:00
|
|
|
nullable=True)
|
2015-02-23 11:51:35 -05:00
|
|
|
project_id = Column(String(255), nullable=False)
|
2016-02-29 14:39:20 -05:00
|
|
|
cell_mapping = orm.relationship('CellMapping',
|
|
|
|
backref=backref('instance_mapping', uselist=False),
|
|
|
|
foreign_keys=cell_id,
|
|
|
|
primaryjoin=('InstanceMapping.cell_id == CellMapping.id'))
|
2015-06-12 11:00:37 +00:00
|
|
|
|
|
|
|
|
|
|
|
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'))
|
|
|
|
|
|
|
|
id = Column(Integer, primary_key=True)
|
|
|
|
cell_id = Column(Integer, ForeignKey('cell_mappings.id'),
|
|
|
|
nullable=False)
|
|
|
|
host = Column(String(255), nullable=False)
|
2015-08-12 15:30:12 -04:00
|
|
|
|
|
|
|
|
|
|
|
class RequestSpec(API_BASE):
|
|
|
|
"""Represents the information passed to the scheduler."""
|
|
|
|
|
|
|
|
__tablename__ = 'request_specs'
|
|
|
|
__table_args__ = (
|
|
|
|
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(Text, nullable=False)
|
2015-07-14 16:48:40 +02:00
|
|
|
|
|
|
|
|
|
|
|
class Flavors(API_BASE):
|
|
|
|
"""Represents possible flavors for instances"""
|
|
|
|
__tablename__ = 'flavors'
|
|
|
|
__table_args__ = (
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
|
|
|
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'),
|
|
|
|
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)
|
2016-03-17 09:49:39 -07:00
|
|
|
flavor = orm.relationship(Flavors, backref='extra_specs',
|
|
|
|
foreign_keys=flavor_id,
|
|
|
|
primaryjoin=(
|
|
|
|
'FlavorExtraSpecs.flavor_id == Flavors.id'))
|
2015-07-14 16:48:40 +02:00
|
|
|
|
|
|
|
|
|
|
|
class FlavorProjects(API_BASE):
|
|
|
|
"""Represents projects associated with flavors"""
|
|
|
|
__tablename__ = 'flavor_projects'
|
|
|
|
__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)
|
2016-03-17 09:49:39 -07:00
|
|
|
flavor = orm.relationship(Flavors, backref='projects',
|
|
|
|
foreign_keys=flavor_id,
|
|
|
|
primaryjoin=(
|
|
|
|
'FlavorProjects.flavor_id == Flavors.id'))
|
2015-12-17 15:05:57 -05:00
|
|
|
|
|
|
|
|
|
|
|
class BuildRequest(API_BASE):
|
|
|
|
"""Represents the information passed to the scheduler."""
|
|
|
|
|
|
|
|
__tablename__ = 'build_requests'
|
|
|
|
__table_args__ = (
|
2016-04-14 14:21:40 -04:00
|
|
|
Index('build_requests_instance_uuid_idx', 'instance_uuid'),
|
2015-12-17 15:05:57 -05:00
|
|
|
Index('build_requests_project_id_idx', 'project_id'),
|
2016-04-14 14:21:40 -04:00
|
|
|
schema.UniqueConstraint('instance_uuid',
|
|
|
|
name='uniq_build_requests0instance_uuid'),
|
2015-12-17 15:05:57 -05:00
|
|
|
)
|
|
|
|
|
|
|
|
id = Column(Integer, primary_key=True)
|
2016-04-14 14:21:40 -04:00
|
|
|
instance_uuid = Column(String(36))
|
2015-12-17 15:05:57 -05:00
|
|
|
project_id = Column(String(255), nullable=False)
|
2016-04-14 14:21:40 -04:00
|
|
|
instance = Column(Text)
|
2016-04-14 11:37:02 -04:00
|
|
|
# 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',
|
|
|
|
# 'image_ref', 'access_ip_v4', 'access_ip_v6', 'info_cache',
|
|
|
|
# 'security_groups', 'config_drive', 'key_name', 'locked_by',
|
|
|
|
# 'reservation_id', 'launch_index', 'hostname', 'kernel_id',
|
|
|
|
# 'ramdisk_id', 'root_device_name', 'user_data']
|
2016-05-04 14:18:10 -07:00
|
|
|
|
|
|
|
|
|
|
|
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"),
|
|
|
|
)
|
|
|
|
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')
|
2016-05-12 09:25:16 -07:00
|
|
|
|
|
|
|
|
|
|
|
class ResourceProvider(API_BASE):
|
|
|
|
"""Represents a mapping to a providers of resources."""
|
|
|
|
|
|
|
|
__tablename__ = "resource_providers"
|
|
|
|
__table_args__ = (
|
|
|
|
Index('resource_providers_uuid_idx', 'uuid'),
|
|
|
|
schema.UniqueConstraint('uuid',
|
|
|
|
name='uniq_resource_providers0uuid'),
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
|
|
|
class Inventory(API_BASE):
|
|
|
|
"""Represents a quantity of available resource."""
|
|
|
|
|
|
|
|
__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')
|
|
|
|
)
|
|
|
|
|
|
|
|
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)
|
|
|
|
resource_provider = orm.relationship(
|
|
|
|
"ResourceProvider",
|
2016-05-13 13:51:57 +03:00
|
|
|
primaryjoin=('Inventory.resource_provider_id == '
|
|
|
|
'ResourceProvider.id'),
|
2016-05-12 09:25:16 -07:00
|
|
|
foreign_keys=resource_provider_id)
|
|
|
|
|
|
|
|
|
|
|
|
class Allocation(API_BASE):
|
|
|
|
"""A use of inventory."""
|
|
|
|
|
|
|
|
__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')
|
|
|
|
)
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
|
|
|
class ResourceProviderAggregate(API_BASE):
|
|
|
|
"""Assocate a resource provider with an aggregate."""
|
|
|
|
|
|
|
|
__tablename__ = 'resource_provider_aggregates'
|
|
|
|
__table_args__ = (
|
|
|
|
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)
|