mirror of
https://github.com/kubevirt/kubevirt.core.git
synced 2026-07-25 08:54:43 +00:00
feat(inventory): add default_win_ansible_connection option
It adds the option `default_win_ansible_connection` to allow users to configure the default `ansible_connection` for Windows VMs detected by the inventory plugin, instead of always hardcoding `winrm`. This enables use of alternative connection plugins like `psrp` or `ssh` without per-host overrides. Defaults to `winrm` for backward compatibility. Assisted-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Signed-off-by: Javier Cano Cano <jcanocan@redhat.com>
This commit is contained in:
@@ -78,23 +78,54 @@ SVC_LB_WINRM_HTTPS = {
|
||||
},
|
||||
"status": {"loadBalancer": {"ingress": [{"ip": "192.168.1.100"}]}},
|
||||
}
|
||||
SVC_LB_SSH = merge_dicts(
|
||||
SVC_LB_WINRM_HTTPS,
|
||||
{
|
||||
"metadata": {
|
||||
"name": "test-lb-ssh",
|
||||
"uid": "33a31042-f58c-5044-cf78-ef211cedb1d4",
|
||||
},
|
||||
"spec": {
|
||||
"ports": [
|
||||
{
|
||||
"protocol": "TCP",
|
||||
"port": 12345,
|
||||
"targetPort": 22,
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"vmi,expected,use_service",
|
||||
"vmi,expected,use_service,default_win_ansible_connection,services",
|
||||
[
|
||||
(BASE_VMI, False, False),
|
||||
(WINDOWS_VMI_1, True, True),
|
||||
(WINDOWS_VMI_2, True, True),
|
||||
(WINDOWS_VMI_3, True, True),
|
||||
(WINDOWS_VMI_4, True, True),
|
||||
(WINDOWS_VMI_1, True, False),
|
||||
(WINDOWS_VMI_2, True, False),
|
||||
(WINDOWS_VMI_3, True, False),
|
||||
(WINDOWS_VMI_4, True, False),
|
||||
(BASE_VMI, False, False, "winrm", [SVC_LB_WINRM_HTTPS]),
|
||||
(WINDOWS_VMI_1, True, True, "winrm", [SVC_LB_WINRM_HTTPS]),
|
||||
(WINDOWS_VMI_2, True, True, "winrm", [SVC_LB_WINRM_HTTPS]),
|
||||
(WINDOWS_VMI_3, True, True, "winrm", [SVC_LB_WINRM_HTTPS]),
|
||||
(WINDOWS_VMI_4, True, True, "winrm", [SVC_LB_WINRM_HTTPS]),
|
||||
(WINDOWS_VMI_1, True, False, "winrm", [SVC_LB_WINRM_HTTPS]),
|
||||
(WINDOWS_VMI_2, True, False, "winrm", [SVC_LB_WINRM_HTTPS]),
|
||||
(WINDOWS_VMI_3, True, False, "winrm", [SVC_LB_WINRM_HTTPS]),
|
||||
(WINDOWS_VMI_4, True, False, "winrm", [SVC_LB_WINRM_HTTPS]),
|
||||
(WINDOWS_VMI_1, True, True, "psrp", [SVC_LB_WINRM_HTTPS]),
|
||||
(WINDOWS_VMI_1, True, False, "psrp", [SVC_LB_WINRM_HTTPS]),
|
||||
(WINDOWS_VMI_2, True, True, "ansible.builtin.psrp", [SVC_LB_WINRM_HTTPS]),
|
||||
(WINDOWS_VMI_3, True, False, "ssh", [SVC_LB_SSH]),
|
||||
(WINDOWS_VMI_4, True, True, "ansible.builtin.ssh", [SVC_LB_SSH]),
|
||||
],
|
||||
)
|
||||
def test_ansible_connection_winrm(inventory, hosts, vmi, expected, use_service):
|
||||
def test_default_win_ansible_connection(
|
||||
inventory,
|
||||
hosts,
|
||||
vmi,
|
||||
expected,
|
||||
use_service,
|
||||
default_win_ansible_connection,
|
||||
services,
|
||||
):
|
||||
inventory._populate_inventory(
|
||||
{
|
||||
"default_hostname": "test",
|
||||
@@ -103,16 +134,19 @@ def test_ansible_connection_winrm(inventory, hosts, vmi, expected, use_service):
|
||||
"default": {
|
||||
"vms": [],
|
||||
"vmis": [vmi],
|
||||
"services": {"testdomain": [SVC_LB_WINRM_HTTPS]},
|
||||
"services": {"testdomain": services},
|
||||
}
|
||||
},
|
||||
},
|
||||
InventoryOptions(use_service=use_service),
|
||||
InventoryOptions(
|
||||
use_service=use_service,
|
||||
default_win_ansible_connection=default_win_ansible_connection,
|
||||
),
|
||||
)
|
||||
|
||||
host = f"{DEFAULT_NAMESPACE}-{vmi['metadata']['name']}"
|
||||
if expected:
|
||||
assert hosts[host]["ansible_connection"] == "winrm"
|
||||
assert hosts[host]["ansible_connection"] == default_win_ansible_connection
|
||||
else:
|
||||
assert "ansible_connection" not in hosts[host]
|
||||
if use_service:
|
||||
@@ -22,6 +22,7 @@ def test_inventory_options_defaults():
|
||||
assert opts.create_groups is False
|
||||
assert opts.base_domain is None
|
||||
assert opts.append_base_domain is False
|
||||
assert opts.default_win_ansible_connection == "winrm"
|
||||
assert opts.host_format == "{namespace}-{name}"
|
||||
|
||||
|
||||
@@ -35,6 +36,7 @@ def test_inventory_options_override_defaults():
|
||||
create_groups = True
|
||||
base_domain = "test-domain.com"
|
||||
append_base_domain = True
|
||||
default_win_ansible_connection = "psrp"
|
||||
host_format = "{name}-testhost"
|
||||
|
||||
opts = InventoryOptions(
|
||||
@@ -47,6 +49,7 @@ def test_inventory_options_override_defaults():
|
||||
create_groups=create_groups,
|
||||
base_domain=base_domain,
|
||||
append_base_domain=append_base_domain,
|
||||
default_win_ansible_connection=default_win_ansible_connection,
|
||||
host_format=host_format,
|
||||
)
|
||||
assert opts.api_version == api_version
|
||||
@@ -58,4 +61,5 @@ def test_inventory_options_override_defaults():
|
||||
assert opts.create_groups == create_groups
|
||||
assert opts.base_domain == base_domain
|
||||
assert opts.append_base_domain == append_base_domain
|
||||
assert opts.default_win_ansible_connection == default_win_ansible_connection
|
||||
assert opts.host_format == host_format
|
||||
|
||||
@@ -86,17 +86,38 @@ def test_ignore_vmi_without_named_interface(mocker, inventory):
|
||||
set_ansible_host_and_port.assert_not_called()
|
||||
|
||||
|
||||
def test_set_winrm_if_windows(mocker, inventory):
|
||||
@pytest.mark.parametrize(
|
||||
"default_win_ansible_connection",
|
||||
[
|
||||
"winrm",
|
||||
"ansible.builtin.winrm",
|
||||
"psrp",
|
||||
"ansible.builtin.psrp",
|
||||
"ssh",
|
||||
"ansible.builtin.ssh",
|
||||
],
|
||||
)
|
||||
def test_set_connection_if_windows(mocker, inventory, default_win_ansible_connection):
|
||||
mocker.patch.object(inventory, "_set_common_vars")
|
||||
mocker.patch.object(inventory, "_is_windows", return_value=True)
|
||||
mocker.patch.object(inventory, "_set_ansible_host_and_port")
|
||||
mocker.patch.object(
|
||||
inventory.inventory,
|
||||
"get_host",
|
||||
return_value=mocker.Mock(get_vars=mocker.Mock(return_value={})),
|
||||
)
|
||||
set_variable = mocker.patch.object(inventory.inventory, "set_variable")
|
||||
|
||||
hostname = "default-testvm"
|
||||
vmi = {"metadata": {}, "status": {"interfaces": [{"ipAddress": "1.1.1.1"}]}}
|
||||
inventory._set_vars_from_vmi(hostname, vmi, {}, InventoryOptions())
|
||||
opts = InventoryOptions(
|
||||
default_win_ansible_connection=default_win_ansible_connection
|
||||
)
|
||||
inventory._set_vars_from_vmi(hostname, vmi, {}, opts)
|
||||
|
||||
set_variable.assert_called_once_with(hostname, "ansible_connection", "winrm")
|
||||
set_variable.assert_called_once_with(
|
||||
hostname, "ansible_connection", default_win_ansible_connection
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
@@ -110,6 +131,11 @@ def test_set_winrm_if_windows(mocker, inventory):
|
||||
def test_service_lookup(mocker, inventory, is_windows, target_port):
|
||||
mocker.patch.object(inventory, "_set_common_vars")
|
||||
mocker.patch.object(inventory, "_is_windows", return_value=is_windows)
|
||||
mocker.patch.object(
|
||||
inventory.inventory,
|
||||
"get_host",
|
||||
return_value=mocker.Mock(get_vars=mocker.Mock(return_value={})),
|
||||
)
|
||||
set_ansible_host_and_port = mocker.patch.object(
|
||||
inventory, "_set_ansible_host_and_port"
|
||||
)
|
||||
@@ -144,6 +170,11 @@ def test_service_ignore_not_matching_connection(
|
||||
):
|
||||
mocker.patch.object(inventory, "_set_common_vars")
|
||||
mocker.patch.object(inventory, "_is_windows", return_value=is_windows)
|
||||
mocker.patch.object(
|
||||
inventory.inventory,
|
||||
"get_host",
|
||||
return_value=mocker.Mock(get_vars=mocker.Mock(return_value={})),
|
||||
)
|
||||
set_ansible_host_and_port = mocker.patch.object(
|
||||
inventory, "_set_ansible_host_and_port"
|
||||
)
|
||||
@@ -168,6 +199,11 @@ def test_service_ignore_not_matching_connection(
|
||||
def test_service_prefer_winrm_https(mocker, inventory):
|
||||
mocker.patch.object(inventory, "_set_common_vars")
|
||||
mocker.patch.object(inventory, "_is_windows", return_value=True)
|
||||
mocker.patch.object(
|
||||
inventory.inventory,
|
||||
"get_host",
|
||||
return_value=mocker.Mock(get_vars=mocker.Mock(return_value={})),
|
||||
)
|
||||
set_ansible_host_and_port = mocker.patch.object(
|
||||
inventory, "_set_ansible_host_and_port"
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user