Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
commit 93206669285b1c868190a2ec64f6c74d5fd4b101 Author: Valentin Gologuzov vgologuz@redhat.com Date: Thu Oct 23 13:23:55 2014 +0200
[backend] [WIP] cli to run createrepo
backend/backend/createrepo.py | 8 ++- backend/backend/helpers.py | 13 +++++ backend/backend/mockremote.py | 17 +----- backend/requirements.txt | 5 ++- backend/run/copr_create_repo.py | 52 +++++++++++++++++++ backend/tests/test_run_copr_create_repo.py | 76 ++++++++++++++++++++++++++++ test_suite.sh | 5 +- 7 files changed, 157 insertions(+), 19 deletions(-)
diff --git a/backend/backend/createrepo.py b/backend/backend/createrepo.py index 85598b3..dca44a9 100644 --- a/backend/backend/createrepo.py +++ b/backend/backend/createrepo.py @@ -1,3 +1,6 @@ +import sys +from backend.helpers import SortedOptParser + __author__ = 'vgologuz'
import os @@ -49,7 +52,8 @@ def get_auto_createrepo_status(front_url, username, projectname): def createrepo(path, front_url, username, projectname, lock=None): # TODO: add means of logging
- if get_auto_createrepo_status(front_url, username, projectname): - createrepo_unsafe(path, lock) + print(" ".join(map(str, [path, front_url, username, projectname]))) + #if get_auto_createrepo_status(front_url, username, projectname): + # createrepo_unsafe(path, lock)
diff --git a/backend/backend/helpers.py b/backend/backend/helpers.py new file mode 100644 index 0000000..db30689 --- /dev/null +++ b/backend/backend/helpers.py @@ -0,0 +1,13 @@ +from operator import methodcaller +import optparse + +__author__ = 'vgologuz' + + +class SortedOptParser(optparse.OptionParser): + + """Optparser which sorts the options by opt before outputting --help""" + + def format_help(self, formatter=None): + self.option_list.sort(key=methodcaller("get_opt_string")) + return optparse.OptionParser.format_help(self, formatter=None) diff --git a/backend/backend/mockremote.py b/backend/backend/mockremote.py index 5f90727..bb5d8cb 100755 --- a/backend/backend/mockremote.py +++ b/backend/backend/mockremote.py @@ -29,24 +29,22 @@ from __future__ import unicode_literals from __future__ import division from __future__ import absolute_import
- import sys import time import fcntl import pipes import socket import urllib -import optparse import subprocess -from operator import methodcaller - import os -import ansible.runner
+import ansible.runner
+from .helpers import SortedOptParser from .exceptions import MockRemoteError, BuilderError from .sign import sign_rpms_in_dir, get_pubkey
+ # where we should execute mockchain from on the remote mockchain = "/usr/bin/mockchain" # rsync path @@ -62,15 +60,6 @@ DEF_MACROS = {} DEF_BUILDROOT_PKGS = ""
-class SortedOptParser(optparse.OptionParser): - - """Optparser which sorts the options by opt before outputting --help""" - - def format_help(self, formatter=None): - self.option_list.sort(key=methodcaller("get_opt_string")) - return optparse.OptionParser.format_help(self, formatter=None) - - def createrepo(path, lock=None): comm = ['/usr/bin/createrepo_c', '--database', '--ignore-lock'] if os.path.exists(path + '/repodata/repomd.xml'): diff --git a/backend/requirements.txt b/backend/requirements.txt index 9a1d6d4..539e50a 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -1,4 +1,7 @@ +PyYAML ansible setproctitle +redis retask -python-deamon +python-daemon +bunch diff --git a/backend/run/copr_create_repo.py b/backend/run/copr_create_repo.py new file mode 100644 index 0000000..e1d4942 --- /dev/null +++ b/backend/run/copr_create_repo.py @@ -0,0 +1,52 @@ +from __future__ import print_function + +import sys + +from backend.createrepo import createrepo +from backend.helpers import SortedOptParser + + + +def main(args): + print(args) + + parser = SortedOptParser( + "mockremote -u user_name -p copr_project repo_dir") + + parser.add_option("-u", "--user", dest="user", + help="copr project owner username") + + parser.add_option("-p", "--project", dest="project", + help="copr project name") + + parser.add_option("-a", "--api_url", dest="api_url", + help="copr frontend api url") + + opts, args = parser.parse_args(args) + + if not opts.user: + print("No user was specified, exiting", file=sys.stderr) + sys.exit(1) + + if not opts.project: + print("No project was specified, exiting", file=sys.stderr) + sys.exit(1) + + if not opts.api_url: + print("No api url was specified, exiting", file=sys.stderr) + sys.exit(1) + + if not args: + print("No directory with repo was specified, exiting", file=sys.stderr) + sys.exit(1) + + createrepo(path=args[0], front_url=opts.api_url, + username=opts.user, projectname=opts.project) + #print(args) + +if __name__ == "__main__": + """ + Provides cli interface for conditional execution of createrepo_c + depending on user setting `auto_createrepo` + """ + main(sys.argv[1:]) diff --git a/backend/tests/test_run_copr_create_repo.py b/backend/tests/test_run_copr_create_repo.py new file mode 100644 index 0000000..14417c5 --- /dev/null +++ b/backend/tests/test_run_copr_create_repo.py @@ -0,0 +1,76 @@ +import sys + +import os +import argparse +from collections import defaultdict +import json +from pprint import pprint +from _pytest.capture import capsys +import pytest + +import six + +if six.PY3: + from unittest import mock + from unittest.mock import MagicMock +else: + import mock + from mock import MagicMock + + +sys.path.insert(0, "../run") + +from copr_create_repo import main as createrepo_main + + +@mock.patch("copr_create_repo.createrepo") +class TestArgParser(object): + + def test_arg_parser_good_input(self, mc_main, capsys): + args = ['-u', 'foo', '-p', 'bar', '-a', 'http://example.com/api/', '/tmp'] + + createrepo_main(args) + assert mc_main.call_args == mock.call(username='foo', projectname='bar', + front_url='http://example.com/api/', path='/tmp') + + def test_arg_parser_missing_path(self, mc_main, capsys): + args = ['-u', 'foo', '-p', 'bar', '-a', 'http://example.com/api/'] + + with pytest.raises(SystemExit) as err: + createrepo_main(args) + + assert err.value.code == 1 + stdout, stderr = capsys.readouterr() + assert "No directory" in stderr + + def test_arg_parser_missing_user(self, mc_main, capsys): + args = ['-p', 'bar', '-a', 'http://example.com/api/', '/tmp'] + + with pytest.raises(SystemExit) as err: + createrepo_main(args) + + assert err.value.code == 1 + stdout, stderr = capsys.readouterr() + assert "No user" in stderr + + + def test_arg_parser_missing_project(self, mc_main, capsys): + args = ['-u', 'foo', '-a', 'http://example.com/api/', '/tmp'] + + with pytest.raises(SystemExit) as err: + createrepo_main(args) + + assert err.value.code == 1 + stdout, stderr = capsys.readouterr() + assert "No project" in stderr + + def test_arg_parser_missing_project(self, mc_main, capsys): + args = ['-u', 'foo', '-p', 'bar', '/tmp'] + + with pytest.raises(SystemExit) as err: + createrepo_main(args) + + assert err.value.code == 1 + stdout, stderr = capsys.readouterr() + assert "No api url" in stderr + diff --git a/test_suite.sh b/test_suite.sh index d98e3b4..7daaf59 100644 --- a/test_suite.sh +++ b/test_suite.sh @@ -8,7 +8,7 @@ source _venv/bin/activate
# sphinx flask flask-script SQLAlchemy==0.8.7 flask-whooshee Flask-OpenID Flask-SQLAlchemy==1.0 Flask-WTF blinker pytz markdown pyLibravatar pydns flexmock whoosh decorator -pip install pytest mock pytest-cov ipdb +pip install pytest mock pytest-cov ipdb redis bunch PyYAML
cp -rv /usr/lib/python2.7/site-packages/rpmUtils _venv/lib/python2.7/site-packages/ @@ -17,6 +17,7 @@ cp -rv /usr/lib64/python2.7/site-packages/rpm _venv/lib/python2.7/site-packages/ pip install -r python/requirements.txt pip install -r cli/requirements.txt pip install -r frontend/requirements.txt +pip install -r backend/requirements.txt pip install -r keygen/requirements.txt
@@ -26,7 +27,7 @@ COPR_CONFIG="$(pwd)/frontend/coprs_frontend/config/copr_unit_test.conf" \ python -m pytest frontend/coprs_frontend/tests --junitxml=_report/frontend.junit.xml --cov-report xml --cov frontend/coprs_frontend/coprs $@ mv {,_report/frontend.}coverage.xml
-python -m pytest backend/tests --junitxml=_report/backend.junit.xml --cov-report xml --cov backend/backend $@ +PYTHONPATH=backend/run:backend:python:$PYTHONPATH python -m pytest backend/tests --junitxml=_report/backend.junit.xml --cov-report xml --cov backend/backend $@ mv {,_report/backend.}coverage.xml
python -m pytest python/copr/test --junitxml=_report/python-copr.junit.xml --cov-report xml --cov python/copr/client $@