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
|
||||
untrusted-projects:
|
||||
- org/project
|
||||
- org/plugin-project
|
||||
- bare-role
|
||||
|
|
|
@ -757,6 +757,54 @@ class TestAnsible(AnsibleZuulTestCase):
|
|||
self.assertIn(fail.format("timeout", build_timeout.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):
|
||||
# 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
|
||||
# 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
|
||||
csvfile = paths._import_ansible_lookup_plugin("csvfile")
|
||||
|
@ -20,6 +24,21 @@ csvfile = paths._import_ansible_lookup_plugin("csvfile")
|
|||
|
||||
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)
|
||||
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