'Creates a snapshot of the storage volume.
@inherits :class:`NodeDriver.create_volume_snapshot`
:keyword ex_description: description of the snapshot.
:type ex_description: ``unicode``
:keyword ex_client_token: a token generated by client to identify
each request.
:type ex_client_token: ``str``'

def create_volume_snapshot(self, volume, name=None, ex_description=None, ex_client_token=None):

    params = {'Action': 'CreateSnapshot', 'DiskId': volume.id}
    if name:
        params['SnapshotName'] = name
    if ex_description:
        params['Description'] = ex_description
    if ex_client_token:
        params['ClientToken'] = ex_client_token
    snapshot_elements = self.connection.request(self.path, params).object
    snapshot_id = findtext(snapshot_elements, 'SnapshotId', namespace=self.namespace)
    snapshots = self.list_volume_snapshots(volume=None, ex_snapshot_ids=[snapshot_id])
    if (len(snapshots) != 1):
        raise LibcloudError(('could    not    find    new    created    snapshot    with    id    %s.' % snapshot_id), driver=self)
    return snapshots[0]
