[libvirt] [test-API][PATCH 1/2] Add support for spice graphics

Osier Yang jyang at redhat.com
Wed Dec 14 08:58:21 UTC 2011


On 2011年09月29日 17:30, Nan Zhang wrote:
> * utils/Python/xmlgenerator.py: This extends graphics element for spice
>    XML composing, and support sub-elements settings for audio, images,
>    streaming and so on:
>
>      <graphics type='spice' autoport='yes'>
>          <image compression='auto_glz'/>
>          <jpeg compression='auto'/>
>          <zlib compression='auto'/>
>          <playback compression='on'/>
>          <streaming mode='filter'/>
>          <clipboard copypaste='no'/>
>      </graphics>
>
> * utils/Python/xmlbuilder.py: Add 2 methods add_graphics() and
>    build_graphics() to XmlBuilder class.
> ---
>   utils/Python/xmlbuilder.py   |   36 +++++++++++++++++++++++-
>   utils/Python/xmlgenerator.py |   62 +++++++++++++++++++++++++++++++++++++----
>   2 files changed, 91 insertions(+), 7 deletions(-)
>
> diff --git a/utils/Python/xmlbuilder.py b/utils/Python/xmlbuilder.py
> index 5a0f8c8..739eccb 100644
> --- a/utils/Python/xmlbuilder.py
> +++ b/utils/Python/xmlbuilder.py
> @@ -64,6 +64,13 @@ class XmlBuilder:
>           hostdev_node, domain.getElementsByTagName("console")[0])
>           return hostdev
>
> +    def add_graphics(self, params, domain):
> +        graphics = xmlgenerator.graphics_xml(params)
> +        graphics_node = domain.importNode(graphics.childNodes[0], True)
> +        domain.getElementsByTagName("devices")[0].insertBefore(
> +        graphics_node, domain.getElementsByTagName("console")[0])
> +        return graphics
> +
>       def build_domain_install(self, params):
>           domain = xmlgenerator.domain_xml(params, True)
>           self.add_disk(params, domain)
> @@ -151,6 +158,12 @@ class XmlBuilder:
>               self.write_toxml(hostdev)
>           return hostdev.toxml()
>
> +    def build_graphics(self, params):
> +        graphics = xmlgenerator.graphics_xml(params)
> +        if __DEBUG__:
> +            self.write_toxml(graphics)
> +        return graphics.toxml()
> +
>       def build_pool(self, params):
>           pool = xmlgenerator.pool_xml(params)
>           if __DEBUG__:
> @@ -242,6 +255,20 @@ if __name__ == "__main__":
>
>       interfacexml = xmlobj.build_interface(params)
>
> +    #--------------------------
> +    # get graphics xml string
> +    #--------------------------
> +    print '=' * 30, 'graphics xml', '=' * 30
> +    params['graphtype'] = 'spice'
> +    params['image'] = 'auto_glz'
> +    params['jpeg'] = 'auto'
> +    params['zlib'] = 'auto'
> +    params['playback'] = 'on'
> +    params['streaming'] = 'filter'
> +    params['clipboard'] = 'no'

What does these hardcoding for?

> +
> +    graphicsxml = xmlobj.build_graphics(params)
> +
>       #---------------------
>       # get pool xml string
>       #---------------------
> @@ -297,6 +324,13 @@ if __name__ == "__main__":
>       params['memory'] = '1048576'
>       params['vcpu'] = '2'
>       params['inputbus'] = 'usb'
> +    params['graphtype'] = 'spice'
> +    params['image'] = 'auto_glz'
> +    params['jpeg'] = 'auto'
> +    params['zlib'] = 'auto'
> +    params['playback'] = 'on'
> +    params['streaming'] = 'filter'
> +    params['clipboard'] = 'no'

Also these?

>       params['sound'] = 'ac97'
>       params['bootcd'] = '/iso/rhel5.iso'
>
> @@ -367,7 +401,7 @@ if __name__ == "__main__":
>       #----------------------------------------
>       # get domain snapshot xml string
>       #----------------------------------------
> -    params['name'] = 'hello'
> +    params['snapshotname'] = 'hello'
>       params['description'] = 'hello snapshot'
>       snapshot_xml = xmlobj.build_domain_snapshot(params)
>
> diff --git a/utils/Python/xmlgenerator.py b/utils/Python/xmlgenerator.py
> index d57dd33..460f2e5 100644
> --- a/utils/Python/xmlgenerator.py
> +++ b/utils/Python/xmlgenerator.py
> @@ -233,12 +233,6 @@ def domain_xml(params, install = False):
>               input_element.setAttribute('bus', 'ps2')
>       devices_element.appendChild(input_element)
>
> -    #<graphics>
> -    graphics_element = domain.createElement('graphics')
> -    graphics_element.setAttribute('type', 'vnc')
> -    graphics_element.setAttribute('port', '-1')
> -    graphics_element.setAttribute('keymap', 'en-us')
> -    devices_element.appendChild(graphics_element)
>       domain_element.appendChild(devices_element)
>
>       #<sound>
> @@ -253,6 +247,62 @@ def domain_xml(params, install = False):
>
>       return domain
>
> +def graphics_xml(params):
> +    graphics = xml.dom.minidom.Document()
> +    #<graphics>
> +    graphics_element = graphics.createElement('graphics')
> +    if not params.has_key('graphtype'):
> +        params['graphtype'] == 'vnc'
> +
> +    graphics_element.setAttribute('type', params['graphtype'])
> +    graphics.appendChild(graphics_element)
> +
> +    if params['graphtype'] == 'vnc':
> +        graphics_element.setAttribute('port', '-1')
> +        graphics_element.setAttribute('keymap', 'en-us')
> +    elif params['graphtype'] == 'spice':
> +        graphics_element.setAttribute('autoport', 'yes')
> +        if params.has_key('image'):
> +            image_element = graphics.createElement('image')
> +            # image to set image compression (accepts
> +            # auto_glz, auto_lz, quic, glz, lz, off)
> +            image_element.setAttribute('compression', params['image'])
> +            graphics_element.appendChild(image_element)
> +        if params.has_key('jpeg'):
> +            jpeg_element = graphics.createElement('jpeg')
> +            # jpeg for JPEG compression for images over wan (accepts
> +            # auto, never, always)
> +            jpeg_element.setAttribute('compression', params['jpeg'])
> +            graphics_element.appendChild(jpeg_element)
> +        if params.has_key('zlib'):
> +            zlib_element = graphics.createElement('zlib')
> +            # zlib for configuring wan image compression (accepts
> +            # auto, never, always)
> +            zlib_element.setAttribute('compression', params['zlib'])
> +            graphics_element.appendChild(zlib_element)
> +        if params.has_key('playback'):
> +            playback_element = graphics.createElement('playback')
> +            # playback for enabling audio stream compression (accepts on or off)
> +            playback_element.setAttribute('compression', params['playback'])
> +            graphics_element.appendChild(playback_element)
> +        if params.has_key('streaming'):
> +            streaming_element = graphics.createElement('streaming')
> +            # streamming for settings it's mode attribute to one of
> +            # filter, all or off
> +            streaming_element.setAttribute('mode', params['streaming'])
> +            graphics_element.appendChild(streaming_element)
> +        if params.has_key('clipboard'):
> +            clipboard_element = graphics.createElement('clipboard')
> +            # Copy&  Paste functionality is enabled by default, and can
> +            # be disabled by setting the copypaste property to no
> +            clipboard_element.setAttribute('copypaste', params['clipboard'])
> +            graphics_element.appendChild(clipboard_element)
> +    else:
> +        print 'Wrong graphics type was specified.'
> +        sys.exit(1)
> +
> +    return graphics
> +

Others look good. Per comments in previous patch, you might want to give
a good name for this function, and expose it as pubic API.

>   def disk_xml(params, cdrom = False):
>       disk = xml.dom.minidom.Document()
>       #<disk>  -- START




More information about the libvir-list mailing list