proxmox/plugins/module_utils/proxmox_node_iface.py

62 lines
2.1 KiB
Python
Raw Normal View History

from typing import List, Tuple
from ansible_collections.finallycoffee.proxmox.plugins.module_utils.common import _proxmox_request, ProxmoxAuthInfo
PM_ACCEPTED_IFACE_TYPES = [
'bridge',
'bond',
'eth',
'alias',
'vlan',
'OVSBridge',
'OVSBond',
'OVSPort',
'OVSIntPort',
'unknown',
]
def get_interfaces(auth_info: ProxmoxAuthInfo, node: str) -> [dict]:
realm_answer = _proxmox_request('get', f"/nodes/{node}/network", auth_info).json()
return realm_answer['data']
def set_interface_config(auth_info: ProxmoxAuthInfo, node: str, name: str, iface_type: str, config: dict[str, str], dry_run: bool, state: str = 'present') -> Tuple[dict, dict]:
existing_iface_data = None
iface_data = None
existing_iface = _proxmox_request('get', f"/nodes/{node}/network/{name}", auth_info)
if existing_iface.ok:
existing_iface_data = existing_iface.json()['data']
if state == 'absent':
iface = _delete_iface(auth_info, node, name, dry_run)
return existing_iface_data, iface_data
else:
iface = _upsert_iface(auth_info, node, name,
iface_type, config, (existing_iface_data is not None), dry_run)
return existing_iface_data, iface
def _upsert_iface(auth_info: ProxmoxAuthInfo, node: str, name: str, iface_type: str, config: dict[str, str], update: bool = False, dry_run: bool = False) -> dict[str, str]:
extra_config = {'node': node, 'iface': name, 'type': iface_type}
full_iface_spec = config | extra_config
if not dry_run:
res = _proxmox_request('put' if update else 'post', f"/nodes/{node}/network", auth_info, full_iface_spec)
if res.ok:
return res.json()['data'] | extra_config
else:
res.raise_for_status()
else:
return full_iface_spec
def _delete_iface(auth_info: ProxmoxAuthInfo, node: str, name: str, dry_run: bool = False) -> dict[str, str]:
if not dry_run:
res = _proxmox_request('delete', f"/nodes/{node}/network/{name}", auth_info)
if res.ok:
return {}
else:
res.raise_for_status()
else:
return {}