stackalytics/stackalytics/processor/launchpad_utils.py

110 lines
3.6 KiB
Python

# Copyright (c) 2013 Mirantis Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from oslo_log import log as logging
import requests
import six
from stackalytics.processor import utils
LOG = logging.getLogger(__name__)
BUG_STATUSES = ['New', 'Incomplete', 'Opinion', 'Invalid', 'Won\'t Fix',
'Expired', 'Confirmed', 'Triaged', 'In Progress',
'Fix Committed', 'Fix Released',
'Incomplete (with response)',
'Incomplete (without response)']
LP_URI_V1 = 'https://api.launchpad.net/1.0/%s'
LP_URI_DEVEL = 'https://api.launchpad.net/devel/%s'
launchpad_session = requests.Session()
def link_to_launchpad_id(link):
return link[link.find('~') + 1:]
def lp_profile_by_launchpad_id(launchpad_id):
LOG.debug('Lookup user id %s at Launchpad', launchpad_id)
uri = LP_URI_V1 % ('~' + launchpad_id)
lp_profile = utils.read_json_from_uri(uri, session=launchpad_session)
utils.validate_lp_display_name(lp_profile)
return lp_profile
def lp_profile_by_email(email):
LOG.debug('Lookup user email %s at Launchpad', email)
uri = LP_URI_V1 % ('people/?ws.op=getByEmail&email=' + email)
lp_profile = utils.read_json_from_uri(uri, session=launchpad_session)
utils.validate_lp_display_name(lp_profile)
return lp_profile
def lp_module_exists(module):
uri = LP_URI_DEVEL % module
request = utils.do_request(uri)
LOG.debug('Checked uri: %(uri)s, status: %(status)s',
{'uri': uri, 'status': request.status_code})
return request.status_code != 404
def lp_blueprint_generator(module):
uri = LP_URI_DEVEL % (module + '/all_specifications')
while uri:
LOG.debug('Reading chunk from uri %s', uri)
chunk = utils.read_json_from_uri(uri, session=launchpad_session)
if not chunk:
LOG.warn('No data was read from uri %s', uri)
break
for record in chunk['entries']:
yield record
uri = chunk.get('next_collection_link')
def lp_bug_generator(module, modified_since):
uri = LP_URI_DEVEL % (module + '?ws.op=searchTasks')
for status in BUG_STATUSES:
uri += '&status=' + six.moves.urllib.parse.quote_plus(status)
if modified_since:
uri += '&modified_since=' + utils.timestamp_to_utc_date(modified_since)
while uri:
LOG.debug('Reading chunk from uri %s', uri)
chunk = utils.read_json_from_uri(uri, session=launchpad_session)
if not chunk:
LOG.warn('No data was read from uri %s', uri)
break
for record in chunk['entries']:
yield record
related_tasks_uri = record['related_tasks_collection_link']
LOG.debug('Reading related task from uri %s', related_tasks_uri)
related_tasks = utils.read_json_from_uri(related_tasks_uri,
session=launchpad_session)
if not related_tasks:
LOG.warn('No data was read from uri %s', uri)
elif related_tasks['entries']:
for related_task in related_tasks['entries']:
yield related_task
uri = chunk.get('next_collection_link')