2011年3月16日 星期三

雲端自動生成系統 - 轉換網路設備定義檔

將網路設備定義檔 (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 "&#160;">
]>
<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 "&#160;">
]>
<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 "&#160;">
]>
<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>

沒有留言:

張貼留言