Revision c19ad1e9 snf-cyclades-app/synnefo/volume/volumes.py
b/snf-cyclades-app/synnefo/volume/volumes.py | ||
---|---|---|
4 | 4 |
from synnefo.db.models import Volume |
5 | 5 |
from snf_django.lib.api import faults |
6 | 6 |
from synnefo.volume import util |
7 |
from synnefo.logic import backend |
|
7 |
from synnefo.logic import backend, servers
|
|
8 | 8 |
|
9 | 9 |
log = logging.getLogger(__name__) |
10 | 10 |
|
... | ... | |
43 | 43 |
msg = ("Cannot take a snapshot while snapshot is in '%s' state" |
44 | 44 |
% source_volume.status) |
45 | 45 |
raise faults.BadRequest(msg) |
46 |
source = Volume.SOURCE_VOLUME_PREFIX + str(source_volume_id)
|
|
46 |
source = Volume.prefix_source(source_volume_id, source_type="volume")
|
|
47 | 47 |
origin = source_volume.backend_volume_uuid |
48 | 48 |
elif source_snapshot_id is not None: |
49 | 49 |
source_snapshot = util.get_snapshot(user_id, source_snapshot_id, |
50 | 50 |
exception=faults.BadRequest) |
51 | 51 |
# TODO: Check the state of the snapshot!! |
52 |
source = Volume.prefix_source(source_snapshot_id, |
|
53 |
source_type="snapshot") |
|
52 | 54 |
origin = source_snapshot["checksum"] |
53 |
source = Volume.SOURCE_SNAPSHOT_PREFIX + str(source_snapshot_id) |
|
54 | 55 |
elif source_image_id is not None: |
55 | 56 |
source_image = util.get_image(user_id, source_image_id, |
56 | 57 |
exception=faults.BadRequest) |
58 |
source = Volume.prefix_source(source_image_id, source_type="image") |
|
57 | 59 |
origin = source_image["checksum"] |
58 |
source = Volume.SOURCE_IMAGE_PREFIX + str(source_image_id) |
|
59 | 60 |
|
60 | 61 |
volume = Volume.objects.create(userid=user_id, |
61 | 62 |
size=size, |
... | ... | |
71 | 72 |
for meta_key, meta_val in metadata.items(): |
72 | 73 |
volume.metadata.create(key=meta_key, value=meta_val) |
73 | 74 |
|
74 |
# Create the disk in the backend |
|
75 |
volume.backendjobid = backend.attach_volume(server, volume) |
|
76 |
volume.save() |
|
75 |
servers.attach_volume(server, volume) |
|
77 | 76 |
|
78 | 77 |
return volume |
79 | 78 |
|
... | ... | |
83 | 82 |
"""Delete a Volume""" |
84 | 83 |
# A volume is deleted by detaching it from the server that is attached. |
85 | 84 |
# Deleting a detached volume is not implemented. |
86 |
if volume.index == 0: |
|
87 |
raise faults.BadRequest("Cannot detach the root volume of a server") |
|
88 |
|
|
89 | 85 |
if volume.machine_id is not None: |
90 |
volume.backendjobid = backend.detach_volume(volume.machine, volume)
|
|
86 |
servers.detach_volume(volume.machine, volume)
|
|
91 | 87 |
log.info("Detach volume '%s' from server '%s', job: %s", |
92 | 88 |
volume.id, volume.machine_id, volume.backendjobid) |
93 | 89 |
else: |
Also available in: Unified diff