ich habe in den letzten Tagen versucht mich in die Arbeit mit XML-Strukturen in Python einzulesen; dabei scheitere ich bisher leider. Ich bin mir nicht ganz sicher woran; ob die Dokus zu abstrakt sind, oder ich einfach nach den falschen Dingen suche ... auf jeden Fall komme ich nicht ganz zurecht.
Folgendes Szenario: Ich habe zwei libvirt - Hosts, welche die "Domains" (VMs) des virtualisierungs-Hosts per DRBD abgleichen; jede VM hat ein eigenes DRBD Device für seine Daten; so können wir einfach entscheiden, welche VM auf welchem der beiden Hosts liegt. Libvirt arbeitet beim Ex- und Import der Configs mit XML. Verbindung mit den libvirt-Hosts über die Python-API aufnehmen, Konfigs als XML Dateien auslesen, usw. - das ist alles kein Problem. Ich muss jetzt eigentlich nur 2 XML Dateien vergleichen. Ich habe hier mal 2 exemplarische Dateien:
Host1:
Code: Alles auswählen
<domain type='kvm'>
<name>atradis-win7prof64</name>
<uuid>1c7cfcdd-9585-96cd-d36a-c5067b5485cf</uuid>
<memory>4194304</memory>
<currentMemory>4194304</currentMemory>
<vcpu>2</vcpu>
<os>
<type arch='x86_64' machine='pc-0.14'>hvm</type>
<boot dev='hd'/>
<boot dev='cdrom'/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<cpu>
<topology sockets='2' cores='2' threads='1'/>
</cpu>
<clock offset='localtime'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/bin/qemu-kvm</emulator>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<target dev='hdc' bus='ide'/>
<readonly/>
<address type='drive' controller='0' bus='1' unit='0'/>
</disk>
<disk type='block' device='disk'>
<driver name='qemu' type='raw' cache='none'/>
<source dev='/dev/drbd/by-res/atradis-win7'/>
<target dev='vdb' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</disk>
<controller type='ide' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
</controller>
<interface type='bridge'>
<mac address='52:54:00:c1:68:ce'/>
<source bridge='br1'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<serial type='pty'>
<target port='0'/>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
<input type='tablet' bus='usb'/>
<input type='mouse' bus='ps2'/>
<graphics type='vnc' port='-1' autoport='yes'/>
<video>
<model type='vga' vram='9216' heads='1'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</memballoon>
</devices>
</domain>
Code: Alles auswählen
<domain type='kvm' id='20'>
<name>atradis-win7prof64</name>
<uuid>1c7cfcdd-9585-96cd-d36a-c5067b5485cf</uuid>
<memory>4194304</memory>
<currentMemory>4194304</currentMemory>
<vcpu>2</vcpu>
<os>
<type arch='x86_64' machine='pc-0.14'>hvm</type>
<boot dev='hd'/>
<boot dev='cdrom'/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<cpu>
<topology sockets='2' cores='2' threads='1'/>
</cpu>
<clock offset='localtime'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/bin/qemu-kvm</emulator>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<target dev='hdc' bus='ide'/>
<readonly/>
<alias name='ide0-1-0'/>
<address type='drive' controller='0' bus='1' unit='0'/>
</disk>
<disk type='block' device='disk'>
<driver name='qemu' type='raw' cache='none'/>
<source dev='/dev/drbd/by-res/atradis-win7'/>
<target dev='vdb' bus='virtio'/>
<alias name='virtio-disk1'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</disk>
<controller type='ide' index='0'>
<alias name='ide0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
</controller>
<interface type='bridge'>
<mac address='52:54:00:c1:68:ce'/>
<source bridge='br1'/>
<target dev='vnet2'/>
<alias name='net0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<serial type='pty'>
<source path='/dev/pts/4'/>
<target port='0'/>
<alias name='serial0'/>
</serial>
<console type='pty' tty='/dev/pts/4'>
<source path='/dev/pts/4'/>
<target type='serial' port='0'/>
<alias name='serial0'/>
</console>
<input type='tablet' bus='usb'>
<alias name='input0'/>
</input>
<input type='mouse' bus='ps2'/>
<graphics type='vnc' port='5902' autoport='yes'/>
<video>
<model type='vga' vram='9216' heads='1'/>
<alias name='video0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<memballoon model='virtio'>
<alias name='balloon0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</memballoon>
</devices>
</domain>
- abweichende RAM-Zuweisungen
- fehlende oder falsch zugewiesene Netzwerkbridges
- MAC Adressen der Netzwerkkarten
- Boot-Medien Reihenfolge, ...
Es gibt jedoch auch Unterschiede, die mir vollkommen egal sind: z.B.:
- die Reihenfolge in der die Elemente gelistet sind
- die alias-Bezeichnung einer Festplatte
- das "on_crash" oder "on_reboot" Verhalten
- das "id" Attribut des domain - Elemetes
Dann habe ich versucht mich in das etree submodul von xml/lxml einzuarbeiten, empfinde es aber als ultra kompliziert, sich damit zurecht zu finden...
Kann mir hier zufällig jemand einen Shortcut verraten oder zumindest sagen, mit welchem Weg ich am "richtigsten" liege?
Danke schonmal!
LG