Merge pull request #73 from alexandruavadanii/aarch64-salt-control
libvirt xml: pass loader, virt machine, cpu mode
diff --git a/README.rst b/README.rst
index 33d356a..b7e5154 100644
--- a/README.rst
+++ b/README.rst
@@ -481,6 +481,13 @@
rate:
period: '1800'
bytes: '1500'
+ # Custom per-node loader definition (e.g. for AArch64 UEFI)
+ loader:
+ readonly: yes
+ type: pflash
+ path: /usr/share/AAVMF/AAVMF_CODE.fd
+ machine: virt-2.11 # Custom per-node virt machine type
+ cpu_mode: host-passthrough
mac:
nic01: AC:DE:48:AA:AA:AA
nic02: AC:DE:48:AA:AA:BB
diff --git a/_modules/virtng.py b/_modules/virtng.py
index b9ef85d..b405d59 100644
--- a/_modules/virtng.py
+++ b/_modules/virtng.py
@@ -531,6 +531,9 @@
disk='default',
saltenv='base',
rng=None,
+ loader=None,
+ machine=None,
+ cpu_mode=None,
**kwargs):
'''
Initialize a new vm
@@ -700,6 +703,37 @@
xml = xml_doc.toxml()
# TODO: Remove this code and refactor module, when salt-common would have updated libvirt_domain.jinja template
+ if cpu_mode:
+ xml_doc = minidom.parseString(xml)
+ cpu_xml = xml_doc.createElement("cpu")
+ cpu_xml.setAttribute('mode', cpu_mode)
+ xml_doc.getElementsByTagName("domain")[0].appendChild(cpu_xml)
+ xml = xml_doc.toxml()
+
+ # TODO: Remove this code and refactor module, when salt-common would have updated libvirt_domain.jinja template
+ if machine:
+ xml_doc = minidom.parseString(xml)
+ os_xml = xml_doc.getElementsByTagName("domain")[0].getElementsByTagName("os")[0]
+ os_xml.getElementsByTagName("type")[0].setAttribute('machine', machine)
+ xml = xml_doc.toxml()
+
+ # TODO: Remove this code and refactor module, when salt-common would have updated libvirt_domain.jinja template
+ if loader and 'path' not in loader:
+ log.info('`path` is a required property of `loader`, and cannot be found. Skipping loader configuration')
+ loader = None
+ elif loader:
+ xml_doc = minidom.parseString(xml)
+ loader_xml = xml_doc.createElement("loader")
+ for key, val in loader.items():
+ if key == 'path':
+ continue
+ loader_xml.setAttribute(key, val)
+ loader_path_xml = xml_doc.createTextNode(loader['path'])
+ loader_xml.appendChild(loader_path_xml)
+ xml_doc.getElementsByTagName("domain")[0].getElementsByTagName("os")[0].appendChild(loader_xml)
+ xml = xml_doc.toxml()
+
+ # TODO: Remove this code and refactor module, when salt-common would have updated libvirt_domain.jinja template
for _nic in nicp:
if _nic['virtualport']:
xml_doc = minidom.parseString(xml)
@@ -1602,7 +1636,11 @@
salt '*' virtng.undefine <vm name>
'''
dom = _get_dom(vm_)
- return dom.undefine() == 0
+ if getattr(libvirt, 'VIR_DOMAIN_UNDEFINE_NVRAM', False):
+ # This one is only in 1.2.8+
+ return dom.undefineFlags(libvirt.VIR_DOMAIN_UNDEFINE_NVRAM) == 0
+ else:
+ return dom.undefine() == 0
def purge(vm_, dirs=False):
diff --git a/salt/control/virt.sls b/salt/control/virt.sls
index 5b6fee8..731efeb 100644
--- a/salt/control/virt.sls
+++ b/salt/control/virt.sls
@@ -61,6 +61,15 @@
{%- elif rng is defined %}
- rng: {{ rng }}
{%- endif %}
+ {%- if node.loader is defined %}
+ - loader: {{ node.loader }}
+ {%- endif %}
+ {%- if node.machine is defined %}
+ - machine: {{ node.machine }}
+ {%- endif %}
+ {%- if node.cpu_mode is defined %}
+ - cpu_mode: {{ node.cpu_mode }}
+ {%- endif %}
- kwargs:
{%- if cloud_init is defined %}
cloud_init: {{ cloud_init }}
diff --git a/tests/pillar/control_virt_custom.sls b/tests/pillar/control_virt_custom.sls
index 061d47d..833b5a2 100644
--- a/tests/pillar/control_virt_custom.sls
+++ b/tests/pillar/control_virt_custom.sls
@@ -96,11 +96,17 @@
image: ubuntu.qcow
size: medium
img_dest: /var/lib/libvirt/ssdimages
+ machine: virt-2.11
+ cpu_mode: host-passthrough
ubuntu2:
provider: node02.domain.com
image: bubuntu.qcomw
size: small
img_dest: /var/lib/libvirt/hddimages
+ loader:
+ readonly: yes
+ type: pflash
+ path: /usr/share/AAVMF/AAVMF_CODE.fd
ubuntu3:
provider: node03.domain.com
image: meowbuntu.qcom2