solum/solum/objects/sqlalchemy/app.py

96 lines
3.2 KiB
Python

# Copyright 2015 - Rackspace, Inc.
#
# 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.
import sqlalchemy as sa
from sqlalchemy.orm import exc as orm_exc
from solum.objects import app as abstract
from solum.objects.sqlalchemy import models as sql
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 AppList(abstract.AppList):
"""Represent a list of apps in sqlalchemy."""
@classmethod
def get_all(cls, context):
return AppList(sql.model_query(context, App))