diff --git a/nova/db/sqlalchemy/api_migrations/migrate_repo/versions/018_instance_groups.py b/nova/db/sqlalchemy/api_migrations/migrate_repo/versions/018_instance_groups.py new file mode 100644 index 000000000..08d952fb1 --- /dev/null +++ b/nova/db/sqlalchemy/api_migrations/migrate_repo/versions/018_instance_groups.py @@ -0,0 +1,71 @@ +# 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. +"""API Database migrations for instance_groups""" + +from migrate import UniqueConstraint +from sqlalchemy import Column +from sqlalchemy import DateTime +from sqlalchemy import ForeignKey +from sqlalchemy import Index +from sqlalchemy import Integer +from sqlalchemy import MetaData +from sqlalchemy import String +from sqlalchemy import Table + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + groups = Table('instance_groups', meta, + Column('created_at', DateTime), + Column('updated_at', DateTime), + Column('id', Integer, primary_key=True, nullable=False), + Column('user_id', String(length=255)), + Column('project_id', String(length=255)), + Column('uuid', String(length=36), nullable=False), + Column('name', String(length=255)), + UniqueConstraint('uuid', + name='uniq_instance_groups0uuid'), + mysql_engine='InnoDB', + mysql_charset='utf8', + ) + + groups.create(checkfirst=True) + + group_policy = Table('instance_group_policy', meta, + Column('created_at', DateTime), + Column('updated_at', DateTime), + Column('id', Integer, primary_key=True, nullable=False), + Column('policy', String(length=255)), + Column('group_id', Integer, ForeignKey('instance_groups.id'), + nullable=False), + Index('instance_group_policy_policy_idx', 'policy'), + mysql_engine='InnoDB', + mysql_charset='utf8', + ) + + group_policy.create(checkfirst=True) + + group_member = Table('instance_group_member', meta, + Column('created_at', DateTime), + Column('updated_at', DateTime), + Column('id', Integer, primary_key=True, nullable=False), + Column('instance_uuid', String(length=255)), + Column('group_id', Integer, ForeignKey('instance_groups.id'), + nullable=False), + Index('instance_group_member_instance_idx', 'instance_uuid'), + mysql_engine='InnoDB', + mysql_charset='utf8', + ) + + group_member.create(checkfirst=True) diff --git a/nova/db/sqlalchemy/api_models.py b/nova/db/sqlalchemy/api_models.py index 953499394..af517d220 100644 --- a/nova/db/sqlalchemy/api_models.py +++ b/nova/db/sqlalchemy/api_models.py @@ -344,3 +344,58 @@ class ResourceProviderAggregate(API_BASE): resource_provider_id = Column(Integer, primary_key=True, nullable=False) aggregate_id = Column(Integer, primary_key=True, nullable=False) + + +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'), + ) + id = Column(Integer, primary_key=True, nullable=False) + instance_uuid = Column(String(255)) + group_id = Column(Integer, 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'), + ) + id = Column(Integer, primary_key=True, nullable=False) + policy = Column(String(255)) + group_id = Column(Integer, ForeignKey('instance_groups.id'), + nullable=False) + + +class InstanceGroup(API_BASE): + """Represents an instance group. + + A group will maintain a collection of instances and the relationship + between them. + """ + + __tablename__ = 'instance_groups' + __table_args__ = ( + 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') + + @property + def policies(self): + return [p.policy for p in self._policies] + + @property + def members(self): + return [m.instance_uuid for m in self._members]