Revision 4944a1f8 snf-cyclades-app/synnefo/volume/snapshots.py
b/snf-cyclades-app/synnefo/volume/snapshots.py | ||
---|---|---|
7 | 7 |
from synnefo.logic import backend |
8 | 8 |
from synnefo.volume import util |
9 | 9 |
|
10 |
|
|
11 | 10 |
SNAPSHOTS_CONTAINER = "snapshots" |
12 | 11 |
SNAPSHOTS_DOMAIN = "plankton" |
13 | 12 |
SNAPSHOTS_PREFIX = "plankton:" |
... | ... | |
23 | 22 |
|
24 | 23 |
volume.snapshot_counter += 1 |
25 | 24 |
volume.save() |
25 |
transaction.commit() |
|
26 | 26 |
|
27 | 27 |
snapshot_metadata = {} |
28 |
snapshot_metadata[SNAPSHOTS_PREFIX + "name"] = description
|
|
28 |
snapshot_metadata[SNAPSHOTS_PREFIX + "name"] = name
|
|
29 | 29 |
snapshot_metadata[SNAPSHOTS_PREFIX + "description"] = description |
30 | 30 |
snapshot_metadata[SNAPSHOTS_PREFIX + "metadata"] = json.dumps(metadata) |
31 | 31 |
snapshot_metadata[SNAPSHOTS_PREFIX + "volume_id"] = volume.id |
32 | 32 |
snapshot_metadata[SNAPSHOTS_PREFIX + "status"] = "CREATING" |
33 | 33 |
#XXX: just to work |
34 | 34 |
snapshot_metadata[SNAPSHOTS_PREFIX + "is_snapshot"] = True |
35 |
#XXX: for images |
|
36 |
snapshot_metadata[SNAPSHOTS_PREFIX + "store"] = "pithos" |
|
37 |
snapshot_metadata[SNAPSHOTS_PREFIX + "disk_format"] = "diskdump" |
|
38 |
snapshot_metadata[SNAPSHOTS_PREFIX + "default_container_format"] = "bare" |
|
39 |
# XXX: Hack-ish way to clone the metadata |
|
40 |
image_properties = {"EXCLUDE_ALL_TASKS": "yes", |
|
41 |
"description": description} |
|
42 |
vm_metadata = dict(volume.machine.metadata.values_list("meta_key", "meta_value")) |
|
43 |
for key in ["OS", "users"]: |
|
44 |
val = vm_metadata.get(key) |
|
45 |
if val is not None: |
|
46 |
image_properties[key] = val |
|
47 |
snapshot_metadata[SNAPSHOTS_PREFIX + "properties"] = json.dumps(image_properties) |
|
35 | 48 |
|
36 | 49 |
snapshot_name = generate_snapshot_name(volume) |
37 | 50 |
mapfile = SNAPSHOTS_MAPFILE_PREFIX + snapshot_name |
38 | 51 |
|
52 |
size = volume.size << 30 |
|
39 | 53 |
with image_backend(user_id) as pithos_backend: |
40 | 54 |
# move this to plankton backend |
41 | 55 |
snapshot_uuid = pithos_backend.backend.register_object_map( |
42 | 56 |
user=user_id, |
43 | 57 |
account=user_id, |
44 | 58 |
container=SNAPSHOTS_CONTAINER, |
45 |
name=name, |
|
46 |
size=volume.size, |
|
59 |
name=snapshot_name, |
|
60 |
size=size, |
|
61 |
domain=SNAPSHOTS_DOMAIN, |
|
47 | 62 |
type=SNAPSHOTS_TYPE, |
48 | 63 |
mapfile=mapfile, |
49 | 64 |
meta=snapshot_metadata, |
50 |
replace_meta=False,
|
|
65 |
replace_meta=True,
|
|
51 | 66 |
permissions=None) |
52 | 67 |
#checksum=None, |
53 | 68 |
|
54 |
backend.snapshot_instance(volume.machine, snapshot_name=snapshot_uuid)
|
|
69 |
backend.snapshot_instance(volume.machine, snapshot_name=snapshot_name)
|
|
55 | 70 |
|
56 | 71 |
snapshot = util.get_snapshot(user_id, snapshot_uuid) |
57 | 72 |
|
... | ... | |
60 | 75 |
|
61 | 76 |
def generate_snapshot_name(volume): |
62 | 77 |
time = isoformat(datetime.datetime.now()) |
63 |
return "snf-snapshot-of-volume-%s-%s-%s" % (volume.id,
|
|
64 |
volume.snapshot_counter, time)
|
|
78 |
return "snf-snapshot-of-volume-%s-%s" % (volume.id, |
|
79 |
volume.snapshot_counter) |
|
65 | 80 |
|
66 | 81 |
|
67 | 82 |
@transaction.commit_on_success |
Also available in: Unified diff