"""`get_service_packages`: which installed packages each systemd unit of the node is. The node's own services -- pveproxy, corosync, ceph -- are where a decision about a service lands on a hypervisor (NetOrk/netork#1236). The command and its parse are napalm-device-types'; the driver only carries the command over its exec path. """ from __future__ import annotations from unittest.mock import patch import pytest from napalm_device_types import ServicePackagesMixin from napalm_device_types.service_packages import SERVICE_PACKAGES_COMMAND from napalm_proxmox.driver import ProxmoxDriver WIRE = ( "SVCPKG_BEGIN\n[units]\nId=pveproxy.service\n" "FragmentPath=/lib/systemd/system/pveproxy.service\n" "ExecStart={ path=/usr/bin/pveproxy ; argv[]=/usr/bin/pveproxy start }\n\n" "[dpkg]\npve-manager: /lib/systemd/system/pveproxy.service\n" "pve-manager: /usr/bin/pveproxy\nSVCPKG_END" ) def test_the_driver_declares_the_contract(): assert issubclass(ProxmoxDriver, ServicePackagesMixin) def test_it_runs_the_shared_command(driver): with patch.object(driver, "_exec_ssh_command", return_value=WIRE) as exec_: found = driver.get_service_packages() exec_.assert_called_once_with(SERVICE_PACKAGES_COMMAND) assert found == {"pveproxy": ["pve-manager"]} def test_output_without_a_report_raises(driver): with patch.object(driver, "_exec_ssh_command", return_value=""): with pytest.raises(ValueError): driver.get_service_packages()