| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- import datetime
- import sqlalchemy as sql
- metadata = sql.MetaData()
- summary = sql.Table(
- 'summary', metadata,
- sql.Column('id', sql.Integer, primary_key=True),
- sql.Column('result', sql.Boolean),
- sql.Column('build_date', sql.String)
- )
- summary_item = sql.Table(
- 'summary_item', metadata,
- sql.Column('id', sql.Integer, primary_key=True),
- sql.Column('repo_name', sql.String),
- sql.Column('exception', sql.String),
- sql.Column('commit_id', sql.String),
- sql.Column('image_id', sql.String),
- sql.Column('source_desc', sql.String),
- sql.Column('tag', sql.String),
- sql.Column('summary_id', None, sql.ForeignKey('summary.id'))
- )
- class SummaryV2(object):
- def __init__(self, engine, summary_id, errorlogs=None):
- self.summary_id = summary_id
- self._engine = engine
- self.errorlogs = errorlogs
- def handle_build_result(self, exc, repo, version, img_id, build_result):
- c = self._engine.connect()
- if exc and self.errorlogs:
- if isinstance(build_result, list):
- build_result = '\n'.join(build_result)
- elif not isinstance(build_result, str):
- build_result = str(build_result)
- with open('{2}/{0}.{1}.error.log'.format(repo.name, version[1], self.errorlogs), 'w') as f:
- f.write(build_result)
- ins = summary_item.insert().values(
- repo_name=repo.name,
- exception=str(exc) if exc else None,
- commit_id=version[1],
- image_id=img_id,
- source_desc=version[0],
- tag=', '.join(repo.get_associated_tags(version)),
- summary_id=self.summary_id
- )
- c.execute(ins)
- class DbManager(object):
- def __init__(self, db='/opt/stackbrew/data.db', debug=False):
- self._engine = sql.create_engine('sqlite:///' + db, echo=debug)
- def generate_tables(self):
- metadata.create_all(self._engine)
- def insert_summary(self, s):
- c = self._engine.connect()
- summary_id = None
- with c.begin():
- ins = summary.insert().values(
- result=not s.exit_code(),
- build_date=str(datetime.datetime.now()))
- r = c.execute(ins)
- summary_id = r.inserted_primary_key[0]
- for item in s.items():
- ins = summary_item.insert().values(
- repo_name=item.repository,
- exception=item.exc,
- commit_id=item.commit_id,
- image_id=item.image_id,
- source_desc=item.source,
- tag=item.tag,
- summary_id=summary_id
- )
- c.execute(ins)
- return summary_id
- def new_summary(self, errorlogs=None):
- c = self._engine.connect()
- ins = summary.insert().values(
- result=True, build_date=str(datetime.datetime.now())
- )
- r = c.execute(ins)
- summary_id = r.inserted_primary_key[0]
- return SummaryV2(self._engine, summary_id, errorlogs)
- def latest_status(self):
- c = self._engine.connect()
- s = sql.select([summary]).order_by(summary.c.id.desc()).limit(1)
- res = c.execute(s)
- row = res.fetchone()
- if row is not None:
- return dict(row)
- return None
- def get_summary(self, id):
- c = self._engine.connect()
- s = sql.select([summary_item]).where(summary_item.c.summary_id == id)
- res = c.execute(s)
- return [dict(row) for row in res]
- def get_latest_successful(self, repo, tag=None):
- c = self._engine.connect()
- tag = tag or 'latest'
- s = sql.select([summary_item]).where(
- summary_item.c.repo_name == repo
- ).where(
- summary_item.c.tag == tag
- ).where(
- summary_item.c.image_id is not None
- ).order_by(
- summary_item.c.summary_id.desc()
- ).limit(1)
- res = c.execute(s)
- row = res.fetchone()
- if row is not None:
- return dict(row)
- return None
|