Repository :
http://git.fedorahosted.org/cgit/copr.git
On branch : master
---------------------------------------------------------------
commit fc251751427ab7d11f3528cd9ca04757b740a76f
Author: Valentin Gologuzov <vgologuz(a)redhat.com>
Date: Fri Sep 11 13:57:48 2015 +0200
[backend] split backend daemon: extracting VMM
---------------------------------------------------------------
backend/backend/daemons/backend.py | 2 +-
backend/backend/helpers.py | 18 ++++++
backend/copr-backend.spec | 5 +-
backend/run/copr_run_vmm.py | 62 ++++++++++++++++++++
.../systemd/copr-backend-vmm.service} | 4 +-
backend/{ => run/systemd}/copr-backend.service | 3 +-
backend/tests/deamons/test_backend.py | 2 -
7 files changed, 87 insertions(+), 9 deletions(-)
diff --git a/backend/backend/daemons/backend.py b/backend/backend/daemons/backend.py
index a78791d..1dd1385 100644
--- a/backend/backend/daemons/backend.py
+++ b/backend/backend/daemons/backend.py
@@ -123,7 +123,7 @@ class CoprBackend(object):
self._start_log_handler()
self._start_job_grab()
- self._start_vmm()
+ # self._start_vmm()
def _start_vmm(self):
self.log.info("Creating VM Spawner, HealthChecker, Terminator")
diff --git a/backend/backend/helpers.py b/backend/backend/helpers.py
index 0bcf97f..e26d5f7 100644
--- a/backend/backend/helpers.py
+++ b/backend/backend/helpers.py
@@ -367,3 +367,21 @@ def silent_remove(filename):
except OSError as e: # this would be "except OSError, e:" before Python
2.6
if e.errno != errno.ENOENT: # errno.ENOENT = no such file or directory
raise # re-raise exception if a different error occured
+
+
+def get_backend_opts():
+ args = sys.argv[1:]
+ parser = optparse.OptionParser("\ncopr-be [options]")
+ parser.add_option("-c", "--config",
default="/etc/copr/copr-be.conf",
+ dest="config_file",
+ help="config file to use for copr-be run")
+
+ opts, args = parser.parse_args(args)
+ if not os.path.exists(opts.config_file):
+ sys.stderr.write("No config file found at: {0}\n".format(
+ opts.config_file))
+ sys.exit(1)
+
+ config_file = os.path.abspath(opts.config_file)
+ config_reader = BackendConfigReader(config_file, {})
+ return config_reader.read()
diff --git a/backend/copr-backend.spec b/backend/copr-backend.spec
index 3cea572..3ddd257 100644
--- a/backend/copr-backend.spec
+++ b/backend/copr-backend.spec
@@ -159,7 +159,8 @@ touch %{buildroot}%{_var}/log/copr/prune_old.log
touch %{buildroot}%{_var}/run/copr-backend/copr-be.pid
-install -m 0644 copr-backend.service %{buildroot}/%{_unitdir}/
+#install -m 0644 copr-backend.service %{buildroot}/%{_unitdir}/
+cp -a run/systemd/*.service %{buildroot}/%{_unitdir}/
install -m 0644 conf/copr.sudoers.d %{buildroot}%{_sysconfdir}/sudoers.d/copr
@@ -225,7 +226,7 @@ useradd -r -g copr -G lighttpd -s /bin/bash -c "COPR user"
copr
%doc %{_pkgdocdir}/playbooks
%dir %{_sysconfdir}/copr
%config(noreplace) %attr(0640, root, copr) %{_sysconfdir}/copr/copr-be.conf
-%{_unitdir}/copr-backend.service
+%{_unitdir}/*.service
%{_tmpfilesdir}/copr-backend.conf
%{_bindir}/*
diff --git a/backend/run/copr_run_vmm.py b/backend/run/copr_run_vmm.py
new file mode 100755
index 0000000..f3c03f0
--- /dev/null
+++ b/backend/run/copr_run_vmm.py
@@ -0,0 +1,62 @@
+#!/usr/bin/python2
+# coding: utf-8
+
+from __future__ import print_function
+from __future__ import unicode_literals
+from __future__ import division
+from __future__ import absolute_import
+
+from setproctitle import setproctitle
+
+from backend.vm_manage.manager import VmManager
+from backend.vm_manage.spawn import Spawner
+from backend.vm_manage.event_handle import EventHandler
+from backend.vm_manage.terminate import Terminator
+from backend.vm_manage.check import HealthChecker
+from backend.daemons.vm_master import VmMaster
+from backend.helpers import get_redis_logger, get_backend_opts
+
+
+class VmmRunner(object):
+
+ def __init__(self, opts):
+ self.opts = opts
+ self.log = get_redis_logger(self.opts, "vmm.main", "vmm")
+
+ def run(self):
+ # todo: 1) do all ansible calls through subprocess
+ # 2) move to Python 3 and asyncIO all in one thread + executors
+ # ... -> eliminate multiprocessing here,
+ # ... possible to use simple logging, with redis handler
+
+ self.log.info("Creating VM Spawner, HealthChecker, Terminator")
+ self.spawner = Spawner(self.opts)
+ self.checker = HealthChecker(self.opts)
+ self.terminator = Terminator(self.opts)
+ self.vm_manager = VmManager(
+ opts=self.opts, logger=self.log,
+ )
+ self.vm_manager.post_init()
+ self.log.info("Starting up VM EventHandler")
+ self.event_handler = EventHandler(self.opts,
+ vmm=self.vm_manager,
+ terminator=self.terminator)
+ self.event_handler.post_init()
+ self.event_handler.start()
+
+ self.log.info("Starting up VM Master")
+ self.vm_master = VmMaster(self.opts,
+ vmm=self.vm_manager,
+ spawner=self.spawner,
+ checker=self.checker)
+ self.vm_master.start()
+ setproctitle("Copr VMM base process")
+
+
+def main():
+ opts = get_backend_opts()
+ vr = VmmRunner(opts)
+ vr.run()
+
+if __name__ == "__main__":
+ main()
diff --git a/backend/copr-backend.service b/backend/run/systemd/copr-backend-vmm.service
similarity index 66%
copy from backend/copr-backend.service
copy to backend/run/systemd/copr-backend-vmm.service
index 71fa067..9784b93 100644
--- a/backend/copr-backend.service
+++ b/backend/run/systemd/copr-backend-vmm.service
@@ -4,12 +4,10 @@ After=syslog.target network.target auditd.service
[Service]
Type=simple
-PIDFile=/var/run/copr-backend/copr-be.pid
Environment="PYTHONPATH=/usr/share/copr/"
User=copr
Group=copr
-ExecStart=/usr/bin/copr_be.py
-ExecReload=/bin/kill -HUP $MAINPID
+ExecStart=/usr/bin/copr_run_vmm.py
[Install]
WantedBy=multi-user.target
diff --git a/backend/copr-backend.service b/backend/run/systemd/copr-backend.service
similarity index 73%
copy from backend/copr-backend.service
copy to backend/run/systemd/copr-backend.service
index 71fa067..8aa36db 100644
--- a/backend/copr-backend.service
+++ b/backend/run/systemd/copr-backend.service
@@ -1,6 +1,7 @@
[Unit]
-Description=Copr Backend service
+Description=Copr Backend service, Virtual Machine Management component
After=syslog.target network.target auditd.service
+Requires=copr-backend-vmm.service
[Service]
Type=simple
diff --git a/backend/tests/deamons/test_backend.py
b/backend/tests/deamons/test_backend.py
index b3da64d..37fade0 100644
--- a/backend/tests/deamons/test_backend.py
+++ b/backend/tests/deamons/test_backend.py
@@ -119,13 +119,11 @@ class TestBackend(object):
)
-
@pytest.fixture
def init_be(self):
self.be = CoprBackend(self.config_file, self.ext_opts)
self.be.log = MagicMock()
-
@pytest.yield_fixture
def mc_vmm_stuff(self):
patchers = []