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
20a1d49e2b
commit
8e4e0dab63
1 changed files with 55 additions and 4 deletions
|
@ -47,10 +47,11 @@ options:
|
||||||
required: false
|
required: false
|
||||||
choices: [ "define", "create", "start", "stop", "destroy",
|
choices: [ "define", "create", "start", "stop", "destroy",
|
||||||
"undefine", "get_xml", "list_nets", "facts",
|
"undefine", "get_xml", "list_nets", "facts",
|
||||||
"info", "status"]
|
"info", "status", "modify"]
|
||||||
description:
|
description:
|
||||||
- in addition to state management, various non-idempotent commands are available.
|
- in addition to state management, various non-idempotent commands are available.
|
||||||
See examples.
|
See examples.
|
||||||
|
Modify was added in version 2.1
|
||||||
autostart:
|
autostart:
|
||||||
required: false
|
required: false
|
||||||
choices: ["yes", "no"]
|
choices: ["yes", "no"]
|
||||||
|
@ -134,7 +135,8 @@ else:
|
||||||
|
|
||||||
ALL_COMMANDS = []
|
ALL_COMMANDS = []
|
||||||
ENTRY_COMMANDS = ['create', 'status', 'start', 'stop',
|
ENTRY_COMMANDS = ['create', 'status', 'start', 'stop',
|
||||||
'undefine', 'destroy', 'get_xml', 'define']
|
'undefine', 'destroy', 'get_xml', 'define',
|
||||||
|
'modify' ]
|
||||||
HOST_COMMANDS = [ 'list_nets', 'facts', 'info' ]
|
HOST_COMMANDS = [ 'list_nets', 'facts', 'info' ]
|
||||||
ALL_COMMANDS.extend(ENTRY_COMMANDS)
|
ALL_COMMANDS.extend(ENTRY_COMMANDS)
|
||||||
ALL_COMMANDS.extend(HOST_COMMANDS)
|
ALL_COMMANDS.extend(HOST_COMMANDS)
|
||||||
|
@ -206,6 +208,48 @@ class LibvirtConnection(object):
|
||||||
if not state:
|
if not state:
|
||||||
return self.module.exit_json(changed=True)
|
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):
|
def destroy(self, entryid):
|
||||||
if not self.module.check_mode:
|
if not self.module.check_mode:
|
||||||
return self.find_entry(entryid).destroy()
|
return self.find_entry(entryid).destroy()
|
||||||
|
@ -345,6 +389,9 @@ class VirtNetwork(object):
|
||||||
def create(self, entryid):
|
def create(self, entryid):
|
||||||
return self.conn.create(entryid)
|
return self.conn.create(entryid)
|
||||||
|
|
||||||
|
def modify(self, entryid, xml):
|
||||||
|
return self.conn.modify(entryid, xml)
|
||||||
|
|
||||||
def start(self, entryid):
|
def start(self, entryid):
|
||||||
return self.conn.create(entryid)
|
return self.conn.create(entryid)
|
||||||
|
|
||||||
|
@ -460,14 +507,18 @@ def core(module):
|
||||||
if command in ENTRY_COMMANDS:
|
if command in ENTRY_COMMANDS:
|
||||||
if not name:
|
if not name:
|
||||||
module.fail_json(msg = "%s requires 1 argument: name" % command)
|
module.fail_json(msg = "%s requires 1 argument: name" % command)
|
||||||
if command == 'define':
|
if command in ('define', 'modify'):
|
||||||
if not xml:
|
if not xml:
|
||||||
module.fail_json(msg = "define requires xml argument")
|
module.fail_json(msg = command+" requires xml argument")
|
||||||
try:
|
try:
|
||||||
v.get_net(name)
|
v.get_net(name)
|
||||||
except EntryNotFound:
|
except EntryNotFound:
|
||||||
v.define(name, xml)
|
v.define(name, xml)
|
||||||
res = {'changed': True, 'created': name}
|
res = {'changed': True, 'created': name}
|
||||||
|
else:
|
||||||
|
if command == 'modify':
|
||||||
|
mod = v.modify(name, xml)
|
||||||
|
res = {'changed': mod, 'modified': name}
|
||||||
return VIRT_SUCCESS, res
|
return VIRT_SUCCESS, res
|
||||||
res = getattr(v, command)(name)
|
res = getattr(v, command)(name)
|
||||||
if type(res) != dict:
|
if type(res) != dict:
|
||||||
|
|
Loading…
Reference in a new issue