將網路設備定義檔 (CloudNetwork.xml) 轉換成 Libvirt XML 檔案格式, 在自動生成系統使用 xslt 程式語言來執行轉換. CloudNetwork.xslt 程式根據 CloudNetwork.xml 的內容會各別生成
Libvirt 所製定的 XML 資訊檔. CloudNetwork.xslt 呼叫 makehub.xslt 副程式, 將 CloudNetwork.xml 中的 <hub> 標籤內容轉換成 Libvirt 可處理的網路定義檔, 呼叫 makenat.xslt 副程式, 將 CloudNetwork.xml 中的 <nat> 標籤內容轉換成 Libvirt 可處理的虛擬系統定義檔, 呼叫 makerouter.xslt 副程式, 將 CloudNetwork.xml 中的 <router> 標籤內容轉換成 Libvirt 可處理的虛擬系統定義檔
CloudNetwork.xslt 程式內容
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/network">
<!--###################### 主程式 #####################-->
<xsl:for-each select="*">
<xsl:choose>
<xsl:when test="name() = 'hub'">
<!-- 呼叫 makehub 副程式 -->
<xsl:call-template name="makehub">
<xsl:with-param name="pname"><xsl:value-of select="name"/></xsl:with-param>
</xsl:call-template>
</xsl:when>
<xsl:when test="name() = 'nat'">
<!-- 呼叫 makenat 副程式 -->
<xsl:call-template name="makenat">
<xsl:with-param name="pname"><xsl:value-of select="name"/></xsl:with-param>
</xsl:call-template>
</xsl:when>
<xsl:when test="name() = 'router'">
<!-- 呼叫 makerouter 副程式 -->
<xsl:call-template name="makerouter">
<xsl:with-param name="pname"><xsl:value-of select="name"/></xsl:with-param>
</xsl:call-template>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:template>
<!-- 載入外部副程式 -->
<xsl:include href="makehub.xslt"/>
<xsl:include href="makenat.xslt"/>
<xsl:include href="makerouter.xslt"/>
</xsl:stylesheet>
程式執行, 命令如下 :
$ xsltproc CloudNetwork.xslt CloudNetwork.xml
上面命令執行後, 會將生成的 Libvirt XML 檔, 存在目前目錄的 out 資料夾中.
以下為三個副程式的內容 :
1. makehub.xslt 程式
<?xml version="1.0"?>
<!DOCTYPE xsl:stylesheet [
<!ENTITY nbsp " ">
]>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:saxon="http://icl.com/saxon"
extension-element-prefixes="saxon">
<xsl:template name="makehub">
<xsl:param name="pname"></xsl:param>
<xsl:variable name="filename"><xsl:value-of select="$pname"/></xsl:variable>
<saxon:output file="./out/{$filename}.xml">
<xsl:variable name="sname"><xsl:value-of select="name"/></xsl:variable>
<xsl:variable name="nid"><xsl:value-of select="nid"/></xsl:variable>
<xsl:variable name="mask"><xsl:value-of select="netmask"/></xsl:variable>
<xsl:variable name="s"><xsl:value-of select="dhcp/start"/></xsl:variable>
<xsl:variable name="e"><xsl:value-of select="dhcp/end"/></xsl:variable>
<network>
<name><xsl:value-of select="$sname"/></name>
<bridge name='{$sname}_NET' stp='on' delay='0' />
<ip address='{$nid}' netmask='{$mask}'>
<xsl:if test="dhcp">
<dhcp>
<range start='{$s}' end='{$e}' />
</dhcp>
</xsl:if>
</ip>
</network>
</saxon:output>
</xsl:template>
</xsl:stylesheet>
2. makenat.xslt 程式
<?xml version="1.0"?>
<!DOCTYPE xsl:stylesheet [
<!ENTITY nbsp " ">
]>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:saxon="http://icl.com/saxon"
extension-element-prefixes="saxon">
<xsl:template name="makenat">
<xsl:param name="pname"></xsl:param>
<xsl:variable name="filename"><xsl:value-of select="$pname"/></xsl:variable>
<saxon:output file="./out/{$filename}.xml">
<xsl:variable name="s"><xsl:value-of select="system"/></xsl:variable>
<xsl:variable name="oip"><xsl:value-of select="out/ip"/></xsl:variable>
<xsl:variable name="ohub"><xsl:value-of select="out/hub"/></xsl:variable>
<xsl:variable name="omac"><xsl:value-of select="out/mac"/></xsl:variable>
<xsl:variable name="iip"><xsl:value-of select="in/ip"/></xsl:variable>
<xsl:variable name="ihub"><xsl:value-of select="in/hub"/></xsl:variable>
<xsl:variable name="imac"><xsl:value-of select="in/mac"/></xsl:variable>
<!-- Libvirt 虛擬電腦定義檔 -->
<domain type='kvm' id='1'>
<name><xsl:value-of select="name"/></name>
<memory><xsl:value-of select="memory"/></memory>
<currentMemory><xsl:value-of select="memory"/></currentMemory>
<vcpu>1</vcpu>
<os>
<type arch='i686' machine='pc-0.12'>hvm</type>
<boot dev='hd'/>
</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>
<emulator>/usr/bin/kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu'/>
<source file='{$s}_nat.img'/>
<target dev='vda' bus='virtio'/>
</disk>
<interface type='network'>
<mac address='{$omac}'/>
<source network='{$omac}'/>
<model type='virtio'/>
</interface>
<interface type='network'>
<mac address='{$imac}'/>
<source network='{$imac}'/>
<model type='virtio'/>>
</interface>
<console type='pty' tty='/dev/pts/0'>
<source path='/dev/pts/0'/>
<target port='0'/>
</console>
<input type='mouse' bus='ps2'/>
<graphics type='vnc' port='-1' autoport='yes' keymap='en-us'/>
<video>
<model type='cirrus' vram='9216' heads='1'/>
</video>
</devices>
</domain>
</saxon:output>
</xsl:template>
</xsl:stylesheet>
3. makerouter.xslt 程式
<?xml version="1.0"?>
<!DOCTYPE xsl:stylesheet [
<!ENTITY nbsp " ">
]>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:saxon="http://icl.com/saxon"
extension-element-prefixes="saxon">
<xsl:template name="makerouter">
<xsl:param name="pname"></xsl:param>
<xsl:variable name="filename"><xsl:value-of select="$pname"/></xsl:variable>
<saxon:output file="./out/{$filename}.xml">
<xsl:variable name="s"><xsl:value-of select="system"/></xsl:variable>
<xsl:variable name="oip"><xsl:value-of select="out/ip"/></xsl:variable>
<xsl:variable name="ohub"><xsl:value-of select="out/hub"/></xsl:variable>
<xsl:variable name="omac"><xsl:value-of select="out/mac"/></xsl:variable>
<xsl:variable name="iip"><xsl:value-of select="in/ip"/></xsl:variable>
<xsl:variable name="ihub"><xsl:value-of select="in/hub"/></xsl:variable>
<xsl:variable name="imac"><xsl:value-of select="in/mac"/></xsl:variable>
<!-- Libvirt 虛擬電腦定義檔 -->
<domain type='kvm' id='1'>
<name><xsl:value-of select="name"/></name>
<memory><xsl:value-of select="memory"/></memory>
<currentMemory><xsl:value-of select="memory"/></currentMemory>
<vcpu>1</vcpu>
<os>
<type arch='i686' machine='pc-0.12'>hvm</type>
<boot dev='hd'/>
</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>
<emulator>/usr/bin/kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu'/>
<source file='{$s}_router.img'/>
<target dev='vda' bus='virtio'/>
</disk>
<interface type='network'>
<mac address='{$omac}'/>
<source network='{$omac}'/>
<model type='virtio'/>
</interface>
<interface type='network'>
<mac address='{$imac}'/>
<source network='{$imac}'/>
<model type='virtio'/>>
</interface>
<console type='pty' tty='/dev/pts/0'>
<source path='/dev/pts/0'/>
<target port='0'/>
</console>
<input type='mouse' bus='ps2'/>
<graphics type='vnc' port='-1' autoport='yes' keymap='en-us'/>
<video>
<model type='cirrus' vram='9216' heads='1'/>
</video>
</devices>
</domain>
</saxon:output>
</xsl:template>
</xsl:stylesheet>
沒有留言:
張貼留言