def create(self, request, review_request_id, try_syntax, *args, **kwargs): try: rr = ReviewRequest.objects.get(pk=review_request_id) except ReviewRequest.DoesNotExist: return DOES_NOT_EXIST if not try_syntax.startswith("try: "): return INVALID_FORM_DATA, {"fields": {"try_syntax": ["The provided try syntax was invalid"]}} commit_data = fetch_commit_data(rr) if not is_pushed(rr, commit_data) or not is_parent(rr, commit_data): logger.error( "Failed triggering Autoland because the review " "request is not pushed, or not the parent review " "request." ) return NOT_PUSHED_PARENT_REVIEW_REQUEST target_repository = rr.repository.extra_data.get("try_repository_url") if not target_repository: return AUTOLAND_CONFIGURATION_ERROR.with_message("Autoland has not been configured with a proper try URL.") last_revision = json.loads(commit_data.extra_data.get(COMMITS_KEY))[-1][0] ext = get_extension_manager().get_enabled_extension("mozreview.extension.MozReviewExtension") logger.info( "Submitting a request to Autoland for review request " "ID %s for revision %s destination try" % (review_request_id, last_revision) ) autoland_url = ext.get_settings("autoland_url") if not autoland_url: return AUTOLAND_CONFIGURATION_ERROR autoland_user = ext.get_settings("autoland_user") autoland_password = ext.get_settings("autoland_password") if not autoland_user or not autoland_password: return AUTOLAND_CONFIGURATION_ERROR pingback_url = autoland_request_update_resource.get_uri(request) lock_id = get_autoland_lock_id(rr.id, target_repository, last_revision) if not acquire_lock(lock_id): return AUTOLAND_REQUEST_IN_PROGRESS try: # We use a hard-coded destination here. If we ever open this up # to make the destination a parameter to this resource, we need to # verify that the destination is in fact an "scm_level_1" # repository to ensure that people don't try to land to inbound # using this resource. response = requests.post( autoland_url + "/autoland", data=json.dumps( { "ldap_username": request.mozreview_profile.ldap_username, "tree": rr.repository.name, "pingback_url": pingback_url, "rev": last_revision, "destination": TRY_AUTOLAND_DESTINATION, "trysyntax": try_syntax, } ), headers={"content-type": "application/json"}, timeout=AUTOLAND_REQUEST_TIMEOUT, auth=(autoland_user, autoland_password), ) except requests.exceptions.RequestException: logger.error("We hit a RequestException when submitting a " "request to Autoland") release_lock(lock_id) return AUTOLAND_ERROR except requests.exceptions.Timeout: logger.error("We timed out when submitting a request to " "Autoland") release_lock(lock_id) return AUTOLAND_TIMEOUT if response.status_code != 200: release_lock(lock_id) return AUTOLAND_ERROR, {"status_code": response.status_code, "message": response.json().get("error")} # We succeeded in scheduling the job. try: autoland_request_id = int(response.json().get("request_id", 0)) finally: if autoland_request_id is None: release_lock(lock_id) return AUTOLAND_ERROR, {"status_code": response.status_code, "request_id": None} autoland_request = AutolandRequest.objects.create( autoland_id=autoland_request_id, push_revision=last_revision, repository_url=target_repository, review_request_id=rr.id, user_id=request.user.id, extra_data=json.dumps({"try_syntax": try_syntax}), ) AutolandEventLogEntry.objects.create( status=AutolandEventLogEntry.REQUESTED, autoland_request_id=autoland_request_id ) self.save_autolandrequest_id("p2rb.autoland_try", rr, autoland_request_id) return 200, {}
def create(self, request, review_request_id, commit_descriptions, *args, **kwargs): try: rr = ReviewRequest.objects.get(pk=review_request_id) except ReviewRequest.DoesNotExist: return DOES_NOT_EXIST commit_data = fetch_commit_data(rr) if not is_pushed(rr, commit_data) or not is_parent(rr, commit_data): logger.error( "Failed triggering Autoland because the review " "request is not pushed, or not the parent review " "request." ) return NOT_PUSHED_PARENT_REVIEW_REQUEST target_repository = rr.repository.extra_data.get("landing_repository_url") push_bookmark = rr.repository.extra_data.get("landing_bookmark") if not target_repository: return AUTOLAND_CONFIGURATION_ERROR.with_message( "Autoland has not been configured with a proper landing URL." ) last_revision = json.loads(commit_data.extra_data.get(COMMITS_KEY))[-1][0] ext = get_extension_manager().get_enabled_extension("mozreview.extension.MozReviewExtension") logger.info( "Submitting a request to Autoland for review request " "ID %s for revision %s destination %s" % (review_request_id, last_revision, target_repository) ) autoland_url = ext.get_settings("autoland_url") if not autoland_url: return AUTOLAND_CONFIGURATION_ERROR autoland_user = ext.get_settings("autoland_user") autoland_password = ext.get_settings("autoland_password") if not autoland_user or not autoland_password: return AUTOLAND_CONFIGURATION_ERROR pingback_url = autoland_request_update_resource.get_uri(request) lock_id = get_autoland_lock_id(rr.id, target_repository, last_revision) if not acquire_lock(lock_id): return AUTOLAND_REQUEST_IN_PROGRESS try: response = requests.post( autoland_url + "/autoland", data=json.dumps( { "ldap_username": request.mozreview_profile.ldap_username, "tree": rr.repository.name, "pingback_url": pingback_url, "rev": last_revision, "destination": target_repository, "push_bookmark": push_bookmark, "commit_descriptions": json.loads(commit_descriptions), } ), headers={"content-type": "application/json"}, timeout=AUTOLAND_REQUEST_TIMEOUT, auth=(autoland_user, autoland_password), ) except requests.exceptions.RequestException: logger.error("We hit a RequestException when submitting a " "request to Autoland") release_lock(lock_id) return AUTOLAND_ERROR except requests.exceptions.Timeout: logger.error("We timed out when submitting a request to " "Autoland") release_lock(lock_id) return AUTOLAND_TIMEOUT if response.status_code != 200: release_lock(lock_id) return AUTOLAND_ERROR, {"status_code": response.status_code, "message": response.json().get("error")} # We succeeded in scheduling the job. try: autoland_request_id = int(response.json().get("request_id", 0)) finally: if autoland_request_id is None: release_lock(lock_id) return AUTOLAND_ERROR, {"status_code": response.status_code, "request_id": None} autoland_request = AutolandRequest.objects.create( autoland_id=autoland_request_id, push_revision=last_revision, repository_url=target_repository, review_request_id=rr.id, user_id=request.user.id, ) AutolandEventLogEntry.objects.create( status=AutolandEventLogEntry.REQUESTED, autoland_request_id=autoland_request_id ) self.save_autolandrequest_id("p2rb.autoland", rr, autoland_request_id) return 200, {}
def create(self, request, review_request_id, try_syntax, *args, **kwargs): try: rr = ReviewRequest.objects.get(pk=review_request_id) except ReviewRequest.DoesNotExist: return DOES_NOT_EXIST if not try_syntax.startswith('try: '): return INVALID_FORM_DATA, { 'fields': { 'try_syntax': ['The provided try syntax was invalid'] } } commit_data = fetch_commit_data(rr) if not is_pushed(rr, commit_data) or not is_parent(rr, commit_data): logger.error('Failed triggering Autoland because the review ' 'request is not pushed, or not the parent review ' 'request.') return NOT_PUSHED_PARENT_REVIEW_REQUEST enabled = rr.repository.extra_data.get('autolanding_to_try_enabled') if not enabled: return AUTOLAND_CONFIGURATION_ERROR.with_message( 'Autolanding to try not enabled.') target_repository = rr.repository.extra_data.get('try_repository_url') if not target_repository: return AUTOLAND_CONFIGURATION_ERROR.with_message( 'Autoland has not been configured with a proper try URL.') last_revision = json.loads( commit_data.extra_data.get(COMMITS_KEY))[-1][0] ext = get_extension_manager().get_enabled_extension( 'mozreview.extension.MozReviewExtension') logger.info('Submitting a request to Autoland for review request ' 'ID %s for revision %s destination try' % (review_request_id, last_revision)) autoland_url = ext.get_settings('autoland_url') if not autoland_url: return AUTOLAND_CONFIGURATION_ERROR autoland_user = ext.get_settings('autoland_user') autoland_password = ext.get_settings('autoland_password') if not autoland_user or not autoland_password: return AUTOLAND_CONFIGURATION_ERROR pingback_url = autoland_request_update_resource.get_uri(request) lock_id = get_autoland_lock_id(rr.id, target_repository, last_revision) if not acquire_lock(lock_id): return AUTOLAND_REQUEST_IN_PROGRESS try: # We use a hard-coded destination here. If we ever open this up # to make the destination a parameter to this resource, we need to # verify that the destination is in fact an "scm_level_1" # repository to ensure that people don't try to land to inbound # using this resource. response = requests.post( autoland_url + '/autoland', data=json.dumps({ 'ldap_username': request.mozreview_profile.ldap_username, 'tree': rr.repository.name, 'pingback_url': pingback_url, 'rev': last_revision, 'destination': TRY_AUTOLAND_DESTINATION, 'trysyntax': try_syntax, }), headers={ 'content-type': 'application/json', }, timeout=AUTOLAND_REQUEST_TIMEOUT, auth=(autoland_user, autoland_password)) except requests.exceptions.RequestException: logger.error('We hit a RequestException when submitting a ' 'request to Autoland') release_lock(lock_id) return AUTOLAND_ERROR except requests.exceptions.Timeout: logger.error('We timed out when submitting a request to ' 'Autoland') release_lock(lock_id) return AUTOLAND_TIMEOUT if response.status_code != 200: release_lock(lock_id) return AUTOLAND_ERROR, { 'status_code': response.status_code, 'message': response.json().get('error'), } # We succeeded in scheduling the job. try: autoland_request_id = int(response.json().get('request_id', 0)) finally: if autoland_request_id is None: release_lock(lock_id) return AUTOLAND_ERROR, { 'status_code': response.status_code, 'request_id': None, } AutolandRequest.objects.create(autoland_id=autoland_request_id, push_revision=last_revision, repository_url=target_repository, review_request_id=rr.id, user_id=request.user.id, extra_data=json.dumps( {'try_syntax': try_syntax})) AutolandEventLogEntry.objects.create( status=AutolandEventLogEntry.REQUESTED, autoland_request_id=autoland_request_id) self.save_autolandrequest_id('p2rb.autoland_try', rr, autoland_request_id) return 200, {}
def create(self, request, review_request_id, commit_descriptions, *args, **kwargs): try: rr = ReviewRequest.objects.get(pk=review_request_id) except ReviewRequest.DoesNotExist: return DOES_NOT_EXIST commit_data = fetch_commit_data(rr) if not is_pushed(rr, commit_data) or not is_parent(rr, commit_data): logger.error('Failed triggering Autoland because the review ' 'request is not pushed, or not the parent review ' 'request.') return NOT_PUSHED_PARENT_REVIEW_REQUEST enabled = rr.repository.extra_data.get('autolanding_enabled') if not enabled: return AUTOLAND_CONFIGURATION_ERROR.with_message( 'Autolanding not enabled.') target_repository = rr.repository.extra_data.get( 'landing_repository_url') push_bookmark = rr.repository.extra_data.get('landing_bookmark') if not target_repository: return AUTOLAND_CONFIGURATION_ERROR.with_message( 'Autoland has not been configured with a proper landing URL.') last_revision = json.loads( commit_data.extra_data.get(COMMITS_KEY))[-1][0] ext = get_extension_manager().get_enabled_extension( 'mozreview.extension.MozReviewExtension') logger.info('Submitting a request to Autoland for review request ' 'ID %s for revision %s destination %s' % (review_request_id, last_revision, target_repository)) autoland_url = ext.get_settings('autoland_url') if not autoland_url: return AUTOLAND_CONFIGURATION_ERROR autoland_user = ext.get_settings('autoland_user') autoland_password = ext.get_settings('autoland_password') if not autoland_user or not autoland_password: return AUTOLAND_CONFIGURATION_ERROR pingback_url = autoland_request_update_resource.get_uri(request) lock_id = get_autoland_lock_id(rr.id, target_repository, last_revision) if not acquire_lock(lock_id): return AUTOLAND_REQUEST_IN_PROGRESS try: response = requests.post( autoland_url + '/autoland', data=json.dumps({ 'ldap_username': request.mozreview_profile.ldap_username, 'tree': rr.repository.name, 'pingback_url': pingback_url, 'rev': last_revision, 'destination': target_repository, 'push_bookmark': push_bookmark, 'commit_descriptions': json.loads(commit_descriptions), }), headers={ 'content-type': 'application/json', }, timeout=AUTOLAND_REQUEST_TIMEOUT, auth=(autoland_user, autoland_password)) except requests.exceptions.RequestException: logger.error('We hit a RequestException when submitting a ' 'request to Autoland') release_lock(lock_id) return AUTOLAND_ERROR except requests.exceptions.Timeout: logger.error('We timed out when submitting a request to ' 'Autoland') release_lock(lock_id) return AUTOLAND_TIMEOUT if response.status_code != 200: release_lock(lock_id) try: error_message = response.json().get('error') except ValueError: error_message = response.text return AUTOLAND_ERROR, { 'status_code': response.status_code, 'message': error_message, } # We succeeded in scheduling the job. try: autoland_request_id = int(response.json().get('request_id', 0)) finally: if autoland_request_id is None: release_lock(lock_id) return AUTOLAND_ERROR, { 'status_code': response.status_code, 'request_id': None, } AutolandRequest.objects.create( autoland_id=autoland_request_id, push_revision=last_revision, repository_url=target_repository, review_request_id=rr.id, user_id=request.user.id, ) AutolandEventLogEntry.objects.create( status=AutolandEventLogEntry.REQUESTED, autoland_request_id=autoland_request_id) self.save_autolandrequest_id('p2rb.autoland', rr, autoland_request_id) return 200, {}
def create(self, request, review_request_id, try_syntax, *args, **kwargs): try: rr = ReviewRequest.objects.get(pk=review_request_id) except ReviewRequest.DoesNotExist: return DOES_NOT_EXIST if not try_syntax.startswith('try: '): return INVALID_FORM_DATA, { 'fields': { 'try_syntax': ['The provided try syntax was invalid'] } } if not is_pushed(rr) or not is_parent(rr): logging.error('Failed triggering Autoland because the review ' 'request is not pushed, or not the parent review ' 'request.') return NOT_PUSHED_PARENT_REVIEW_REQUEST if not rr.is_mutable_by(request.user): return PERMISSION_DENIED target_repository = rr.repository.extra_data.get( 'try_repository_url') if not target_repository: return AUTOLAND_CONFIGURATION_ERROR.with_message( 'Autoland has not been configured with a proper try URL.') last_revision = json.loads(rr.extra_data.get('p2rb.commits'))[-1][0] ext = get_extension_manager().get_enabled_extension( 'mozreview.extension.MozReviewExtension') logging.info('Submitting a request to Autoland for review request ' 'ID %s for revision %s ' % (review_request_id, last_revision)) autoland_url = ext.settings.get('autoland_url') if not autoland_url: return AUTOLAND_CONFIGURATION_ERROR autoland_user = ext.settings.get('autoland_user') autoland_password = ext.settings.get('autoland_password') if not autoland_user or not autoland_password: return AUTOLAND_CONFIGURATION_ERROR pingback_url = autoland_request_update_resource.get_uri(request) logging.info('Telling Autoland to give status updates to %s' % pingback_url) lock_id = get_autoland_lock_id(rr.id, target_repository, last_revision) if not acquire_lock(lock_id): return AUTOLAND_REQUEST_IN_PROGRESS try: # We use a hard-coded destination here. If we ever open this up # to make the destination a parameter to this resource, we need to # verify that the destination is in fact an "scm_level_1" # repository to ensure that people don't try to land to inbound # using this resource. response = requests.post(autoland_url + '/autoland', data=json.dumps({ 'tree': rr.repository.name, 'pingback_url': pingback_url, 'rev': last_revision, 'destination': TRY_AUTOLAND_DESTINATION, 'trysyntax': try_syntax, }), headers={ 'content-type': 'application/json', }, timeout=AUTOLAND_REQUEST_TIMEOUT, auth=(autoland_user, autoland_password)) except requests.exceptions.RequestException: logging.error('We hit a RequestException when submitting a ' 'request to Autoland') release_lock(lock_id) return AUTOLAND_ERROR except requests.exceptions.Timeout: logging.error('We timed out when submitting a request to ' 'Autoland') release_lock(lock_id) return AUTOLAND_TIMEOUT if response.status_code != 200: release_lock(lock_id) return AUTOLAND_ERROR, { 'status_code': response.status_code, 'message': response.json().get('error'), } # We succeeded in scheduling the job. try: autoland_request_id = int(response.json().get('request_id', 0)) finally: if autoland_request_id is None: release_lock(lock_id) return AUTOLAND_ERROR, { 'status_code': response.status_code, 'request_id': None, } autoland_request = AutolandRequest.objects.create( autoland_id=autoland_request_id, push_revision=last_revision, repository_url=target_repository, review_request_id=rr.id, user_id=request.user.id, extra_data=json.dumps({ 'try_syntax': try_syntax }) ) AutolandEventLogEntry.objects.create( status=AutolandEventLogEntry.REQUESTED, autoland_request_id=autoland_request_id) self.save_autolandrequest_id('p2rb.autoland_try', rr, autoland_request_id) return 200, {}
def create(self, request, review_request_id, *args, **kwargs): try: rr = ReviewRequest.objects.get(pk=review_request_id) except ReviewRequest.DoesNotExist: return DOES_NOT_EXIST if not is_pushed(rr) or not is_parent(rr): logging.error('Failed triggering Autoland because the review ' 'request is not pushed, or not the parent review ' 'request.') return NOT_PUSHED_PARENT_REVIEW_REQUEST if not rr.is_mutable_by(request.user): return PERMISSION_DENIED target_repository = rr.repository.extra_data.get( 'landing_repository_url') push_bookmark = rr.repository.extra_data.get('landing_bookmark') if not target_repository: return AUTOLAND_CONFIGURATION_ERROR.with_message( 'Autoland has not been configured with a proper landing URL.') last_revision = json.loads(rr.extra_data.get('p2rb.commits'))[-1][0] ext = get_extension_manager().get_enabled_extension( 'mozreview.extension.MozReviewExtension') logging.info('Submitting a request to Autoland for review request ' 'ID %s for revision %s ' % (review_request_id, last_revision)) autoland_url = ext.settings.get('autoland_url') if not autoland_url: return AUTOLAND_CONFIGURATION_ERROR autoland_user = ext.settings.get('autoland_user') autoland_password = ext.settings.get('autoland_password') if not autoland_user or not autoland_password: return AUTOLAND_CONFIGURATION_ERROR pingback_url = autoland_request_update_resource.get_uri(request) logging.info('Telling Autoland to give status updates to %s' % pingback_url) try: # Rather than hard coding the destination it would make sense # to extract it from metadata about the repository. That will have # to wait until we fix Bug 1168486. response = requests.post(autoland_url + '/autoland', data=json.dumps({ 'tree': rr.repository.name, 'pingback_url': pingback_url, 'rev': last_revision, 'destination': target_repository, 'push_bookmark': push_bookmark, }), headers={ 'content-type': 'application/json', }, timeout=AUTOLAND_REQUEST_TIMEOUT, auth=(autoland_user, autoland_password)) except requests.exceptions.RequestException: logging.error('We hit a RequestException when submitting a ' 'request to Autoland') return AUTOLAND_ERROR except requests.exceptions.Timeout: logging.error('We timed out when submitting a request to ' 'Autoland') return AUTOLAND_TIMEOUT if response.status_code != 200: return AUTOLAND_ERROR, { 'status_code': response.status_code, 'message': response.json().get('error'), } # We succeeded in scheduling the job. try: autoland_request_id = int(response.json().get('request_id', 0)) finally: if autoland_request_id is None: return AUTOLAND_ERROR, { 'status_code': response.status_code, 'request_id': None, } autoland_request = AutolandRequest.objects.create( autoland_id=autoland_request_id, push_revision=last_revision, repository_url=target_repository, review_request_id=rr.id, user_id=request.user.id, ) AutolandEventLogEntry.objects.create( status=AutolandEventLogEntry.REQUESTED, autoland_request_id=autoland_request_id) self.save_autolandrequest_id('p2rb.autoland', rr, autoland_request_id) return 200, {}