diff --git a/vrtManager/network.py b/vrtManager/network.py index c1de4f3..e48a185 100644 --- a/vrtManager/network.py +++ b/vrtManager/network.py @@ -1,6 +1,10 @@ from vrtManager import util from vrtManager.IPy import IP from vrtManager.connection import wvmConnect +from xml.etree import ElementTree +from libvirt import VIR_NETWORK_SECTION_IP_DHCP_HOST +from libvirt import VIR_NETWORK_UPDATE_COMMAND_ADD_LAST, VIR_NETWORK_UPDATE_COMMAND_DELETE, VIR_NETWORK_UPDATE_COMMAND_MODIFY +from libvirt import VIR_NETWORK_UPDATE_AFFECT_LIVE, VIR_NETWORK_UPDATE_AFFECT_CONFIG, VIR_NETWORK_UPDATE_AFFECT_CURRENT def network_size(net, dhcp=None): @@ -106,6 +110,9 @@ class wvmNetwork(wvmConnect): def delete(self): self.net.undefine() + def update(self, command, section, parentIndex, xml, flags=0): + return self.net.update(command, section, parentIndex, xml, flags) + def get_ipv4_network(self): xml = self._XMLDesc(0) if util.get_xml_path(xml, "/network/ip") is None: @@ -175,3 +182,40 @@ class wvmNetwork(wvmConnect): return result return util.get_xml_path(self._XMLDesc(0), func=network) + + def modify_fixed_address(self, name, address, mac): + util.validate_macaddr(mac) + new_xml = ''.format(mac, name, address) + new_host_xml = ElementTree.fromstring(new_xml) + + tree = ElementTree.fromstring(self._XMLDesc(0)) + hosts = tree.findall("./ip/dhcp/host") + + host = None + for h in hosts: + if h.get('mac') == mac: + host = h + break + if host is None: + + self.update(VIR_NETWORK_UPDATE_COMMAND_ADD_LAST, VIR_NETWORK_SECTION_IP_DHCP_HOST, -1, new_xml, + VIR_NETWORK_UPDATE_AFFECT_CURRENT) + else: + # change the host + if host.get('name') == new_host_xml.get('name') and host.get('ip') == new_host_xml.get('ip'): + return False + else: + res = self.update(VIR_NETWORK_UPDATE_COMMAND_MODIFY, VIR_NETWORK_SECTION_IP_DHCP_HOST, -1, new_xml, + VIR_NETWORK_UPDATE_AFFECT_CURRENT) + + def delete_fixed_address(self, mac): + util.validate_macaddr(mac) + tree = ElementTree.fromstring(self._XMLDesc(0)) + hosts = tree.findall("./ip/dhcp/host") + + for h in hosts: + if h.get('mac') == mac: + new_xml = ''.format(mac, h.get('name'), h.get('ip')) + self.update(VIR_NETWORK_UPDATE_COMMAND_DELETE, VIR_NETWORK_SECTION_IP_DHCP_HOST, -1, new_xml, + VIR_NETWORK_UPDATE_AFFECT_CURRENT) + break