mozreview: remove import pullrequest code (bug 1248592) r?smacleod draft
authorDan Minor <dminor@mozilla.com>
Tue, 16 Feb 2016 14:57:52 -0500
changeset 7426 9733a44750b11e6e7046b08af8433d88cf320b22
parent 7410 1aaa9bfa0ce81b7ed125b1cf42a4db39d9ea2e84
child 7427 aa21333adb1e03c6f94e44dc960a3ac58e90e11c
push id677
push userdminor@mozilla.com
push dateThu, 03 Mar 2016 20:19:20 +0000
reviewerssmacleod
bugs1248592
mozreview: remove import pullrequest code (bug 1248592) r?smacleod This no longer seems relevant now that we can push to review directly from git. The corresponding autoland code was removed months ago. We can pull it out from version control if for some reason we need to resurrect it. MozReview-Commit-ID: Fzxxalpv6Ru
pylib/mozreview/mozreview/autoland/models.py
pylib/mozreview/mozreview/autoland/resources.py
pylib/mozreview/mozreview/autoland/views.py
pylib/mozreview/mozreview/extension.py
pylib/mozreview/mozreview/static/mozreview/js/import-pullrequest.js
pylib/mozreview/mozreview/templates/mozreview/import-pullrequest.html
pylib/mozreview/mozreview/tests/test-import-pullrequest.py
--- a/pylib/mozreview/mozreview/autoland/models.py
+++ b/pylib/mozreview/mozreview/autoland/models.py
@@ -75,41 +75,8 @@ class AutolandEventLogEntry(models.Model
     event_time = models.DateTimeField(auto_now_add=True)
     status = models.CharField(_('status'), max_length=1, choices=STATUSES,
                               db_index=True)
     details = models.TextField(_('details'), blank=True)
     error_msg = models.TextField(_('error_msg'), blank=True)
 
     class Meta:
         app_label = 'mozreview'
-
-
-class ImportPullRequestRequest(models.Model):
-    autoland_id = models.IntegerField(
-        primary_key=True,
-        help_text=_('The job ID that Autoland returns to us.'))
-    github_user = models.CharField(
-        max_length=255,
-        help_text=_('The github user/org for which Autoland was asked to '
-                    'land the pullrequest (e.g. mozilla).'),
-        db_index=True)
-    github_repo = models.CharField(
-        max_length=255,
-        help_text=_('The github repo name for which Autoland was asked to '
-                    'land the pullrequest (e.g. gecko-dev).'),
-        db_index=True)
-    github_pullrequest = models.IntegerField(
-        help_text=_('The pullrequest number for which Autoland was asked to '
-                    'land the pullrequest (e.g. 42).'),
-        db_index=True)
-    bugid = models.IntegerField(
-        help_text=_('The bugzilla bug id for the pullrequest.'),
-        null=True)
-    # Unfortunately, Review Board extensions can't take advantage of the
-    # ForeignKey ORM magic that Django provides. This is because the extension
-    # loading mechanism doesn't do enough (yet) to flush out the foreign key
-    # caches in Django.
-    review_request_id = models.IntegerField(
-        help_text=_('The ID of the review request that was created from the '
-                    'pullrequest'), null=True)
-
-    class Meta:
-        app_label = 'mozreview'
--- a/pylib/mozreview/mozreview/autoland/resources.py
+++ b/pylib/mozreview/mozreview/autoland/resources.py
@@ -12,23 +12,21 @@ from djblets.webapi.decorators import (w
 from djblets.webapi.errors import (DOES_NOT_EXIST,
                                    INVALID_FORM_DATA,
                                    NOT_LOGGED_IN,
                                    PERMISSION_DENIED)
 import requests
 from reviewboard.changedescs.models import ChangeDescription
 from reviewboard.extensions.base import get_extension_manager
 from reviewboard.reviews.models import ReviewRequest
-from reviewboard.scmtools.models import Repository
 from reviewboard.site.urlresolvers import local_site_reverse
 from reviewboard.webapi.resources import WebAPIResource
 
 from mozreview.autoland.models import (AutolandEventLogEntry,
-                                       AutolandRequest,
-                                       ImportPullRequestRequest)
+                                       AutolandRequest)
 from mozreview.decorators import webapi_scm_groups_required
 from mozreview.errors import (AUTOLAND_CONFIGURATION_ERROR,
                               AUTOLAND_ERROR,
                               AUTOLAND_REQUEST_IN_PROGRESS,
                               AUTOLAND_TIMEOUT,
                               NOT_PUSHED_PARENT_REVIEW_REQUEST)
 from mozreview.extra_data import (
     COMMITS_KEY,
@@ -519,289 +517,8 @@ class AutolandRequestUpdateResource(WebA
                                        autoland_request.repository_url,
                                        autoland_request.push_revision)
         release_lock(lock_id)
 
         return 200, {}
 
 
 autoland_request_update_resource = AutolandRequestUpdateResource()
-
-
-class ImportPullRequestTriggerResource(WebAPIResource):
-    """Resource to import pullrequests."""
-
-    name = 'import_pullrequest_trigger'
-    allowed_methods = ('POST',)
-    model = ImportPullRequestRequest
-
-    fields = {
-        'autoland_id': {
-            'type': int,
-            'description': 'The request ID that Autoland gave back.'
-        },
-        'push_revision': {
-            'type': six.text_type,
-            'description': 'The revision of what got pushed for Autoland to '
-                           'land.',
-        },
-        'repository_url': {
-            'type': six.text_type,
-            'description': 'The repository that Autoland was asked to land '
-                           'on.',
-        },
-        'repository_revision': {
-            'type': six.text_type,
-            'description': 'The revision of what Autoland landed on the '
-                           'repository.',
-        },
-        'review_request_id': {
-            'type': int,
-            'description': 'The review request associated with this Autoland '
-                           'request.',
-        },
-        'user_id': {
-            'type': int,
-            'description': 'The user that initiated the Autoland request.',
-        },
-        'last_known_status': {
-            'type': six.text_type,
-            'description': 'The last known status for this request.',
-        },
-    }
-
-    def has_access_permissions(self, request, *args, **kwargs):
-        return False
-
-    def has_list_access_permissions(self, request, *args, **kwargs):
-        return True
-
-    @webapi_login_required
-    @webapi_response_errors(DOES_NOT_EXIST, INVALID_FORM_DATA,
-                            NOT_LOGGED_IN)
-    @webapi_request_fields(
-        required={
-            'github_user': {
-                'type': six.text_type,
-                'description': 'The github user for the pullrequest',
-            },
-            'github_repo': {
-                'type': six.text_type,
-                'description': 'The github repo for the pullrequest',
-            },
-            'pullrequest': {
-                'type': int,
-                'description': 'The pullrequest number',
-            },
-        },
-    )
-    @transaction.atomic
-    def create(self, request, github_user, github_repo, pullrequest, *args,
-               **kwargs):
-
-        ext = get_extension_manager().get_enabled_extension(
-            'mozreview.extension.MozReviewExtension')
-
-        testing = ext.get_settings('autoland_testing', False)
-
-        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
-
-
-        # if we've seen an import for this pullrequest before, see if we have
-        # an existing bugid we can reuse. Otherwise, Autoland will attempt to
-        # extract one from the pullrequest title and if that fails, file a new
-        # bug.
-        bugid = None
-        prs = ImportPullRequestRequest.objects.filter(github_user=github_user,
-                                                      github_repo=github_repo,
-                                                      github_pullrequest=pullrequest)
-        prs = prs.order_by('-pk')[0:1]
-        if prs:
-            bugid = prs[0].bugid
-
-        pingback_url = import_pullrequest_update_resource.get_uri(request)
-
-        logger.info('Submitting a request to Autoland for pull request'
-                    '%s/%s/%s for bug %s with pingback_url %s'
-                    % (github_user, github_repo, pullrequest, bugid,
-                       pingback_url))
-
-        destination = IMPORT_PULLREQUEST_DESTINATION
-        if testing:
-            # This is just slightly better than hard coding the repo name
-            destination = Repository.objects.all()[0].name
-
-        try:
-            response = requests.post(autoland_url + '/pullrequest/mozreview',
-                data=json.dumps({
-                'user': github_user,
-                'repo': github_repo,
-                'pullrequest': pullrequest,
-                'destination': destination,
-                'bzuserid': request.session['Bugzilla_login'],
-                'bzcookie': request.session['Bugzilla_logincookie'],
-                'bugid': bugid,
-                'pingback_url': pingback_url
-            }), 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')
-            return AUTOLAND_ERROR
-        except requests.exceptions.Timeout:
-            logger.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:
-            request_id = int(response.json()['request_id'])
-        except KeyError, ValueError:
-            return AUTOLAND_ERROR, {
-                'status_code': response.status_code,
-                'request_id': autoland_request_id,
-            }
-
-        import_pullrequest_request = ImportPullRequestRequest.objects.create(
-            autoland_id=request_id,
-            github_user=github_user,
-            github_repo=github_repo,
-            github_pullrequest=pullrequest,
-        )
-
-        AutolandEventLogEntry.objects.create(
-            status=AutolandEventLogEntry.REQUESTED,
-            autoland_request_id=request_id)
-
-        url = autoland_url + '/pullrequest/mozreview/status/' + str(request_id)
-        return 200, {'status-url': url}
-
-    def get_uri(self, request):
-        named_url = self._build_named_url(self.name_plural)
-
-        return request.build_absolute_uri(
-            local_site_reverse(named_url, request=request, kwargs={}))
-
-    def serialize_last_known_status_field(self, obj, **kwargs):
-        return obj.last_known_status
-
-
-import_pullrequest_trigger_resource = ImportPullRequestTriggerResource()
-
-
-class ImportPullRequestUpdateResource(WebAPIResource):
-    """Resource for notifications of pullrequest import status update."""
-
-    name = 'import_pullrequest_update'
-    allowed_methods = ('POST',)
-    fields = {
-        'request_id': {
-            'type': int,
-            'description': 'ID of the Autoland request this event refers to',
-        },
-        'bugid': {
-            'type': int,
-            'description': 'The bugid for the pullrequest',
-        },
-        'landed': {
-            'type': bool,
-            'description': 'Whether the import succeeded or not',
-        },
-        'result': {
-            'type': six.text_type,
-            'description': 'In case of success, this is the review request '
-                           'associated with the pullrequest',
-        },
-        'error_msg': {
-            'type': six.text_type,
-            'description': 'An error message in case something went wrong',
-        },
-    }
-
-    def has_access_permissions(self, request, *args, **kwargs):
-        return False
-
-    def has_list_access_permissions(self, request, *args, **kwargs):
-        return True
-
-    def get_uri(self, request):
-        named_url = self._build_named_url(self.name_plural)
-
-        return request.build_absolute_uri(
-            local_site_reverse(named_url, request=request, kwargs={}))
-
-    @webapi_response_errors(DOES_NOT_EXIST, INVALID_FORM_DATA,
-                            NOT_LOGGED_IN, PERMISSION_DENIED)
-    @webapi_login_required
-    @transaction.atomic
-    def create(self, request, *args, **kwargs):
-        ext = get_extension_manager().get_enabled_extension(
-            'mozreview.extension.MozReviewExtension')
-
-        testing = ext.get_settings('autoland_testing', False)
-
-        if not testing and not request.user.has_perm(
-                'mozreview.add_autolandeventlogentry'):
-            return PERMISSION_DENIED
-
-        try:
-            fields = json.loads(request.body)
-            landed = fields['landed']
-            for field_name in fields:
-                assert type(fields[field_name]) == self.fields[field_name]['type']
-        except (ValueError, IndexError, AssertionError) as e:
-            return INVALID_FORM_DATA, {
-                'error': e,
-                }
-
-        try:
-            ImportPullRequestRequest.objects.get(pk=fields['request_id'])
-        except ImportPullRequestRequest.DoesNotExist:
-            return DOES_NOT_EXIST
-
-        if landed:
-            # Autoland gives us a review request url, we need to extract the id
-            try:
-                review_request_id = int(fields['result'].split('/')[-1])
-            except ValueError as e:
-                return INVALID_FORM_DATA, {'error': e}
-
-            ImportPullRequestRequest.objects.filter(
-                pk=fields['request_id']).update(
-                review_request_id=review_request_id, bugid=fields['bugid'])
-
-            AutolandEventLogEntry.objects.create(
-                autoland_request_id=fields['request_id'],
-                status=AutolandEventLogEntry.SERVED,
-                details=fields['result'])
-        else:
-            # We need to store the bugid even if the import failed so we can
-            # use that same bug for later imports of this pullrequest.
-            ImportPullRequestRequest.objects.filter(
-                pk=fields['request_id']).update(bugid=fields['bugid'])
-
-            AutolandEventLogEntry.objects.create(
-                autoland_request_id=fields['request_id'],
-                status=AutolandEventLogEntry.PROBLEM,
-                error_msg=fields['error_msg']
-            )
-
-        return 200, {}
-
-
-import_pullrequest_update_resource = ImportPullRequestUpdateResource()
deleted file mode 100644
--- a/pylib/mozreview/mozreview/autoland/views.py
+++ /dev/null
@@ -1,26 +0,0 @@
-from django.http import HttpResponse, HttpResponseForbidden
-from django.contrib.auth.decorators import login_required
-from django.template.loader import Context, get_template
-from mozreview.autoland.resources import import_pullrequest_trigger_resource
-from reviewboard.extensions.base import get_extension_manager
-
-@login_required
-def import_pullrequest(request, user, repo, pullrequest):
-    ext = get_extension_manager().get_enabled_extension(
-        'mozreview.extension.MozReviewExtension')
-    enabled = ext.get_settings('autoland_import_pullrequest_ui_enabled', False)
-
-    if not enabled:
-        return HttpResponseForbidden('Importing pullrequests is disabled')
-
-    trigger_url = import_pullrequest_trigger_resource.get_uri(request)
-
-    template = get_template('mozreview/import-pullrequest.html')
-    return HttpResponse(template.render(Context({
-        'request': request,
-        'user': user,
-        'repo': repo,
-        'pullrequest': pullrequest,
-        'trigger_url': trigger_url,
-    })))
-
--- a/pylib/mozreview/mozreview/extension.py
+++ b/pylib/mozreview/mozreview/extension.py
@@ -20,23 +20,18 @@ from reviewboard.reviews.builtin_fields 
 from reviewboard.reviews.fields import (get_review_request_field,
                                         get_review_request_fieldset)
 from reviewboard.urls import (diffviewer_url_names,
                               review_request_url_names)
 
 from mozreview.autoland.resources import (
     autoland_request_update_resource,
     autoland_trigger_resource,
-    import_pullrequest_trigger_resource,
-    import_pullrequest_update_resource,
     try_autoland_trigger_resource,
 )
-from mozreview.autoland.views import (
-    import_pullrequest,
-)
 from mozreview.batchreview.resources import (
     batch_review_resource,
 )
 from mozreview.extra_data import (
     is_parent,
 )
 from mozreview.fields import (
     BaseCommitField,
@@ -130,20 +125,16 @@ class MozReviewExtension(Extension):
             'source_filenames': ['mozreview/js/default.js'],
         },
         'filediffreviewer': {
             'source_filenames': ['mozreview/js/models/filediffreviewermodel.js',
                                  'mozreview/js/collections/filediffreviewercollection.js',
                                  'mozreview/js/init_filediffreviewer.js'],
             'apply_to': diffviewer_url_names,
         },
-        'import-pullrequest': {
-            'source_filenames': ['mozreview/js/import-pullrequest.js',],
-            'apply_to': ['import_pullrequest',],
-        },
         'reviews': {
             # TODO: Everything will break if init_rr.js is not first in this
             # list.
             'source_filenames': ['mozreview/js/init_rr.js',
                                  'mozreview/js/commits.js',
                                  'mozreview/js/review.js',
                                  'mozreview/js/autoland.js',
                                  'mozreview/js/ui.mozreviewautocomplete.js',]
@@ -158,18 +149,16 @@ class MozReviewExtension(Extension):
         autoland_request_update_resource,
         autoland_trigger_resource,
         batch_review_request_resource,
         batch_review_resource,
         bugzilla_api_key_login_resource,
         commit_data_resource,
         commit_rewrite_resource,
         file_diff_reviewer_resource,
-        import_pullrequest_trigger_resource,
-        import_pullrequest_update_resource,
         ldap_association_resource,
         review_request_summary_resource,
         try_autoland_trigger_resource,
     ]
 
     middleware = [
         MozReviewCacheDisableMiddleware,
         MozReviewUserProfileMiddleware,
@@ -287,20 +276,16 @@ class MozReviewExtension(Extension):
         # Use a custom method to calculate a review approval state.
         MozReviewApprovalHook(self)
 
         # Instantiate the various signal handlers
         initialize_signal_handlers(self)
 
         HostingServiceHook(self, HMORepository)
 
-        URLHook(self, patterns('',
-            url(r'^import-pullrequest/(?P<user>.+)/(?P<repo>.+)/(?P<pullrequest>\d+)/$',
-            import_pullrequest, name='import_pullrequest')))
-
     def shutdown(self):
         # We have to put the TestingDone field back before we shut down
         # in order to get the instance back to its original state.
         main_fieldset = get_review_request_fieldset('main')
         if not get_review_request_field('testing_done'):
             main_fieldset.add_field(TestingDoneField)
 
         info_fieldset = get_review_request_fieldset('info')
deleted file mode 100644
--- a/pylib/mozreview/mozreview/static/mozreview/js/import-pullrequest.js
+++ /dev/null
@@ -1,78 +0,0 @@
-$(document).ready(function() {
-  function pollAutolandRequest(statusUrl, activityIndicator) {
-    $.ajax({
-        type: "GET",
-        url: statusUrl
-      })
-      .done(function(requestStatus){
-        var landed = requestStatus["landed"];
-
-        if (landed !== null) {
-          if (landed === true) {
-            activityIndicator.hide();
-            window.location.href = requestStatus["result"];
-          } else {
-            activityIndicator.addClass("error")
-              .text(gettext("Importing the pull request failed: " + requestStatus["error_msg"]))
-              .append(
-                $("<a/>")
-                  .text(gettext("Dismiss"))
-                  .attr("href", "#")
-                  .click(function() {
-                    activityIndicator.fadeOut("fast");
-                    return false;
-                  })
-              );
-          }
-        } else {
-          setTimeout(pollAutolandRequest, 500, statusUrl, activityIndicator);
-        }
-      })
-      .fail(function(xhr, textStatus, errorThrown){
-        activityIndicator.addClass("error")
-          .text(gettext("Error communicating with Autoland server"))
-          .append(
-            $("<a/>")
-              .text(gettext("Dismiss"))
-              .attr("href", "#")
-              .click(function() {
-                activityIndicator.fadeOut("fast");
-                return false;
-              })
-          );
-      });
-  }
-
-  $("#mozreview-import-pullrequest-trigger").click(function() {
-    var activityIndicator = $("#activity-indicator")
-      .removeClass("error")
-      .text(gettext("Importing pull request..."))
-      .show();
-
-    $.ajax({
-      type: "POST",
-      url: PULLREQUEST_TRIGGER,
-      data: {
-        github_user: GITHUB_USER,
-        github_repo: GITHUB_REPO,
-        pullrequest: GITHUB_PULLREQUEST
-      }
-    })
-    .done(function(data){
-      pollAutolandRequest(data["status-url"], activityIndicator);
-    })
-    .fail(function(xhr, textStatus, errorThrown){
-      activityIndicator.addClass("error")
-        .text(gettext("Error submitting pull request"))
-        .append(
-          $("<a/>")
-            .text(gettext("Dismiss"))
-            .attr("href", "#")
-            .click(function() {
-              activityIndicator.fadeOut("fast");
-              return false;
-            })
-        );
-    });
-  });
-});
deleted file mode 100644
--- a/pylib/mozreview/mozreview/templates/mozreview/import-pullrequest.html
+++ /dev/null
@@ -1,33 +0,0 @@
-{% extends "base.html" %}
-{% load i18n %}
-
-{% block title %}{% trans "Import Pull Request" %}{% endblock %}
-
-{% block extrahead %}
-<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
-{% endblock %}
-
-{% block page_class %}new-review-request-page full-page-content has-sidebar mobile-show-page-sidebar{% endblock %}
-
-{% block content %}
-<h1>Import a Pull Request</h1>
-<div id="mozreview-import-pullrequest">
-  <div>
-    <label>Github Pull Request: </label>
-    <a href="https://github.com/{{user}}/{{repo}}/pull/{{pullrequest}}">https://github.com/{{user}}/{{repo}}/pull/{{pullrequest}}</a>
-  </div>
-  <div>
-  <input id="mozreview-import-pullrequest-trigger" type="button" value="{% trans "Import Pull Request" %}" />
-  </div>
-</div>
-{% endblock %}
-
-{% block scripts-post %}
-<script charset="utf-8" type="text/javascript">
-    var GITHUB_USER = "{{user}}";
-    var GITHUB_REPO = "{{repo}}";
-    var GITHUB_PULLREQUEST= {{pullrequest}};
-    var PULLREQUEST_TRIGGER = "{{trigger_url}}";
-</script>
-{{block.super}}
-{% endblock %}
deleted file mode 100644
--- a/pylib/mozreview/mozreview/tests/test-import-pullrequest.py
+++ /dev/null
@@ -1,75 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-from __future__ import absolute_import, unicode_literals
-
-import unittest
-
-import selenium.webdriver.support.expected_conditions as EC
-from selenium.common.exceptions import StaleElementReferenceException
-from selenium.webdriver.common.by import By
-from selenium.webdriver.support.wait import WebDriverWait
-
-from vcttesting.unittest import MozReviewWebDriverTest
-
-@unittest.skip('importing pull requests not supported')
-class ImportPullrequestTest(MozReviewWebDriverTest):
-    @classmethod
-    def setUpClass(cls):
-        MozReviewWebDriverTest.setUpClass()
-
-        try:
-            self = cls('run')
-            self.create_users([
-                ('mjane@example.com', 'password2', 'Mary Jane [:mary]'),
-            ])
-
-            self.create_ldap(b'mjane@example.com', b'mjane', 2001, b'Mary Jane')
-
-            lr = self.create_basic_repo('mjane@example.com', 'mjane')
-        except Exception:
-            MozReviewWebDriverTest.tearDownClass()
-            raise
-
-    def test_import_pullrequest(self):
-        self.reviewboard_login('mjane@example.com', 'password2')
-
-        self.load_rburl('import-pullrequest/dminor/gecko-dev/1')
-
-        btn = self.browser.find_element_by_id('mozreview-import-pullrequest-trigger');
-        btn.click()
-
-        # Clicking the button should display the activity indicator
-        element = WebDriverWait(self.browser, 3).until(
-            EC.visibility_of_element_located((By.ID, "activity-indicator"))
-        )
-        try:
-            self.assertTrue('Error' not in element.text)
-        except StaleElementReferenceException:
-            # The activity indicator may already have disappeared by the time
-            # we check the text, but we want to be able to catch the error
-            # if it shows up.
-            pass
-
-        # If this succeeds, we should be redirected to a review for the pull
-        # request.
-        WebDriverWait(self.browser, 10).until(
-            lambda x: 'bz://1/' in self.browser.title)
-
-        # Autoland should create the bug for us.
-        bug = self.bugzilla().client.get(1)
-        self.assertTrue('A pullrequest' in bug.summary)
-
-        # It is possible to import a pull request again.
-        self.load_rburl('import-pullrequest/dminor/gecko-dev/1')
-
-        btn = self.browser.find_element_by_id('mozreview-import-pullrequest-trigger');
-        btn.click()
-
-        WebDriverWait(self.browser, 10).until(
-            lambda x: 'bz://1/' in self.browser.title)
-
-        # Autoland should reuse the existing bug for this pull request.
-        with self.assertRaises(KeyError):
-            self.bugzilla().client.get(2)