Repository :
http://git.fedorahosted.org/cgit/copr.git
On branch : master
---------------------------------------------------------------
commit 08b17088b6093aaf159d425f75f6e2b7a910e8ab
Author: Valentin Gologuzov <vgologuz(a)redhat.com>
Date: Fri Jan 2 17:22:16 2015 +0100
[backend] test build with disabled networking
---------------------------------------------------------------
backend/backend/exceptions.py | 5 ++-
backend/backend/mockremote/__init__.py | 1 +
backend/backend/mockremote/builder.py | 54 ++++++++++++++-----
backend/copr-backend.spec | 9 +++
backend/tests/mockremote/test_builder.py | 85 +++++++++++++++++++++++++-----
5 files changed, 126 insertions(+), 28 deletions(-)
diff --git a/backend/backend/exceptions.py b/backend/backend/exceptions.py
index 762d6df..164f4a7 100644
--- a/backend/backend/exceptions.py
+++ b/backend/backend/exceptions.py
@@ -13,7 +13,10 @@ class BuilderError(MockRemoteError):
class AnsibleCallError(BuilderError):
def __init__(self, msg, ansible_errors, cmd, module_name, as_root):
- super(AnsibleCallError, self).__init__(msg)
+ self.msg = "{}\nError: {}\nCall cmd: `{}`, module: `{}`, as root:
{}".format(
+ msg, ansible_errors, cmd, module_name, as_root
+ )
+ super(AnsibleCallError, self).__init__(self.msg)
self.call_args = dict(
cmd=cmd,
module_name=module_name,
diff --git a/backend/backend/mockremote/__init__.py
b/backend/backend/mockremote/__init__.py
index df5d79e..b889dad 100755
--- a/backend/backend/mockremote/__init__.py
+++ b/backend/backend/mockremote/__init__.py
@@ -138,6 +138,7 @@ class MockRemote(object):
opts=self.opts,
hostname=builder_host,
username=self.opts.build_user,
+ job=self.job,
chroot=self.job.chroot,
timeout=self.job.timeout or DEF_BUILD_TIMEOUT,
buildroot_pkgs=self.job.buildroot_pkgs,
diff --git a/backend/backend/mockremote/builder.py
b/backend/backend/mockremote/builder.py
index 4b0b53b..903a12e 100644
--- a/backend/backend/mockremote/builder.py
+++ b/backend/backend/mockremote/builder.py
@@ -13,7 +13,7 @@ from ..constants import mockchain, rsync
class Builder(object):
- def __init__(self, opts, hostname, username,
+ def __init__(self, opts, hostname, username, job,
timeout, chroot, buildroot_pkgs,
callback,
remote_basedir, remote_tempdir=None,
@@ -23,6 +23,7 @@ class Builder(object):
self.opts = opts
self.hostname = hostname
self.username = username
+ self.job = job
self.timeout = timeout
self.chroot = chroot
self.repos = repos or []
@@ -130,7 +131,7 @@ class Builder(object):
return remote_pkg_dir
- def modify_base_buildroot(self):
+ def modify_mock_chroot_config(self):
"""
Modify mock config for current chroot.
@@ -147,19 +148,44 @@ class Builder(object):
self.callback.log("putting {0} into minimal buildroot of {1}"
.format(self.buildroot_pkgs, self.chroot))
- results = self._run_ansible(
- "dest=/etc/mock/{0}.cfg"
- " line=\"config_opts['chroot_setup_cmd'] = 'install
@buildsys-build {1}'\""
+ kwargs = {
+ "chroot": self.chroot,
+ "pkgs": self.buildroot_pkgs
+ }
+ buildroot_cmd = (
+ "dest=/etc/mock/{chroot}.cfg"
+ " line=\"config_opts['chroot_setup_cmd'] = 'install
@buildsys-build {pkgs}'\""
" regexp=\"^.*chroot_setup_cmd.*$\""
- .format(self.chroot, self.buildroot_pkgs),
- module_name="lineinfile", as_root=True)
-
- is_err, err_results = check_for_ans_error(results, self.hostname)
+ )
- if is_err:
- self.callback.log("Error: {0}".format(err_results))
- myresults = get_ans_results(results, self.hostname)
- self.callback.log("{0}".format(myresults))
+ disable_networking_cmd = (
+ "dest=/etc/mock/{chroot}.cfg"
+ " line=\"config_opts['use_host_resolv'] =
False\""
+ " regexp=\"^.*user_host_resolv.*$\""
+ )
+ try:
+ self.run_ansible_with_check(buildroot_cmd.format(**kwargs),
+ module_name="lineinfile",
as_root=True)
+ # TODO: do it conditionally
+ self.run_ansible_with_check(disable_networking_cmd.format(**kwargs),
+ module_name="lineinfile",
as_root=True)
+ except BuilderError as err:
+ self.callback.log(str(err))
+
+
+ # results = self._run_ansible(
+ # "dest=/etc/mock/{0}.cfg"
+ # " line=\"config_opts['chroot_setup_cmd'] = 'install
@buildsys-build {1}'\""
+ # " regexp=\"^.*chroot_setup_cmd.*$\""
+ # .format(self.chroot, self.buildroot_pkgs),
+ # module_name="lineinfile", as_root=True)
+ #
+ # is_err, err_results = check_for_ans_error(results, self.hostname)
+ #
+ # if is_err:
+ # self.callback.log("Error: {0}".format(err_results))
+ # myresults = get_ans_results(results, self.hostname)
+ # self.callback.log("{0}".format(myresults))
def collect_built_packages(self, build_details, pkg):
self.callback.log("Listing built binary packages")
@@ -262,7 +288,7 @@ class Builder(object):
# returns success_bool, out, err
build_details = {}
- self.modify_base_buildroot()
+ self.modify_mock_chroot_config()
# check if pkg is local or http
dest = self.check_if_pkg_local_or_http(pkg)
diff --git a/backend/copr-backend.spec b/backend/copr-backend.spec
index aa0fb70..7a99e1d 100644
--- a/backend/copr-backend.spec
+++ b/backend/copr-backend.spec
@@ -45,6 +45,9 @@ BuildRequires: python-copr
BuildRequires: python-six
BuildRequires: ansible >= 1.2
BuildRequires: python-IPy
+BuildRequires: python-paramiko
+BuildRequires: python-plumbum
+BuildRequires: wget
Requires: obs-signd
Requires: ansible >= 1.2
@@ -69,6 +72,8 @@ Requires: logrotate
Requires: fedmsg
Requires: gawk
Requires: crontabs
+Requires: python-paramiko
+Requires: python-plumbum
Requires(post): systemd
Requires(preun): systemd
@@ -100,6 +105,10 @@ pushd documentation
make %{?_smp_mflags} python
popd
+pushd /tmp
+wget
http://people.redhat.com/~vgologuz/permanent/hello_beaker_test_2-0.0.1-1....
+popd
+
%install
install -d %{buildroot}%{_sharedstatedir}/copr
diff --git a/backend/tests/mockremote/test_builder.py
b/backend/tests/mockremote/test_builder.py
index 8b623b4..6f80130 100644
--- a/backend/tests/mockremote/test_builder.py
+++ b/backend/tests/mockremote/test_builder.py
@@ -4,13 +4,14 @@ import copy
from collections import defaultdict
from pprint import pprint
from bunch import Bunch
-from backend.exceptions import BuilderError, BuilderTimeOutError
+from backend.exceptions import BuilderError, BuilderTimeOutError, AnsibleCallError
import tempfile
import shutil
import os
import six
+from backend.job import BuildJob
if six.PY3:
from unittest import mock
@@ -44,6 +45,13 @@ def assert_in_log(msg, log_list):
assert any(msg in record for record in log_list)
+STDOUT = "stdout"
+STDERR = "stderr"
+COPR_OWNER = "copr_owner"
+COPR_NAME = "copr_name"
+COPR_VENDOR = "vendor"
+
+
class TestBuilder(object):
BUILDER_BUILDROOT_PKGS = []
BUILDER_CHROOT = "fedora-20-i386"
@@ -65,10 +73,23 @@ class TestBuilder(object):
)
def get_test_builder(self):
+ self.job = BuildJob({
+ "project_owner": COPR_OWNER,
+ "project_name": COPR_NAME,
+ "pkgs": self.BUILDER_PKG,
+ "repos": "",
+ "build_id": 12345,
+ "chroot": self.BUILDER_CHROOT,
+ }, Bunch({
+ "timeout": 1800,
+ "destdir": self.test_root_path,
+ "results_baseurl": "/tmp/",
+ }))
builder = Builder(
opts=self.opts,
hostname=self.BUILDER_HOSTNAME,
username=self.BUILDER_USER,
+ job=self.job,
timeout=self.BUILDER_TIMEOUT,
chroot=self.BUILDER_CHROOT,
buildroot_pkgs=self.BUILDER_BUILDROOT_PKGS,
@@ -432,7 +453,7 @@ class TestBuilder(object):
]:
with pytest.raises(BuilderError) as err:
builder.buildroot_pkgs = bad_pkg
- builder.modify_base_buildroot()
+ builder.modify_mock_chroot_config()
def test_modify_base_buildroot_on_error(self, ):
builder = self.get_test_builder()
@@ -443,7 +464,7 @@ class TestBuilder(object):
"dark": {}
}
- builder.modify_base_buildroot()
+ builder.modify_mock_chroot_config()
assert_in_log("putting {} into minimal buildroot of
fedora-20-i386".format(br_pkgs),
self._cb_log)
@@ -462,6 +483,7 @@ class TestBuilder(object):
def test_modify_base_buildroot(self, ):
builder = self.get_test_builder()
+ # TODO: rewrite test to use builder.run_ansible_with_check
br_pkgs = "foo bar"
builder.buildroot_pkgs = br_pkgs
builder.root_conn.run.return_value = {
@@ -469,20 +491,20 @@ class TestBuilder(object):
"dark": {}
}
- builder.modify_base_buildroot()
+ builder.modify_mock_chroot_config()
assert_in_log("putting {} into minimal buildroot of
fedora-20-i386".format(br_pkgs),
self._cb_log)
assert not builder.conn.run.called
assert builder.root_conn.run.called
-
- expected = (
- "dest=/etc/mock/{}.cfg "
- "line=\"config_opts['chroot_setup_cmd'] = 'install
@buildsys-build {}'\" "
- "regexp=\"^.*chroot_setup_cmd.*$\""
- ).format(self.BUILDER_CHROOT, br_pkgs)
- assert builder.root_conn.module_args == expected
+ #
+ # expected = (
+ # "dest=/etc/mock/{}.cfg "
+ # "line=\"config_opts['chroot_setup_cmd'] = 'install
@buildsys-build {}'\" "
+ # "regexp=\"^.*chroot_setup_cmd.*$\""
+ # ).format(self.BUILDER_CHROOT, br_pkgs)
+ # assert builder.root_conn.module_args == expected
def test_collect_build_packages(self):
builder = self.get_test_builder()
@@ -504,6 +526,43 @@ class TestBuilder(object):
assert builder.conn.module_args == expected
@mock.patch("backend.mockremote.builder.check_for_ans_error")
+ def test_run_ansible_with_check(self, mc_check_for_ans_errror):
+ builder = self.get_test_builder()
+
+ cmd = "cmd"
+ module_name = "module_name"
+ as_root = True
+
+ err_codes = [1, 3, 7, ]
+ success_codes = [0, 255]
+
+ results = mock.MagicMock()
+
+ err_results = mock.MagicMock()
+
+ mc_check_for_ans_errror.return_value = (False, [])
+ builder._run_ansible = mock.MagicMock()
+ builder._run_ansible.return_value = results
+
+ got_results = builder.run_ansible_with_check(
+ cmd, module_name, as_root, err_codes, success_codes)
+
+ assert results == got_results
+ expected_call_run = mock.call(cmd, module_name, as_root)
+ assert expected_call_run == builder._run_ansible.call_args
+ expected_call_check = mock.call(results, builder.hostname,
+ err_codes, success_codes)
+ assert expected_call_check == mc_check_for_ans_errror.call_args
+
+ mc_check_for_ans_errror.return_value = (True, err_results)
+
+ with pytest.raises(AnsibleCallError):
+ builder.run_ansible_with_check(
+ cmd, module_name, as_root, err_codes, success_codes)
+
+
+
+ @mock.patch("backend.mockremote.builder.check_for_ans_error")
def test_check_build_success(self, mc_check_for_ans_errror):
builder = self.get_test_builder()
@@ -673,7 +732,7 @@ class TestBuilder(object):
def test_build(self):
builder = self.get_test_builder()
- builder.modify_base_buildroot = MagicMock()
+ builder.modify_mock_chroot_config = MagicMock()
builder.check_if_pkg_local_or_http = MagicMock()
builder.check_if_pkg_local_or_http.return_value = self.BUILDER_PKG
@@ -698,7 +757,7 @@ class TestBuilder(object):
assert success
assert stdout == self.STDOUT
assert stderr == self.STDERR
- assert builder.modify_base_buildroot.called
+ assert builder.modify_mock_chroot_config.called
assert builder.check_if_pkg_local_or_http.called
assert builder.run_command_and_wait.called
assert builder.check_build_success.called