blob: 64f43052691a82a200a81c7fac2e6b80acb89d02 [file] [log] [blame]
# Copyright 2019 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Task handlers for publishing issue updates onto a pub/sub topic.
The pub/sub topic name is: `projects/{project-id}/topics/issue-updates`.
"""
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import
import logging
import sys
import settings
from googleapiclient.discovery import build
from apiclient.errors import Error as ApiClientError
from oauth2client.client import GoogleCredentials
from oauth2client.client import Error as Oauth2ClientError
from framework import exceptions
from framework import jsonfeed
class PublishPubsubIssueChangeTask(jsonfeed.InternalTask):
"""JSON servlet that pushes issue update messages onto a pub/sub topic."""
def HandleRequest(self, mr):
"""Push a message onto a pub/sub queue.
Args:
mr: common information parsed from the HTTP request.
Returns:
A dictionary. If an error occurred, the 'error' field will be a string
containing the error message.
"""
pubsub_client = set_up_pubsub_api()
if not pubsub_client:
return {
'error': 'Pub/Sub API init failure.',
}
issue_id = mr.GetPositiveIntParam('issue_id')
if not issue_id:
return {
'error': 'Cannot proceed without a valid issue ID.',
}
try:
issue = self.services.issue.GetIssue(mr.cnxn, issue_id, use_cache=False)
except exceptions.NoSuchIssueException:
return {
'error': 'Could not find issue with ID %s' % issue_id,
}
pubsub_client.projects().topics().publish(
topic=settings.pubsub_topic_id,
body={
'messages': [{
'attributes': {
'local_id': str(issue.local_id),
'project_name': str(issue.project_name),
},
}],
},
).execute()
return {}
def PostPublishPubsubIssueChangeTask(self, **kwargs):
return self.handler(**kwargs)
def set_up_pubsub_api():
"""Attempts to build and return a pub/sub API client."""
try:
return build(
'pubsub', 'v1', credentials=GoogleCredentials.get_application_default())
except (Oauth2ClientError, ApiClientError):
logging.error("Error setting up Pub/Sub API: %s" % sys.exc_info()[0])
return None