<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">

<head>

<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<title>Re: RFC: Rewritten libvirt driver XML generation</title>
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page Section1
        {size:612.0pt 792.0pt;
        margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
        {page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>

<body lang=ZH-CN link=blue vlink=purple>

<div class=Section1>

<p class=MsoNormal><span lang=EN-US style='font-size:10.5pt;font-family:"Arial","sans-serif";
color:#222222'>Hi all:<br>
    I tried kvm on my openstack on ubuntu11.10  with the
libvirt.xml file as follows:<br>
<domain type='kvm'><br>
    <name>instance-00000011</name><br>
    <memory>2097152</memory><br>
    <os><br>
           
<type>hvm</type><br>
            <boot
dev="hd" /><br>
    </os><br>
    <features><br>
        <acpi/><br>
    </features><br>
    <vcpu>1</vcpu><br>
    <devices><br>
    <sound model='ac97'/><br>
    <input type='tablet' bus='usb'/><br>
        <disk type='file'><br>
            <driver
type='qcow2'/><br>
            <source
file='/opt/stack/nova/nova/..//instances/instance-00000011/disk'/><br>
            <target
dev='vda' bus='ide'/><br>
        </disk><br>
            <disk
type='file'><br>
               
<driver type='qcow2'/><br>
               
<source file='/opt/stack/nova/nova/..//instances/instance-00000011/disk.local'/><br>
               
<target dev='vdb' bus='ide'/><br>
            </disk><br>
<br>
        <interface type='bridge'><br>
            <source
bridge='br100'/><br>
            <mac
address='02:16:3e:44:a1:dd'/><br>
           
<filterref filter="nova-instance-instance-00000011-02163e44a1dd"><br>
               
<parameter name="IP" value="10.0.0.2" /><br>
               
<parameter name="DHCPSERVER" value="10.0.0.1" /><br>
           
</filterref><br>
        </interface><br>
<br>
        <!-- The order is significant
here.  File must be defined first --><br>
        <serial type="file"><br>
            <source
path='/opt/stack/nova/nova/..//instances/instance-00000011/console.log'/><br>
            <target
port='1'/><br>
        </serial><br>
<br>
        <console type='pty'
tty='/dev/pts/2'><br>
            <source
path='/dev/pts/2'/><br>
            <target
port='0'/><br>
        </console><br>
<br>
        <serial type='pty'><br>
            <source
path='/dev/pts/2'/><br>
            <target
port='0'/><br>
        </serial><br>
<br>
<br>
        <graphics type='vnc' port='-1'
autoport='yes' keymap='en-us' listen='0.0.0.0'/><br>
<br>
    </devices><br>
</domain><br>
<br>
So it works well.<br>
<br>
Howerver, I want change the remote access method by spice, I simply changed the
libvirt.xml as follows:<br>
<domain type='kvm'><br>
    <name>instance-00000011</name><br>
    <memory>2097152</memory><br>
    <os><br>
           
<type>hvm</type><br>
            <boot
dev="hd" /><br>
    </os><br>
    <features><br>
        <acpi/><br>
    </features><br>
    <vcpu>1</vcpu><br>
    <devices><br>
    <sound model='ac97'/><br>
    <input type='tablet' bus='usb'/><br>
        <disk type='file'><br>
            <driver
type='qcow2'/><br>
            <source
file='/opt/stack/nova/nova/..//instances/instance-00000011/disk'/><br>
            <target
dev='vda' bus='ide'/><br>
        </disk><br>
            <disk
type='file'><br>
               
<driver type='qcow2'/><br>
               
<source file='/opt/stack/nova/nova/..//instances/instance-00000011/disk.local'/><br>
               
<target dev='vdb' bus='ide'/><br>
            </disk><br>
<br>
        <interface type='bridge'><br>
            <source
bridge='br100'/><br>
            <mac
address='02:16:3e:44:a1:dd'/><br>
           
<filterref filter="nova-instance-instance-00000011-02163e44a1dd"><br>
               
<parameter name="IP" value="10.0.0.2" /><br>
               
<parameter name="DHCPSERVER" value="10.0.0.1" /><br>
           
</filterref><br>
        </interface><br>
<br>
        <!-- The order is significant
here.  File must be defined first --><br>
        <serial type="file"><br>
            <source
path='/opt/stack/nova/nova/..//instances/instance-00000011/console.log'/><br>
            <target
port='1'/><br>
        </serial><br>
<br>
        <console type='pty'
tty='/dev/pts/2'><br>
            <source
path='/dev/pts/2'/><br>
            <target
port='0'/><br>
        </console><br>
<br>
        <serial type='pty'><br>
            <source
path='/dev/pts/2'/><br>
            <target
port='0'/><br>
        </serial><br>
<br>
<br>
        <graphics type='spice' port='-1'
autoport='yes' keymap='en-us' listen='0.0.0.0'/><br>
<br>
    </devices><br>
</domain><br>
<br>
As you can see, I just change <graphics type='vnc' port='-1' autoport='yes'
keymap='en-us' listen='0.0.0.0'/> to <graphics type='spice' port='-1'
autoport='yes' keymap='en-us' listen='0.0.0.0'/>   ,  
But it called the error as follows:<br>
<br>
libvirtError: internal error Process exited while reading console log output:
char device redirected to /dev/pts/12<br>
TRACE: do_spice_init: starting 0.8.1<br>
TRACE: do_spice_init: statistics shm_open failed, Permission denied"<br>
<br>
<br>
I wish someone can give me some help! Thanks!</span><span lang=EN-US
style='font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.5pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'>

<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:SimSun'>发件人<span
lang=EN-US>:</span></span></b><span lang=EN-US style='font-size:10.0pt;
font-family:SimSun'> openstack-bounces+wangsuyi640=gmail.com@lists.launchpad.net
[mailto:openstack-bounces+wangsuyi640=gmail.com@lists.launchpad.net] </span><b><span
style='font-size:10.0pt;font-family:SimSun'>代表 </span></b><span
lang=EN-US style='font-size:10.0pt;font-family:SimSun'>Joshua Harlow<br>
</span><b><span style='font-size:10.0pt;font-family:SimSun'>发送时间<span
lang=EN-US>:</span></span></b><span lang=EN-US style='font-size:10.0pt;
font-family:SimSun'> 2012</span><span style='font-size:10.0pt;font-family:SimSun'>年<span
lang=EN-US>3</span>月<span lang=EN-US>9</span>日<span lang=EN-US>
4:34<br>
</span><b>收件人<span lang=EN-US>:</span></b><span
lang=EN-US> Daniel P. Berrange; openstack<br>
</span><b>主题<span lang=EN-US>:</span></b><span lang=EN-US> Re:
[Openstack] RFC: Rewritten libvirt driver XML generation<o:p></o:p></span></span></p>

</div>

</div>

<p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p>

<p class=MsoNormal style='margin-bottom:12.0pt'><span lang=EN-US
style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>Awesome!<br>
<br>
Great job :-)<br>
<br>
+1 milllion<br>
<br>
On 3/8/12 11:03 AM, "Daniel P. Berrange" <<a
href="berrange@redhat.com">berrange@redhat.com</a>> wrote:</span><span
lang=EN-US><o:p></o:p></span></p>

<p class=MsoNormal style='margin-bottom:12.0pt'><span lang=EN-US
style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>Back in January
Joshua Harlow raised the question of whether we should<br>
replace the usage of Cheetah templates for generating XML in the libvirt<br>
driver:<br>
<br>
  <a href="https://lists.launchpad.net/openstack/msg06481.html">https://lists.launchpad.net/openstack/msg06481.html</a><br>
<br>
Since then I have had some time to work on this idea and now have a<br>
working branch available for testing. I don't want to push this to<br>
Gerrit right now, since it isn't really material suitable for the<br>
Essex release, and AFAICT we don't have a separate review/GIT branch<br>
for non-Essex feature dev work.<br>
<br>
Thus for now I have pushed it to a private a branch here:<br>
<br>
  <a
href="https://github.com/berrange/nova/tree/libvirt-xml-config-v1">https://github.com/berrange/nova/tree/libvirt-xml-config-v1</a><br>
<br>
The  foundation for the work is early in the series, where I create<br>
a new nova/virt/libvirt/config.py module with a set of classes for<br>
representing the aspects of libvirt configuration that Nova is interested<br>
in. Each of the config classes implement a format_dom() method for<br>
serializing themselves to an lxml.etree.Element DOM instance.<br>
<br>
Currently these objects can be used to generate XML, but in the future<br>
they will also be able to parse the XML. For this they will implement<br>
a parse_dom() method which will de-deserialize the xml.etree.Element<br>
DOM.<br>
<br>
Joshua's original posting had talked about having separate layers<br>
for the config objects vs the serialization. IMHO this would be<br>
overkill, just adding abstraction for little real world gain. We<br>
don't need to have pluggable XML serialization impls, one good one<br>
is sufficient.<br>
<br>
The rest of the series is simply a piece-by-piece conversion of the<br>
template code to the new object based APIs. I did it in a great many<br>
steps, to make it easier to review & test the changes.<br>
<br>
As well as the guest config creation, I also took the opportunity to<br>
change two others places where we generate XML. The host CPU comparison<br>
code and the domain snapshot creation. There is still one place left<br>
to fix, the firewall filter generator.<br>
<br>
By the end of the series we have the following benefits<br>
<br>
 - No code anywhere outside config.py ever needs to know about XML<br>
   documents<br>
<br>
 - We actually have proper XML escaping, making us safe from potential<br>
   exploits in that area<br>
<br>
 - There is clean separation of the logic for constructing the<br>
   guest config, from the logic for generating XML.<br>
<br>
<br>
My next step following on from this is to actually start making the<br>
config generation more flexible, removing alot of hardcoding it<br>
currently does (eg horrible global virtio on/off switch). This will<br>
entail tagging images on import with an operating system identifier,<br>
and then using libosinfo to query exactly what hardware devices the<br>
OS supports & picking the optimal ones.<br>
<br>
I tested this on a KVM host and verified the XML generated for the<br>
guest before/after was the same. I've not tested all the possible<br>
block / network driver combinations though, so might have broken<br>
something not covered by the test suite<br>
<br>
Diffstat for the whole patch series<br>
<br>
 b/nova/tests/fakelibvirt.py
        |   11<br>
 b/nova/tests/test_libvirt.py        |
  67 +++--<br>
 b/nova/tests/test_libvirt_config.py |  448
+++++++++++++++++++++++++++++++++<br>
 b/nova/tests/test_libvirt_vif.py    |   54 +---<br>
 b/nova/virt/libvirt/config.py       |
 420 +++++++++++++++++++++++++++++++<br>
 b/nova/virt/libvirt/connection.py   |  476
++++++++++++++++++++++--------------<br>
 b/nova/virt/libvirt/vif.py
         |  102 ++++---<br>
 b/nova/virt/libvirt/volume.py       |
  52 ++-<br>
 nova/virt/cpuinfo.xml.template      |
   9<br>
 nova/virt/libvirt.xml.template      |  188
--------------<br>
 10 files changed, 1323 insertions(+), 504 deletions(-)<br>
<br>
<br>
Regards,<br>
Daniel<br>
--<br>
|: <a href="http://berrange.com">http://berrange.com</a>
     -o-    <a
href="http://www.flickr.com/photos/dberrange/">http://www.flickr.com/photos/dberrange/</a>
:|<br>
|: <a href="http://libvirt.org">http://libvirt.org</a>
             -o-
            <a
href="http://virt-manager.org">http://virt-manager.org</a> :|<br>
|: <a href="http://autobuild.org">http://autobuild.org</a>
      -o-
        <a
href="http://search.cpan.org/~danberr/">http://search.cpan.org/~danberr/</a> :|<br>
|: <a href="http://entangle-photo.org">http://entangle-photo.org</a>
      -o-       <a
href="http://live.gnome.org/gtk-vnc">http://live.gnome.org/gtk-vnc</a> :|</span><span
lang=EN-US><o:p></o:p></span></p>

</div>

</body>

</html>