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)
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)
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, )
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
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)
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)
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 )
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
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