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
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
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'))
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)
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)
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
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)
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))
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)
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))
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)
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)
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)
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
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)
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))
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()
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()
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
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))
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
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)
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()
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)
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()
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)
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()