예제 #1
0
class Sensor(sql.Base, abstract.Sensor):
    """Represent an sensor in sqlalchemy."""

    __tablename__ = 'sensor'
    __table_args__ = sql.table_args()

    id = sqlalchemy.Column(sqlalchemy.Integer,
                           primary_key=True,
                           autoincrement=True)
    uuid = sqlalchemy.Column(sqlalchemy.String(36))
    project_id = sqlalchemy.Column(sqlalchemy.String(36))
    user_id = sqlalchemy.Column(sqlalchemy.String(36))
    name = sqlalchemy.Column(sqlalchemy.String(255))
    sensor_type = sqlalchemy.Column(sqlalchemy.String(255))
    value = sqlalchemy.Column(sqlalchemy.String(255))
    timestamp = sqlalchemy.Column(sqlalchemy.DateTime),
    description = sqlalchemy.Column(sqlalchemy.String(255))
    documentation = sqlalchemy.Column(sqlalchemy.String(255))
    target_resource = sqlalchemy.Column(sqlalchemy.String(255))

    @classmethod
    def _raise_duplicate_object(cls, e, self):
        raise exception.SensorExists()

    @classmethod
    def get_by_uuid(cls, context, item_uuid):
        query = db_session.get_session().query(cls).filter_by(uuid=item_uuid)
        result = query.first()
        if not result:
            cls._raise_not_found(item_uuid)
        return result
예제 #2
0
class Plan(sql.Base, abstract.Plan):
    """Represent a plan in sqlalchemy."""

    __tablename__ = 'plan'
    __table_args__ = sql.table_args()

    id = sqlalchemy.Column(sqlalchemy.Integer,
                           primary_key=True,
                           autoincrement=True)
    uuid = sqlalchemy.Column(sqlalchemy.String(36))
    project_id = sqlalchemy.Column(sqlalchemy.String(36))
    user_id = sqlalchemy.Column(sqlalchemy.String(36))
    glance_id = sqlalchemy.Column(sqlalchemy.String(36))
    name = sqlalchemy.Column(sqlalchemy.String(255))
    raw_content = sqlalchemy.Column(sqlalchemy.Text)

    @classmethod
    def _raise_duplicate_object(cls, e, self):
        raise exception.PlanExists()

    @classmethod
    def get_by_uuid(cls, context, item_uuid):
        query = db_session.get_session().query(cls).filter_by(uuid=item_uuid)
        result = query.first()
        if not result:
            cls._raise_not_found(item_uuid)
        return result
예제 #3
0
class Execution(sql.Base, abstract.Execution):
    """Represent an execution in sqlalchemy."""

    __tablename__ = 'execution'
    __resource__ = 'executions'
    __table_args__ = sql.table_args()

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    uuid = sa.Column(sa.String(36))
    pipeline_id = sa.Column(sa.Integer, sa.ForeignKey('pipeline.id'))
예제 #4
0
class CompilerVersions(sql.Base, abs_cv.CompilerVersions):

    __tablename__ = 'compiler_versions'
    __table_args__ = sql.table_args()

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    uuid = sa.Column(sa.String(36), nullable=False)
    version = sa.Column(sa.String(36), nullable=False)
    language_pack_id = sa.Column(sa.Integer,
                                 sa.ForeignKey('language_pack.id'),
                                 nullable=False)
예제 #5
0
class OSPlatform(sql.Base, abs_op.OSPlatform):

    __tablename__ = 'os_platform'
    __table_args__ = sql.table_args()

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    uuid = sa.Column(sa.String(36), nullable=False)
    os = sa.Column(sa.String(36), nullable=False)
    version = sa.Column(sa.String(36), nullable=False)
    language_pack_id = sa.Column(sa.Integer,
                                 sa.ForeignKey('language_pack.id'),
                                 nullable=False)
예제 #6
0
class Component(sql.Base, abstract.Component):
    """Represent an component in sqlalchemy."""

    __tablename__ = 'component'
    __resource__ = 'components'
    __table_args__ = sql.table_args()

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    uuid = sa.Column(sa.String(36))
    project_id = sa.Column(sa.String(36))
    user_id = sa.Column(sa.String(36))
    name = sa.Column(sa.String(100))
    component_type = sa.Column(sa.String(100))
    description = sa.Column(sa.String(255))
    tags = sa.Column(sa.Text)
    assembly_id = sa.Column(sa.Integer, sa.ForeignKey('assembly.id'))
    parent_component_id = sa.Column(sa.Integer, sa.ForeignKey('component.id'))
    resource_uri = sa.Column(sa.String(1024))
    heat_stack_id = sa.Column(sa.String(36))

    @property
    def assembly_uuid(self):
        if self.assembly_id is None:
            return None
        return objects.registry.Assembly.get_by_id(None, self.assembly_id).uuid

    @assembly_uuid.setter
    def assembly_uuid(self, assembly_uuid):
        assembly = objects.registry.Assembly.get_by_uuid(None, assembly_uuid)
        self.assembly_id = assembly.id

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

    @staticmethod
    def assign_and_create(ctxt, assem, name, type, description, resource_uri,
                          stack_id):
        """Helper function to make creating components easier."""
        comp = objects.registry.Component()
        comp.uuid = str(uuid.uuid4())
        comp.name = name
        comp.component_type = type
        comp.description = description
        comp.assembly_id = assem.id
        comp.user_id = ctxt.user
        comp.project_id = ctxt.tenant
        comp.resource_uri = resource_uri
        comp.heat_stack_id = stack_id
        comp.create(ctxt)
        return comp
예제 #7
0
파일: assembly.py 프로젝트: julienvey/solum
class Assembly(sql.Base, abstract.Assembly):
    """Represent an assembly in sqlalchemy."""

    __tablename__ = 'assembly'
    __resource__ = 'assemblies'
    __table_args__ = sql.table_args()

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    uuid = sa.Column(sa.String(36), nullable=False)
    project_id = sa.Column(sa.String(36))
    user_id = sa.Column(sa.String(36))
    name = sa.Column(sa.String(100))
    description = sa.Column(sa.String(255))
    tags = sa.Column(sa.Text)
    plan_id = sa.Column(sa.Integer, sa.ForeignKey('plan.id'), nullable=False)
예제 #8
0
class Userlog(sql.Base, abstract.Userlog):
    """Represent a userlog in sqlalchemy."""

    __tablename__ = 'userlogs'
    __resource__ = 'userlog'
    __table_args__ = sql.table_args()

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    resource_uuid = sa.Column(sa.String(36), nullable=False)
    project_id = sa.Column(sa.String(36))
    created_at = sa.Column(sa.DateTime)
    location = sa.Column(sa.String(255))
    strategy = sa.Column(sa.String(255))
    strategy_info = sa.Column(sa.String(1024))
    resource_type = sa.Column(sa.String(36))
예제 #9
0
파일: service.py 프로젝트: paulczar/solum
class Service(sql.Base, abstract.Service):
    """Represent a service in sqlalchemy."""

    __resource__ = 'services'
    __tablename__ = 'service'
    __table_args__ = sql.table_args()

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    uuid = sa.Column(sa.String(36), nullable=False)
    name = sa.Column(sa.String(100))
    description = sa.Column(sa.String(255))
    project_id = sa.Column(sa.String(36))
    user_id = sa.Column(sa.String(36))
    service_type = sa.Column(sa.String(100))
    read_only = sa.Column(sa.Boolean, default=False)
    tags = sa.Column(sa.Text)
예제 #10
0
class Extension(sql.Base, abstract.Extension):
    """Represent an extension in sqlalchemy."""

    __resource__ = 'extensions'
    __tablename__ = 'extension'
    __table_args__ = sql.table_args()

    id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True,
                           autoincrement=True)
    uuid = sqlalchemy.Column(sqlalchemy.String(36))
    project_id = sqlalchemy.Column(sqlalchemy.String(36))
    user_id = sqlalchemy.Column(sqlalchemy.String(36))
    description = sqlalchemy.Column(sqlalchemy.String(255))
    name = sqlalchemy.Column(sqlalchemy.String(100))
    version = sqlalchemy.Column(sqlalchemy.String(16))
    documentation = sqlalchemy.Column(sqlalchemy.String(255))
예제 #11
0
class Component(sql.Base, abstract.Component):
    """Represent an component in sqlalchemy."""

    __tablename__ = 'component'
    __resource__ = 'components'
    __table_args__ = sql.table_args()

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    uuid = sa.Column(sa.String(36))
    project_id = sa.Column(sa.String(36))
    user_id = sa.Column(sa.String(36))
    name = sa.Column(sa.String(100))
    description = sa.Column(sa.String(255))
    tags = sa.Column(sa.Text)
    assembly_id = sa.Column(sa.Integer)
    parent_component_id = sa.Column(sa.Integer)
예제 #12
0
class Operation(sql.Base, abstract.Operation):
    """Represent an operation in sqlalchemy."""

    __resource__ = 'operations'
    __tablename__ = 'operation'
    __table_args__ = sql.table_args()

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    uuid = sa.Column(sa.String(36), nullable=False)
    project_id = sa.Column(sa.String(36))
    user_id = sa.Column(sa.String(36))
    name = sa.Column(sa.String(100))
    description = sa.Column(sa.String(255))
    tags = sa.Column(sa.Text)
    documentation = sa.Column(sa.Text)
    target_resource = sa.Column(sa.Text)
예제 #13
0
class InfrastructureStack(sql.Base, abstract.InfrastructureStack):
    """Represent an infrastructure_stack in sqlalchemy."""

    __tablename__ = 'infrastructure_stack'
    __resource__ = 'infrastructure/stacks'
    __table_args__ = sql.table_args()

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    uuid = sa.Column(sa.String(36), nullable=False)
    project_id = sa.Column(sa.String(36))
    user_id = sa.Column(sa.String(36))
    image_id = sa.Column(sa.String(36))
    heat_stack_id = sa.Column(sa.String(36))
    name = sa.Column(sa.String(100))
    description = sa.Column(sa.String(255))
    tags = sa.Column(sa.Text)
예제 #14
0
class Plan(sql.Base, abstract.Plan):
    """Represent a plan in sqlalchemy."""

    __resource__ = 'plans'
    __tablename__ = 'plan'
    __table_args__ = sql.table_args()

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    uuid = sa.Column(sa.String(36))
    project_id = sa.Column(sa.String(36))
    user_id = sa.Column(sa.String(36))
    name = sa.Column(sa.String(255), nullable=False)
    description = sa.Column(sa.String(255))
    raw_content = sa.Column(sql.YAMLEncodedDict(2048))
    trigger_id = sa.Column(sa.String(36))
    trust_id = sa.Column(sa.String(255))
    username = sa.Column(sa.String(256))

    @classmethod
    def _raise_trigger_not_found(cls, item_id):
        """Raise a NotFound exception."""
        raise exception.ResourceNotFound(id=item_id, name='trigger')

    @classmethod
    def get_by_trigger_id(cls, context, trigger_id):
        try:
            session = sql.Base.get_session()
            return session.query(cls).filter_by(trigger_id=trigger_id).one()
        except sa.orm.exc.NoResultFound:
            cls._raise_trigger_not_found(trigger_id)

    @classmethod
    def get_by_uuid(cls, context, app_id):
        try:
            session = sql.Base.get_session()
            return session.query(cls).filter_by(uuid=app_id).one()
        except sa.orm.exc.NoResultFound as e:
            LOG.exception(e)
            raise exception.ResourceNotFound(id=app_id, name='plan')

    def _non_updatable_fields(self):
        return set(('uuid', 'id', 'project_id'))

    def refined_content(self):
        if self.raw_content and self.uuid:
            self.raw_content['uuid'] = self.uuid
        return self.raw_content
예제 #15
0
class Plan(sql.Base, abstract.Plan):
    """Represent a plan in sqlalchemy."""

    __resource__ = 'plans'
    __tablename__ = 'plan'
    __table_args__ = sql.table_args()

    id = sqlalchemy.Column(sqlalchemy.Integer,
                           primary_key=True,
                           autoincrement=True)
    uuid = sqlalchemy.Column(sqlalchemy.String(36))
    project_id = sqlalchemy.Column(sqlalchemy.String(36))
    user_id = sqlalchemy.Column(sqlalchemy.String(36))
    glance_id = sqlalchemy.Column(sqlalchemy.String(36))
    name = sqlalchemy.Column(sqlalchemy.String(255))
    description = sqlalchemy.Column(sqlalchemy.String(255))
    raw_content = sqlalchemy.Column(sqlalchemy.Text)
예제 #16
0
파일: sensor.py 프로젝트: julienvey/solum
class Sensor(sql.Base, abstract.Sensor):
    """Represent an sensor in sqlalchemy."""

    __resource__ = 'sensors'
    __tablename__ = 'sensor'
    __table_args__ = sql.table_args()

    id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True,
                           autoincrement=True)
    uuid = sqlalchemy.Column(sqlalchemy.String(36))
    project_id = sqlalchemy.Column(sqlalchemy.String(36))
    user_id = sqlalchemy.Column(sqlalchemy.String(36))
    name = sqlalchemy.Column(sqlalchemy.String(255))
    sensor_type = sqlalchemy.Column(sqlalchemy.String(255))
    value = sqlalchemy.Column(sqlalchemy.String(255))
    timestamp = sqlalchemy.Column(sqlalchemy.DateTime),
    description = sqlalchemy.Column(sqlalchemy.String(255))
    documentation = sqlalchemy.Column(sqlalchemy.String(255))
    target_resource = sqlalchemy.Column(sqlalchemy.String(255))
예제 #17
0
파일: service.py 프로젝트: alex/solum
class Service(sql.Base, abstract.Service):
    """Represent a service in sqlalchemy."""

    __tablename__ = 'service'
    __table_args__ = sql.table_args()

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    uuid = sa.Column(sa.String(36), nullable=False)
    name = sa.Column(sa.String(100))
    description = sa.Column(sa.String(255))
    project_id = sa.Column(sa.String(36))
    user_id = sa.Column(sa.String(36))
    service_type = sa.Column(sa.String(100))
    read_only = sa.Column(sa.Integer, default=0)
    tags = sa.Column(sa.Text)

    @classmethod
    def _raise_duplicate_object(cls, e, self):
        raise exception.ServiceExists()
예제 #18
0
파일: operation.py 프로젝트: alex/solum
class Operation(sql.Base, abstract.Operation):
    """Represent an operation in sqlalchemy."""

    __tablename__ = 'operation'
    __table_args__ = sql.table_args()

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    uuid = sa.Column(sa.String(36), nullable=False)
    project_id = sa.Column(sa.String(36))
    user_id = sa.Column(sa.String(36))
    name = sa.Column(sa.String(100))
    description = sa.Column(sa.String(255))
    tags = sa.Column(sa.Text)
    documentation = sa.Column(sa.Text)
    target_resource = sa.Column(sa.Text)

    @classmethod
    def _raise_duplicate_object(cls, e, self):
        raise exception.OperationExists()
예제 #19
0
class Parameter(sql.Base, abstract.Parameter):
    """Represent a parameter in sqlalchemy."""

    __resource__ = 'parameters'
    __tablename__ = 'parameter'
    __table_args__ = sql.table_args()

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    plan_id = sa.Column(sa.Integer, sa.ForeignKey('plan.id'),
                        nullable=False)
    user_defined_params = sa.Column(sql.YAMLEncodedDict(65535))
    sys_defined_params = sa.Column(sql.YAMLEncodedDict(65535))

    @classmethod
    def get_by_plan_id(cls, context, p_id):
        try:
            session = sql.SolumBase.get_session()
            return session.query(cls).filter_by(plan_id=p_id).one()
        except exc.NoResultFound:
            return None
예제 #20
0
파일: image.py 프로젝트: paulczar/solum
class Image(sql.Base, abstract.Image):
    """Represent a image in sqlalchemy."""

    __tablename__ = 'image'
    __resource__ = 'images'
    __table_args__ = sql.table_args()

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    uuid = sa.Column(sa.String(36), nullable=False)
    name = sa.Column(sa.String(100))
    source_uri = sa.Column(sa.String(1024))
    source_format = sa.Column(sa.String(12))
    description = sa.Column(sa.String(255))
    project_id = sa.Column(sa.String(36))
    user_id = sa.Column(sa.String(36))
    tags = sa.Column(sa.Text)
    state = sa.Column(sa.String(12))
    base_image_id = sa.Column(sa.String(36))
    created_image_id = sa.Column(sa.String(36))
    image_format = sa.Column(sa.String(12))
예제 #21
0
파일: plan.py 프로젝트: paulczar/solum
class Plan(sql.Base, abstract.Plan):
    """Represent a plan in sqlalchemy."""

    __resource__ = 'plans'
    __tablename__ = 'plan'
    __table_args__ = sql.table_args()

    id = sqlalchemy.Column(sqlalchemy.Integer,
                           primary_key=True,
                           autoincrement=True)
    uuid = sqlalchemy.Column(sqlalchemy.String(36))
    project_id = sqlalchemy.Column(sqlalchemy.String(36))
    user_id = sqlalchemy.Column(sqlalchemy.String(36))
    name = sqlalchemy.Column(sqlalchemy.String(255))
    description = sqlalchemy.Column(sqlalchemy.String(255))
    raw_content = sqlalchemy.Column(sql.YAMLEncodedDict(2048))

    def refined_content(self):
        if self.raw_content and self.uuid:
            self.raw_content['uuid'] = self.uuid
        return self.raw_content
예제 #22
0
class LanguagePack(sql.Base, abstract.LanguagePack):
    """Represent a language pack in sqlalchemy."""

    __resource__ = 'language_packs'
    __tablename__ = 'language_pack'
    __table_args__ = sql.table_args()

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    uuid = sa.Column(sa.String(36), nullable=False)
    name = sa.Column(sa.String(100))
    description = sa.Column(sa.String(255))
    project_id = sa.Column(sa.String(36))
    user_id = sa.Column(sa.String(36))
    language_impl = sa.Column(sa.String(100))
    tags = sa.Column(sa.Text)
    compiler_versions = orm.relationship("CompilerVersions",
                                         backref=__tablename__)
    os_platform = orm.relationship("OSPlatform", backref=__tablename__)
    attr_blob = sa.Column(sql.JSONEncodedDict(255))
    service_id = sa.Column(sa.Integer,
                           sa.ForeignKey('service.id'),
                           nullable=False)
예제 #23
0
class Pipeline(sql.Base, abstract.Pipeline):
    """Represent an pipeline in sqlalchemy."""

    __resource__ = 'pipelines'
    __tablename__ = 'pipeline'
    __table_args__ = sql.table_args()

    id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True,
                           autoincrement=True)
    uuid = sqlalchemy.Column(sqlalchemy.String(36))
    project_id = sqlalchemy.Column(sqlalchemy.String(36))
    user_id = sqlalchemy.Column(sqlalchemy.String(36))
    name = sqlalchemy.Column(sqlalchemy.String(100))
    description = sqlalchemy.Column(sqlalchemy.String(255))
    tags = sqlalchemy.Column(sqlalchemy.Text)
    workbook_name = sqlalchemy.Column(sqlalchemy.String(255))
    plan_id = sqlalchemy.Column(sqlalchemy.Integer,
                                sqlalchemy.ForeignKey('plan.id'),
                                nullable=False)
    trigger_id = sqlalchemy.Column(sqlalchemy.String(36))
    trust_id = sqlalchemy.Column(sqlalchemy.String(255))

    @property
    def plan_uuid(self):
        return objects.registry.Plan.get_by_id(None, self.plan_id).uuid

    @plan_uuid.setter
    def plan_uuid(self, value):
        plan = objects.registry.Plan.get_by_uuid(None, value)
        self.plan_id = plan.id

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

    @classmethod
    def get_by_trigger_id(cls, context, trigger_id):
        try:
            session = sql.Base.get_session()
            return session.query(cls).filter_by(trigger_id=trigger_id).one()
        except sqlalchemy.orm.exc.NoResultFound:
            raise exception.ResourceNotFound(id=trigger_id, name='trigger')

    def last_execution(self):
        session = sql.Base.get_session()
        try:
            return session.query(execution.Execution).filter_by(
                pipeline_id=self.id).order_by(
                    sqlalchemy.desc(
                        execution.Execution.created_at)).limit(1).one()
        except sqlalchemy.orm.exc.NoResultFound as no_ex:
            LOG.debug('No Execution found %s' % no_ex)
            return None

    @property
    def executions(self):
        session = sql.Base.get_session()
        return session.query(execution.Execution).filter_by(
            pipeline_id=self.id).all()

    def destroy(self, context):
        session = sql.Base.get_session()
        with session.begin():
            session.query(execution.Execution).filter_by(
                pipeline_id=self.id).delete()
            session.query(self.__class__).filter_by(
                id=self.id).delete()
예제 #24
0
class App(sql.Base, abstract.App):
    """Represent an app in sqlalchemy."""

    __tablename__ = 'app'
    __resource__ = 'apps'
    __table_args__ = sql.table_args()

    id = sa.Column(sa.String(36), primary_key=True)
    deleted = sa.Column(sa.Boolean, default=False)
    project_id = sa.Column(sa.String(36))
    user_id = sa.Column(sa.String(36))

    languagepack = sa.Column(sa.String(1024))
    stack_id = sa.Column(sa.String(36))

    name = sa.Column(sa.String(length=100))
    description = sa.Column(sa.String(length=255))
    ports = sa.Column(sql.YAMLEncodedDict(1024))
    source = sa.Column(sql.YAMLEncodedDict(1024))
    workflow_config = sa.Column(sql.YAMLEncodedDict(1024))
    trigger_uuid = sa.Column(sa.String(length=36))
    trigger_actions = sa.Column(sql.YAMLEncodedDict(1024))
    trust_id = sa.Column(sa.String(255))
    trust_user = sa.Column(sa.String(256))
    status = sa.Column(sa.String(36))
    app_url = sa.Column(sa.String(1024))

    def _non_updatable_fields(self):
        return set(('id', 'project_id'))

    @classmethod
    def get_by_uuid(cls, context, item_uuid):
        app = cls.get_by_id(context, item_uuid)
        return app

    @classmethod
    def get_by_trigger_id(cls, context, trigger_id):
        try:
            session = sql.Base.get_session()
            return session.query(cls).filter_by(trigger_uuid=trigger_id).one()
        except sa.orm.exc.NoResultFound:
            cls._raise_trigger_not_found(trigger_id)

    @classmethod
    def get_all_by_lp(cls, context, lp):
        session = sql.SolumBase.get_session()
        apps = []
        with session.begin():
            query = session.query(cls).filter_by(languagepack=lp)
            apps = sql.filter_by_project(context, query).all()
            return apps

    @classmethod
    @sql.retry
    def update_and_save(cls, context, id_or_uuid, data):
        try:
            session = sql.SolumBase.get_session()
            with session.begin():
                query = session.query(cls).filter_by(id=id_or_uuid)
                obj = sql.filter_by_project(context, query).one()
                if obj._is_updatable():
                    obj.update(data)
                    session.merge(obj)
            return obj
        except orm_exc.NoResultFound:
            cls._raise_not_found(id_or_uuid)
예제 #25
0
파일: assembly.py 프로젝트: paulczar/solum
class Assembly(sql.Base, abstract.Assembly):
    """Represent an assembly in sqlalchemy."""

    __tablename__ = 'assembly'
    __resource__ = 'assemblies'
    __table_args__ = sql.table_args()

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    uuid = sa.Column(sa.String(36), nullable=False)
    project_id = sa.Column(sa.String(36))
    user_id = sa.Column(sa.String(36))
    trigger_id = sa.Column(sa.String(36))
    trust_id = sa.Column(sa.String(255))
    name = sa.Column(sa.String(100))
    description = sa.Column(sa.String(255))
    tags = sa.Column(sa.Text)
    plan_id = sa.Column(sa.Integer, sa.ForeignKey('plan.id'), nullable=False)
    status = sa.Column(sa.String(36))
    application_uri = sa.Column(sa.String(1024))

    @classmethod
    def _raise_trigger_not_found(cls, item_id):
        """Raise a NotFound exception."""
        raise exception.ResourceNotFound(id=item_id, name='trigger')

    @classmethod
    def get_by_trigger_id(cls, context, trigger_id):
        try:
            session = sql.Base.get_session()
            return session.query(cls).filter_by(trigger_id=trigger_id).one()
        except sa.orm.exc.NoResultFound:
            cls._raise_trigger_not_found(trigger_id)

    @property
    def plan_uuid(self):
        return objects.registry.Plan.get_by_id(None, self.plan_id).uuid

    @plan_uuid.setter
    def plan_uuid(self, value):
        plan = objects.registry.Plan.get_by_uuid(None, value)
        self.plan_id = plan.id

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

    @property
    def components(self):
        session = sql.Base.get_session()
        return session.query(
            component.Component).filter_by(assembly_id=self.id).all()

    def destroy(self, context):
        session = sql.Base.get_session()
        with session.begin():
            session.query(
                component.Component).filter_by(assembly_id=self.id).delete()
            session.query(self.__class__).filter_by(id=self.id).delete()

    @property
    def heat_stack_component(self):
        session = sql.Base.get_session()
        return session.query(component.Component).filter_by(
            assembly_id=self.id, component_type='heat_stack').first()
예제 #26
0
class Workflow(sql.Base, abstract.Workflow):
    """Represent an app workflow in sqlalchemy."""

    __tablename__ = 'workflow'
    __resource__ = 'workflows'
    __table_args__ = sql.table_args()

    id = sa.Column(sa.String(36), primary_key=True)
    deleted = sa.Column(sa.Boolean, default=False)
    project_id = sa.Column(sa.String(36))
    user_id = sa.Column(sa.String(36))

    app_id = sa.Column(sa.String(36))
    wf_id = sa.Column(sa.Integer())
    source = sa.Column(sql.YAMLEncodedDict(1024))
    config = sa.Column(sql.YAMLEncodedDict(1024))
    actions = sa.Column(sql.YAMLEncodedDict(1024))
    assembly = sa.Column(sa.Integer())
    status = sa.Column(sa.String(36))
    result = sa.Column(sa.Text)

    def _non_updatable_fields(self):
        return set(('id', 'project_id'))

    @classmethod
    def get_by_assembly_id(cls, assembly_id):
        try:
            session = sql.Base.get_session()
            result = session.query(Workflow)
            result = result.filter(Workflow.assembly == assembly_id)
            return result.one()
        except orm_exc.NoResultFound:
            cls._raise_not_found(assembly_id)

    @classmethod
    def get_by_uuid(cls, context, item_uuid):
        return cls.get_by_id(context, item_uuid)

    @classmethod
    @sql.retry
    def update_and_save(cls, context, id_or_uuid, data):
        try:
            session = sql.SolumBase.get_session()
            with session.begin():
                query = session.query(cls).filter_by(id=id_or_uuid)
                obj = sql.filter_by_project(context, query).one()
                if obj._is_updatable():
                    obj.update(data)
                    session.merge(obj)
            return obj
        except orm_exc.NoResultFound:
            cls._raise_not_found(id_or_uuid)

    @classmethod
    @sql.retry
    def insert(cls, context, db_obj):
        try:
            ss = sql.Base.get_session()
            with ss.begin():
                s = text("select max(wf_id) as max_wf_id "
                         "from workflow where app_id like :app")
                res = ss.execute(s, params=dict(app=db_obj.app_id)).fetchone()
                if res.max_wf_id:
                    db_obj.wf_id = res.max_wf_id + 1
                else:
                    db_obj.wf_id = 1
                db_obj.create(context)
        except orm_exc.NoResultFound:
            cls._raise_not_found(db_obj.app_id)

    @classmethod
    @sql.retry
    def destroy(cls, app_id):
        # Delete relevant plan, assembly, component on workflow delete
        try:
            session = sql.Base.get_session()
            plan_id = None
            image_name = None
            with session.begin():
                wfs = session.query(cls).filter_by(app_id=app_id).all()
                for wf_obj in wfs:
                    asm = session.query(assembly.Assembly).filter_by(
                        id=wf_obj.assembly).one()
                    plan_id = asm.plan_id
                    image_name = asm.name
                    # delete component
                    session.query(component.Component).filter_by(
                        assembly_id=wf_obj.assembly).delete()
                    # delete assembly
                    session.query(assembly.Assembly).filter_by(
                        id=wf_obj.assembly).delete()

                # delete plan
                if not plan_id:
                    plan_id = app_id
                session.query(plan.Plan).filter_by(id=plan_id).delete()
                # delete workflows
                session.query(cls).filter_by(app_id=app_id).delete()
                # delete image
                if image_name:
                    session.query(image.Image).filter_by(
                        name=image_name).delete()
        except orm_exc.NoResultFound:
            cls._raise_not_found(app_id)
예제 #27
0
파일: image.py 프로젝트: maniacs-ops/solum
class Image(sql.Base, abstract.Image):
    """Represent a image in sqlalchemy."""

    __tablename__ = 'image'
    __resource__ = 'images'
    __table_args__ = sql.table_args()

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    uuid = sa.Column(sa.String(36), nullable=False)
    name = sa.Column(sa.String(100))
    source_uri = sa.Column(sa.String(1024))
    source_format = sa.Column(sa.String(36))
    description = sa.Column(sa.String(255))
    project_id = sa.Column(sa.String(36))
    user_id = sa.Column(sa.String(36))
    tags = sa.Column(sa.Text)
    status = sa.Column(sa.String(12))
    base_image_id = sa.Column(sa.String(36))
    created_image_id = sa.Column(sa.String(36))
    image_format = sa.Column(sa.String(12))
    artifact_type = sa.Column(sa.String(36))
    external_ref = sa.Column(sa.String(1024))
    docker_image_name = sa.Column(sa.String(512))

    @classmethod
    def get_num_of_lps(cls, context):
        try:
            session = Image.get_session()
            oper_result = session.query(cls).filter_by(
                project_id=context.tenant, status='READY')
            cnt = oper_result.count()
            return cnt
        except exc.NoResultFound:
            LOG.debug("Exception encountered in getting count of number"
                      " of languagepacks")

    @classmethod
    def get_lp_by_name_or_uuid(cls,
                               context,
                               name_or_uuid,
                               include_operators_lp=False):
        if uuidutils.is_uuid_like(name_or_uuid):
            try:
                session = Image.get_session()
                result = session.query(cls).filter_by(
                    artifact_type='language_pack', uuid=name_or_uuid)
                if include_operators_lp is True:
                    result = result.filter(
                        Image.project_id.in_([operator_id, context.tenant]))
                    return result.one()
                else:
                    return sql.filter_by_project(context, result).one()
            except exc.NoResultFound:
                return cls.get_by_name(context, name_or_uuid,
                                       include_operators_lp)
        else:
            return cls.get_by_name(context, name_or_uuid, include_operators_lp)

    @classmethod
    def get_by_name(cls, context, name, include_operators_lp=False):
        try:
            session = Image.get_session()
            result = session.query(cls).filter_by(
                artifact_type='language_pack', name=name)
            if include_operators_lp is True:
                result = result.filter(
                    Image.project_id.in_([operator_id, context.tenant]))
                return result.one()
            else:
                return sql.filter_by_project(context, result).one()
        except exc.NoResultFound:
            cls._raise_not_found(name)

    @classmethod
    def get_all_languagepacks(cls, context):
        """Return all images that are languagepacks."""
        session = Image.get_session()
        result = session.query(cls)
        result = result.filter_by(artifact_type='language_pack')
        result = sql.filter_by_project(context, result)

        # Include Languagepacks that have been created by the operator, and
        # are in the 'READY' state.
        # The operator LP is identified based on the operator_project_id
        # config setting in solum.conf
        oper_result = session.query(cls)
        oper_result = oper_result.filter_by(artifact_type='language_pack')
        oper_result = oper_result.filter_by(status='READY')
        oper_result = oper_result.filter_by(project_id=operator_id)

        return result.union(oper_result).all()