Example #1
0
    def __listen_console(job_id):
        logger.debug('listen:console for %s', job_id)
        token = get_token()

        if not job_id:
            logger.debug('job_id not set')
            return flask_socketio.disconnect()

        try:
            uuid.UUID(job_id)
        except:
            logger.debug('job_id not a uuid')
            return flask_socketio.disconnect()

        conn = dbpool.get()
        try:
            if token['type'] not in ('project', 'project-token'):
                logger.debug('only project token allowed')
                return flask_socketio.disconnect()

            project_id = token['project']['id']

            build = conn.execute_one('''
                SELECT id
                FROM job
                WHERE project_id = %s AND id = %s
            ''', [project_id, job_id])

            if not build:
                logger.debug('job does not belong to project')
                return flask_socketio.disconnect()
        finally:
            dbpool.put(conn)

        flask_socketio.join_room(job_id)
Example #2
0
def __handle_event(event, socketio, client_manager):
    job_id = event['job_id']
    console_id = event['id']

    if not client_manager.has_clients(job_id):
        return

    logger.info('start console %s', console_id)
    conn = dbpool.get()
    try:
        r = conn.execute_one(
            '''
           SELECT output FROM console WHERE id = %s
        ''', [console_id])
        logger.info('retrived console %s', console_id)

        if not r:
            return

        r = r[0]

        socketio.emit('notify:console', {
            'data': r,
            'job_id': job_id
        },
                      room=job_id)
    finally:
        dbpool.put(conn)
        logger.info('stop console %s', console_id)
Example #3
0
def opa_push_all():
    db = dbpool.get()

    try:
        opa_push_collaborator_data(db)
        opa_push_project_data(db)
    finally:
        dbpool.put(db)
Example #4
0
def handle(event):
    db = dbpool.get()
    try:
        handle_job_update(db.conn, event)
    except Exception as e:
        logger.error(e)
    finally:
        dbpool.put(db)
Example #5
0
    def before_request():
        g.db = dbpool.get()

        def release_db():
            db = getattr(g, 'db', None)
            if not db:
                return

            dbpool.put(db)
            g.db = None

        g.release_db = release_db
Example #6
0
def before_request():
    def release_db():
        db = getattr(g, 'db', None)
        if not db:
            return

        dbpool.put(db)
        g.db = None

    g.release_db = release_db

    g.db = dbpool.get()

    g.token = normalize_token(get_token())
    check_request_authorization()
Example #7
0
    def run(self):
        # TODO: Delete storage objects: uploads, outputs
        # TODO: Delete images from registry

        while True:
            db = dbpool.get()
            try:
                logger.info('Starting next GC run')
                self._gc(db)
                logger.info('Finished GC run')
                logger.info('')
            except Exception as e:
                logger.exception(e)
            finally:
                dbpool.put(db)

            time.sleep(3600)
Example #8
0
    def __listen_dashboard_console(job_id):
        logger.debug('listen:console for %s', job_id)

        if not job_id:
            logger.debug('job_id not set')
            return flask_socketio.disconnect()

        try:
            uuid.UUID(job_id)
        except:
            logger.debug('job_id not a uuid')
            return flask_socketio.disconnect()

        conn = dbpool.get()
        try:
            u = conn.execute_one_dict(
                '''
                SELECT p.public, j.project_id
                FROM project p
                INNER JOIN job j
                    ON j.project_id = p.id
                    AND j.id = %s
            ''', [job_id])

            if not u:
                logger.warn('job not found')
                return flask_socketio.disconnect()

            if not u['public']:
                token = get_token()
                if token['type'] == 'user':
                    user_id = token['user']['id']
                    collaborator = is_collaborator(user_id,
                                                   u['project_id'],
                                                   db=conn)

                    if not collaborator:
                        logger.warn('not a collaborator')
                        return flask_socketio.disconnect()
                else:
                    logger.debug('only user token allowed')
                    return flask_socketio.disconnect()
        finally:
            dbpool.put(conn)

        flask_socketio.join_room(job_id)
Example #9
0
    def __listen_jobs(project_id):
        logger.debug('listen:jobs for %s', project_id)

        if not project_id:
            logger.debug('project_id not set')
            return flask_socketio.disconnect()

        try:
            uuid.UUID(project_id)
        except:
            logger.debug('project_id not a uuid')
            return flask_socketio.disconnect()

        conn = dbpool.get()
        try:
            p = conn.execute_one_dict(
                '''
                    SELECT public
                    FROM project
                    WHERE id = %s
                ''', [project_id])

            if not p['public']:
                token = get_token()
                if token['type'] == 'user':
                    user_id = token['user']['id']
                    collaborator = is_collaborator(user_id,
                                                   project_id,
                                                   db=conn)

                    if not collaborator:
                        logger.warn('not a collaborator')
                        return flask_socketio.disconnect()
                else:
                    logger.debug('only user token allowed')
                    return flask_socketio.disconnect()

        finally:
            dbpool.put(conn)

        flask_socketio.join_room(project_id)
Example #10
0
    def __listen_dashboard_console(job_id):
        logger.debug('listen:dashboard-console for %s', job_id)

        if not job_id:
            logger.debug('job_id not set')
            return flask_socketio.disconnect()

        try:
            uuid.UUID(job_id)
        except:
            logger.debug('job_id not a uuid')
            return flask_socketio.disconnect()

        conn = dbpool.get()
        try:
            u = conn.execute_one_dict(
                '''
                SELECT p.public, j.project_id
                FROM project p
                INNER JOIN job j
                    ON j.project_id = p.id
                    AND j.id = %s
            ''', [job_id])

            if not u:
                logger.warn('job not found')
                return flask_socketio.disconnect()

            if not sio_is_authorized(
                ['listen:dashboard-console', u['project_id'], job_id]):
                return flask_socketio.disconnect()

        except:
            logger.exception("Exception occured")
            return flask_socketio.disconnect()
        finally:
            dbpool.put(conn)

        flask_socketio.join_room(job_id)
Example #11
0
    def __listen_build(build_id):
        logger.debug('listen:build for %s', build_id)

        if not build_id:
            logger.debug('build_id not set')
            return flask_socketio.disconnect()

        try:
            uuid.UUID(build_id)
        except:
            logger.debug('build_id not a uuid')
            return flask_socketio.disconnect()

        if not sio_is_authorized(['listen:build', build_id]):
            return flask_socketio.disconnect()

        conn = dbpool.get()
        try:
            token = normalize_token(get_token())

            project_id = token['project']['id']

            build = conn.execute_one(
                '''
                SELECT id
                FROM build
                WHERE project_id = %s AND id = %s
            ''', [project_id, build_id])

            if not build:
                logger.debug('build does not belong to project')
                return flask_socketio.disconnect()
        except:
            logger.exception("Exception occured")
            return flask_socketio.disconnect()
        finally:
            dbpool.put(conn)

        flask_socketio.join_room(build_id)
Example #12
0
    def sio_is_authorized(path):
        g.db = dbpool.get()
        try:
            # Assemble Input Data for Open Policy Agent
            opa_input = {
                "input": {
                    "method": "WS",
                    "path": path,
                    "token": normalize_token(get_token())
                }
            }

            authorized = opa_do_auth(opa_input)
            if not authorized:
                logger.warn("Unauthorized socket.io access attempt")
                return False
            return True
        except RequestException as e:
            logger.error(e)
            return False
        finally:
            dbpool.put(g.db)
            g.db = None
Example #13
0
def __handle_event(event, socketio):
    job_id = event['job_id']

    db = dbpool.get()

    try:
        job = db.execute_one_dict(
            '''
            SELECT id, state, to_char(start_date, 'YYYY-MM-DD HH24:MI:SS') start_date, type, dockerfile,
                   to_char(end_date, 'YYYY-MM-DD HH24:MI:SS') end_date,
                   name, cpu, memory, dependencies, to_char(created_at, 'YYYY-MM-DD HH24:MI:SS') created_at, message,
                   project_id, build_id
            FROM job
            WHERE id = %s
        ''', [job_id])

        if not job:
            return

        project_id = job['project_id']
        build_id = job['build_id']

        project = db.execute_one_dict(
            '''
            SELECT id, name, type
            FROM project
            WHERE id = %s
        ''', [project_id])

        if not project:
            return

        build = db.execute_one_dict(
            '''
            SELECT id, build_number, restart_counter, commit_id
            FROM build
            WHERE id = %s
        ''', [build_id])

        commit_id = build['commit_id']

        commit = None
        pr = None
        if project['type'] in ('gerrit', 'github'):
            commit = db.execute_one_dict(
                '''
		SELECT
                    c.id,
                    split_part(c.message, '\n', 1) as message,
                    c.author_name,
                    c.author_email,
                    c.author_username,
                    c.committer_name,
                    c.committer_email,
                    c.committer_username,
                    c.url,
                    c.branch,
                    c.pull_request_id
		FROM commit c
		WHERE c.id = %s
                AND   c.project_id = %s
            ''', [commit_id, project_id])

            pull_request_id = commit['pull_request_id']

            pr = db.execute_one_dict(
                '''
                SELECT title, url
                FROM pull_request
                WHERE id = %s
                AND   project_id = %s
            ''', [pull_request_id, project_id])

    finally:
        dbpool.put(db)

    msg = {
        'type': event['type'],
        'data': {
            'build': build,
            'project': project,
            'commit': commit,
            'pull_request': pr,
            'job': job
        }
    }

    socketio.emit('notify:job', msg, room=build_id)
    socketio.emit('notify:job', msg, room=project_id)
Example #14
0
 def before_request():
     g.db = dbpool.get()