Files
kubernetes.core/tests/unit/modules/test_module_helm.py
GomathiselviS b066a2dda3 Cleanup GitHub workflows (#655)
* Cleanup gha

* test by removing matrix excludes

* Rename sanity tests

* trigger integration tests

* Fix ansible-lint workflow

* Fix concurrency

* Add ansible-lint config

* Add ansible-lint config

* Fix integration and lint issues

* integration wf

* fix yamllint issues

* fix yamllint issues

* update readme and add ignore-2.16.txt

* fix ansible-doc

* Add version

* Use /dev/random to generate random data

The GHA environment has difficultly generating entropy. Trying to read
from /dev/urandom just blocks forever. We don't care if the random data
is cryptographically secure; it's just garbage data for the test. Read
from /dev/random, instead. This is only used during the k8s_copy test
target.

This also removes the custom test module that was being used to generate
the files. It's not worth maintaining this for two task that can be
replaced with some simple command/shell tasks.

* Fix saniry errors

* test github_action fix

* Address review comments

* Remove default types

* review comments

* isort fixes

* remove tags

* Add setuptools to venv

* Test gh changes

* update changelog

* update ignore-2.16

* Fix indentation in inventory plugin example

* Update .github/workflows/integration-tests.yaml

* Update integration-tests.yaml

---------

Co-authored-by: Mike Graves <mgraves@redhat.com>
Co-authored-by: Bikouo Aubin <79859644+abikouo@users.noreply.github.com>
2023-11-10 16:33:40 +01:00

497 lines
19 KiB
Python

# -*- coding: utf-8 -*-
# Copyright: (c) 2021, Ansible Project
# 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 unittest
from unittest.mock import MagicMock, call, patch
from ansible.module_utils import basic
from ansible_collections.kubernetes.core.plugins.modules import helm
from ansible_collections.kubernetes.core.tests.unit.utils.ansible_module_mock import (
AnsibleExitJson,
AnsibleFailJson,
exit_json,
fail_json,
get_bin_path,
set_module_args,
)
class TestDependencyUpdateWithoutChartRepoUrlOption(unittest.TestCase):
def setUp(self):
self.mock_module_helper = patch.multiple(
basic.AnsibleModule,
exit_json=exit_json,
fail_json=fail_json,
get_bin_path=get_bin_path,
)
self.mock_module_helper.start()
# Stop the patch after test execution
# like tearDown but executed also when the setup failed
self.addCleanup(self.mock_module_helper.stop)
self.chart_info_without_dep = {
"apiVersion": "v2",
"appVersion": "default",
"description": "A chart used in molecule tests",
"name": "test-chart",
"type": "application",
"version": "0.1.0",
}
self.chart_info_with_dep = {
"apiVersion": "v2",
"appVersion": "default",
"description": "A chart used in molecule tests",
"name": "test-chart",
"type": "application",
"version": "0.1.0",
"dependencies": [
{
"name": "test",
"version": "0.1.0",
"repository": "file://../test-chart",
}
],
}
def test_module_fail_when_required_args_missing(self):
with self.assertRaises(AnsibleFailJson):
set_module_args({})
helm.main()
def test_dependency_update_option_not_defined(self):
set_module_args(
{
"release_name": "test",
"release_namespace": "test",
"chart_ref": "/tmp/path",
}
)
helm.get_release_status = MagicMock(return_value=None)
helm.fetch_chart_info = MagicMock(return_value=self.chart_info_without_dep)
helm.run_dep_update = MagicMock()
with patch.object(basic.AnsibleModule, "run_command") as mock_run_command:
mock_run_command.return_value = (
0,
"configuration updated",
"",
) # successful execution
with self.assertRaises(AnsibleExitJson) as result:
helm.main()
helm.run_dep_update.assert_not_called()
mock_run_command.assert_called_once_with(
"/usr/bin/helm upgrade -i --reset-values test /tmp/path",
environ_update={"HELM_NAMESPACE": "test"},
)
assert (
result.exception.args[0]["command"]
== "/usr/bin/helm upgrade -i --reset-values test /tmp/path"
)
def test_dependency_update_option_false(self):
set_module_args(
{
"release_name": "test",
"release_namespace": "test",
"chart_ref": "/tmp/path",
"dependency_update": False,
}
)
helm.get_release_status = MagicMock(return_value=None)
helm.fetch_chart_info = MagicMock(return_value=self.chart_info_without_dep)
helm.run_dep_update = MagicMock()
with patch.object(basic.AnsibleModule, "run_command") as mock_run_command:
mock_run_command.return_value = (
0,
"configuration updated",
"",
) # successful execution
with self.assertRaises(AnsibleExitJson) as result:
helm.main()
helm.run_dep_update.assert_not_called()
mock_run_command.assert_called_once_with(
"/usr/bin/helm upgrade -i --reset-values test /tmp/path",
environ_update={"HELM_NAMESPACE": "test"},
)
assert (
result.exception.args[0]["command"]
== "/usr/bin/helm upgrade -i --reset-values test /tmp/path"
)
def test_dependency_update_option_true(self):
set_module_args(
{
"release_name": "test",
"release_namespace": "test",
"chart_ref": "/tmp/path",
"dependency_update": True,
}
)
helm.get_release_status = MagicMock(return_value=None)
helm.fetch_chart_info = MagicMock(return_value=self.chart_info_with_dep)
with patch.object(basic.AnsibleModule, "run_command") as mock_run_command:
mock_run_command.return_value = 0, "configuration updated", ""
with patch.object(basic.AnsibleModule, "warn") as mock_warn:
with self.assertRaises(AnsibleExitJson) as result:
helm.main()
mock_warn.assert_not_called()
mock_run_command.assert_has_calls(
[
call(
"/usr/bin/helm upgrade -i --reset-values test /tmp/path",
environ_update={"HELM_NAMESPACE": "test"},
)
]
)
assert (
result.exception.args[0]["command"]
== "/usr/bin/helm upgrade -i --reset-values test /tmp/path"
)
def test_dependency_update_option_true_without_dependencies_block(self):
set_module_args(
{
"release_name": "test",
"release_namespace": "test",
"chart_ref": "/tmp/path",
"dependency_update": True,
}
)
helm.get_release_status = MagicMock(return_value=None)
helm.fetch_chart_info = MagicMock(return_value=self.chart_info_without_dep)
with patch.object(basic.AnsibleModule, "run_command") as mock_run_command:
mock_run_command.return_value = (
0,
"configuration updated",
"",
) # successful execution
with patch.object(basic.AnsibleModule, "warn") as mock_warn:
with self.assertRaises(AnsibleExitJson) as result:
helm.main()
mock_warn.assert_called_once()
mock_run_command.assert_has_calls(
[
call(
"/usr/bin/helm upgrade -i --reset-values test /tmp/path",
environ_update={"HELM_NAMESPACE": "test"},
)
]
)
assert (
result.exception.args[0]["command"]
== "/usr/bin/helm upgrade -i --reset-values test /tmp/path"
)
class TestDependencyUpdateWithChartRepoUrlOption(unittest.TestCase):
def setUp(self):
self.mock_module_helper = patch.multiple(
basic.AnsibleModule,
exit_json=exit_json,
fail_json=fail_json,
get_bin_path=get_bin_path,
)
self.mock_module_helper.start()
# Stop the patch after test execution
# like tearDown but executed also when the setup failed
self.addCleanup(self.mock_module_helper.stop)
self.chart_info_without_dep = {
"apiVersion": "v2",
"appVersion": "default",
"description": "A chart used in molecule tests",
"name": "test-chart",
"type": "application",
"version": "0.1.0",
}
self.chart_info_with_dep = {
"apiVersion": "v2",
"appVersion": "default",
"description": "A chart used in molecule tests",
"name": "test-chart",
"type": "application",
"version": "0.1.0",
"dependencies": [
{
"name": "test",
"version": "0.1.0",
"repository": "file://../test-chart",
}
],
}
def test_dependency_update_option_not_defined(self):
set_module_args(
{
"release_name": "test",
"release_namespace": "test",
"chart_ref": "chart1",
"chart_repo_url": "http://repo.example/charts",
}
)
helm.get_release_status = MagicMock(return_value=None)
helm.fetch_chart_info = MagicMock(return_value=self.chart_info_without_dep)
with patch.object(basic.AnsibleModule, "run_command") as mock_run_command:
mock_run_command.return_value = (
0,
"configuration updated",
"",
) # successful execution
with self.assertRaises(AnsibleExitJson) as result:
helm.main()
mock_run_command.assert_called_once_with(
"/usr/bin/helm --repo=http://repo.example/charts upgrade -i --reset-values test chart1",
environ_update={"HELM_NAMESPACE": "test"},
)
assert (
result.exception.args[0]["command"]
== "/usr/bin/helm --repo=http://repo.example/charts upgrade -i --reset-values test chart1"
)
def test_dependency_update_option_False(self):
set_module_args(
{
"release_name": "test",
"release_namespace": "test",
"chart_ref": "chart1",
"chart_repo_url": "http://repo.example/charts",
"dependency_update": False,
}
)
helm.get_release_status = MagicMock(return_value=None)
helm.fetch_chart_info = MagicMock(return_value=self.chart_info_without_dep)
with patch.object(basic.AnsibleModule, "run_command") as mock_run_command:
mock_run_command.return_value = (
0,
"configuration updated",
"",
) # successful execution
with self.assertRaises(AnsibleExitJson) as result:
helm.main()
mock_run_command.assert_called_once_with(
"/usr/bin/helm --repo=http://repo.example/charts upgrade -i --reset-values test chart1",
environ_update={"HELM_NAMESPACE": "test"},
)
assert (
result.exception.args[0]["command"]
== "/usr/bin/helm --repo=http://repo.example/charts upgrade -i --reset-values test chart1"
)
def test_dependency_update_option_True_and_replace_option_disabled(self):
set_module_args(
{
"release_name": "test",
"release_namespace": "test",
"chart_ref": "chart1",
"chart_repo_url": "http://repo.example/charts",
"dependency_update": True,
}
)
helm.get_release_status = MagicMock(return_value=None)
helm.fetch_chart_info = MagicMock(return_value=self.chart_info_with_dep)
with patch.object(basic.AnsibleModule, "run_command") as mock_run_command:
mock_run_command.return_value = (
0,
"configuration updated",
"",
) # successful execution
with self.assertRaises(AnsibleFailJson) as result:
helm.main()
# mock_run_command.assert_called_once_with('/usr/bin/helm --repo=http://repo.example/charts upgrade -i --reset-values test chart1',
# environ_update={'HELM_NAMESPACE': 'test'})
assert result.exception.args[0]["msg"] == (
"'--dependency-update' hasn't been supported yet with 'helm upgrade'. "
"Please use 'helm install' instead by adding 'replace' option"
)
assert result.exception.args[0]["failed"]
def test_dependency_update_option_True_and_replace_option_enabled(self):
set_module_args(
{
"release_name": "test",
"release_namespace": "test",
"chart_ref": "chart1",
"chart_repo_url": "http://repo.example/charts",
"dependency_update": True,
"replace": True,
}
)
helm.get_release_status = MagicMock(return_value=None)
helm.fetch_chart_info = MagicMock(return_value=self.chart_info_without_dep)
with patch.object(basic.AnsibleModule, "run_command") as mock_run_command:
mock_run_command.return_value = (
0,
"configuration updated",
"",
) # successful execution
with self.assertRaises(AnsibleExitJson) as result:
helm.main()
mock_run_command.assert_called_once_with(
"/usr/bin/helm --repo=http://repo.example/charts install --dependency-update --replace test chart1",
environ_update={"HELM_NAMESPACE": "test"},
)
assert (
result.exception.args[0]["command"]
== "/usr/bin/helm --repo=http://repo.example/charts install --dependency-update --replace test chart1"
)
class TestDependencyUpdateWithChartRefIsUrl(unittest.TestCase):
def setUp(self):
self.mock_module_helper = patch.multiple(
basic.AnsibleModule,
exit_json=exit_json,
fail_json=fail_json,
get_bin_path=get_bin_path,
)
self.mock_module_helper.start()
# Stop the patch after test execution
# like tearDown but executed also when the setup failed
self.addCleanup(self.mock_module_helper.stop)
self.chart_info_without_dep = {
"apiVersion": "v2",
"appVersion": "default",
"description": "A chart used in molecule tests",
"name": "test-chart",
"type": "application",
"version": "0.1.0",
}
self.chart_info_with_dep = {
"apiVersion": "v2",
"appVersion": "default",
"description": "A chart used in molecule tests",
"name": "test-chart",
"type": "application",
"version": "0.1.0",
"dependencies": [
{
"name": "test",
"version": "0.1.0",
"repository": "file://../test-chart",
}
],
}
def test_dependency_update_option_not_defined(self):
set_module_args(
{
"release_name": "test",
"release_namespace": "test",
"chart_ref": "http://repo.example/charts/application.tgz",
}
)
helm.get_release_status = MagicMock(return_value=None)
helm.fetch_chart_info = MagicMock(return_value=self.chart_info_without_dep)
with patch.object(basic.AnsibleModule, "run_command") as mock_run_command:
mock_run_command.return_value = (
0,
"configuration updated",
"",
) # successful execution
with self.assertRaises(AnsibleExitJson) as result:
helm.main()
mock_run_command.assert_called_once_with(
"/usr/bin/helm upgrade -i --reset-values test http://repo.example/charts/application.tgz",
environ_update={"HELM_NAMESPACE": "test"},
)
assert (
result.exception.args[0]["command"]
== "/usr/bin/helm upgrade -i --reset-values test http://repo.example/charts/application.tgz"
)
def test_dependency_update_option_False(self):
set_module_args(
{
"release_name": "test",
"release_namespace": "test",
"chart_ref": "http://repo.example/charts/application.tgz",
"dependency_update": False,
}
)
helm.get_release_status = MagicMock(return_value=None)
helm.fetch_chart_info = MagicMock(return_value=self.chart_info_without_dep)
with patch.object(basic.AnsibleModule, "run_command") as mock_run_command:
mock_run_command.return_value = (
0,
"configuration updated",
"",
) # successful execution
with self.assertRaises(AnsibleExitJson) as result:
helm.main()
mock_run_command.assert_called_once_with(
"/usr/bin/helm upgrade -i --reset-values test http://repo.example/charts/application.tgz",
environ_update={"HELM_NAMESPACE": "test"},
)
assert (
result.exception.args[0]["command"]
== "/usr/bin/helm upgrade -i --reset-values test http://repo.example/charts/application.tgz"
)
def test_dependency_update_option_True_and_replace_option_disabled(self):
set_module_args(
{
"release_name": "test",
"release_namespace": "test",
"chart_ref": "http://repo.example/charts/application.tgz",
"dependency_update": True,
}
)
helm.get_release_status = MagicMock(return_value=None)
helm.fetch_chart_info = MagicMock(return_value=self.chart_info_with_dep)
with patch.object(basic.AnsibleModule, "run_command") as mock_run_command:
mock_run_command.return_value = (
0,
"configuration updated",
"",
) # successful execution
with self.assertRaises(AnsibleFailJson) as result:
helm.main()
# mock_run_command.assert_called_once_with('/usr/bin/helm --repo=http://repo.example/charts upgrade -i --reset-values test chart1',
# environ_update={'HELM_NAMESPACE': 'test'})
assert result.exception.args[0]["msg"] == (
"'--dependency-update' hasn't been supported yet with 'helm upgrade'. "
"Please use 'helm install' instead by adding 'replace' option"
)
assert result.exception.args[0]["failed"]
def test_dependency_update_option_True_and_replace_option_enabled(self):
set_module_args(
{
"release_name": "test",
"release_namespace": "test",
"chart_ref": "http://repo.example/charts/application.tgz",
"dependency_update": True,
"replace": True,
}
)
helm.get_release_status = MagicMock(return_value=None)
helm.fetch_chart_info = MagicMock(return_value=self.chart_info_without_dep)
with patch.object(basic.AnsibleModule, "run_command") as mock_run_command:
mock_run_command.return_value = (
0,
"configuration updated",
"",
) # successful execution
with self.assertRaises(AnsibleExitJson) as result:
helm.main()
mock_run_command.assert_called_once_with(
"/usr/bin/helm install --dependency-update --replace test http://repo.example/charts/application.tgz",
environ_update={"HELM_NAMESPACE": "test"},
)
assert (
result.exception.args[0]["command"]
== "/usr/bin/helm install --dependency-update --replace test http://repo.example/charts/application.tgz"
)