Virt net mods batch 1 (#1686)
* add a new modify command for now, allows adding or modifying hosts in the dhcp subsystem * fix some pep8 things that escaped * add modify in the list in the doc * added mention of adding modify in version 2.1 * handle the test mode case for modify * modify the code for finer check mode support
This commit is contained in:
parent
d256c7f373
commit
a82e991453
1 changed files with 55 additions and 4 deletions
|
@ -47,10 +47,11 @@ options:
|
|||
required: false
|
||||
choices: [ "define", "create", "start", "stop", "destroy",
|
||||
"undefine", "get_xml", "list_nets", "facts",
|
||||
"info", "status"]
|
||||
"info", "status", "modify"]
|
||||
description:
|
||||
- in addition to state management, various non-idempotent commands are available.
|
||||
See examples.
|
||||
Modify was added in version 2.1
|
||||
autostart:
|
||||
required: false
|
||||
choices: ["yes", "no"]
|
||||
|
@ -134,7 +135,8 @@ else:
|
|||
|
||||
ALL_COMMANDS = []
|
||||
ENTRY_COMMANDS = ['create', 'status', 'start', 'stop',
|
||||
'undefine', 'destroy', 'get_xml', 'define']
|
||||
'undefine', 'destroy', 'get_xml', 'define',
|
||||
'modify' ]
|
||||
HOST_COMMANDS = [ 'list_nets', 'facts', 'info' ]
|
||||
ALL_COMMANDS.extend(ENTRY_COMMANDS)
|
||||
ALL_COMMANDS.extend(HOST_COMMANDS)
|
||||
|
@ -206,6 +208,48 @@ class LibvirtConnection(object):
|
|||
if not state:
|
||||
return self.module.exit_json(changed=True)
|
||||
|
||||
def modify(self, entryid, xml):
|
||||
network = self.find_entry(entryid)
|
||||
# identify what type of entry is given in the xml
|
||||
new_data = etree.fromstring(xml)
|
||||
old_data = etree.fromstring(network.XMLDesc(0))
|
||||
if new_data.tag == 'host':
|
||||
mac_addr = new_data.get('mac')
|
||||
hosts = old_data.xpath('/network/ip/dhcp/host')
|
||||
# find the one mac we're looking for
|
||||
host = None
|
||||
for h in hosts:
|
||||
if h.get('mac') == mac_addr:
|
||||
host = h
|
||||
break
|
||||
if host is None:
|
||||
# add the host
|
||||
if not self.module.check_mode:
|
||||
res = network.update (libvirt.VIR_NETWORK_UPDATE_COMMAND_ADD_LAST,
|
||||
libvirt.VIR_NETWORK_SECTION_IP_DHCP_HOST,
|
||||
-1, xml, libvirt.VIR_NETWORK_UPDATE_AFFECT_CURRENT)
|
||||
else:
|
||||
# pretend there was a change
|
||||
res = 0
|
||||
if res == 0:
|
||||
return True
|
||||
else:
|
||||
# change the host
|
||||
if host.get('name') == new_data.get('name') and host.get('ip') == new_data.get('ip'):
|
||||
return False
|
||||
else:
|
||||
if not self.module.check_mode:
|
||||
res = network.update (libvirt.VIR_NETWORK_UPDATE_COMMAND_MODIFY,
|
||||
libvirt.VIR_NETWORK_SECTION_IP_DHCP_HOST,
|
||||
-1, xml, libvirt.VIR_NETWORK_UPDATE_AFFECT_CURRENT)
|
||||
else:
|
||||
# pretend there was a change
|
||||
res = 0
|
||||
if res == 0:
|
||||
return True
|
||||
# command, section, parentIndex, xml, flags=0
|
||||
self.module.fail_json(msg='updating this is not supported yet '+unicode(xml))
|
||||
|
||||
def destroy(self, entryid):
|
||||
if not self.module.check_mode:
|
||||
return self.find_entry(entryid).destroy()
|
||||
|
@ -344,6 +388,9 @@ class VirtNetwork(object):
|
|||
|
||||
def create(self, entryid):
|
||||
return self.conn.create(entryid)
|
||||
|
||||
def modify(self, entryid, xml):
|
||||
return self.conn.modify(entryid, xml)
|
||||
|
||||
def start(self, entryid):
|
||||
return self.conn.create(entryid)
|
||||
|
@ -460,14 +507,18 @@ def core(module):
|
|||
if command in ENTRY_COMMANDS:
|
||||
if not name:
|
||||
module.fail_json(msg = "%s requires 1 argument: name" % command)
|
||||
if command == 'define':
|
||||
if command in ('define', 'modify'):
|
||||
if not xml:
|
||||
module.fail_json(msg = "define requires xml argument")
|
||||
module.fail_json(msg = command+" requires xml argument")
|
||||
try:
|
||||
v.get_net(name)
|
||||
except EntryNotFound:
|
||||
v.define(name, xml)
|
||||
res = {'changed': True, 'created': name}
|
||||
else:
|
||||
if command == 'modify':
|
||||
mod = v.modify(name, xml)
|
||||
res = {'changed': mod, 'modified': name}
|
||||
return VIRT_SUCCESS, res
|
||||
res = getattr(v, command)(name)
|
||||
if type(res) != dict:
|
||||
|
|
Loading…
Reference in a new issue