'Create a new volume.
@inherites :class:`NodeDriver.create_volume`
:keyword ex_zone_id: the availability zone id (required)
:type ex_zone_id: ``str``
:keyword ex_description: volume description
:type ex_description: ``unicode``
:keyword ex_disk_category: disk category for data disk
:type ex_disk_category: ``str``
:keyword ex_client_token: a token generated by client to identify
each request.
:type ex_client_token: ``str``'

def create_volume(self, size, name, location=None, snapshot=None, ex_zone_id=None, ex_description=None, ex_disk_category=None, ex_client_token=None):

    params = {'Action': 'CreateDisk', 'RegionId': self.region, 'DiskName': name, 'Size': size}
    if (ex_zone_id is None):
        raise AttributeError('ex_zone_id    is    required')
    params['ZoneId'] = ex_zone_id
    if ((snapshot is not None) and isinstance(snapshot, VolumeSnapshot)):
        params['SnapshotId'] = snapshot.id
    if ex_description:
        params['Description'] = ex_description
    if ex_disk_category:
        params['DiskCategory'] = ex_disk_category
    if ex_client_token:
        params['ClientToken'] = ex_client_token
    resp = self.connection.request(self.path, params).object
    volume_id = findtext(resp, 'DiskId', namespace=self.namespace)
    volumes = self.list_volumes(ex_volume_ids=[volume_id])
    if (len(volumes) != 1):
        raise LibcloudError(('could    not    find    the    new    create    volume    with    id    %s.' % volume_id), driver=self)
    return volumes[0]
