#!/usr/bin/env python3

# libvirt_schema.py - Libvirt schema elements
# Part of the Parallel Virtual Cluster (PVC) system
#
#    Copyright (C) 2018-2022 Joshua M. Boniface <joshua@boniface.me>
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, version 3.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <https://www.gnu.org/licenses/>.
#
###############################################################################

# File header, containing default values for various non-device components
# Variables:
#  * vm_name
#  * vm_uuid
#  * vm_description
#  * vm_memory
#  * vm_vcpus
#  * vm_architecture
libvirt_header = """<domain type='kvm'>
  <name>{vm_name}</name>
  <uuid>{vm_uuid}</uuid>
  <description>{vm_description}</description>
  <memory unit='MiB'>{vm_memory}</memory>
  <vcpu>{vm_vcpus}</vcpu>
  <cpu mode='host-model'>
    <topology sockets='1' cores='{vm_vcpus}' threads='1'/>
  </cpu>
  <os>
    <type arch='{vm_architecture}' machine='pc-i440fx-2.7'>hvm</type>
    <bootmenu enable='yes'/>
    <boot dev='cdrom'/>
    <boot dev='hd'/>
    <bios useserial='yes' rebootTimeout='5'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <console type='pty'/>
"""

# File footer, closing devices and domain elements
libvirt_footer = """  </devices>
</domain>"""

# Default devices for all VMs
devices_default = """    <emulator>/usr/bin/kvm</emulator>
    <controller type='usb' index='0'/>
    <controller type='pci' index='0' model='pci-root'/>
    <rng model='virtio'>
      <rate period="1000" bytes="2048"/>
      <backend model='random'>/dev/random</backend>
    </rng>
    <channel type='unix'>
      <target type='virtio' name='org.qemu.guest_agent.0'/>
    </channel>
"""

# Serial device
# Variables:
#  * vm_name
devices_serial = """    <serial type='pty'>
      <log file='/var/log/libvirt/{vm_name}.log' append='on'/>
    </serial>
"""

# VNC device
# Variables:
#  * vm_vncport
#  * vm_vnc_autoport
#  * vm_vnc_bind
devices_vnc = """    <graphics type='vnc' port='{vm_vncport}' autoport='{vm_vnc_autoport}' listen='{vm_vnc_bind}'/>
"""

# VirtIO SCSI device
devices_scsi_controller = """    <controller type='scsi' index='0' model='virtio-scsi'/>
"""

# Disk device header
# Variables:
#  * ceph_storage_secret
#  * disk_pool
#  * vm_name
#  * disk_id
devices_disk_header = """    <disk type='network' device='disk'>
      <driver name='qemu' discard='unmap'/>
      <target dev='{disk_id}' bus='scsi'/>
      <auth username='libvirt'>
        <secret type='ceph' uuid='{ceph_storage_secret}'/>
      </auth>
      <source protocol='rbd' name='{disk_pool}/{vm_name}_{disk_id}'>
"""

# Disk device coordinator element
# Variables:
#  * coordinator_name
#  * coordinator_ceph_mon_port
devices_disk_coordinator = """        <host name='{coordinator_name}' port='{coordinator_ceph_mon_port}'/>
"""

# Disk device footer
devices_disk_footer = """      </source>
    </disk>
"""

# vhostmd virtualization passthrough device
devices_vhostmd = """    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/dev/shm/vhostmd0'/>
      <target dev='sdz' bus='usb'/>
      <readonly/>
    </disk>
"""

# Network interface device
# Variables:
#  * eth_macaddr
#  * eth_bridge
devices_net_interface = """    <interface type='bridge'>
      <mac address='{eth_macaddr}'/>
      <source bridge='{eth_bridge}'/>
      <model type='virtio'/>
    </interface>
"""