summaryrefslogtreecommitdiffstats
path: root/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit
diff options
context:
space:
mode:
Diffstat (limited to 'collections-debian-merged/ansible_collections/community/kubevirt/tests/unit')
-rw-r--r--collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/compat/__init__.py0
-rw-r--r--collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/compat/mock.py122
-rw-r--r--collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/compat/unittest.py38
-rw-r--r--collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/plugins/module_utils/test_kubevirt.py54
-rw-r--r--collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/plugins/modules/__init__.py0
-rw-r--r--collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/plugins/modules/kubevirt_fixtures.py74
-rw-r--r--collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/plugins/modules/test_kubevirt_rs.py78
-rw-r--r--collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/plugins/modules/test_kubevirt_vm.py113
-rw-r--r--collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/plugins/modules/utils.py52
-rw-r--r--collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/requirements.txt2
10 files changed, 533 insertions, 0 deletions
diff --git a/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/compat/__init__.py b/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/compat/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/compat/__init__.py
diff --git a/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/compat/mock.py b/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/compat/mock.py
new file mode 100644
index 00000000..0972cd2e
--- /dev/null
+++ b/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/compat/mock.py
@@ -0,0 +1,122 @@
+# (c) 2014, Toshio Kuratomi <tkuratomi@ansible.com>
+#
+# This file is part of Ansible
+#
+# Ansible is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Ansible is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
+
+# Make coding more python3-ish
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+
+'''
+Compat module for Python3.x's unittest.mock module
+'''
+import sys
+
+# Python 2.7
+
+# Note: Could use the pypi mock library on python3.x as well as python2.x. It
+# is the same as the python3 stdlib mock library
+
+try:
+ # Allow wildcard import because we really do want to import all of mock's
+ # symbols into this compat shim
+ # pylint: disable=wildcard-import,unused-wildcard-import
+ from unittest.mock import *
+except ImportError:
+ # Python 2
+ # pylint: disable=wildcard-import,unused-wildcard-import
+ try:
+ from mock import *
+ except ImportError:
+ print('You need the mock library installed on python2.x to run tests')
+
+
+# Prior to 3.4.4, mock_open cannot handle binary read_data
+if sys.version_info >= (3,) and sys.version_info < (3, 4, 4):
+ file_spec = None
+
+ def _iterate_read_data(read_data):
+ # Helper for mock_open:
+ # Retrieve lines from read_data via a generator so that separate calls to
+ # readline, read, and readlines are properly interleaved
+ sep = b'\n' if isinstance(read_data, bytes) else '\n'
+ data_as_list = [l + sep for l in read_data.split(sep)]
+
+ if data_as_list[-1] == sep:
+ # If the last line ended in a newline, the list comprehension will have an
+ # extra entry that's just a newline. Remove this.
+ data_as_list = data_as_list[:-1]
+ else:
+ # If there wasn't an extra newline by itself, then the file being
+ # emulated doesn't have a newline to end the last line remove the
+ # newline that our naive format() added
+ data_as_list[-1] = data_as_list[-1][:-1]
+
+ for line in data_as_list:
+ yield line
+
+ def mock_open(mock=None, read_data=''):
+ """
+ A helper function to create a mock to replace the use of `open`. It works
+ for `open` called directly or used as a context manager.
+
+ The `mock` argument is the mock object to configure. If `None` (the
+ default) then a `MagicMock` will be created for you, with the API limited
+ to methods or attributes available on standard file handles.
+
+ `read_data` is a string for the `read` methoddline`, and `readlines` of the
+ file handle to return. This is an empty string by default.
+ """
+ def _readlines_side_effect(*args, **kwargs):
+ if handle.readlines.return_value is not None:
+ return handle.readlines.return_value
+ return list(_data)
+
+ def _read_side_effect(*args, **kwargs):
+ if handle.read.return_value is not None:
+ return handle.read.return_value
+ return type(read_data)().join(_data)
+
+ def _readline_side_effect():
+ if handle.readline.return_value is not None:
+ while True:
+ yield handle.readline.return_value
+ for line in _data:
+ yield line
+
+ global file_spec
+ if file_spec is None:
+ import _io
+ file_spec = list(set(dir(_io.TextIOWrapper)).union(set(dir(_io.BytesIO))))
+
+ if mock is None:
+ mock = MagicMock(name='open', spec=open)
+
+ handle = MagicMock(spec=file_spec)
+ handle.__enter__.return_value = handle
+
+ _data = _iterate_read_data(read_data)
+
+ handle.write.return_value = None
+ handle.read.return_value = None
+ handle.readline.return_value = None
+ handle.readlines.return_value = None
+
+ handle.read.side_effect = _read_side_effect
+ handle.readline.side_effect = _readline_side_effect()
+ handle.readlines.side_effect = _readlines_side_effect
+
+ mock.return_value = handle
+ return mock
diff --git a/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/compat/unittest.py b/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/compat/unittest.py
new file mode 100644
index 00000000..98f08ad6
--- /dev/null
+++ b/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/compat/unittest.py
@@ -0,0 +1,38 @@
+# (c) 2014, Toshio Kuratomi <tkuratomi@ansible.com>
+#
+# This file is part of Ansible
+#
+# Ansible is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Ansible is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
+
+# Make coding more python3-ish
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+
+'''
+Compat module for Python2.7's unittest module
+'''
+
+import sys
+
+# Allow wildcard import because we really do want to import all of
+# unittests's symbols into this compat shim
+# pylint: disable=wildcard-import,unused-wildcard-import
+if sys.version_info < (2, 7):
+ try:
+ # Need unittest2 on python2.6
+ from unittest2 import *
+ except ImportError:
+ print('You need unittest2 installed on python2.6.x to run tests')
+else:
+ from unittest import *
diff --git a/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/plugins/module_utils/test_kubevirt.py b/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/plugins/module_utils/test_kubevirt.py
new file mode 100644
index 00000000..5cec7d4e
--- /dev/null
+++ b/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/plugins/module_utils/test_kubevirt.py
@@ -0,0 +1,54 @@
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+
+import json
+import pytest
+
+from ansible_collections.community.kubevirt.plugins.module_utils import kubevirt as mymodule
+
+
+def test_simple_merge_dicts():
+ dict1 = {'labels': {'label1': 'value'}}
+ dict2 = {'labels': {'label2': 'value'}}
+ dict3 = json.dumps({'labels': {'label1': 'value', 'label2': 'value'}}, sort_keys=True)
+ assert dict3 == json.dumps(dict(mymodule.KubeVirtRawModule.merge_dicts(dict1, dict2)), sort_keys=True)
+
+
+def test_simple_multi_merge_dicts():
+ dict1 = {'labels': {'label1': 'value', 'label3': 'value'}}
+ dict2 = {'labels': {'label2': 'value'}}
+ dict3 = json.dumps({'labels': {'label1': 'value', 'label2': 'value', 'label3': 'value'}}, sort_keys=True)
+ assert dict3 == json.dumps(dict(mymodule.KubeVirtRawModule.merge_dicts(dict1, dict2)), sort_keys=True)
+
+
+def test_double_nested_merge_dicts():
+ dict1 = {'metadata': {'labels': {'label1': 'value', 'label3': 'value'}}}
+ dict2 = {'metadata': {'labels': {'label2': 'value'}}}
+ dict3 = json.dumps({'metadata': {'labels': {'label1': 'value', 'label2': 'value', 'label3': 'value'}}}, sort_keys=True)
+ assert dict3 == json.dumps(dict(mymodule.KubeVirtRawModule.merge_dicts(dict1, dict2)), sort_keys=True)
+
+
+@pytest.mark.parametrize("lval, operations, rval, result", [
+ ('v1', ['<', '<='], 'v2', True),
+ ('v1', ['>', '>=', '=='], 'v2', False),
+ ('v1', ['>'], 'v1alpha1', True),
+ ('v1', ['==', '<', '<='], 'v1alpha1', False),
+ ('v1beta5', ['==', '<=', '>='], 'v1beta5', True),
+ ('v1beta5', ['<', '>', '!='], 'v1beta5', False),
+
+])
+def test_kubeapiversion_comparisons(lval, operations, rval, result):
+ KubeAPIVersion = mymodule.KubeAPIVersion
+ for op in operations:
+ test = '(KubeAPIVersion("{0}") {1} KubeAPIVersion("{2}")) == {3}'.format(lval, op, rval, result)
+ assert eval(test)
+
+
+@pytest.mark.parametrize("ver", ('nope', 'v1delta7', '1.5', 'v1beta', 'v'))
+def test_kubeapiversion_unsupported_versions(ver):
+ threw = False
+ try:
+ mymodule.KubeAPIVersion(ver)
+ except ValueError:
+ threw = True
+ assert threw
diff --git a/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/plugins/modules/__init__.py b/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/plugins/modules/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/plugins/modules/__init__.py
diff --git a/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/plugins/modules/kubevirt_fixtures.py b/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/plugins/modules/kubevirt_fixtures.py
new file mode 100644
index 00000000..645c70ca
--- /dev/null
+++ b/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/plugins/modules/kubevirt_fixtures.py
@@ -0,0 +1,74 @@
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+
+import pytest
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.community.kubevirt.tests.unit.compat.mock import MagicMock
+
+from ansible_collections.community.kubernetes.plugins.module_utils.common import K8sAnsibleMixin
+from ansible_collections.community.kubernetes.plugins.module_utils.raw import KubernetesRawModule
+from ansible_collections.community.kubevirt.plugins.module_utils.kubevirt import KubeVirtRawModule
+
+import openshift.dynamic
+
+RESOURCE_DEFAULT_ARGS = {'api_version': 'v1alpha3', 'group': 'kubevirt.io',
+ 'prefix': 'apis', 'namespaced': True}
+
+
+class AnsibleExitJson(Exception):
+ """Exception class to be raised by module.exit_json and caught
+ by the test case"""
+ def __init__(self, **kwargs):
+ for k in kwargs:
+ setattr(self, k, kwargs[k])
+
+ def __getitem__(self, attr):
+ return getattr(self, attr)
+
+
+class AnsibleFailJson(Exception):
+ """Exception class to be raised by module.fail_json and caught
+ by the test case"""
+ def __init__(self, **kwargs):
+ for k in kwargs:
+ setattr(self, k, kwargs[k])
+
+ def __getitem__(self, attr):
+ return getattr(self, attr)
+
+
+def exit_json(*args, **kwargs):
+ kwargs['success'] = True
+ if 'changed' not in kwargs:
+ kwargs['changed'] = False
+ raise AnsibleExitJson(**kwargs)
+
+
+def fail_json(*args, **kwargs):
+ kwargs['success'] = False
+ raise AnsibleFailJson(**kwargs)
+
+
+@pytest.fixture()
+def base_fixture(monkeypatch):
+ monkeypatch.setattr(
+ AnsibleModule, "exit_json", exit_json)
+ monkeypatch.setattr(
+ AnsibleModule, "fail_json", fail_json)
+ # Create mock methods in Resource directly, otherwise dyn client
+ # tries binding those to corresponding methods in DynamicClient
+ # (with partial()), which is more problematic to intercept
+ openshift.dynamic.Resource.get = MagicMock()
+ openshift.dynamic.Resource.create = MagicMock()
+ openshift.dynamic.Resource.delete = MagicMock()
+ openshift.dynamic.Resource.patch = MagicMock()
+ openshift.dynamic.Resource.search = MagicMock()
+ openshift.dynamic.Resource.watch = MagicMock()
+ # Globally mock some methods, since all tests will use this
+ KubernetesRawModule.patch_resource = MagicMock()
+ KubernetesRawModule.patch_resource.return_value = ({}, None)
+ K8sAnsibleMixin.get_api_client = MagicMock()
+ K8sAnsibleMixin.get_api_client.return_value = None
+ K8sAnsibleMixin.find_resource = MagicMock()
+ KubeVirtRawModule.find_supported_resource = MagicMock()
diff --git a/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/plugins/modules/test_kubevirt_rs.py b/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/plugins/modules/test_kubevirt_rs.py
new file mode 100644
index 00000000..b9425ee9
--- /dev/null
+++ b/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/plugins/modules/test_kubevirt_rs.py
@@ -0,0 +1,78 @@
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+
+import pytest
+
+openshiftdynamic = pytest.importorskip("openshift.dynamic")
+
+from ansible_collections.community.kubevirt.tests.unit.plugins.modules.utils import set_module_args
+from .kubevirt_fixtures import base_fixture, RESOURCE_DEFAULT_ARGS, AnsibleExitJson
+
+from ansible_collections.community.kubernetes.plugins.module_utils.raw import KubernetesRawModule
+from ansible_collections.community.kubevirt.plugins.modules import kubevirt_rs as mymodule
+
+KIND = 'VirtualMachineInstanceReplicaSet'
+
+
+@pytest.mark.usefixtures("base_fixture")
+@pytest.mark.parametrize("_replicas, _changed", ((1, True),
+ (3, True),
+ (2, False),
+ (5, True),))
+def test_scale_rs_nowait(_replicas, _changed):
+ _name = 'test-rs'
+ # Desired state:
+ args = dict(name=_name, namespace='vms', replicas=_replicas, wait=False)
+ set_module_args(args)
+
+ # Mock pre-change state:
+ resource_args = dict(kind=KIND, **RESOURCE_DEFAULT_ARGS)
+ mymodule.KubeVirtVMIRS.find_supported_resource.return_value = openshiftdynamic.Resource(**resource_args)
+ res_inst = openshiftdynamic.ResourceInstance('', dict(kind=KIND, metadata={'name': _name}, spec={'replicas': 2}))
+ openshiftdynamic.Resource.get.return_value = res_inst
+ openshiftdynamic.Resource.search.return_value = [res_inst]
+
+ # Final state, after patching the object
+ KubernetesRawModule.patch_resource.return_value = dict(kind=KIND, metadata={'name': _name},
+ spec={'replicas': _replicas}), None
+
+ # Run code:
+ with pytest.raises(AnsibleExitJson) as result:
+ mymodule.KubeVirtVMIRS().execute_module()
+
+ # Verify result:
+ assert result.value['changed'] == _changed
+
+
+@pytest.mark.usefixtures("base_fixture")
+@pytest.mark.parametrize("_replicas, _success", ((1, False),
+ (2, False),
+ (5, True),))
+def test_scale_rs_wait(_replicas, _success):
+ _name = 'test-rs'
+ # Desired state:
+ args = dict(name=_name, namespace='vms', replicas=5, wait=True)
+ set_module_args(args)
+
+ # Mock pre-change state:
+ resource_args = dict(kind=KIND, **RESOURCE_DEFAULT_ARGS)
+ mymodule.KubeVirtVMIRS.find_supported_resource.return_value = openshiftdynamic.Resource(**resource_args)
+ res_inst = openshiftdynamic.ResourceInstance('', dict(kind=KIND, metadata={'name': _name}, spec={'replicas': 2}))
+ openshiftdynamic.Resource.get.return_value = res_inst
+ openshiftdynamic.Resource.search.return_value = [res_inst]
+
+ # ~Final state, after patching the object (`replicas` match desired state)
+ KubernetesRawModule.patch_resource.return_value = dict(kind=KIND, name=_name, metadata={'name': _name},
+ spec={'replicas': 5}), None
+
+ # Final final state, as returned by resource.watch()
+ final_obj = dict(metadata=dict(name=_name), status=dict(readyReplicas=_replicas), **resource_args)
+ event = openshiftdynamic.ResourceInstance(None, final_obj)
+ openshiftdynamic.Resource.watch.return_value = [dict(object=event)]
+
+ # Run code:
+ with pytest.raises(Exception) as result:
+ mymodule.KubeVirtVMIRS().execute_module()
+
+ # Verify result:
+ assert result.value['success'] == _success
diff --git a/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/plugins/modules/test_kubevirt_vm.py b/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/plugins/modules/test_kubevirt_vm.py
new file mode 100644
index 00000000..975876e7
--- /dev/null
+++ b/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/plugins/modules/test_kubevirt_vm.py
@@ -0,0 +1,113 @@
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+
+import pytest
+
+openshiftdynamic = pytest.importorskip("openshift.dynamic")
+
+from ansible_collections.community.kubevirt.tests.unit.plugins.modules.utils import set_module_args
+from .kubevirt_fixtures import base_fixture, RESOURCE_DEFAULT_ARGS, AnsibleExitJson
+
+from ansible_collections.community.kubevirt.plugins.module_utils.kubevirt import KubeVirtRawModule
+from ansible_collections.community.kubevirt.plugins.modules import kubevirt_vm as mymodule
+
+KIND = 'VirtulMachine'
+
+
+@pytest.mark.usefixtures("base_fixture")
+def test_create_vm_with_multus_nowait():
+ # Desired state:
+ args = dict(
+ state='present', name='testvm',
+ namespace='vms',
+ interfaces=[
+ {'bridge': {}, 'name': 'default', 'network': {'pod': {}}},
+ {'bridge': {}, 'name': 'mynet', 'network': {'multus': {'networkName': 'mynet'}}},
+ ],
+ wait=False,
+ )
+ set_module_args(args)
+
+ # State as "returned" by the "k8s cluster":
+ resource_args = dict(kind=KIND, **RESOURCE_DEFAULT_ARGS)
+ KubeVirtRawModule.find_supported_resource.return_value = openshiftdynamic.Resource(**resource_args)
+ openshiftdynamic.Resource.get.return_value = None # Object doesn't exist in the cluster
+
+ # Run code:
+ with pytest.raises(AnsibleExitJson) as result:
+ mymodule.KubeVirtVM().execute_module()
+
+ # Verify result:
+ assert result.value['changed']
+ assert result.value['method'] == 'create'
+
+
+@pytest.mark.usefixtures("base_fixture")
+@pytest.mark.parametrize("_wait", (False, True))
+def test_vm_is_absent(_wait):
+ # Desired state:
+ args = dict(
+ state='absent', name='testvmi',
+ namespace='vms',
+ wait=_wait,
+ )
+ set_module_args(args)
+
+ # State as "returned" by the "k8s cluster":
+ resource_args = dict(kind=KIND, **RESOURCE_DEFAULT_ARGS)
+ KubeVirtRawModule.find_supported_resource.return_value = openshiftdynamic.Resource(**resource_args)
+ openshiftdynamic.Resource.get.return_value = None # Object doesn't exist in the cluster
+
+ # Run code:
+ with pytest.raises(AnsibleExitJson) as result:
+ mymodule.KubeVirtVM().execute_module()
+
+ # Verify result:
+ assert not result.value['kubevirt_vm']
+ assert result.value['method'] == 'delete'
+ # Note: nothing actually gets deleted, as we mock that there's not object in the cluster present,
+ # so if the method changes to something other than 'delete' at some point, that's fine
+
+
+@pytest.mark.usefixtures("base_fixture")
+def test_vmpreset_create():
+ KIND = 'VirtulMachineInstancePreset'
+ # Desired state:
+ args = dict(state='present', name='testvmipreset', namespace='vms', memory='1024Mi', wait=False)
+ set_module_args(args)
+
+ # State as "returned" by the "k8s cluster":
+ resource_args = dict(kind=KIND, **RESOURCE_DEFAULT_ARGS)
+ KubeVirtRawModule.find_supported_resource.return_value = openshiftdynamic.Resource(**resource_args)
+ openshiftdynamic.Resource.get.return_value = None # Object doesn't exist in the cluster
+
+ # Run code:
+ with pytest.raises(AnsibleExitJson) as result:
+ mymodule.KubeVirtVM().execute_module()
+
+ # Verify result:
+ assert result.value['changed']
+ assert result.value['method'] == 'create'
+
+
+@pytest.mark.usefixtures("base_fixture")
+def test_vmpreset_is_absent():
+ KIND = 'VirtulMachineInstancePreset'
+ # Desired state:
+ args = dict(state='absent', name='testvmipreset', namespace='vms')
+ set_module_args(args)
+
+ # State as "returned" by the "k8s cluster":
+ resource_args = dict(kind=KIND, **RESOURCE_DEFAULT_ARGS)
+ KubeVirtRawModule.find_supported_resource.return_value = openshiftdynamic.Resource(**resource_args)
+ openshiftdynamic.Resource.get.return_value = None # Object doesn't exist in the cluster
+
+ # Run code:
+ with pytest.raises(AnsibleExitJson) as result:
+ mymodule.KubeVirtVM().execute_module()
+
+ # Verify result:
+ assert not result.value['kubevirt_vm']
+ assert result.value['method'] == 'delete'
+ # Note: nothing actually gets deleted, as we mock that there's not object in the cluster present,
+ # so if the method changes to something other than 'delete' at some point, that's fine
diff --git a/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/plugins/modules/utils.py b/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/plugins/modules/utils.py
new file mode 100644
index 00000000..a340d28d
--- /dev/null
+++ b/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/plugins/modules/utils.py
@@ -0,0 +1,52 @@
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+
+import json
+
+from ansible_collections.community.kubevirt.tests.unit.compat import unittest
+from ansible_collections.community.kubevirt.tests.unit.compat.mock import patch
+from ansible.module_utils import basic
+from ansible.module_utils._text import to_bytes
+
+
+def set_module_args(args):
+ if '_ansible_remote_tmp' not in args:
+ args['_ansible_remote_tmp'] = '/tmp'
+ if '_ansible_keep_remote_files' not in args:
+ args['_ansible_keep_remote_files'] = False
+
+ args = json.dumps({'ANSIBLE_MODULE_ARGS': args})
+ basic._ANSIBLE_ARGS = to_bytes(args)
+
+
+class AnsibleExitJson(Exception):
+ pass
+
+
+class AnsibleFailJson(Exception):
+ pass
+
+
+def exit_json(*args, **kwargs):
+ if 'changed' not in kwargs:
+ kwargs['changed'] = False
+ raise AnsibleExitJson(kwargs)
+
+
+def fail_json(*args, **kwargs):
+ kwargs['failed'] = True
+ raise AnsibleFailJson(kwargs)
+
+
+class ModuleTestCase(unittest.TestCase):
+
+ def setUp(self):
+ self.mock_module = patch.multiple(basic.AnsibleModule, exit_json=exit_json, fail_json=fail_json)
+ self.mock_module.start()
+ self.mock_sleep = patch('time.sleep')
+ self.mock_sleep.start()
+ set_module_args({})
+ self.addCleanup(self.mock_module.stop)
+ self.addCleanup(self.mock_sleep.stop)
diff --git a/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/requirements.txt b/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/requirements.txt
new file mode 100644
index 00000000..73fafe55
--- /dev/null
+++ b/collections-debian-merged/ansible_collections/community/kubevirt/tests/unit/requirements.txt
@@ -0,0 +1,2 @@
+# requirement for kubevirt modules
+openshift ; python_version >= '2.7'