[virt-tools-list] [virt-manager PATCH] delete: do not throw exception if the volume or the pool don't exist

Giuseppe Scrivano gscrivan at redhat.com
Thu May 7 15:27:59 UTC 2015


Cole Robinson <crobinso at redhat.com> writes:

> On 05/07/2015 08:33 AM, Giuseppe Scrivano wrote:
>> Giuseppe Scrivano <gscrivan at redhat.com> writes:
>> 
>>> Giuseppe Scrivano <gscrivan at redhat.com> writes:
>>>
>>>> Closes: https://bugzilla.redhat.com/show_bug.cgi?id=1219427
>>>>
>>>> Signed-off-by: Giuseppe Scrivano <gscrivan at redhat.com>
>>>> ---
>>>>  virtManager/delete.py | 4 ++++
>>>>  1 file changed, 4 insertions(+)
>>>>
>>>> diff --git a/virtManager/delete.py b/virtManager/delete.py
>>>> index 2addcfa..a7d4ec2 100644
>>>> --- a/virtManager/delete.py
>>>> +++ b/virtManager/delete.py
>>>> @@ -236,7 +236,11 @@ def populate_storage_list(storage_list, vm, conn):
>>>>          if disk.source_pool:
>>>>              try:
>>>>                  pool = conn.get_pool(disk.source_pool)
>>>> +                if pool is None:
>>>> +                    return disk.path
>>>>                  vol = pool.get_volume(disk.path)
>>>> +                if vol is None:
>>>> +                    return disk.path
>>>>                  return vol.get_target_path()
>>>>              except KeyError:
>>>>                  return disk.path
>>>
>>> looking into the root cause of it..
>>>
>>> commit 5357b91402fb7a8a73921216926908c08f6ad99d changed the semantic of
>>> conn.get_(vm|pool|interface|nodedev|net), to return None instead of
>>> raising KeyError.  Should we perhaps restore the previous behavior?
>> 
>> I am more convinced about this version now (additionally, the try/except
>> code in the first patch is not useful):
>> 
>> diff --git a/virtManager/connection.py b/virtManager/connection.py
>> index 41403f6..47204e9 100644
>> --- a/virtManager/connection.py
>> +++ b/virtManager/connection.py
>> @@ -133,7 +133,7 @@ class _ObjectList(vmmGObject):
>>          for obj in self.get_objects_for_class(classobj):
>>              if obj.get_connkey() == connkey:
>>                  return obj
>> -        return None
>> +        raise KeyError("Key %s does not exist" % connkey)
>> 
>> Regards,
>> Giuseppe
>> 
>
> I'm slightly afraid that new code might be depending on that return None
> behavior now. I changed a lot of stuff in this area...
>
> Looking at all places that catch KeyError, most have the exact same behavior
> with or without this change. The only other two places that likely have
> different behavior with the current code are:
>
> host.py:net_selected (fairly minor)
> details.py:refresh_disk_page (another instance of pool/vol bug)
>
> Though some sites may be catching Exception and not KeyError
>
> How about a patch to fix the delete.py and details.py issues that you can
> backport, I'll audit the remaining callers to look for any regressions

ok sure, then we can go with the first version of the patch, I'll leave
the exception handling in case the old behavior is restored.

OK to push this?

diff --git a/virtManager/delete.py b/virtManager/delete.py
index 2addcfa..a7d4ec2 100644
--- a/virtManager/delete.py
+++ b/virtManager/delete.py
@@ -236,7 +236,11 @@ def populate_storage_list(storage_list, vm, conn):
         if disk.source_pool:
             try:
                 pool = conn.get_pool(disk.source_pool)
+                if pool is None:
+                    return disk.path
                 vol = pool.get_volume(disk.path)
+                if vol is None:
+                    return disk.path
                 return vol.get_target_path()
             except KeyError:
                 return disk.path
diff --git a/virtManager/details.py b/virtManager/details.py
index 7690e46..03184d8 100644
--- a/virtManager/details.py
+++ b/virtManager/details.py
@@ -2700,12 +2700,14 @@ class vmmDetails(vmmGObjectUI):
         if not path:
             size = "-"
         else:
+            vol = None
             if source_pool:
                 try:
                     pool = self.conn.get_pool(source_pool)
-                    vol = pool.get_volume(path)
+                    if pool is not None:
+                        vol = pool.get_volume(path)
                 except KeyError:
-                    vol = None
+                    pass
             else:
                 vol = self.conn.get_vol_by_path(path)

Thanks,
Giuseppe




More information about the virt-tools-list mailing list