'Create a volume (disk).
:param  size: Size of volume to create (in GB). Can be None if image
or snapshot is supplied.
:type   size: ``int`` or ``str`` or ``None``
:param  name: Name of volume to create
:type   name: ``str``
:keyword  location: Location (zone) to create the volume in
:type     location: ``str`` or :class:`GCEZone` or
:class:`NodeLocation` or ``None``
:keyword  snapshot: Snapshot to create image from
:type     snapshot: :class:`GCESnapshot` or ``str`` or ``None``
:keyword  image: Image to create disk from.
:type     image: :class:`GCENodeImage` or ``str`` or ``None``
:keyword  use_existing: If True and a disk with the given name already
exists, return an object for that disk instead
of attempting to create a new disk.
:type     use_existing: ``bool``
:keyword  ex_disk_type: Specify a pd-standard (default) disk or pd-ssd
for an SSD disk.
:type     ex_disk_type: ``str`` or :class:`GCEDiskType`
:keyword  ex_image_family: Determine image from an \'Image Family\'
instead of by name. \'image\' should be None
to use this keyword.
:type     ex_image_family: ``str`` or ``None``
:return:  Storage Volume object
:rtype:   :class:`StorageVolume`'

def create_volume(self, size, name, location=None, snapshot=None, image=None, use_existing=True, ex_disk_type='pd-standard', ex_image_family=None):

    if (image and ex_image_family):
        raise ValueError("Cannot    specify    both    'image'    and    'ex_image_family'")
    if ex_image_family:
        image = self.ex_get_image_from_family(ex_image_family)
    (request, volume_data, params) = self._create_vol_req(size, name, location, snapshot, image, ex_disk_type)
    try:
        self.connection.async_request(request, method='POST', data=volume_data, params=params)
    except ResourceExistsError:
        e = sys.exc_info()[1]
        if (not use_existing):
            raise e
    return self.ex_get_volume(name, location)
