"""State module for standard vSwitch / port group / VMkernel adapters."""
from saltext.vcf.clients import vim_host_network as c
__virtualname__ = "vcf_vim_host_network"
def __virtual__():
return __virtualname__
def _ret(name):
return {"name": name, "changes": {}, "result": True, "comment": ""}
[docs]
def vswitch_present(
name,
host,
num_ports=128,
mtu=1500,
pnic_devices=None,
profile=None,
):
"""Ensure a standard vSwitch *name* exists on *host* with the given config."""
ret = _ret(name)
existing = c.vswitch_get_or_none(__opts__, host, name, profile=profile)
desired_pnics = sorted(pnic_devices or [])
if existing is not None:
drift = {}
if existing["mtu"] != int(mtu):
drift["mtu"] = (existing["mtu"], int(mtu))
if existing["num_ports"] != int(num_ports):
drift["num_ports"] = (existing["num_ports"], int(num_ports))
if sorted(existing.get("pnic_devices") or []) != desired_pnics:
drift["pnic_devices"] = (existing.get("pnic_devices"), desired_pnics)
if not drift:
ret["comment"] = f"vSwitch {name} on {host} already matches"
return ret
if __opts__["test"]:
ret["result"] = None
ret["comment"] = f"vSwitch {name} on {host} would be updated: {sorted(drift)}"
return ret
c.vswitch_update(
__opts__,
host,
name,
num_ports=int(num_ports),
mtu=int(mtu),
pnic_devices=desired_pnics or None,
profile=profile,
)
ret["changes"] = drift
ret["comment"] = f"vSwitch {name} on {host} updated"
return ret
if __opts__["test"]:
ret["result"] = None
ret["comment"] = f"vSwitch {name} would be created on {host}"
return ret
c.vswitch_add(
__opts__,
host,
name,
num_ports=int(num_ports),
mtu=int(mtu),
pnic_devices=desired_pnics or None,
profile=profile,
)
ret["changes"] = {"new": name}
ret["comment"] = f"vSwitch {name} created on {host}"
return ret
def vswitch_absent(name, host, profile=None):
ret = _ret(name)
if c.vswitch_get_or_none(__opts__, host, name, profile=profile) is None:
ret["comment"] = f"vSwitch {name} on {host} is already absent"
return ret
if __opts__["test"]:
ret["result"] = None
ret["comment"] = f"vSwitch {name} on {host} would be deleted"
return ret
c.vswitch_remove(__opts__, host, name, profile=profile)
ret["changes"] = {"deleted": name}
ret["comment"] = f"vSwitch {name} on {host} deleted"
return ret
[docs]
def portgroup_present(name, host, vswitch, vlan_id=0, profile=None):
"""Ensure a standard port group *name* exists with the given config."""
ret = _ret(name)
existing = c.portgroup_get_or_none(__opts__, host, name, profile=profile)
if existing is not None:
drift = {}
if existing["vlan_id"] != int(vlan_id):
drift["vlan_id"] = (existing["vlan_id"], int(vlan_id))
if existing["vswitch"] != vswitch:
drift["vswitch"] = (existing["vswitch"], vswitch)
if not drift:
ret["comment"] = f"port group {name} on {host} already matches"
return ret
if __opts__["test"]:
ret["result"] = None
ret["comment"] = f"port group {name} on {host} would be updated: {sorted(drift)}"
return ret
c.portgroup_update(
__opts__, host, name, vlan_id=int(vlan_id), vswitch=vswitch, profile=profile
)
ret["changes"] = drift
ret["comment"] = f"port group {name} on {host} updated"
return ret
if __opts__["test"]:
ret["result"] = None
ret["comment"] = f"port group {name} would be created on {host}"
return ret
c.portgroup_add(__opts__, host, name, vswitch, vlan_id=int(vlan_id), profile=profile)
ret["changes"] = {"new": name}
ret["comment"] = f"port group {name} created on {host}"
return ret
def portgroup_absent(name, host, profile=None):
ret = _ret(name)
if c.portgroup_get_or_none(__opts__, host, name, profile=profile) is None:
ret["comment"] = f"port group {name} on {host} is already absent"
return ret
if __opts__["test"]:
ret["result"] = None
ret["comment"] = f"port group {name} on {host} would be deleted"
return ret
c.portgroup_remove(__opts__, host, name, profile=profile)
ret["changes"] = {"deleted": name}
ret["comment"] = f"port group {name} on {host} deleted"
return ret
[docs]
def vmkernel_present(
name,
host,
portgroup=None,
dhcp=False,
ip_address=None,
subnet_mask=None,
mtu=1500,
profile=None,
):
"""Ensure a VMkernel *name* (device id, e.g. ``vmk1``) exists.
If the device doesn't exist, a *portgroup* is required to bind it to.
For an existing vmkernel, drift on IP/MTU/DHCP triggers an update.
"""
ret = _ret(name)
existing = c.vmkernel_get_or_none(__opts__, host, name, profile=profile)
if existing is not None:
drift = {}
if bool(existing["dhcp"]) != bool(dhcp):
drift["dhcp"] = (existing["dhcp"], dhcp)
if not dhcp:
if ip_address is not None and existing["ip_address"] != ip_address:
drift["ip_address"] = (existing["ip_address"], ip_address)
if subnet_mask is not None and existing["subnet_mask"] != subnet_mask:
drift["subnet_mask"] = (existing["subnet_mask"], subnet_mask)
if mtu is not None and existing["mtu"] != int(mtu):
drift["mtu"] = (existing["mtu"], int(mtu))
if not drift:
ret["comment"] = f"vmkernel {name} on {host} already matches"
return ret
if __opts__["test"]:
ret["result"] = None
ret["comment"] = f"vmkernel {name} on {host} would be updated: {sorted(drift)}"
return ret
c.vmkernel_update(
__opts__,
host,
name,
dhcp=dhcp,
ip_address=ip_address,
subnet_mask=subnet_mask,
mtu=mtu,
profile=profile,
)
ret["changes"] = drift
ret["comment"] = f"vmkernel {name} on {host} updated"
return ret
if portgroup is None:
ret["result"] = False
ret["comment"] = f"vmkernel {name} missing on {host}; provide portgroup= to create"
return ret
if __opts__["test"]:
ret["result"] = None
ret["comment"] = f"vmkernel would be created on {host} portgroup={portgroup}"
return ret
device = c.vmkernel_add(
__opts__,
host,
portgroup,
dhcp=dhcp,
ip_address=ip_address,
subnet_mask=subnet_mask,
mtu=mtu,
profile=profile,
)
ret["changes"] = {"new": device}
ret["comment"] = f"vmkernel {device} created on {host}"
return ret
def vmkernel_absent(name, host, profile=None):
ret = _ret(name)
if c.vmkernel_get_or_none(__opts__, host, name, profile=profile) is None:
ret["comment"] = f"vmkernel {name} on {host} is already absent"
return ret
if __opts__["test"]:
ret["result"] = None
ret["comment"] = f"vmkernel {name} on {host} would be deleted"
return ret
c.vmkernel_remove(__opts__, host, name, profile=profile)
ret["changes"] = {"deleted": name}
ret["comment"] = f"vmkernel {name} on {host} deleted"
return ret