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