[virt-tools-list] [virt-manager PATCH] delete: do not throw exception if the volume or the pool don't exist
Cole Robinson
crobinso at redhat.com
Thu May 7 15:29:12 UTC 2015
On 05/07/2015 11:27 AM, Giuseppe Scrivano wrote:
> 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
>
ACK
- Cole
More information about the virt-tools-list
mailing list