<domain type='<%= @domain_type %>' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
  <name><%= @name %></name>
  <title><%= @title %></title>
  <description><%= @description %></description>
  <uuid><%= @uuid %></uuid>
  <memory><%= @memory_size %></memory>
  <vcpu<% if @cpuset %> cpuset='<%= @cpuset %>'<% end %>><%= @cpus %></vcpu>


  <cpu mode='<%= @cpu_mode %>'>
    <% if @cpu_mode != 'host-passthrough' %>
      <model fallback='<%= @cpu_fallback %>'><% if @cpu_mode == 'custom' %><%= @cpu_model %><% end %></model>
      <% if @nested %>
        <% if @cpu_features.select{|x| x[:name] == 'vmx'}.empty? %>
          <feature policy='optional' name='vmx'/>
        <% end %>
        <% if @cpu_features.select{|x| x[:name] == 'svm'}.empty? %>
          <feature policy='optional' name='svm'/>
        <% end %>
      <% end %>
      <% @cpu_features.each do |cpu_feature| %>
        <feature name='<%= cpu_feature[:name] %>' policy='<%= cpu_feature[:policy] %>'/>
      <% end %>
      <% unless @cpu_topology.empty? %>
        <%# CPU topology -%>
        <topology sockets='<%= @cpu_topology[:sockets] %>' cores='<%= @cpu_topology[:cores] %>' threads='<%= @cpu_topology[:threads] %>'/>
      <% end %>
    <% end %>
    <% if @numa_nodes %>
      <numa>
        <% @numa_nodes.each_with_index do |node, index| %>
          <cell id='<%= index %>' cpus='<%= node[:cpus] %>' memory='<%= node[:memory] %>'/>
        <% end %>
      </numa>
    <% end %>
  </cpu>

<%- if @nodeset -%>
  <numatune>
    <memory nodeset='<%= @nodeset %>'/>
  </numatune>
<%- end -%>
<% unless @memory_backing.empty? %>
  <memoryBacking>
  <% @memory_backing.each do |backing| %>
    <<%= backing[:name] %> <%= backing[:config].map { |k,v| "#{k}='#{v}'"}.join(' ')  %>/>
  <% end %>
  </memoryBacking>
<% end%>
<% if @shares %>
  <cputune>
    <shares><%= @shares %></shares>
  </cputune>
<% end %>

  <os>
    <% if @machine_type %>
      <% if @machine_arch %>
        <type arch='<%= @machine_arch %>' machine='<%= @machine_type %>'>hvm</type>
      <% else %>
        <type machine='<%= @machine_type %>'>hvm</type>
      <% end %>
    <% else %>
      <% if @machine_arch %>
        <type arch='<%= @machine_arch %>'>hvm</type>
      <% else %>
        <type>hvm</type>
      <% end %>
    <% end %>
    <% if @loader %>
      <% if @nvram %>
        <loader readonly='yes' type='pflash'><%= @loader %></loader>
      <% else %>
        <loader readonly='yes' type='rom'><%= @loader %></loader>
      <% end %>
    <% end %>
    <% if @nvram %>
      <nvram><%= @nvram %></nvram>
    <% end %>
    <% if @boot_order.count >= 1 %>
      <bootmenu enable='yes'/>
    <% end %>
    <kernel><%= @kernel %></kernel>
    <initrd><%= @initrd %></initrd>
    <cmdline><%= @cmd_line %></cmdline>
    <% if @dtb %>
      <dtb><%= @dtb %></dtb>
    <% end %>
  </os>
  <features>
    <% @features.each do |feature| %>
    <<%= feature %>/>
    <% end %>
    <% if @kvm_hidden %>
      <kvm>
        <hidden state='on'/>
      </kvm>
    <% end %>
    <% if !@features_hyperv.empty? %>
    <hyperv>
      <% @features_hyperv.each do |feature| %>
      <<%= feature[:name] %> state='<%= feature[:state] %>'<% if feature[:name] == 'spinlocks' %> retries='<%= feature[:retries] %>'<% end %> />
      <% end %>
    </hyperv>
    <% end %>
  </features>
  <clock offset='<%= @clock_offset %>'>
  <% @clock_timers.each do |clock_timer| %>
    <timer<% clock_timer.each do |attr, value| %> <%= attr %>='<%= value %>'<% end %>/>
  <% end %>
  </clock>
  <devices>
    <% if @emulator_path %>
    <emulator><%= @emulator_path %></emulator>
    <% end %>
<% @domain_volumes.each_with_index do |volume, index| -%>
    <disk type='file' device='disk'>
      <alias name='ua-box-volume-<%= index -%>'/>
      <driver name='qemu' type='qcow2' <%=
        @disk_driver_opts.empty? ? "cache='#{volume[:cache]}'" :
            @disk_driver_opts.reject { |k,v| v.nil? }
                             .map { |k,v| "#{k}='#{v}'"}
                             .join(' ') -%>/>
      <source file='<%= volume[:path] %>'/>
      <%# we need to ensure a unique target dev -%>
      <target dev='<%= volume[:dev] %>' bus='<%= volume[:bus] %>'/>
    </disk>
<% end -%>
<%# additional disks -%>
<% @disks.each_with_index do |d, index| -%>
    <disk type='file' device='disk'>
      <alias name='ua-disk-volume-<%= index -%>'/>
      <driver name='qemu' type='<%= d[:type] %>' <%=
        d.select { |k,_| [:cache, :io, :copy_on_read, :discard, :detect_zeroes].include? k }
         .reject { |k,v| v.nil? }
         .map { |k,v| "#{k}='#{v}'"}
         .join(' ')
      -%>/>
      <source file='<%= d[:absolute_path] %>'/>
      <target dev='<%= d[:device] %>' bus='<%= d[:bus] %>'/>
      <% if d[:shareable] %>
        <shareable/>
      <% end %>
      <% if d[:serial] %>
        <serial><%= d[:serial] %></serial>
      <% end %>
      <% if d[:wwn] %>
        <wwn><%= d[:wwn] %></wwn>
      <% end %>
<%# this will get auto generated by Libvirt
      <address type='pci' domain='0x0000' bus='0x00' slot='???' function='0x0'/>
-%>
    </disk>
<% end -%>

<% @cdroms.each do |c| %>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='<%= c[:type] %>' />
      <source file='<%= c[:path] %>'/>
      <target dev='<%= c[:dev] %>' bus='<%= c[:bus] %>'/>
      <readonly/>
    </disk>
<% end %>

<% @serials.each_with_index do |serial, port| %>
    <serial type='<%= serial[:type] %>'>
      <% unless serial[:source].nil? %>
      <source path='<%= serial[:source][:path] %>'/>
      <% end %>
      <target port='<%= port %>'/>
    </serial>
    <% end %>
    <% console_log = @serials.first %>
    <console type='<%= console_log[:type] %>'>
      <% unless console_log[:source].nil? %>
      <source path='<%= console_log[:source][:path] %>'/>
<% end %>
      <target port='0'/>
    </console>

<% @channels.each do |channel| %>
  <channel type='<%= channel[:type] %>' >
      <%if channel[:source_mode] or channel[:source_path] %>
      <source
          <% if channel[:source_mode] %>
               mode='<%= channel[:source_mode] %>'
          <% end %>
          <% if channel[:source_path] %>
               path="<%= channel[:source_path] %>"
          <% end %>
      />
      <% end %>
      <target type='<%= channel[:target_type] %>'
          <% if channel[:target_name] %>
               name="<%= channel[:target_name] %>"
          <% end %>
          <% if channel[:target_address] %>
               address="<%= channel[:target_address] %>"
          <% end %>
          <% if channel[:target_port] %>
               port="<%= channel[:target_port] %>"
          <% end %>
      />
  </channel>
<% end %>

<% @inputs.each do |input| %>
    <input type='<%= input[:type] %>' bus='<%= input[:bus] %>'/>
<% end %>

    <% if !@sound_type.nil? %>
      <%# Sound device-%>
      <sound model='<%= @sound_type %>'>
      </sound>
      <%# End Sound%>
    <% end %>
    <% if @graphics_type != 'none' %>
      <%# Video device -%>
      <graphics type='<%= @graphics_type %>' port='<%= @graphics_port %>' autoport='<%= @graphics_autoport %>' listen='<%= @graphics_ip %>' keymap='<%= @keymap %>' <%= @graphics_passwd %> <% if not @graphics_gl %>/><% else %>>
        <gl enable='yes' />
      </graphics><% end %>
      <video>
        <model type='<%= @video_type %>' vram='<%= @video_vram %>' heads='1'<% if not @video_accel3d %>/><% else %>>
          <acceleration accel3d='yes'/>
        </model><% end %>
      </video>
      <%#End Video -%>
    <% end %>
    <% if @rng[:model] == "random"%>
      <rng model='virtio'>
        <backend model='random'>/dev/random</backend>
      </rng>
    <% end %>
    <% @pcis.each do |pci| %>
      <hostdev mode='subsystem' type='pci' managed='yes'>
        <source>
          <address domain='<%= pci[:domain] %>'
            bus='<%= pci[:bus] %>'
            slot='<%= pci[:slot] %>'
            function='<%= pci[:function] %>'/>
        </source>
      </hostdev>
    <% end %>
    <% @usbs.each do |usb| %>
      <hostdev mode='subsystem' type='usb'>
        <source startupPolicy='<%= usb[:startupPolicy] || "mandatory" %>'>
          <% if usb[:vendor] %>
          <vendor id='<%= usb[:vendor] %>'/>
          <% end %>
          <% if usb[:product] %>
          <product id='<%= usb[:product] %>'/>
          <% end %>
          <% if usb[:bus] && usb[:device] %>
          <address bus='<%= usb[:bus] %>' device='<%= usb[:device] %>'/>
          <% end %>
        </source>
      </hostdev>
    <% end %>
    <% unless @redirdevs.empty? %>
      <% @redirdevs.each do |redirdev| %>
        <redirdev bus='usb' type='<%= redirdev[:type] %>'>
        </redirdev>
      <% end %>
      <% unless @redirfilters.empty? %>
        <redirfilter>
        <% @redirfilters.each do |usbdev| %>
          <usbdev class='<%= usbdev[:class]  %>' vendor='<%= usbdev[:vendor] %>' product='<%= usbdev[:product] %>' version='<%= usbdev[:version] %>' allow='<%= usbdev[:allow] %>'/>
        <% end %>
        </redirfilter>
      <% end %>
    <% end %>
    <% unless @watchdog_dev.empty? %>
    <%# Watchdog Device -%>
    <watchdog model='<%= @watchdog_dev[:model] %>' action='<%= @watchdog_dev[:action] %>'/>
    <% end %>

    <% unless @smartcard_dev.empty? -%>
      <% if @smartcard_dev[:mode] == 'passthrough' %>
        <% if @smartcard_dev[:type] == 'tcp' %>
        <smartcard mode='<%= @smartcard_dev[:mode] %>' type='<%= @smartcard_dev[:type] %>'>
            <source mode='<%= @smartcard_dev[:source_mode] %>' host='<%= @smartcard_dev[:source_host] %>' service='<%= @smartcard_dev[:source_service] %>'/>
        </smartcard>
        <% else %>
        <smartcard mode='<%= @smartcard_dev[:mode] %>' type='<%= @smartcard_dev[:type] %>'/>
        <% end %>
      <% end %>
    <% end -%>

    <% if @tpm_path || @tpm_version -%>
    <%# TPM Device -%>
    <tpm model='<%= @tpm_model %>'>
      <backend type='<%= @tpm_type %>'<% if @tpm_version %> version='<%= @tpm_version %>'<% end %>>
        <% if @tpm_path -%>
        <device path='<%= @tpm_path %>'/>
        <% end -%>
      </backend>
    </tpm>
    <% end -%>
    <% if not @usbctl_dev.empty? %>
    <%# USB Controller -%>
    <controller type='usb' model='<%= @usbctl_dev[:model] %>' <%= "ports=\"#{@usbctl_dev[:ports]}\" " if @usbctl_dev[:ports] %>/>
    <% end %>
    <% unless @memballoon_enabled.nil? %>
    <% if @memballoon_enabled %>
    <memballoon model='<%= @memballoon_model %>'>
      <address type='pci' domain='0x0000' bus='<%= @memballoon_pci_bus %>' slot='<%= @memballoon_pci_slot %>' function='0x0'/>
    </memballoon>
    <% else %>
    <memballoon model='none'/>
    <% end %>
    <% end %>
  </devices>

  <% if not @qemu_args.empty? or not @qemu_env.empty? %>
  <qemu:commandline>
    <% @qemu_args.each do |arg| %>
    <qemu:arg value='<%= arg[:value] %>'/>
    <% end %>
    <% @qemu_env.each do |env_var, env_value| %>
    <qemu:env name='<%= env_var.to_s %>' value='<%= env_value %>'/>
    <% end %>
  </qemu:commandline>
  <% end %>
</domain>
