It seems all the arguments except `extra` dictionary are the same.

To reduce duplication, I would just build `extra` dictionary depending on the provider.

E.g.

```python
if rackspace:
    extra = ...
else:
  extra = ...

snapshot = VolumeSnapshot(..., extra=extra)
```