Merge "Get project list from gerrit"
This commit is contained in:
commit
a77502ea10
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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',
|
||||||
|
@ -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)
|
|
||||||
|
|
||||||
repos = []
|
|
||||||
for project_source in project_sources:
|
|
||||||
organization = project_source['organization']
|
|
||||||
LOG.debug('Get list of projects for organization %s', organization)
|
|
||||||
try:
|
try:
|
||||||
github_repos = github.get_organization(organization).get_repos()
|
project_list = gerrit.get_project_list()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
LOG.exception(e)
|
LOG.exception(e)
|
||||||
LOG.warn('Fail to retrieve list of projects. Keep it unmodified')
|
LOG.warn('Fail to retrieve list of projects. Keep it unmodified')
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
repos = []
|
||||||
|
for project_source in project_sources:
|
||||||
|
organization = project_source['organization']
|
||||||
|
LOG.debug('Get list of projects for organization %s', organization)
|
||||||
|
git_repos = [
|
||||||
|
f for f in project_list if f.startswith(organization + "/")]
|
||||||
|
|
||||||
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)
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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']]))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user