#!/usr/bin/env python
# -*- coding: utf-8 -*-
from models import Config, Disk, OSTemplate, OSType
from models import Guest
from models import status
__author__ = 'James Iter'
__date__ = '2017/3/25'
__contact__ = 'james.iter.cn@gmail.com'
__copyright__ = '(c) 2017 by James Iter.'
class GuestXML(object):
def __init__(self, guest=None, disk=None, config=None, os_type=None):
assert isinstance(guest, Guest)
assert isinstance(disk, Disk)
assert isinstance(config, Config)
self.guest = guest
self.disk = disk
self.config = config
self.os_type = os_type
def get_domain(self):
return """
{0}
{1}
{2}
{3}
{4}
{5}
{6}
{7}
{8}
""".format(self.get_features(), self.get_cpu_mode(), self.get_clock(), self.get_name(), self.get_uuid(),
self.get_vcpu(), self.get_memory(), self.get_os(), self.get_devices())
@staticmethod
def get_features():
return """
"""
@staticmethod
def get_cpu_mode():
return """"""
def get_clock(self):
# clock 参考链接:https://libvirt.org/formatdomain.html#elementsTime
# Windows Guest 设为 localtime,非 Windows Guest 都设为 utc
offset = 'utc'
if self.os_type == OSType.windows.value:
offset = 'localtime'
return """""".format(offset)
def get_name(self):
return """{0}""".format(self.guest.label)
def get_uuid(self):
return """{0}""".format(self.guest.uuid)
def get_vcpu(self):
return """{0}""".format(self.guest.cpu.__str__())
def get_memory(self):
return """{0}""".format(self.guest.memory.__str__())
@staticmethod
def get_os():
return """
hvm
"""
def get_devices(self):
return """
{0}
{1}
{2}
{3}
{4}
""".format(self.get_interface(), self.get_disk(), self.get_graphics(), self.get_console(), self.get_channel())
def get_interface(self):
return """
""".format(self.guest.network)
def get_disk(self):
from initialize import dev_table
if self.config.storage_mode in [status.StorageMode.local.value, status.StorageMode.shared_mount.value]:
disk_xml = """
""".format(self.disk.format, self.disk.path, dev_table[self.disk.sequence])
elif self.config.storage_mode in [status.StorageMode.ceph.value, status.StorageMode.glusterfs.value]:
dfs_protocol = 'ceph'
if self.config.storage_mode == status.StorageMode.glusterfs.value:
dfs_protocol = 'gluster'
disk_xml = """
""".format(self.disk.format, dfs_protocol, self.config.dfs_volume, self.disk.path,
dev_table[self.disk.sequence])
else:
disk_xml = ''
return disk_xml
def get_graphics(self):
return """
""".format(self.guest.vnc_password, self.guest.vnc_port, self.guest.manage_network)
@staticmethod
def get_console():
return """
"""
@staticmethod
def get_channel():
return """
"""