Merge "Put Zuul vars in an ansible vars file" into feature/zuulv3

This commit is contained in:
Jenkins 2017-02-06 16:42:45 +00:00 committed by Gerrit Code Review
commit 95508716de
5 changed files with 26 additions and 6 deletions

View File

@ -676,6 +676,7 @@ class RecordingLaunchServer(zuul.launcher.server.LaunchServer):
""" """
def __init__(self, *args, **kw): def __init__(self, *args, **kw):
self._run_ansible = kw.pop('_run_ansible', False) self._run_ansible = kw.pop('_run_ansible', False)
self._test_root = kw.pop('_test_root', False)
super(RecordingLaunchServer, self).__init__(*args, **kw) super(RecordingLaunchServer, self).__init__(*args, **kw)
self.hold_jobs_in_build = False self.hold_jobs_in_build = False
self.lock = threading.Lock() self.lock = threading.Lock()
@ -724,6 +725,9 @@ class RecordingLaunchServer(zuul.launcher.server.LaunchServer):
job.build = build job.build = build
self.running_builds.append(build) self.running_builds.append(build)
self.job_builds[job.unique] = build self.job_builds[job.unique] = build
args = json.loads(job.arguments)
args['zuul']['_test'] = dict(test_root=self._test_root)
job.arguments = json.dumps(args)
super(RecordingLaunchServer, self).launchJob(job) super(RecordingLaunchServer, self).launchJob(job)
def stopJob(self, job): def stopJob(self, job):
@ -1252,7 +1256,9 @@ class ZuulTestCase(BaseTestCase):
self._startMerger() self._startMerger()
self.launch_server = RecordingLaunchServer( self.launch_server = RecordingLaunchServer(
self.config, self.connections, _run_ansible=self.run_ansible) self.config, self.connections,
_run_ansible=self.run_ansible,
_test_root=self.test_root)
self.launch_server.start() self.launch_server.start()
self.history = self.launch_server.build_history self.history = self.launch_server.build_history
self.builds = self.launch_server.running_builds self.builds = self.launch_server.running_builds

View File

@ -1,6 +1,5 @@
# TODO(jeblair): Perform an action inside of a test chroot
- hosts: all - hosts: all
tasks: tasks:
- file: - file:
path: /tmp/playbook.test path: "{{zuul._test.test_root}}/{{zuul.uuid}}.flag"
state: touch state: touch

View File

@ -15,6 +15,7 @@
# under the License. # under the License.
import logging import logging
import os
import textwrap import textwrap
from tests.base import AnsibleZuulTestCase from tests.base import AnsibleZuulTestCase
@ -129,5 +130,7 @@ class TestAnsible(AnsibleZuulTestCase):
A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A') A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1)) self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
self.waitUntilSettled() self.waitUntilSettled()
self.assertEqual(self.getJobFromHistory('python27').result, build = self.getJobFromHistory('python27')
'SUCCESS') self.assertEqual(build.result, 'SUCCESS')
flag_path = os.path.join(self.test_root, build.uuid + '.flag')
self.assertTrue(os.path.exists(flag_path))

View File

@ -300,6 +300,10 @@ class LaunchClient(object):
[x.change for x in dependent_items])) [x.change for x in dependent_items]))
dependent_items = dependent_items[:] dependent_items = dependent_items[:]
dependent_items.reverse() dependent_items.reverse()
# TODOv3(jeblair): This ansible vars data structure will
# replace the environment variables below.
zuul_params = dict(uuid=uuid)
# Legacy environment variables
params = dict(ZUUL_UUID=uuid, params = dict(ZUUL_UUID=uuid,
ZUUL_PROJECT=item.change.project.name) ZUUL_PROJECT=item.change.project.name)
params['ZUUL_PIPELINE'] = pipeline.name params['ZUUL_PIPELINE'] = pipeline.name
@ -382,6 +386,7 @@ class LaunchClient(object):
for node in item.current_build_set.getJobNodeSet(job.name).getNodes(): for node in item.current_build_set.getJobNodeSet(job.name).getNodes():
nodes.append(dict(name=node.name, image=node.image)) nodes.append(dict(name=node.name, image=node.image))
params['nodes'] = nodes params['nodes'] = nodes
params['zuul'] = zuul_params
projects = set() projects = set()
for item in all_items: for item in all_items:
if item.change.project not in projects: if item.change.project not in projects:

View File

@ -24,6 +24,7 @@ import tempfile
import threading import threading
import time import time
import traceback import traceback
import yaml
import gear import gear
@ -75,6 +76,7 @@ class JobDir(object):
os.makedirs(self.ansible_root) os.makedirs(self.ansible_root)
self.known_hosts = os.path.join(self.ansible_root, 'known_hosts') self.known_hosts = os.path.join(self.ansible_root, 'known_hosts')
self.inventory = os.path.join(self.ansible_root, 'inventory') self.inventory = os.path.join(self.ansible_root, 'inventory')
self.vars = os.path.join(self.ansible_root, 'vars.yaml')
self.playbook = None self.playbook = None
self.playbook_root = os.path.join(self.ansible_root, 'playbook') self.playbook_root = os.path.join(self.ansible_root, 'playbook')
os.makedirs(self.playbook_root) os.makedirs(self.playbook_root)
@ -444,6 +446,10 @@ class LaunchServer(object):
for k, v in host_vars.items(): for k, v in host_vars.items():
inventory.write('%s=%s' % (k, v)) inventory.write('%s=%s' % (k, v))
inventory.write('\n') inventory.write('\n')
with open(jobdir.vars, 'w') as vars_yaml:
zuul_vars = dict(zuul=args['zuul'])
vars_yaml.write(
yaml.safe_dump(zuul_vars, default_flow_style=False))
with open(jobdir.config, 'w') as config: with open(jobdir.config, 'w') as config:
config.write('[defaults]\n') config.write('[defaults]\n')
config.write('hostfile = %s\n' % jobdir.inventory) config.write('hostfile = %s\n' % jobdir.inventory)
@ -499,7 +505,8 @@ class LaunchServer(object):
else: else:
verbose = '-v' verbose = '-v'
cmd = ['ansible-playbook', jobdir.playbook, verbose] cmd = ['ansible-playbook', jobdir.playbook,
'-e@%s' % jobdir.vars, verbose]
self.log.debug("Ansible command: %s" % (cmd,)) self.log.debug("Ansible command: %s" % (cmd,))
# TODOv3: verbose # TODOv3: verbose
proc = subprocess.Popen( proc = subprocess.Popen(