Ejemplo n.º 1
0
def put_remoteci(user, r_id):
    # get If-Match header
    if_match_etag = utils.check_and_get_etag(flask.request.headers)

    values = schemas.remoteci.put(flask.request.json)

    remoteci = v1_utils.verify_existence_and_get(r_id, _TABLE)

    if 'data' in values:
        remoteci_data = get_remoteci_data_json(user, r_id)
        remoteci_data.update(values['data'])
        values['data'] = {k: v for k, v in remoteci_data.items() if v}

    if not (auth.is_admin(user) or auth.is_in_team(user, remoteci['team_id'])):
        raise auth.UNAUTHORIZED

    values['etag'] = utils.gen_etag()
    where_clause = sql.and_(_TABLE.c.etag == if_match_etag,
                            _TABLE.c.state != 'archived', _TABLE.c.id == r_id)

    query = (_TABLE.update().where(where_clause).values(**values))

    result = flask.g.db_conn.execute(query)

    if not result.rowcount:
        raise dci_exc.DCIConflict('RemoteCI', r_id)

    return flask.Response(None,
                          204,
                          headers={'ETag': values['etag']},
                          content_type='application/json')
Ejemplo n.º 2
0
def delete_remoteci_by_id(user, remoteci_id):
    # get If-Match header
    if_match_etag = utils.check_and_get_etag(flask.request.headers)

    remoteci = v1_utils.verify_existence_and_get(remoteci_id, _TABLE)

    if not (auth.is_admin(user) or auth.is_in_team(user, remoteci['team_id'])):
        raise auth.UNAUTHORIZED

    with flask.g.db_conn.begin():
        values = {'state': 'archived'}
        where_clause = sql.and_(_TABLE.c.etag == if_match_etag,
                                _TABLE.c.id == remoteci_id)
        query = _TABLE.update().where(where_clause).values(**values)

        result = flask.g.db_conn.execute(query)

        if not result.rowcount:
            raise dci_exc.DCIDeleteConflict('RemoteCI', remoteci_id)

        for model in [models.JOBS]:
            query = model.update().where(model.c.remoteci_id == remoteci_id) \
                         .values(**values)
            flask.g.db_conn.execute(query)

    return flask.Response(None, 204, content_type='application/json')
Ejemplo n.º 3
0
def delete_team_by_id(user, t_id):
    # get If-Match header
    if_match_etag = utils.check_and_get_etag(flask.request.headers)
    v1_utils.verify_existence_and_get(t_id, _TABLE)

    if not user.is_in_team(t_id):
        raise auth.UNAUTHORIZED

    with flask.g.db_conn.begin():
        values = {'state': 'archived'}
        where_clause = sql.and_(
            _TABLE.c.etag == if_match_etag,
            _TABLE.c.id == t_id
        )
        query = _TABLE.update().where(where_clause).values(**values)
        result = flask.g.db_conn.execute(query)

        if not result.rowcount:
            raise dci_exc.DCIDeleteConflict('Team', t_id)

        for model in [models.FILES, models.TESTS, models.REMOTECIS,
                      models.USERS, models.JOBS]:
            query = model.update().where(model.c.team_id == t_id).values(
                **values
            )
            flask.g.db_conn.execute(query)

    return flask.Response(None, 204, content_type='application/json')
Ejemplo n.º 4
0
def put_team(user, t_id):
    # get If-Match header
    if_match_etag = utils.check_and_get_etag(flask.request.headers)

    values = schemas.team.put(flask.request.json)

    if not user.is_in_team(t_id):
        raise auth.UNAUTHORIZED

    v1_utils.verify_existence_and_get(t_id, _TABLE)

    values['etag'] = utils.gen_etag()
    where_clause = sql.and_(
        _TABLE.c.etag == if_match_etag,
        _TABLE.c.id == t_id
    )
    query = _TABLE.update().where(where_clause).values(**values)

    result = flask.g.db_conn.execute(query)

    if not result.rowcount:
        raise dci_exc.DCIConflict('Team', t_id)

    return flask.Response(None, 204, headers={'ETag': values['etag']},
                          content_type='application/json')
Ejemplo n.º 5
0
def update_remoteci_keys(user, r_id):
    _CAKEY = dci_config.generate_conf()['CA_KEY']
    _CACERT = dci_config.generate_conf()['CA_CERT']

    etag = utils.check_and_get_etag(flask.request.headers)
    remoteci = v1_utils.verify_existence_and_get(r_id, _TABLE)

    key, cert = v1_utils.get_key_and_cert_signed(_CAKEY, _CACERT)

    values = {}
    keys = {
        'key': crypto.dump_privatekey(crypto.FILETYPE_PEM,
                                      key).decode('utf-8'),
        'cert': crypto.dump_certificate(crypto.FILETYPE_PEM,
                                        cert).decode('utf-8')
    }
    where_clause = sql.and_(_TABLE.c.etag == etag,
                            _TABLE.c.state != 'archived',
                            _TABLE.c.id == remoteci['id'])

    values['etag'] = utils.gen_etag()
    values['cert_fp'] = re.sub(':', '',
                               cert.digest('sha1').decode('utf-8')).lower()

    query = (_TABLE.update().where(where_clause).values(**values))

    flask.g.db_conn.execute(query)

    return flask.Response(json.dumps({'keys': keys}),
                          201,
                          content_type='application/json')
Ejemplo n.º 6
0
def put_remoteci(user, r_id):
    # get If-Match header
    if_match_etag = utils.check_and_get_etag(flask.request.headers)
    values = flask.request.json
    check_json_is_valid(update_remoteci_schema, values)

    remoteci = v1_utils.verify_existence_and_get(r_id, _TABLE)

    if user.is_not_in_team(remoteci['team_id']) and user.is_not_epm():
        raise dci_exc.Unauthorized()

    values['etag'] = utils.gen_etag()
    where_clause = sql.and_(_TABLE.c.etag == if_match_etag,
                            _TABLE.c.state != 'archived', _TABLE.c.id == r_id)

    query = (_TABLE.update().returning(
        *_TABLE.columns).where(where_clause).values(**values))

    result = flask.g.db_conn.execute(query)
    if not result.rowcount:
        raise dci_exc.DCIConflict('RemoteCI', r_id)

    _result = dict(result.fetchone())
    del _result['api_secret']

    return flask.Response(json.dumps({'remoteci': _result}),
                          200,
                          headers={'ETag': values['etag']},
                          content_type='application/json')
Ejemplo n.º 7
0
def delete_issue_by_id(user, issue_id):
    # get If-Match header
    if_match_etag = utils.check_and_get_etag(flask.request.headers)
    v1_utils.verify_existence_and_get(issue_id, _TABLE)

    with flask.g.db_conn.begin():
        values = {'state': 'archived'}
        where_clause = sql.and_(_TABLE.c.etag == if_match_etag,
                                _TABLE.c.id == issue_id)
        query = _TABLE.update().where(where_clause).values(**values)
        result = flask.g.db_conn.execute(query)
        if not result.rowcount:
            raise dci_exc.DCIDeleteConflict('Issue', issue_id)

    return flask.Response(None, 204, content_type='application/json')
Ejemplo n.º 8
0
def update_job_by_id(user, job_id):
    """Update a job
    """
    # get If-Match header
    if_match_etag = utils.check_and_get_etag(flask.request.headers)

    # get the diverse parameters
    values = schemas.job.put(flask.request.json)

    job = v1_utils.verify_existence_and_get(job_id, _TABLE)

    # If it's an admin or belongs to the same team
    if not(auth.is_admin(user) or auth.is_in_team(user, job['team_id'])):
        raise auth.UNAUTHORIZED

    # Update jobstate if needed
    status = values.get('status')
    if status and job.status != status:
        jobstates.insert_jobstate(user, {
            'status': status,
            'job_id': job_id
        })

    where_clause = sql.and_(_TABLE.c.etag == if_match_etag,
                            _TABLE.c.id == job_id)

    values['etag'] = utils.gen_etag()
    query = _TABLE.update().where(where_clause).values(**values)

    result = flask.g.db_conn.execute(query)

    if not result.rowcount:
        raise dci_exc.DCIConflict('Job', job_id)
    if values.get('status') == "failure":
        _TEAMS = models.TEAMS
        where_clause = sql.expression.and_(
            _TEAMS.c.id == job['team_id']
        )
        query = (sql.select([_TEAMS]).where(where_clause))
        team_info = flask.g.db_conn.execute(query).fetchone()
        if team_info['notification'] is True:
            if team_info['email'] is not None:
                msg = {'event': 'notification',
                       'email': team_info['email'],
                       'job_id': str(job['id'])}
                flask.g.sender.send_json(msg)
    return flask.Response(None, 204, headers={'ETag': values['etag']},
                          content_type='application/json')
Ejemplo n.º 9
0
def put_current_sequence(user):
    if user.is_not_super_admin():
        raise dci_exc.Unauthorized()

    # get If-Match header
    if_match_etag = utils.check_and_get_etag(flask.request.headers)
    values = flask.request.json
    check_json_is_valid(counter_schema, values)
    etag = utils.gen_etag()
    q_update = models.COUNTER.update().\
        where(sql.and_(models.COUNTER.c.name == 'jobs_events',
                       models.COUNTER.c.etag == if_match_etag)).\
        values(sequence=values['sequence'],
               etag=etag)
    result = flask.g.db_conn.execute(q_update)
    if not result.rowcount:
        raise dci_exc.DCIConflict('jobs_events', 'sequence')

    return flask.Response(None, 204, content_type='application/json')
Ejemplo n.º 10
0
def delete_feeder_by_id(user, f_id):
    if_match_etag = utils.check_and_get_etag(flask.request.headers)
    feeder = v1_utils.verify_existence_and_get(f_id, _TABLE)

    if not user.is_in_team(feeder['team_id']):
        raise auth.UNAUTHORIZED

    with flask.g.db_conn.begin():
        values = {'state': 'archived'}
        where_clause = sql.and_(_TABLE.c.etag == if_match_etag,
                                _TABLE.c.id == f_id)
        query = _TABLE.update().where(where_clause).values(**values)

        result = flask.g.db_conn.execute(query)

        if not result.rowcount:
            raise dci_exc.DCIDeleteConflict('Feeder', f_id)

    return flask.Response(None, 204, content_type='application/json')
Ejemplo n.º 11
0
def delete_user_by_id(user, user_id):
    # get If-Match header
    if_match_etag = utils.check_and_get_etag(flask.request.headers)

    duser = _verify_existence_and_get_user(user_id)

    if not (auth.is_admin(user) or auth.is_admin_user(user, duser['team_id'])):
        raise auth.UNAUTHORIZED

    values = {'state': 'archived'}
    where_clause = sql.and_(_TABLE.c.etag == if_match_etag,
                            _TABLE.c.id == user_id)
    query = _TABLE.update().where(where_clause).values(**values)

    result = flask.g.db_conn.execute(query)

    if not result.rowcount:
        raise dci_exc.DCIDeleteConflict('User', user_id)

    return flask.Response(None, 204, content_type='application/json')
Ejemplo n.º 12
0
def update_permission(user, permission_id):
    # get If-Match header
    if_match_etag = utils.check_and_get_etag(flask.request.headers)
    values = schemas.permission.put(flask.request.json)
    v1_utils.verify_existence_and_get(permission_id, _TABLE)

    values['etag'] = utils.gen_etag()
    where_clause = sql.and_(_TABLE.c.etag == if_match_etag,
                            _TABLE.c.id == permission_id)
    query = _TABLE.update().where(where_clause).values(**values)

    result = flask.g.db_conn.execute(query)

    if not result.rowcount:
        raise dci_exc.DCIConflict('Permission update error', permission_id)

    return flask.Response(None,
                          204,
                          headers={'ETag': values['etag']},
                          content_type='application/json')
Ejemplo n.º 13
0
def delete_product_by_id(user, product_id):
    # get If-Match header
    if_match_etag = utils.check_and_get_etag(flask.request.headers)

    if user.is_not_super_admin():
        raise dci_exc.Unauthorized()

    v1_utils.verify_existence_and_get(product_id, _TABLE)

    values = {'state': 'archived'}
    where_clause = sql.and_(_TABLE.c.etag == if_match_etag,
                            _TABLE.c.id == product_id)

    query = _TABLE.update().where(where_clause).values(**values)

    result = flask.g.db_conn.execute(query)

    if not result.rowcount:
        raise dci_exc.DCIConflict('Product deletion error', product_id)

    return flask.Response(None, 204, content_type='application/json')
Ejemplo n.º 14
0
def put_identity(user):
    if_match_etag = utils.check_and_get_etag(flask.request.headers)
    values = flask.request.json
    check_json_is_valid(update_current_user_schema, values)

    if user.is_not_read_only_user():
        current_password = values['current_password']
        encrypted_password = user.password
        if not auth.check_passwords_equal(current_password,
                                          encrypted_password):
            raise dci_exc.DCIException('current_password invalid')

    new_values = {}
    new_password = values.get('new_password')
    if new_password:
        encrypted_password = auth.hash_password(new_password)
        new_values['password'] = encrypted_password

    etag = utils.gen_etag()
    new_values.update({
        'etag': etag,
        'fullname': values.get('fullname') or user.fullname,
        'email': values.get('email') or user.email,
        'timezone': values.get('timezone') or user.timezone
    })

    query = _TABLE.update().returning(*_TABLE.columns).where(
        sql.and_(_TABLE.c.etag == if_match_etag,
                 _TABLE.c.id == user.id)).values(new_values)

    result = flask.g.db_conn.execute(query)
    if not result.rowcount:
        raise dci_exc.DCIConflict('User', user.id)
    _result = dict(result.fetchone())
    del _result['password']

    return flask.Response(json.dumps({'user': _result}),
                          200,
                          headers={'ETag': etag},
                          content_type='application/json')
Ejemplo n.º 15
0
def update_tests(user, t_id):
    v1_utils.verify_existence_and_get(t_id, _TABLE)
    if_match_etag = utils.check_and_get_etag(flask.request.headers)

    values = flask.request.json
    check_json_is_valid(update_test_schema, values)
    values['etag'] = utils.gen_etag()

    where_clause = sql.and_(_TABLE.c.etag == if_match_etag,
                            _TABLE.c.id == t_id)

    query = _TABLE.update().returning(*_TABLE.columns).\
        where(where_clause).values(**values)

    result = flask.g.db_conn.execute(query)
    if not result.rowcount:
        raise dci_exc.DCIConflict('Test', t_id)

    return flask.Response(json.dumps({'test': result.fetchone()}),
                          200,
                          headers={'ETag': values['etag']},
                          content_type='application/json')
Ejemplo n.º 16
0
def delete_permission_by_id(user, permission_id):
    if not auth.is_admin(user):
        raise auth.UNAUTHORIZED

    # get If-Match header
    if_match_etag = utils.check_and_get_etag(flask.request.headers)
    v1_utils.verify_existence_and_get(permission_id, _TABLE)

    values = {'state': 'archived'}
    where_clause = sql.and_(
        _TABLE.c.etag == if_match_etag,
        _TABLE.c.id == permission_id
    )

    query = _TABLE.update().where(where_clause).values(**values)

    result = flask.g.db_conn.execute(query)

    if not result.rowcount:
        raise dci_exc.DCIConflict('Permission deletion error',
                                  permission_id)

    return flask.Response(None, 204, content_type='application/json')
Ejemplo n.º 17
0
def put_feeder(user, f_id):
    if_match_etag = utils.check_and_get_etag(flask.request.headers)
    values = schemas.feeder.put(flask.request.json)
    feeder = v1_utils.verify_existence_and_get(f_id, _TABLE)

    if not user.is_in_team(feeder['team_id']):
        raise auth.UNAUTHORIZED

    values['etag'] = utils.gen_etag()
    where_clause = sql.and_(_TABLE.c.etag == if_match_etag,
                            _TABLE.c.state != 'archived', _TABLE.c.id == f_id)

    query = (_TABLE.update().where(where_clause).values(**values))

    result = flask.g.db_conn.execute(query)

    if not result.rowcount:
        raise dci_exc.DCIConflict('Feeder', f_id)

    return flask.Response(None,
                          204,
                          headers={'ETag': values['etag']},
                          content_type='application/json')
Ejemplo n.º 18
0
def update_components(user, c_id):
    if not auth.is_admin(user):
        raise auth.UNAUTHORIZED

    v1_utils.verify_existence_and_get(c_id, _TABLE)
    if_match_etag = utils.check_and_get_etag(flask.request.headers)

    values = schemas.component.put(flask.request.json)
    values['etag'] = utils.gen_etag()

    where_clause = sql.and_(_TABLE.c.etag == if_match_etag,
                            _TABLE.c.id == c_id)

    query = _TABLE.update().where(where_clause).values(**values)

    result = flask.g.db_conn.execute(query)
    if not result.rowcount:
        raise dci_exc.DCIConflict('Component', c_id)

    return flask.Response(None,
                          204,
                          headers={'ETag': values['etag']},
                          content_type='application/json')
Ejemplo n.º 19
0
def update_job_by_id(user, job_id):
    """Update a job
    """
    # get If-Match header
    if_match_etag = utils.check_and_get_etag(flask.request.headers)

    values = flask.request.json
    check_json_is_valid(update_job_schema, values)

    job = v1_utils.verify_existence_and_get(job_id, _TABLE)
    job = dict(job)

    if user.is_not_in_team(job['team_id']) and user.is_not_epm():
        raise dci_exc.Unauthorized()

    # Update jobstate if needed
    status = values.get('status')
    if status and job.get('status') != status:
        jobstates.insert_jobstate(user, {'status': status, 'job_id': job_id})
        if status in models.FINAL_STATUSES:
            jobs_events.create_event(job_id, status, job['topic_id'])

    where_clause = sql.and_(_TABLE.c.etag == if_match_etag,
                            _TABLE.c.id == job_id)

    values['etag'] = utils.gen_etag()
    query = _TABLE.update().returning(*_TABLE.columns).\
        where(where_clause).values(**values)

    result = flask.g.db_conn.execute(query)
    if not result.rowcount:
        raise dci_exc.DCIConflict('Job', job_id)

    return flask.Response(json.dumps({'job': result.fetchone()}),
                          200,
                          headers={'ETag': values['etag']},
                          content_type='application/json')
Ejemplo n.º 20
0
def put_topic(user, topic_id):
    # get If-Match header
    if_match_etag = utils.check_and_get_etag(flask.request.headers)
    values = flask.request.json
    check_json_is_valid(update_topic_schema, values)

    if user.is_not_super_admin() and user.is_not_epm() and user.is_not_feeder(
    ):  # noqa
        raise dci_exc.Unauthorized()

    values['etag'] = utils.gen_etag()
    where_clause = sql.and_(_TABLE.c.etag == if_match_etag,
                            _TABLE.c.id == topic_id)
    query = _TABLE.update().returning(*_TABLE.columns).\
        where(where_clause).values(**values)

    result = flask.g.db_conn.execute(query)
    if not result.rowcount:
        raise dci_exc.DCIConflict('Topic', topic_id)

    return flask.Response(json.dumps({'topic': result.fetchone()}),
                          200,
                          headers={'ETag': values['etag']},
                          content_type='application/json')