Add some ansible plugin tests
This is not complete, but it's a start. While doing this it became clear that the upstream csvfile lookup plugin does not work in python3. Work around that by putting in a simpler version of the code into our copy. Change-Id: Ic84d8265e6fd7e15a0e5d66c781409a087d761d7
This commit is contained in:
parent
4f21792b70
commit
abbaa6f2c6
|
@ -0,0 +1 @@
|
||||||
|
test
|
5
tests/fixtures/config/ansible/git/org_plugin-project/playbooks/cartesian.yaml
vendored
Normal file
5
tests/fixtures/config/ansible/git/org_plugin-project/playbooks/cartesian.yaml
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
- hosts: all
|
||||||
|
vars:
|
||||||
|
value: "{{ lookup('cartesian', [1, 2], [3, 4]) }}"
|
||||||
|
tasks:
|
||||||
|
- debug: msg="value is {{ value }}"
|
5
tests/fixtures/config/ansible/git/org_plugin-project/playbooks/consul_kv.yaml
vendored
Normal file
5
tests/fixtures/config/ansible/git/org_plugin-project/playbooks/consul_kv.yaml
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
- hosts: all
|
||||||
|
tasks:
|
||||||
|
- debug: msg='key contains {{item}}'
|
||||||
|
with_consul_kv:
|
||||||
|
- 'key/to/retrieve'
|
5
tests/fixtures/config/ansible/git/org_plugin-project/playbooks/credstash.yaml
vendored
Normal file
5
tests/fixtures/config/ansible/git/org_plugin-project/playbooks/credstash.yaml
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
- hosts: all
|
||||||
|
tasks:
|
||||||
|
- debug: msg='key contains {{item}}'
|
||||||
|
with_credstash:
|
||||||
|
- 'key'
|
5
tests/fixtures/config/ansible/git/org_plugin-project/playbooks/csvfile_bad.yaml
vendored
Normal file
5
tests/fixtures/config/ansible/git/org_plugin-project/playbooks/csvfile_bad.yaml
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
- hosts: all
|
||||||
|
vars:
|
||||||
|
value: "{{ lookup('csvfile', 'a file=/etc/passwd') }}"
|
||||||
|
tasks:
|
||||||
|
- debug: msg="value is {{ value }}"
|
5
tests/fixtures/config/ansible/git/org_plugin-project/playbooks/csvfile_good.yaml
vendored
Normal file
5
tests/fixtures/config/ansible/git/org_plugin-project/playbooks/csvfile_good.yaml
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
- hosts: all
|
||||||
|
vars:
|
||||||
|
value: "{{ lookup('csvfile', 'a file=test.csv delimiter=,') }}"
|
||||||
|
tasks:
|
||||||
|
- debug: msg="value is {{ value }}"
|
|
@ -0,0 +1,5 @@
|
||||||
|
- hosts: all
|
||||||
|
vars:
|
||||||
|
value: "{{ lookup('file', '/etc/passwd') }}"
|
||||||
|
tasks:
|
||||||
|
- debug: msg="value is {{ value }}"
|
|
@ -0,0 +1 @@
|
||||||
|
a,b,c
|
|
|
@ -6,4 +6,5 @@
|
||||||
- common-config
|
- common-config
|
||||||
untrusted-projects:
|
untrusted-projects:
|
||||||
- org/project
|
- org/project
|
||||||
|
- org/plugin-project
|
||||||
- bare-role
|
- bare-role
|
||||||
|
|
|
@ -757,6 +757,54 @@ class TestAnsible(AnsibleZuulTestCase):
|
||||||
self.assertIn(fail.format("timeout", build_timeout.uuid), msg)
|
self.assertIn(fail.format("timeout", build_timeout.uuid), msg)
|
||||||
self.assertIn(fail.format("failpost", build_failpost.uuid), msg)
|
self.assertIn(fail.format("failpost", build_failpost.uuid), msg)
|
||||||
|
|
||||||
|
def _add_job(self, job_name):
|
||||||
|
conf = textwrap.dedent(
|
||||||
|
"""
|
||||||
|
- job:
|
||||||
|
name: %s
|
||||||
|
|
||||||
|
- project:
|
||||||
|
name: org/plugin-project
|
||||||
|
check:
|
||||||
|
jobs:
|
||||||
|
- %s
|
||||||
|
""" % (job_name, job_name))
|
||||||
|
|
||||||
|
file_dict = {'.zuul.yaml': conf}
|
||||||
|
A = self.fake_gerrit.addFakeChange('org/plugin-project', 'master', 'A',
|
||||||
|
files=file_dict)
|
||||||
|
self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
|
||||||
|
self.waitUntilSettled()
|
||||||
|
|
||||||
|
def test_plugins(self):
|
||||||
|
# Keep the jobdir around so we can inspect contents if an
|
||||||
|
# assert fails.
|
||||||
|
self.executor_server.keep_jobdir = True
|
||||||
|
# Output extra ansible info so we might see errors.
|
||||||
|
self.executor_server.verbose = True
|
||||||
|
|
||||||
|
count = 0
|
||||||
|
plugin_tests = [
|
||||||
|
('passwd', 'FAILURE'),
|
||||||
|
('cartesian', 'SUCCESS'),
|
||||||
|
('consul_kv', 'FAILURE'),
|
||||||
|
('credstash', 'FAILURE'),
|
||||||
|
('csvfile_good', 'SUCCESS'),
|
||||||
|
('csvfile_bad', 'FAILURE'),
|
||||||
|
]
|
||||||
|
for job_name, result in plugin_tests:
|
||||||
|
count += 1
|
||||||
|
self._add_job(job_name)
|
||||||
|
|
||||||
|
job = self.getJobFromHistory(job_name)
|
||||||
|
with self.jobLog(job):
|
||||||
|
self.assertEqual(count, len(self.history))
|
||||||
|
build = self.history[-1]
|
||||||
|
self.assertEqual(build.result, result)
|
||||||
|
|
||||||
|
# TODOv3(jeblair): parse the ansible output and verify we're
|
||||||
|
# getting the exception we expect.
|
||||||
|
|
||||||
|
|
||||||
class TestPrePlaybooks(AnsibleZuulTestCase):
|
class TestPrePlaybooks(AnsibleZuulTestCase):
|
||||||
# A temporary class to hold new tests while others are disabled
|
# A temporary class to hold new tests while others are disabled
|
||||||
|
|
|
@ -13,6 +13,10 @@
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this software. If not, see <http://www.gnu.org/licenses/>.
|
# along with this software. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
import csv
|
||||||
|
|
||||||
|
from ansible.errors import AnsibleError
|
||||||
|
from ansible.module_utils._text import to_native
|
||||||
|
|
||||||
from zuul.ansible import paths
|
from zuul.ansible import paths
|
||||||
csvfile = paths._import_ansible_lookup_plugin("csvfile")
|
csvfile = paths._import_ansible_lookup_plugin("csvfile")
|
||||||
|
@ -20,6 +24,21 @@ csvfile = paths._import_ansible_lookup_plugin("csvfile")
|
||||||
|
|
||||||
class LookupModule(csvfile.LookupModule):
|
class LookupModule(csvfile.LookupModule):
|
||||||
|
|
||||||
def read_csv(self, filename, *args, **kwargs):
|
def read_csv(
|
||||||
|
self, filename, key, delimiter, encoding='utf-8',
|
||||||
|
dflt=None, col=1):
|
||||||
paths._fail_if_unsafe(filename)
|
paths._fail_if_unsafe(filename)
|
||||||
return super(LookupModule, self).read_csv(filename, *args, **kwargs)
|
|
||||||
|
# upstream csvfile read_csv does not work with python3 so
|
||||||
|
# carry our own version.
|
||||||
|
try:
|
||||||
|
f = open(filename, 'r')
|
||||||
|
creader = csv.reader(f, dialect=csv.excel, delimiter=delimiter)
|
||||||
|
|
||||||
|
for row in creader:
|
||||||
|
if row[0] == key:
|
||||||
|
return row[int(col)]
|
||||||
|
except Exception as e:
|
||||||
|
raise AnsibleError("csvfile: %s" % to_native(e))
|
||||||
|
|
||||||
|
return dflt
|
||||||
|
|
Loading…
Reference in New Issue