Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 09591c30e2fc6b799160ee72ab900405073030b8
Author: Pavel Raiskup <praiskup(a)redhat.com>
Date: Fri Jun 13 14:04:15 2014 +0200
backend: allow passing additional info to playbooks
Sometimes is useful to parametrize spawn_instance or
terminate_instance ansible playbooks. Motivation for this was
that we want make the spawn_instance playbook clever enough to
give us proper builder machine based on 'chroot' architecture
(fedora-20-ppc64 should give us ppc64 machine).
>---------------------------------------------------------------
backend/backend/dispatcher.py | 32 +++++++++++++++++++++++++++-----
backend/copr-be.conf.example | 19 +++++++++++++++++++
backend/copr-be.py | 4 ++++
3 files changed, 50 insertions(+), 5 deletions(-)
diff --git a/backend/backend/dispatcher.py b/backend/backend/dispatcher.py
index 8a280ea..7e6b16c 100644
--- a/backend/backend/dispatcher.py
+++ b/backend/backend/dispatcher.py
@@ -26,6 +26,12 @@ try:
except ImportError:
pass # fedmsg is optional
+def ans_extra_vars_encode(extra_vars, name):
+ """ transform dict into --extra-vars="json string" """
+ if not extra_vars:
+ return ""
+ return "--extra-vars='{{\"{0}\": {1}}}'".format(
+ name, json.dumps(extra_vars))
class SilentPlaybookCallbacks(callbacks.PlaybookCallbacks):
@@ -197,7 +203,7 @@ class Worker(multiprocessing.Process):
self.callback.log(name + ": end")
return result
- def spawn_instance(self):
+ def spawn_instance(self, job):
"""call the spawn playbook to startup/provision a building instance"""
start = time.time()
@@ -205,7 +211,16 @@ class Worker(multiprocessing.Process):
# Ansible playbook python API does not work here, dunno why. See:
# https://groups.google.com/forum/#!topic/ansible-project/DNBD2oHv5k8
- args = "-c ssh {0}".format(self.opts.spawn_playbook)
+ extra_vars = {}
+ if self.opts.spawn_vars:
+ for i in self.opts.spawn_vars.split(","):
+ if i == 'chroot':
+ extra_vars['chroot'] = job['chroot']
+
+ args = "-c ssh {0} {1}".format(
+ self.opts.spawn_playbook,
+ ans_extra_vars_encode(extra_vars, "copr_task"))
+
result = self.run_ansible_playbook(args, "spawning instance")
if not result:
return None
@@ -241,8 +256,15 @@ class Worker(multiprocessing.Process):
def terminate_instance(self, instance_ip):
"""call the terminate playbook to destroy the building instance"""
- args = "-c ssh -i '{0},' {1}".format(instance_ip,
- self.opts.terminate_playbook)
+ term_args = {}
+ if self.opts.terminate_vars:
+ for i in self.opts.terminate_vars.split(","):
+ if i == "ip":
+ term_args["ip"] = instance_ip
+
+ args = "-c ssh -i '{0},' {1} {2}".format(
+ instance_ip, self.opts.terminate_playbook,
+ ans_extra_vars_encode(term_args, "copr_task"))
self.run_ansible_playbook(args, "terminate instance")
@@ -368,7 +390,7 @@ class Worker(multiprocessing.Process):
# spin up our build instance
if self.create:
try:
- ip = self.spawn_instance()
+ ip = self.spawn_instance(job)
if not ip:
raise errors.CoprWorkerError(
"No IP found from creating instance")
diff --git a/backend/copr-be.conf.example b/backend/copr-be.conf.example
index e92d14d..c101f54 100644
--- a/backend/copr-be.conf.example
+++ b/backend/copr-be.conf.example
@@ -17,10 +17,29 @@ frontend_auth=backend_password_from_fe_config
# default is /etc/copr/builder_playbook.yml
spawn_playbook=/srv/copr-work/provision/builderpb.yml
+# What variables will be send to spawn_playbook. Expects comma separated list
+# of keywords. For example 'spawn_vars=chroot' will create
+# 'copr_task["chroot"]' variable accessible from spawn_playbook.
+# Currently supported parameters
+# - chroot
+# string representation of expect chroot to be alloced, e.g.
+# fedora-rawhide-ppc64
+#
+# default is None (empty)
+#spawn_vars=chroot
+
# path to ansible playbook which terminate builder
# default is /etc/copr/terminate_playbook.yml
terminate_playbook=/srv/copr-work/provision/terminatepb.yml
+# The same option as 'spawn_vars' above, except that variables will be send to
+# terminate_playbook ansible script.
+# Currently supported parameters:
+# - ip
+# IP address of builder which should be terminated
+# default is None (empty)
+#terminate_vars=ip
+
# directory where jobs are stored
# no defaults
jobsdir=/var/lib/copr/jobs
diff --git a/backend/copr-be.py b/backend/copr-be.py
index f331513..fd7c01e 100755
--- a/backend/copr-be.py
+++ b/backend/copr-be.py
@@ -244,6 +244,10 @@ class CoprBackend(object):
opts.verbose = _get_conf(cp, "backend", "verbose", False)
opts.worker_logdir = _get_conf(
cp, "backend", "worker_logdir", "/var/log/copr/workers/")
+ opts.spawn_vars = _get_conf(cp, "backend", "spawn_vars", None)
+ opts.terminate_vars = _get_conf(cp, "backend", "terminate_vars",
+ None)
+
# thoughts for later
# ssh key for connecting to builders?
# cloud key stuff?