Statistics
| Branch: | Tag: | Revision:

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