예제 #1
0
def upsert_build(repository: Repository,
                 provider: str,
                 external_id: str,
                 data: dict = None) -> Response:
    lock_key = 'hook:build:{repo_id}:{provider}:{build_xid}'.format(
        repo_id=repository.id,
        provider=provider,
        build_xid=external_id,
    )
    with redis.lock(lock_key):
        json = data.copy() if data else {}
        json['external_id'] = external_id
        json['provider'] = provider

        build = Build.query.filter(
            Build.provider == provider,
            Build.external_id == external_id,
        ).first()

        if build:
            return client.put('/repos/{}/builds/{}'.format(
                repository.get_full_name(),
                build.number,
            ),
                              json=json)
        return client.post('/repos/{}/builds'.format(
            repository.get_full_name(), ),
                           json=json)
예제 #2
0
def upsert_job(build: Build,
               provider: str,
               external_id: str,
               data: dict = None) -> Response:
    lock_key = 'upsert:job:{build_id}:{provider}:{job_xid}'.format(
        build_id=build.id,
        provider=provider,
        job_xid=external_id,
    )
    with redis.lock(lock_key):
        json = data.copy() if data else {}
        json['external_id'] = external_id
        json['provider'] = provider

        job = Job.query.filter(
            Job.provider == provider,
            Job.external_id == external_id,
            Job.build_id == build.id,
        ).first()

        if job:
            return client.put('/repos/{}/builds/{}/jobs/{}'.format(
                build.repository.get_full_name(),
                job.build.number,
                job.number,
            ),
                              json=json)

        return client.post('/repos/{}/builds/{}/jobs'.format(
            build.repository.get_full_name(),
            build.number,
        ),
                           json=json)
예제 #3
0
    def post(self, hook, build_xid, job_xid):
        build = Build.query.filter(
            Build.provider == hook.provider,
            Build.external_id == build_xid,
        ).first()
        if not build:
            return self.respond('', 404)

        job = Job.query.filter(
            Job.provider == hook.provider,
            Job.external_id == job_xid,
            Job.build_id == build.id,
        ).first()

        json = request.get_json() or {}
        json['external_id'] = job_xid
        json['provider'] = hook.provider

        if job:
            response = client.put('/repos/{}/{}/builds/{}/jobs/{}'.format(
                hook.repository.owner_name,
                hook.repository.name,
                job.build.number,
                job.number,
            ),
                                  json=json)
        else:
            response = client.post('/repos/{}/{}/builds/{}/jobs'.format(
                hook.repository.owner_name,
                hook.repository.name,
                build.number,
            ),
                                   json=json)

        return response
예제 #4
0
def upsert_change_request(repository: Repository,
                          provider: str,
                          external_id: str,
                          data: dict = None) -> Response:
    lock_key = "hook:cr:{repo_id}:{provider}:{cr_xid}".format(
        repo_id=repository.id, provider=provider, cr_xid=external_id)
    with redis.lock(lock_key):
        json = data.copy() if data else {}
        json["external_id"] = external_id
        json["provider"] = provider

        cr = ChangeRequest.query.filter(
            ChangeRequest.repository_id == repository.id,
            ChangeRequest.provider == provider,
            ChangeRequest.external_id == external_id,
        ).first()

        if cr:
            return client.put(
                "/repos/{}/change-requests/{}".format(
                    repository.get_full_name(), cr.number),
                json=json,
            )

        return client.post("/repos/{}/change-requests".format(
            repository.get_full_name()),
                           json=json)
예제 #5
0
def upsert_job(build: Build,
               hook: Hook,
               external_id: str,
               data: dict = None) -> Response:
    provider_name = hook.get_provider().get_name(hook.config)
    lock_key = "upsert:job:{build_id}:{provider}:{job_xid}".format(
        build_id=build.id, provider=provider_name, job_xid=external_id)
    with redis.lock(lock_key):
        json = data.copy() if data else {}
        json["external_id"] = external_id
        json["provider"] = provider_name
        json["hook_id"] = str(hook.id)

        job = Job.query.filter(
            Job.provider == provider_name,
            Job.external_id == external_id,
            Job.build_id == build.id,
        ).first()

        if job:
            return client.put(
                "/repos/{}/builds/{}/jobs/{}".format(
                    build.repository.get_full_name(), job.build.number,
                    job.number),
                json=json,
            )

        return client.post(
            "/repos/{}/builds/{}/jobs".format(build.repository.get_full_name(),
                                              build.number),
            json=json,
        )
예제 #6
0
def upsert_build(hook: Hook, external_id: str, data: dict = None) -> Response:
    provider_name = hook.get_provider().get_name(hook.config)
    lock_key = "hook:build:{repo_id}:{provider}:{build_xid}".format(
        repo_id=hook.repository_id,
        provider=provider_name,
        build_xid=external_id)
    with redis.lock(lock_key):
        json = data.copy() if data else {}
        json["external_id"] = external_id
        json["provider"] = provider_name
        json["hook_id"] = str(hook.id)

        build = Build.query.filter(Build.provider == provider_name,
                                   Build.external_id == external_id).first()

        if build:
            return client.put(
                "/repos/{}/builds/{}".format(hook.repository.get_full_name(),
                                             build.number),
                json=json,
            )

        return client.post("/repos/{}/builds".format(
            hook.repository.get_full_name()),
                           json=json)
예제 #7
0
파일: upserts.py 프로젝트: jensneuhaus/zeus
def upsert_build(hook: Hook, external_id: str, data: dict = None) -> Response:
    provider_name = hook.get_provider().get_name(hook.config)
    lock_key = "hook:build:{repo_id}:{provider}:{build_xid}".format(
        repo_id=hook.repository_id, provider=provider_name, build_xid=external_id
    )
    # TODO (here and in other upsert_* functions): it's better to move all the locking
    # code to async tasks.
    with redis.lock(lock_key, timeout=BUILD_LOCK_TIMEOUT, expire=30):
        json = data.copy() if data else {}
        json["external_id"] = external_id
        json["provider"] = provider_name
        json["hook_id"] = str(hook.id)

        build = Build.query.filter(
            Build.provider == provider_name, Build.external_id == external_id
        ).first()

        if build:
            return client.put(
                "/repos/{}/builds/{}".format(
                    hook.repository.get_full_name(), build.number
                ),
                json=json,
            )

        return client.post(
            "/repos/{}/builds".format(hook.repository.get_full_name()), json=json
        )
예제 #8
0
    def post(self, hook, build_xid):
        build = Build.query.filter(
            Build.provider == hook.provider,
            Build.external_id == build_xid,
        ).first()

        json = request.get_json() or {}
        json['external_id'] = build_xid
        json['provider'] = hook.provider

        if build:
            response = client.put(
                '/repos/{}/builds/{}'.format(
                    hook.repository.get_full_name(),
                    build.number,
                ),
                json=json
            )
        else:
            response = client.post(
                '/repos/{}/builds'.format(
                    hook.repository.get_full_name(),
                ),
                json=json
            )

        return response
예제 #9
0
파일: job_artifacts.py 프로젝트: kaiix/zeus
    def post(self, hook, build_xid, job_xid):
        build = Build.query.filter(
            Build.provider == hook.provider,
            Build.external_id == build_xid,
        ).first()
        if not build:
            return self.respond('', 404)

        job = Job.query.filter(
            Job.provider == hook.provider,
            Job.external_id == job_xid,
            Job.build_id == build.id,
        ).first()
        if not job:
            return self.respond('', 404)

        return client.post(
            '/repos/{}/{}/builds/{}/jobs/{}/artifacts'.format(
                hook.repository.owner_name,
                hook.repository.name,
                job.build.number,
                job.number,
            ),
            request=request,
        )
예제 #10
0
파일: build.py 프로젝트: sfermigier/zeus
    def post(self, hook, build_xid):
        build = Build.query.filter(
            Build.organization_id == hook.organization_id,
            Build.project_id == hook.project_id,
            Build.provider == hook.provider,
            Build.external_id == build_xid,
        ).first()

        json = request.get_json() or {}
        json['external_id'] = build_xid
        json['provider'] = hook.provider

        if build:
            response = client.put('/projects/{}/{}/builds/{}'.format(
                hook.organization.name,
                hook.project.name,
                build.number,
            ),
                                  json=json)
        else:
            response = client.post('/projects/{}/{}/builds'.format(
                hook.organization.name,
                hook.project.name,
            ),
                                   json=json)

        return response
예제 #11
0
    def post(self, hook, build_xid, job_xid):
        provider_name = hook.get_provider().get_name(hook.config)
        build = Build.query.filter(
            Build.provider == provider_name, Build.external_id == build_xid
        ).first()
        if not build:
            return self.handle_async(hook, build_xid, job_xid)

        job = Job.query.filter(
            Job.provider == provider_name,
            Job.external_id == job_xid,
            Job.build_id == build.id,
        ).first()
        if not job:
            return self.handle_async(hook, build_xid, job_xid)

        return client.post(
            "/repos/{}/builds/{}/jobs/{}/artifacts".format(
                hook.repository.get_full_name(), job.build.number, job.number
            ),
            request=request,
        )