'Return a Volume object based on a volume name and optional zone.
To improve performance, we request all disks and allow the user
to consult the cache dictionary rather than making an API call.
:param    name: The name of the volume
:type     name: ``str``
:keyword  zone: The zone to search for the volume in (set to \'all\' to
search all zones)
:type     zone: ``str`` or :class:`GCEZone` or :class:`NodeLocation`
or ``None``
:keyword  use_cache: Search for the volume in the existing cache of
volumes.  If True, we omit the API call and search
self.volumes_dict.  If False, a call to
disks/aggregatedList is made prior to searching
self._ex_volume_dict.
:type     use_cache: ``bool``
:return:  A StorageVolume object for the volume
:rtype:   :class:`StorageVolume`'

def ex_get_volume(self, name, zone=None, use_cache=False):

    if ((not self._ex_volume_dict) or (use_cache is False)):
        self._ex_populate_volume_dict()
    try:
        zone = zone.name
    except AttributeError:
        pass
    return self._ex_lookup_volume(name, zone)
