feat: NAPALM drivers for VMware ESXi and vCenter
Two drivers from one package, both in the hypervisor role: - vmware_esxi talks to one host directly: facts, vmnics and vmkernel NICs, CDP/LLDP neighbours, sensors, VMs, datastores and port groups. - vmware_vcenter talks to a vCenter: every VM of every host it manages, with the host as the VM's node, plus distributed port groups. It reports no interfaces of its own; the hosts' NICs belong to the hosts. Both implement the HypervisorDriver VM contract: get_vms, get_vm_config, start/stop/reboot/suspend_vm and the four snapshot methods, and emit raw device warnings (maintenance mode, disconnected host, config issues, host managed by a vCenter, free license making the API read-only). Every read is a PropertyCollector query for the explicit paths in paths.py, converted by to_plain() into dicts and lists; the parsers only ever see that. tools/harvest.py dumps exactly those paths to JSON and tools/sanitize.py scrubs the dump, so a real host can become a test fixture without code changes. A VM's vmid is its instance UUID, which survives vMotion and re-registration; a MoRef does not. Tested against govmomi's vcsim in ESXi and vCenter mode, including real power and snapshot tasks. Not yet tested against real hardware.
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
"""The vSphere property paths the drivers read, per managed object type.
|
||||
|
||||
Single source of truth for both the drivers and ``tools/harvest.py``: a
|
||||
fixture harvested from a real host contains exactly what the parsers are
|
||||
later fed, no more and no less. Adding a path here is the first step of
|
||||
adding a field to any getter.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
HOST = (
|
||||
"name",
|
||||
"summary.hardware",
|
||||
"summary.quickStats",
|
||||
"summary.managementServerIp",
|
||||
"hardware.systemInfo",
|
||||
"runtime.inMaintenanceMode",
|
||||
"runtime.connectionState",
|
||||
"runtime.healthSystemRuntime.systemHealthInfo.numericSensorInfo",
|
||||
"config.product",
|
||||
"config.network.pnic",
|
||||
"config.network.vnic",
|
||||
"config.network.portgroup",
|
||||
"config.network.vswitch",
|
||||
"config.network.dnsConfig",
|
||||
"config.autoStart",
|
||||
"configIssue",
|
||||
"configManager.networkSystem",
|
||||
)
|
||||
|
||||
VM = (
|
||||
"name",
|
||||
"config.instanceUuid",
|
||||
"config.template",
|
||||
"config.guestId",
|
||||
"config.guestFullName",
|
||||
"config.annotation",
|
||||
"config.firmware",
|
||||
"config.version",
|
||||
"config.hardware.numCPU",
|
||||
"config.hardware.numCoresPerSocket",
|
||||
"config.hardware.memoryMB",
|
||||
"config.hardware.device",
|
||||
"config.bootOptions.bootOrder",
|
||||
"runtime.powerState",
|
||||
"runtime.host",
|
||||
"summary.quickStats",
|
||||
"guest.net",
|
||||
"guest.ipAddress",
|
||||
"guest.toolsStatus",
|
||||
"guest.toolsRunningStatus",
|
||||
"snapshot",
|
||||
)
|
||||
|
||||
DATASTORE = (
|
||||
"name",
|
||||
"summary",
|
||||
)
|
||||
|
||||
DV_PORTGROUP = (
|
||||
"name",
|
||||
"config.defaultPortConfig",
|
||||
"config.distributedVirtualSwitch",
|
||||
"config.uplink",
|
||||
)
|
||||
|
||||
DV_SWITCH = ("name",)
|
||||
|
||||
#: Managed object type name -> paths, in the order harvest.py dumps them.
|
||||
ALL = {
|
||||
"HostSystem": HOST,
|
||||
"VirtualMachine": VM,
|
||||
"Datastore": DATASTORE,
|
||||
"DistributedVirtualPortgroup": DV_PORTGROUP,
|
||||
"DistributedVirtualSwitch": DV_SWITCH,
|
||||
}
|
||||
Reference in New Issue
Block a user