root / snf-cyclades-app / synnefo / volume / snapshots.py @ 0a83201b
History | View | Annotate | Download (2.3 kB)
1 | 79a1e9bd | Christos Stavrakakis | import datetime |
---|---|---|---|
2 | 79a1e9bd | Christos Stavrakakis | from django.utils import simplejson as json |
3 | 79a1e9bd | Christos Stavrakakis | from django.db import transaction |
4 | 79a1e9bd | Christos Stavrakakis | from snf_django.lib.api import faults |
5 | 79a1e9bd | Christos Stavrakakis | from snf_django.lib.api.utils import isoformat |
6 | 79a1e9bd | Christos Stavrakakis | from synnefo.plankton.utils import image_backend |
7 | 79a1e9bd | Christos Stavrakakis | from synnefo.logic import backend |
8 | 79a1e9bd | Christos Stavrakakis | from synnefo.volume import util |
9 | 79a1e9bd | Christos Stavrakakis | |
10 | 79a1e9bd | Christos Stavrakakis | |
11 | 79a1e9bd | Christos Stavrakakis | SNAPSHOTS_CONTAINER = "snapshots"
|
12 | 79a1e9bd | Christos Stavrakakis | SNAPSHOTS_DOMAIN = "plankton"
|
13 | 79a1e9bd | Christos Stavrakakis | SNAPSHOTS_PREFIX = "plankton:"
|
14 | 79a1e9bd | Christos Stavrakakis | SNAPSHOTS_TYPE = "application/octet-stream"
|
15 | 79a1e9bd | Christos Stavrakakis | SNAPSHOTS_MAPFILE_PREFIX = "archip:"
|
16 | 79a1e9bd | Christos Stavrakakis | |
17 | 79a1e9bd | Christos Stavrakakis | |
18 | 79a1e9bd | Christos Stavrakakis | @transaction.commit_on_success
|
19 | 79a1e9bd | Christos Stavrakakis | def create(user_id, volume, name, description, metadata, force=False): |
20 | 79a1e9bd | Christos Stavrakakis | |
21 | 79a1e9bd | Christos Stavrakakis | if volume.machine is None: |
22 | 79a1e9bd | Christos Stavrakakis | raise faults.BadRequest("Can not snapshot detached volume!") |
23 | 79a1e9bd | Christos Stavrakakis | |
24 | 79a1e9bd | Christos Stavrakakis | volume.snapshot_counter += 1
|
25 | 79a1e9bd | Christos Stavrakakis | volume.save() |
26 | 79a1e9bd | Christos Stavrakakis | |
27 | 79a1e9bd | Christos Stavrakakis | snapshot_metadata = {} |
28 | 79a1e9bd | Christos Stavrakakis | snapshot_metadata[SNAPSHOTS_PREFIX + "name"] = description
|
29 | 79a1e9bd | Christos Stavrakakis | snapshot_metadata[SNAPSHOTS_PREFIX + "description"] = description
|
30 | 79a1e9bd | Christos Stavrakakis | snapshot_metadata[SNAPSHOTS_PREFIX + "metadata"] = json.dumps(metadata)
|
31 | 79a1e9bd | Christos Stavrakakis | snapshot_metadata[SNAPSHOTS_PREFIX + "volume_id"] = volume.id
|
32 | 79a1e9bd | Christos Stavrakakis | snapshot_metadata[SNAPSHOTS_PREFIX + "status"] = "CREATING" |
33 | 79a1e9bd | Christos Stavrakakis | #XXX: just to work
|
34 | 79a1e9bd | Christos Stavrakakis | snapshot_metadata[SNAPSHOTS_PREFIX + "is_snapshot"] = True |
35 | 79a1e9bd | Christos Stavrakakis | |
36 | 79a1e9bd | Christos Stavrakakis | snapshot_name = generate_snapshot_name(volume) |
37 | 79a1e9bd | Christos Stavrakakis | mapfile = SNAPSHOTS_MAPFILE_PREFIX + snapshot_name |
38 | 79a1e9bd | Christos Stavrakakis | |
39 | 79a1e9bd | Christos Stavrakakis | with image_backend(user_id) as pithos_backend: |
40 | 79a1e9bd | Christos Stavrakakis | # move this to plankton backend
|
41 | 79a1e9bd | Christos Stavrakakis | snapshot_uuid = pithos_backend.backend.register_object_map( |
42 | 79a1e9bd | Christos Stavrakakis | user=user_id, |
43 | 79a1e9bd | Christos Stavrakakis | account=user_id, |
44 | 79a1e9bd | Christos Stavrakakis | container=SNAPSHOTS_CONTAINER, |
45 | 79a1e9bd | Christos Stavrakakis | name=name, |
46 | 79a1e9bd | Christos Stavrakakis | size=volume.size, |
47 | 79a1e9bd | Christos Stavrakakis | type=SNAPSHOTS_TYPE, |
48 | 79a1e9bd | Christos Stavrakakis | mapfile=mapfile, |
49 | 79a1e9bd | Christos Stavrakakis | meta=snapshot_metadata, |
50 | 79a1e9bd | Christos Stavrakakis | replace_meta=False,
|
51 | 79a1e9bd | Christos Stavrakakis | permissions=None)
|
52 | 79a1e9bd | Christos Stavrakakis | #checksum=None,
|
53 | 79a1e9bd | Christos Stavrakakis | |
54 | 79a1e9bd | Christos Stavrakakis | backend.snapshot_instance(volume.machine, snapshot_name=snapshot_uuid) |
55 | 79a1e9bd | Christos Stavrakakis | |
56 | 79a1e9bd | Christos Stavrakakis | snapshot = util.get_snapshot(user_id, snapshot_uuid) |
57 | 79a1e9bd | Christos Stavrakakis | |
58 | 79a1e9bd | Christos Stavrakakis | return snapshot
|
59 | 79a1e9bd | Christos Stavrakakis | |
60 | 79a1e9bd | Christos Stavrakakis | |
61 | 79a1e9bd | Christos Stavrakakis | def generate_snapshot_name(volume): |
62 | 79a1e9bd | Christos Stavrakakis | time = isoformat(datetime.datetime.now()) |
63 | 79a1e9bd | Christos Stavrakakis | return "snf-snapshot-of-volume-%s-%s-%s" % (volume.id, |
64 | 79a1e9bd | Christos Stavrakakis | volume.snapshot_counter, time) |
65 | 79a1e9bd | Christos Stavrakakis | |
66 | 79a1e9bd | Christos Stavrakakis | |
67 | 79a1e9bd | Christos Stavrakakis | @transaction.commit_on_success
|
68 | 79a1e9bd | Christos Stavrakakis | def delete(snapshot): |
69 | 79a1e9bd | Christos Stavrakakis | user_id = snapshot["owner"]
|
70 | 79a1e9bd | Christos Stavrakakis | with image_backend(user_id) as pithos_backend: |
71 | 79a1e9bd | Christos Stavrakakis | pithos_backend.delete_snapshot(snapshot["uuid"])
|
72 | 79a1e9bd | Christos Stavrakakis | return snapshot |