コード例 #1
0
def create_meta(user, job_id):
    """Create a meta information associated to a specific job."""
    v1_utils.verify_existence_and_get(job_id, models.JOBS)

    values = v1_utils.common_values_dict(user)
    values.update(schemas.meta.post(flask.request.json))

    values.update({
        'job_id': job_id
    })

    with flask.g.db_conn.begin():
        where_clause = sql.and_(
            _TABLE.c.name == values['name'],
            _TABLE.c.job_id == values['job_id'])
        query = sql.select([_TABLE.c.id]).where(where_clause)
        if flask.g.db_conn.execute(query).fetchone():
            raise dci_exc.DCIConflict('Meta already exists', values['name'])

        # create the label/value row
        query = _TABLE.insert().values(**values)
        flask.g.db_conn.execute(query)
        result = json.dumps({'meta': values})
        return flask.Response(result, 201,
                              headers={'ETag': values['etag']},
                              content_type='application/json')
コード例 #2
0
def create_configuration(user, r_id):
    values_configuration = v1_utils.common_values_dict(user)
    values_configuration.update(
        schemas.rconfiguration.post(flask.request.json))
    values_configuration.update(flask.request.json)

    remoteci = v1_utils.verify_existence_and_get(r_id, _TABLE)

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

    rconfiguration_id = values_configuration.get('id')

    with flask.g.db_conn.begin():
        try:
            # insert configuration
            query = _RCONFIGURATIONS.insert().\
                values(**values_configuration)
            flask.g.db_conn.execute(query)
            # insert join between rconfiguration and remoteci
            values_join = {
                'rconfiguration_id': rconfiguration_id,
                'remoteci_id': r_id}
            query = models.JOIN_REMOTECIS_RCONFIGURATIONS.insert().\
                values(**values_join)
            flask.g.db_conn.execute(query)
        except sa_exc.IntegrityError as ie:
            raise dci_exc.DCIException('Integrity Error: %s' % str(ie))

    return flask.Response(
        json.dumps({'rconfiguration': values_configuration}), 201,
        headers={'ETag': values_configuration['etag']},
        content_type='application/json'
    )
コード例 #3
0
def create_feeders(user):
    values = v1_utils.common_values_dict(user)
    values.update(schemas.feeder.post(flask.request.json))

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

    values.update({
        # XXX(fc): this should be populated as a default value from the
        # model, but we don't return values from the database :(
        'api_secret': signature.gen_secret(),
        'role_id': auth.get_role_id('FEEDER'),
        'data': values.get('data', {}),
    })

    query = _TABLE.insert().values(**values)

    try:
        flask.g.db_conn.execute(query)
    except sa_exc.IntegrityError:
        raise dci_exc.DCICreationConflict(_TABLE.name, 'name')

    return flask.Response(json.dumps({'feeder': values}),
                          201,
                          headers={'ETag': values['etag']},
                          content_type='application/json')
コード例 #4
0
def create_feeders(user):
    values = flask.request.json
    check_json_is_valid(create_feeder_schema, values)
    values.update(v1_utils.common_values_dict())

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

    values.update({
        # XXX(fc): this should be populated as a default value from the
        # model, but we don't return values from the database :(
        'api_secret': signature.gen_secret(),
        'data': values.get('data', {}),
    })

    query = _TABLE.insert().values(**values)

    try:
        flask.g.db_conn.execute(query)
    except sa_exc.IntegrityError:
        raise dci_exc.DCICreationConflict(_TABLE.name, 'name')

    return flask.Response(json.dumps({'feeder': values}),
                          201,
                          headers={'ETag': values['etag']},
                          content_type='application/json')
コード例 #5
0
def create_users(user):
    values = v1_utils.common_values_dict(user)
    values.update(schemas.user.post(flask.request.json))

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

    role_id = values.get('role_id', auth.get_role_id('USER'))
    if not auth.is_admin(user) and role_id == auth.get_role_id('SUPER_ADMIN'):
        raise auth.UNAUTHORIZED

    values.update({
        'password': auth.hash_password(values.get('password')),
        'role_id': role_id
    })

    query = _TABLE.insert().values(**values)

    try:
        flask.g.db_conn.execute(query)
    except sa_exc.IntegrityError:
        raise dci_exc.DCICreationConflict(_TABLE.name, 'name')

    # remove the password in the result for security reasons
    del values['password']

    return flask.Response(json.dumps({'user': values}),
                          201,
                          headers={'ETag': values['etag']},
                          content_type='application/json')
コード例 #6
0
def create_remotecis(user):
    values = v1_utils.common_values_dict(user)
    values.update(schemas.remoteci.post(flask.request.json))

    # If it's not a super admin nor belongs to the same team_id
    if not (auth.is_admin(user)
            or auth.is_in_team(user, values.get('team_id'))):
        raise auth.UNAUTHORIZED

    values.update({
        'data': values.get('data', {}),
        # XXX(fc): this should be populated as a default value from the
        # model, but we don't return values from the database :(
        'api_secret': signature.gen_secret(),
    })

    query = _TABLE.insert().values(**values)

    try:
        flask.g.db_conn.execute(query)
    except sa_exc.IntegrityError:
        raise dci_exc.DCICreationConflict(_TABLE.name, 'name')

    return flask.Response(json.dumps({'remoteci': values}),
                          201,
                          headers={'ETag': values['etag']},
                          content_type='application/json')
コード例 #7
0
ファイル: users.py プロジェクト: asergienk/dci-control-server
def create_users(user):
    values = flask.request.json
    check_json_is_valid(create_user_schema, values)
    values.update(v1_utils.common_values_dict())

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

    values.update({
        'password': auth.hash_password(values.get('password')),
        'fullname': values.get('fullname', values['name']),
        'timezone': values.get('timezone', 'UTC'),
        'sso_username': None
    })

    query = _TABLE.insert().values(**values)

    try:
        flask.g.db_conn.execute(query)
    except sa_exc.IntegrityError:
        raise dci_exc.DCICreationConflict(_TABLE.name, 'name')

    # remove the password in the result for security reasons
    del values['password']

    return flask.Response(json.dumps({'user': values}),
                          201,
                          headers={'ETag': values['etag']},
                          content_type='application/json')
コード例 #8
0
def create_topics(user):
    values = flask.request.json
    check_json_is_valid(create_topic_schema, values)
    values.update(v1_utils.common_values_dict())

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

    # todo(yassine): enabled when client updated.
    # if values['component_types'] == []:
    #     raise dci_exc.DCIException('component_types should not be void')

    query = _TABLE.insert().values(**values)

    try:
        flask.g.db_conn.execute(query)
    except sa_exc.IntegrityError:
        raise dci_exc.DCICreationConflict(_TABLE.name, 'name')

    result = json.dumps({'topic': values})
    return flask.Response(result,
                          201,
                          headers={'ETag': values['etag']},
                          content_type='application/json')
コード例 #9
0
def create_jobs(user):
    values = flask.request.json
    check_json_is_valid(create_job_schema, values)
    values.update(v1_utils.common_values_dict())

    components_ids = values.pop('components')

    if user.is_not_remoteci():
        raise dci_exc.DCIException('Only remoteci can create job')

    topic_id = values.get('topic_id')
    topic = v1_utils.verify_existence_and_get(topic_id, models.TOPICS)
    export_control.verify_access_to_topic(user, topic)
    previous_job_id = values.get('previous_job_id')
    if previous_job_id:
        v1_utils.verify_existence_and_get(previous_job_id, _TABLE)

    values.update({
        'status':
        'new',
        'remoteci_id':
        user.id,
        'topic_id':
        topic_id,
        'user_agent':
        flask.request.environ.get('HTTP_USER_AGENT'),
        'client_version':
        flask.request.environ.get('HTTP_CLIENT_VERSION'),
        'previous_job_id':
        previous_job_id,
        'team_id':
        user.teams_ids[0],
        'product_id':
        topic['product_id'],
        'duration':
        0
    })

    # create the job and feed the jobs_components table
    with flask.g.db_conn.begin():
        query = _TABLE.insert().values(**values)
        flask.g.db_conn.execute(query)

        jobs_components_to_insert = []
        for cmpt_id in components_ids:
            v1_utils.verify_existence_and_get(cmpt_id, models.COMPONENTS)
            jobs_components_to_insert.append({
                'job_id': values['id'],
                'component_id': cmpt_id
            })
        if jobs_components_to_insert:
            flask.g.db_conn.execute(models.JOIN_JOBS_COMPONENTS.insert(),
                                    jobs_components_to_insert)

    return flask.Response(json.dumps({'job': values}),
                          201,
                          headers={'ETag': values['etag']},
                          content_type='application/json')
コード例 #10
0
def create_tests(user):
    values = v1_utils.common_values_dict(user)
    values.update(schemas.test.post(flask.request.json))

    query = _TABLE.insert().values(**values)

    try:
        flask.g.db_conn.execute(query)
    except sa_exc.IntegrityError:
        raise dci_exc.DCICreationConflict(_TABLE.name, 'name')

    return flask.Response(json.dumps({'test': values}),
                          201,
                          content_type='application/json')
コード例 #11
0
def create_components(user):
    if not auth.is_admin(user):
        raise auth.UNAUTHORIZED

    values = v1_utils.common_values_dict(user)
    values.update(schemas.component.post(flask.request.json))

    query = _TABLE.insert().values(**values)

    try:
        flask.g.db_conn.execute(query)
    except sa_exc.IntegrityError:
        raise dci_exc.DCICreationConflict(_TABLE.name, 'name')

    result = json.dumps({'component': values})
    return flask.Response(result, 201, content_type='application/json')
コード例 #12
0
def create_components(user):
    values = flask.request.json
    check_json_is_valid(create_component_schema, values)
    values.update(v1_utils.common_values_dict())

    if str(values['topic_id']) not in v1_utils.user_topic_ids(user):
        raise dci_exc.Unauthorized()

    query = _TABLE.insert().values(**values)

    try:
        flask.g.db_conn.execute(query)
    except sa_exc.IntegrityError:
        raise dci_exc.DCICreationConflict(_TABLE.name, 'name')

    result = json.dumps({'component': values})
    return flask.Response(result, 201, content_type='application/json')
コード例 #13
0
def create_jobdefinitions(user):
    values = v1_utils.common_values_dict(user)
    values.update(schemas.jobdefinition.post(flask.request.json))

    query = _TABLE.insert().values(**values)

    try:
        flask.g.db_conn.execute(query)
    except sa_exc.IntegrityError as e:
        raise dci_exc.DCIException("Integrity error on 'test_id' field.",
                                   payload=str(e))

    result = json.dumps({'jobdefinition': values})
    return flask.Response(result,
                          201,
                          headers={'ETag': values['etag']},
                          content_type='application/json')
コード例 #14
0
ファイル: roles.py プロジェクト: Kryndex/dci-control-server
def create_roles(user):
    values = v1_utils.common_values_dict(user)
    values.update(schemas.role.post(flask.request.json))

    if not values['label']:
        values.update({'label': values['name'].upper()})

    query = _TABLE.insert().values(**values)

    try:
        flask.g.db_conn.execute(query)
    except sa_exc.IntegrityError:
        raise dci_exc.DCICreationConflict(_TABLE.name, 'name')

    return flask.Response(json.dumps({'role': values}),
                          201,
                          headers={'ETag': values['etag']},
                          content_type='application/json')
コード例 #15
0
def create_teams(user):
    values = v1_utils.common_values_dict(user)
    values.update(schemas.team.post(flask.request.json))

    if not auth.is_admin(user):
        raise auth.UNAUTHORIZED

    query = _TABLE.insert().values(**values)

    try:
        flask.g.db_conn.execute(query)
    except sa_exc.IntegrityError:
        raise dci_exc.DCICreationConflict(_TABLE.name, 'name')

    return flask.Response(json.dumps({'team': values}),
                          201,
                          headers={'ETag': values['etag']},
                          content_type='application/json')
コード例 #16
0
ファイル: teams.py プロジェクト: asergienk/dci-control-server
def create_teams(user):
    values = flask.request.json
    check_json_is_valid(create_team_schema, values)
    values.update(v1_utils.common_values_dict())

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

    query = _TABLE.insert().values(**values)

    try:
        flask.g.db_conn.execute(query)
    except sa_exc.IntegrityError:
        raise dci_exc.DCICreationConflict(_TABLE.name, 'name')

    return flask.Response(
        json.dumps({'team': values}), 201,
        headers={'ETag': values['etag']}, content_type='application/json'
    )
コード例 #17
0
def create_tests(user):
    values = flask.request.json
    check_json_is_valid(create_test_schema, values)
    values.update(v1_utils.common_values_dict())

    # todo: remove team_id
    if 'team_id' in values:
        del values['team_id']

    query = _TABLE.insert().values(**values)

    try:
        flask.g.db_conn.execute(query)
    except sa_exc.IntegrityError:
        raise dci_exc.DCICreationConflict(_TABLE.name, 'name')

    return flask.Response(json.dumps({'test': values}),
                          201,
                          content_type='application/json')
コード例 #18
0
ファイル: teams.py プロジェクト: Kryndex/dci-control-server
def create_teams(user):
    values = v1_utils.common_values_dict(user)
    values.update(schemas.team.post(flask.request.json))

    if not values['parent_id'] or \
       (user.is_product_owner() and values['parent_id'] != user.team_id):
        values['parent_id'] = user.team_id

    query = _TABLE.insert().values(**values)

    try:
        flask.g.db_conn.execute(query)
    except sa_exc.IntegrityError:
        raise dci_exc.DCICreationConflict(_TABLE.name, 'name')

    return flask.Response(
        json.dumps({'team': values}), 201,
        headers={'ETag': values['etag']}, content_type='application/json'
    )
コード例 #19
0
def create_jobs(user):
    values = v1_utils.common_values_dict(user)
    values.update(schemas.job.post(flask.request.json))
    components_ids = values.pop('components')

    values['team_id'] = values.get('team_id', user['team_id'])
    # Only super admin can create job for other teams
    if not user.is_super_admin() and not user.is_in_team(values['team_id']):
        raise auth.UNAUTHORIZED

    if values['topic_id'] is not None:
        v1_utils.verify_team_in_topic(user, values['topic_id'])

    values.update({
        'status': 'new',
        'topic_id': values['topic_id'],
        'rconfiguration_id': values['rconfiguration_id'],
        'user_agent': flask.request.environ.get('HTTP_USER_AGENT'),
        'client_version': flask.request.environ.get(
            'HTTP_CLIENT_VERSION'
        ),
    })

    # create the job and feed the jobs_components table
    with flask.g.db_conn.begin():
        query = _TABLE.insert().values(**values)
        flask.g.db_conn.execute(query)

        jobs_components_to_insert = []
        for cmpt_id in components_ids:
            v1_utils.verify_existence_and_get(cmpt_id, models.COMPONENTS)
            jobs_components_to_insert.append({'job_id': values['id'],
                                              'component_id': cmpt_id})
        if jobs_components_to_insert:
            flask.g.db_conn.execute(models.JOIN_JOBS_COMPONENTS.insert(),
                                    jobs_components_to_insert)

    return flask.Response(json.dumps({'job': values}), 201,
                          headers={'ETag': values['etag']},
                          content_type='application/json')
コード例 #20
0
def create_topics(user):
    values = v1_utils.common_values_dict(user)
    values.update(schemas.topic.post(flask.request.json))

    if not user.is_super_admin() and \
       not ((user.is_product_owner() or user.is_feeder()) and
            user.product_id == values['product_id']):
        raise auth.UNAUTHORIZED

    # todo(yassine): enabled when client updated.
    # if values['component_types'] == []:
    #     raise dci_exc.DCIException('component_types should not be void')

    query = _TABLE.insert().values(**values)

    try:
        flask.g.db_conn.execute(query)
    except sa_exc.IntegrityError:
        raise dci_exc.DCICreationConflict(_TABLE.name, 'name')

    result = json.dumps({'topic': values})
    return flask.Response(result, 201, headers={'ETag': values['etag']},
                          content_type='application/json')
コード例 #21
0
def _get_or_create_issue(data):
    values = v1_utils.common_values_dict()
    values.update(data)
    if 'github.com' in values['url']:
        type = 'github'
    else:
        type = 'bugzilla'
    values['tracker'] = type

    # First, insert the issue if it doesn't already exist
    # in the issues table. If it already exists, ignore the
    # exceptions, and keep proceeding.
    query = _TABLE.insert().returning(*_TABLE.columns).values(**values)
    try:
        return flask.g.db_conn.execute(query).fetchone()
    except sa_exc.IntegrityError:
        # It is not a real failure it the issue have been tried
        # to inserted a second time. As long as it is once, we are
        # good to proceed
        query = (sql.select([_TABLE]).where(
            sql.and_(_TABLE.c.url == values['url'],
                     _TABLE.c.topic_id == values['topic_id'])))
        return flask.g.db_conn.execute(query).fetchone()