Browse Source

libvirt xml: pass loader, virt machine, cpu mode

Spawning AArch64 VMs using salt.control.virt requires a few extra
domain configuration items to be configurable:
- libvirt xml: pass loader param to vm
  Based on upstream commit [1].
- libvirt xml: pass virt machine type
- libvirt xml: pass cpu mode to vm
- virt module: Allow NVRAM unlinking on DOM undefine
  UEFI-enabled VMs usually have pflash (NVRAM) devices attached,
  which require one additional libvirt flag to be passed at 'undefine'.
  This is usually the case for AArch64 (arm64) VMs, where AAVMF (AA64
  UEFI) is the only supported guest bootloader.

[1] https://github.com/saltstack/salt/commit/9cace9adb

Signed-off-by: Alexandru Avadanii <Alexandru.Avadanii@enea.com>
pull/73/head
Alexandru Avadanii 6 years ago
parent
commit
00f187a90e
4 changed files with 61 additions and 1 deletions
  1. +7
    -0
      README.rst
  2. +39
    -1
      _modules/virtng.py
  3. +9
    -0
      salt/control/virt.sls
  4. +6
    -0
      tests/pillar/control_virt_custom.sls

+ 7
- 0
README.rst View File

rate: rate:
period: '1800' period: '1800'
bytes: '1500' 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: mac:
nic01: AC:DE:48:AA:AA:AA nic01: AC:DE:48:AA:AA:AA
nic02: AC:DE:48:AA:AA:BB nic02: AC:DE:48:AA:AA:BB

+ 39
- 1
_modules/virtng.py View File

disk='default', disk='default',
saltenv='base', saltenv='base',
rng=None, rng=None,
loader=None,
machine=None,
cpu_mode=None,
**kwargs): **kwargs):
''' '''
Initialize a new vm Initialize a new vm
xml_doc.getElementsByTagName("domain")[0].getElementsByTagName("devices")[0].appendChild(iso_xml) xml_doc.getElementsByTagName("domain")[0].getElementsByTagName("devices")[0].appendChild(iso_xml)
xml = xml_doc.toxml() 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 # TODO: Remove this code and refactor module, when salt-common would have updated libvirt_domain.jinja template
for _nic in nicp: for _nic in nicp:
if _nic['virtualport']: if _nic['virtualport']:
salt '*' virtng.undefine <vm name> salt '*' virtng.undefine <vm name>
''' '''
dom = _get_dom(vm_) 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): def purge(vm_, dirs=False):

+ 9
- 0
salt/control/virt.sls View File

{%- elif rng is defined %} {%- elif rng is defined %}
- rng: {{ rng }} - rng: {{ rng }}
{%- endif %} {%- 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: - kwargs:
{%- if cloud_init is defined %} {%- if cloud_init is defined %}
cloud_init: {{ cloud_init }} cloud_init: {{ cloud_init }}

+ 6
- 0
tests/pillar/control_virt_custom.sls View File

image: ubuntu.qcow image: ubuntu.qcow
size: medium size: medium
img_dest: /var/lib/libvirt/ssdimages img_dest: /var/lib/libvirt/ssdimages
machine: virt-2.11
cpu_mode: host-passthrough
ubuntu2: ubuntu2:
provider: node02.domain.com provider: node02.domain.com
image: bubuntu.qcomw image: bubuntu.qcomw
size: small size: small
img_dest: /var/lib/libvirt/hddimages img_dest: /var/lib/libvirt/hddimages
loader:
readonly: yes
type: pflash
path: /usr/share/AAVMF/AAVMF_CODE.fd
ubuntu3: ubuntu3:
provider: node03.domain.com provider: node03.domain.com
image: meowbuntu.qcom2 image: meowbuntu.qcom2

Loading…
Cancel
Save