Merge "Get project list from gerrit"

This commit is contained in:
Jenkins 2014-06-17 11:13:11 +00:00 committed by Gerrit Code Review
commit a77502ea10
7 changed files with 52 additions and 23 deletions

View File

@ -26,6 +26,9 @@
# URI of review system # URI of review system
# review_uri = gerrit://review.openstack.org # review_uri = gerrit://review.openstack.org
# git base location
# git_base_uri = git://git.openstack.org
# SSH key for gerrit review system access # SSH key for gerrit review system access
# ssh_key_filename = /home/user/.ssh/id_rsa # ssh_key_filename = /home/user/.ssh/id_rsa

View File

@ -4,7 +4,6 @@ oslo.config>=1.2.0
paramiko>=1.8.0 paramiko>=1.8.0
pbr>=0.6,<1.0 pbr>=0.6,<1.0
psutil>=1.1.1 psutil>=1.1.1
PyGithub
python-memcached>=1.48 python-memcached>=1.48
PyYAML>=3.1.0 PyYAML>=3.1.0
sh sh

View File

@ -37,6 +37,8 @@ OPTS = [
help='The address of file with corrections data'), help='The address of file with corrections data'),
cfg.StrOpt('review-uri', default='gerrit://review.openstack.org', cfg.StrOpt('review-uri', default='gerrit://review.openstack.org',
help='URI of review system'), help='URI of review system'),
cfg.StrOpt('git-base-uri', default='git://git.openstack.org',
help='git base location'),
cfg.StrOpt('ssh-key-filename', default='/home/user/.ssh/id_rsa', cfg.StrOpt('ssh-key-filename', default='/home/user/.ssh/id_rsa',
help='SSH key for gerrit review system access'), help='SSH key for gerrit review system access'),
cfg.StrOpt('ssh-username', default='user', cfg.StrOpt('ssh-username', default='user',

View File

@ -17,7 +17,6 @@ import collections
import hashlib import hashlib
import json import json
from github import MainClass
import six import six
from stackalytics.openstack.common import log as logging from stackalytics.openstack.common import log as logging
@ -42,30 +41,34 @@ def _check_default_data_change(runtime_storage_inst, default_data):
return True return True
def _retrieve_project_list_from_github(project_sources): def _retrieve_project_list_from_gerrit(project_sources, git_base_uri, gerrit):
LOG.info('Retrieving project list from GitHub') LOG.info('Retrieving project list from Gerrit')
github = MainClass.Github(timeout=60) try:
project_list = gerrit.get_project_list()
except Exception as e:
LOG.exception(e)
LOG.warn('Fail to retrieve list of projects. Keep it unmodified')
return False
repos = [] repos = []
for project_source in project_sources: for project_source in project_sources:
organization = project_source['organization'] organization = project_source['organization']
LOG.debug('Get list of projects for organization %s', organization) LOG.debug('Get list of projects for organization %s', organization)
try: git_repos = [
github_repos = github.get_organization(organization).get_repos() f for f in project_list if f.startswith(organization + "/")]
except Exception as e:
LOG.exception(e)
LOG.warn('Fail to retrieve list of projects. Keep it unmodified')
return False
exclude = set(project_source.get('exclude', [])) exclude = set(project_source.get('exclude', []))
for repo in github_repos: for repo in git_repos:
if repo.name not in exclude: (org, name) = repo.split('/')
if name not in exclude:
url = '%(git_base_uri)s/%(repo)s.git' % dict(
git_base_uri=git_base_uri, repo=repo)
r = { r = {
'branches': ['master'], 'branches': ['master'],
'module': repo.name, 'module': name,
'organization': organization, 'organization': org,
'uri': repo.git_url, 'uri': url,
'releases': [] 'releases': []
} }
repos.append(r) repos.append(r)
@ -92,11 +95,12 @@ def _create_module_groups_for_project_sources(project_sources, repos):
return module_groups return module_groups
def _update_project_list(default_data): def _update_project_list(default_data, git_base_uri, gerrit):
configured_repos = set([r['uri'] for r in default_data['repos']]) configured_repos = set([r['uri'] for r in default_data['repos']])
repos = _retrieve_project_list_from_github(default_data['project_sources']) repos = _retrieve_project_list_from_gerrit(
default_data['project_sources'], git_base_uri, gerrit)
if repos: if repos:
default_data['repos'] += [r for r in repos default_data['repos'] += [r for r in repos
if r['uri'] not in configured_repos] if r['uri'] not in configured_repos]
@ -160,10 +164,11 @@ def _store_default_data(runtime_storage_inst, default_data):
runtime_storage_inst.set_by_key(key, value) runtime_storage_inst.set_by_key(key, value)
def process(runtime_storage_inst, default_data): def process(runtime_storage_inst, default_data,
git_base_uri, gerrit):
LOG.debug('Process default data') LOG.debug('Process default data')
if 'project_sources' in default_data: if 'project_sources' in default_data:
_update_project_list(default_data) _update_project_list(default_data, git_base_uri, gerrit)
_store_default_data(runtime_storage_inst, default_data) _store_default_data(runtime_storage_inst, default_data)

View File

@ -302,8 +302,15 @@ def main():
if not default_data: if not default_data:
LOG.critical('Unable to load default data') LOG.critical('Unable to load default data')
return not 0 return not 0
gerrit = rcs.get_rcs(None, cfg.CONF.review_uri)
gerrit.setup(key_filename=cfg.CONF.ssh_key_filename,
username=cfg.CONF.ssh_username)
default_data_processor.process(runtime_storage_inst, default_data_processor.process(runtime_storage_inst,
default_data) default_data,
cfg.CONF.git_base_uri,
gerrit)
process_program_list(runtime_storage_inst, cfg.CONF.program_list_uri) process_program_list(runtime_storage_inst, cfg.CONF.program_list_uri)

View File

@ -135,6 +135,19 @@ class Gerrit(Rcs):
if not proceed: if not proceed:
break break
def get_project_list(self):
if not self._connect():
return
exec_result = self._exec_command('gerrit ls-projects')
if not exec_result:
raise Exception("Unable to retrieve list of projects from gerrit.")
stdin, stdout, stderr = exec_result
result = [line.strip() for line in stdout]
self.client.close()
return result
def log(self, branch, last_id): def log(self, branch, last_id):
if not self._connect(): if not self._connect():
return return

View File

@ -54,7 +54,7 @@ class TestDefaultDataProcessor(testtools.TestCase):
def test_update_project_list(self): def test_update_project_list(self):
with mock.patch('stackalytics.processor.default_data_processor.' with mock.patch('stackalytics.processor.default_data_processor.'
'_retrieve_project_list_from_github') as retriever: '_retrieve_project_list_from_gerrit') as retriever:
retriever.return_value = [ retriever.return_value = [
{'module': 'nova', {'module': 'nova',
'uri': 'git://git.openstack.org/openstack/nova', 'uri': 'git://git.openstack.org/openstack/nova',
@ -76,7 +76,7 @@ class TestDefaultDataProcessor(testtools.TestCase):
'module_groups': [], 'module_groups': [],
} }
default_data_processor._update_project_list(dd) default_data_processor._update_project_list(dd, None, None)
self.assertEqual(3, len(dd['repos'])) self.assertEqual(3, len(dd['repos']))
self.assertIn('qa', set([r['module'] for r in dd['repos']])) self.assertIn('qa', set([r['module'] for r in dd['repos']]))