'Create snapshot from volume
:param volume: Instance of `StorageVolume`
:type  volume: `StorageVolume`
:param name: Name of snapshot (optional)
:type  name: `str` | `NoneType`
:param ex_description: Description of the snapshot (optional)
:type  ex_description: `str` | `NoneType`
:param ex_force: Specifies if we create a snapshot that is not in
state `available`. For example `in-use`. Defaults
to True. (optional)
:type  ex_force: `bool`
:rtype: :class:`VolumeSnapshot`'

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

    data = {'snapshot': {'volume_id': volume.id, 'force': ex_force}}
    if (name is not None):
        data['snapshot']['display_name'] = name
    if (ex_description is not None):
        data['snapshot']['display_description'] = ex_description
    return self._to_snapshot(self.connection.request('/os-snapshots', method='POST', data=data).object)
