Repository :
http://git.fedorahosted.org/cgit/copr.git
On branch : master
---------------------------------------------------------------
commit 93206669285b1c868190a2ec64f6c74d5fd4b101
Author: Valentin Gologuzov <vgologuz(a)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
+
+
+(a)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 $@