guest_xml.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from models import Config
  4. from models import Guest
  5. __author__ = 'James Iter'
  6. __date__ = '2017/3/25'
  7. __contact__ = 'james.iter.cn@gmail.com'
  8. __copyright__ = '(c) 2017 by James Iter.'
  9. class GuestXML(object):
  10. """
  11. <?xml version="1.0" encoding="utf-8"?>
  12. <domain type="kvm">
  13. <features>
  14. <acpi/>
  15. <apic/>
  16. </features>
  17. <name>10v022</name>
  18. <vcpu>16</vcpu>
  19. <memory unit="GiB">64</memory>
  20. <os>
  21. <boot dev="hd"/>
  22. <type arch="x86_64">hvm</type>
  23. <bootmenu timeout="3000" enable="yes"/>
  24. </os>
  25. <devices>
  26. <interface type='network'>
  27. <source network='net-br0'/>
  28. <model type='virtio'/>
  29. </interface>
  30. <disk type='network' device='disk'>
  31. <driver name='qemu' type='qcow2' cache='none'/>
  32. <source protocol='gluster' name='gv0/VMs/disk_pool/10v01251/L_10v01251.qcow2'>
  33. <host name='127.0.0.1' port='24007'/>
  34. </source>
  35. <target dev='vda' bus='virtio'/>
  36. </disk>
  37. <graphics passwd="000000" keymap="en-us" port="6002" type="vnc">
  38. <listen network="net-br0" type="network"/>
  39. </graphics>
  40. <serial type='pty'>
  41. <target port='0'/>
  42. </serial>
  43. <console type='pty'>
  44. <target type='serial' port='0'/>
  45. </console>
  46. </devices>
  47. </domain>
  48. """
  49. def __init__(self, guest=None, disks=None, g_config=None):
  50. assert isinstance(guest, Guest)
  51. assert isinstance(disks, list)
  52. assert isinstance(g_config, Config)
  53. self.guest = guest
  54. self.disks = disks
  55. self.g_config = g_config
  56. def get_domain(self):
  57. return """
  58. <?xml version="1.0" encoding="utf-8"?>
  59. <domain type="kvm">
  60. {0}
  61. {1}
  62. {2}
  63. {3}
  64. {4}
  65. {5}
  66. </domain>
  67. """.format(self.get_features(), self.get_name(), self.get_vcpu(), self.get_memory(), self.get_os(),
  68. self.get_devices())
  69. @staticmethod
  70. def get_features():
  71. return """
  72. <features>
  73. <acpi/>
  74. <apic/>
  75. </features>
  76. """
  77. def get_name(self):
  78. return """<name>{0}</name>""".format(self.guest.name)
  79. def get_vcpu(self):
  80. return """<vcpu>{0}</vcpu>""".format(self.guest.cpu.__str__())
  81. def get_memory(self):
  82. return """<memory unit="GiB">{0}</memory>""".format(self.guest.memory.__str__())
  83. @staticmethod
  84. def get_os():
  85. return """
  86. <os>
  87. <boot dev="hd"/>
  88. <type arch="x86_64">hvm</type>
  89. <bootmenu timeout="3000" enable="yes"/>
  90. </os>
  91. """
  92. def get_devices(self):
  93. return """
  94. <devices>
  95. {0}
  96. {1}
  97. {2}
  98. {3}
  99. </devices>
  100. """.format(self.get_interface(), self.get_disks(), self.get_graphics(), self.get_console())
  101. def get_interface(self):
  102. return """
  103. <interface type='network'>
  104. <source network='{0}'/>
  105. <model type='virtio'/>
  106. </interface>
  107. """.format(self.guest.network)
  108. def get_disks(self):
  109. disks = []
  110. dev_table = ['vda', 'vdb', 'vdc', 'vdd']
  111. for i, disk in self.disks:
  112. disks.append("""
  113. <disk type='network' device='disk'>
  114. <driver name='qemu' type='qcow2' cache='none'/>
  115. <source protocol='gluster' name='{0}/VMs/{1}/{2}.{3}'>
  116. <host name='127.0.0.1' port='24007'/>
  117. </source>
  118. <target dev='{4}' bus='virtio'/>
  119. </disk>
  120. """.format(self.g_config.glusterfs_volume, self.guest.name, disk['label'], disk['format'], dev_table[i]))
  121. return ''.join(disks)
  122. def get_graphics(self):
  123. return """
  124. <graphics passwd="{0}" keymap="en-us" port="{1}" type="vnc">
  125. <listen network="{2}" type="network"/>
  126. </graphics>
  127. """.format(self.guest.vnc_password, self.guest.vnc_port, self.guest.manage_network)
  128. @staticmethod
  129. def get_console():
  130. return """
  131. <serial type='pty'>
  132. <target port='0'/>
  133. </serial>
  134. <console type='pty'>
  135. <target type='serial' port='0'/>
  136. </console>
  137. """