[libvirt] [test-API PATCH 2/7] lib: fix streamAPI class

Guannan Ren gren at redhat.com
Wed Mar 21 15:45:54 UTC 2012


On 03/21/2012 08:46 PM, Peter Krempa wrote:
> The streamAPI class that encapsulates work with libvirt's streams was
> fundamentaly broken:
>   - each call to one of the methods created a new stream and
>     performed the call
>   - some methods called virStream methods with different numbers
>     of arguments
>   - there was no way to extract the actual libvirt stream object
               thanks for the patch.

> ---
>   lib/streamAPI.py |   52 ++++++++++++++++++++++++++--------------------------
>   1 files changed, 26 insertions(+), 26 deletions(-)
>
> diff --git a/lib/streamAPI.py b/lib/streamAPI.py
> index bc7d217..69e183e 100644
> --- a/lib/streamAPI.py
> +++ b/lib/streamAPI.py
> @@ -38,76 +38,76 @@ append_path(result.group(0))
>   import exception
>
>   class StreamAPI(object):
> -    def __init__(self, connection):
> -        self.conn = connection
> +    def __init__(self, conn, flags = 0):
> +        try:
> +            self.stream = conn.newStream(flags)
> +        except libvirt.libvirtError, e:
> +            message = e.get_error_message()
> +            code = e.get_error_code()
> +            raise exception.LibvirtAPI(message, code)
> +
> +    def getStream(self):
> +        return self.stream
>
> -    def abort(self, flag = 0):
> +    def abort(self):
>           try:
> -            stream_obj = newStream(flag)
> -            return stream_obj.abort()
> +            return self.stream.abort()
>           except libvirt.libvirtError, e:
>               message = e.get_error_message()
>               code = e.get_error_code()
>               raise exception.LibvirtAPI(message, code)
>
> -    def connect(self, flag = 0):
> +    def connect(self):
>           try:
> -            stream_obj = newStream(flag)
> -            return stream_obj.connect()
> +            return self.stream.connect()
>           except libvirt.libvirtError, e:
>               message = e.get_error_message()
>               code = e.get_error_code()
>               raise exception.LibvirtAPI(message, code)
>
> -    def finish(self, flag = 0):
> +    def finish(self):
>           try:
> -            stream_obj = newStream(flag)
> -            return stream_obj.finish()
> +            return self.stream.finish()
>           except libvirt.libvirtError, e:
>               message = e.get_error_message()
>               code = e.get_error_code()
>               raise exception.LibvirtAPI(message, code)
>
> -    def recv(self, flag = 0, data, nbytes):
> +    def recv(self, nbytes):
>           try:
> -            stream_obj = newStream(flag)
> -            return stream_obj.recv(data, nbytes)
> +            return self.stream.recv(nbytes)
>           except libvirt.libvirtError, e:
>               message = e.get_error_message()
>               code = e.get_error_code()
>               raise exception.LibvirtAPI(message, code)
>
> -    def send(self, flag = 0, data, nbytes):
> +    def send(self, data):
>           try:
> -            stream_obj = newStream(flag)
> -            return stream_obj.send(data, nbytes)
> +            return self.stream.send(data)
>           except libvirt.libvirtError, e:
>               message = e.get_error_message()
>               code = e.get_error_code()
>               raise exception.LibvirtAPI(message, code)
>
> -    def eventAddCallback(self, flag = 0, cb, opaque):
> +    def eventAddCallback(self, cb, opaque):

        The API need an argument event to pass in which is 
virEventHandleType
              VIR_EVENT_HANDLE_READABLE = 1
              VIR_EVENT_HANDLE_WRITABLE = 2
              VIR_EVENT_HANDLE_ERROR = 4
              VIR_EVENT_HANDLE_HANGUP = 8

        We could just overdefine it in streamAPI.py which make use of 
them easier for
        writing testcase.
        It's not a good idea to import libvirt.py directly in testcases.



>           try:
> -            stream_obj = newStream(flag)
> -            return stream_obj.eventAddCallback(cb, opaque)
> +            return self.stream.eventAddCallback(cb, opaque)
>           except libvirt.libvirtError, e:
>               message = e.get_error_message()
>               code = e.get_error_code()
>               raise exception.LibvirtAPI(message, code)
>
> -    def eventRemoveCallback(self, flag = 0):
> +    def eventRemoveCallback(self):
>           try:
> -            stream_obj = newStream(flag)
> -            return stream_obj.eventRemoveCallback()
> +            return self.stream.eventRemoveCallback()
>           except libvirt.libvirtError, e:
>               message = e.get_error_message()
>               code = e.get_error_code()
>               raise exception.LibvirtAPI(message, code)
>
> -    def eventUpdateCallback(self, flag = 0, events)
> +    def eventUpdateCallback(self, events):
>           try:
> -            stream_obj = newStream(flag)
> -            return stream_obj.eventUpdateCallback(events)
> +            return self.stream.eventUpdateCallback(events)
>           except libvirt.libvirtError, e:
>               message = e.get_error_message()
>               code = e.get_error_code()
         Miss a "raise exception.LibvirtAPI(message, code)" in the  
eventUpdateCallback
         The framework has a its own exception set, it includes the 
error exception from libvirtError
         So, in each testcases, we just catch the LibvirtAPI to raise 
API error in try..catch clause rather
         than catch all of other errors from python basic modules or 
somewhere.

         Guannan Ren




More information about the libvir-list mailing list