root / snf-cyclades-app / synnefo / volume / volumes.py @ dec501fa
History | View | Annotate | Download (3.1 kB)
1 | dec501fa | Christos Stavrakakis | import logging |
---|---|---|---|
2 | dec501fa | Christos Stavrakakis | |
3 | dec501fa | Christos Stavrakakis | from django.db import transaction |
4 | dec501fa | Christos Stavrakakis | from synnefo.db.models import Volume |
5 | dec501fa | Christos Stavrakakis | from snf_django.lib.api import faults |
6 | dec501fa | Christos Stavrakakis | from synnefo.volume import util |
7 | dec501fa | Christos Stavrakakis | from synnefo.logic import backend |
8 | dec501fa | Christos Stavrakakis | |
9 | dec501fa | Christos Stavrakakis | log = logging.getLogger(__name__) |
10 | dec501fa | Christos Stavrakakis | |
11 | dec501fa | Christos Stavrakakis | |
12 | dec501fa | Christos Stavrakakis | @transaction.commit_on_success
|
13 | dec501fa | Christos Stavrakakis | def create(user_id, size, server_id, name=None, description=None, |
14 | dec501fa | Christos Stavrakakis | source_volume_id=None, source_snapshot_id=None, |
15 | dec501fa | Christos Stavrakakis | source_image_id=None, metadata=None): |
16 | dec501fa | Christos Stavrakakis | |
17 | dec501fa | Christos Stavrakakis | if server_id is None: |
18 | dec501fa | Christos Stavrakakis | raise faults.BadRequest("Volume must be attached to server") |
19 | dec501fa | Christos Stavrakakis | server = util.get_server(user_id, server_id, for_update=True,
|
20 | dec501fa | Christos Stavrakakis | exception=faults.BadRequest) |
21 | dec501fa | Christos Stavrakakis | |
22 | dec501fa | Christos Stavrakakis | # Assert that not more than one source are used
|
23 | dec501fa | Christos Stavrakakis | sources = filter(lambda x: x is not None, |
24 | dec501fa | Christos Stavrakakis | [source_volume_id, source_snapshot_id, source_image_id]) |
25 | dec501fa | Christos Stavrakakis | if len(sources) > 1: |
26 | dec501fa | Christos Stavrakakis | raise faults.BadRequest("Volume can not have more than one source!") |
27 | dec501fa | Christos Stavrakakis | |
28 | dec501fa | Christos Stavrakakis | source_volume = None
|
29 | dec501fa | Christos Stavrakakis | if source_volume_id is not None: |
30 | dec501fa | Christos Stavrakakis | source_volume = util.get_volume(user_id, source_volume_id, |
31 | dec501fa | Christos Stavrakakis | for_update=True,
|
32 | dec501fa | Christos Stavrakakis | exception=faults.BadRequest) |
33 | dec501fa | Christos Stavrakakis | source_snapshot = None
|
34 | dec501fa | Christos Stavrakakis | if source_snapshot_id is not None: |
35 | dec501fa | Christos Stavrakakis | source_snapshot = util.get_snapshot(user_id, source_snapshot_id, |
36 | dec501fa | Christos Stavrakakis | exception=faults.BadRequest) |
37 | dec501fa | Christos Stavrakakis | source_image = None
|
38 | dec501fa | Christos Stavrakakis | if source_image_id is not None: |
39 | dec501fa | Christos Stavrakakis | source_image = util.get_image(user_id, source_image_id, |
40 | dec501fa | Christos Stavrakakis | exception=faults.BadRequest) |
41 | dec501fa | Christos Stavrakakis | |
42 | dec501fa | Christos Stavrakakis | volume = Volume.objects.create(userid=user_id, |
43 | dec501fa | Christos Stavrakakis | size=size, |
44 | dec501fa | Christos Stavrakakis | name=name, |
45 | dec501fa | Christos Stavrakakis | machine=server, |
46 | dec501fa | Christos Stavrakakis | description=description, |
47 | dec501fa | Christos Stavrakakis | source_volume=source_volume, |
48 | dec501fa | Christos Stavrakakis | source_image_id=source_image_id, |
49 | dec501fa | Christos Stavrakakis | source_snapshot_id=source_snapshot_id, |
50 | dec501fa | Christos Stavrakakis | #volume_type=volume_type,
|
51 | dec501fa | Christos Stavrakakis | status="CREATING")
|
52 | dec501fa | Christos Stavrakakis | |
53 | dec501fa | Christos Stavrakakis | if metadata is not None: |
54 | dec501fa | Christos Stavrakakis | for meta_key, meta_val in metadata.items(): |
55 | dec501fa | Christos Stavrakakis | volume.metadata.create(key=meta_key, value=meta_val) |
56 | dec501fa | Christos Stavrakakis | |
57 | dec501fa | Christos Stavrakakis | # Annote volume with snapshot/image information
|
58 | dec501fa | Christos Stavrakakis | volume.source_snapshot = source_snapshot |
59 | dec501fa | Christos Stavrakakis | volume.source_image = source_image |
60 | dec501fa | Christos Stavrakakis | |
61 | dec501fa | Christos Stavrakakis | # Create the disk in the backend
|
62 | dec501fa | Christos Stavrakakis | volume.backendjobid = backend.attach_volume(server, volume) |
63 | dec501fa | Christos Stavrakakis | volume.save() |
64 | dec501fa | Christos Stavrakakis | |
65 | dec501fa | Christos Stavrakakis | return volume
|
66 | dec501fa | Christos Stavrakakis | |
67 | dec501fa | Christos Stavrakakis | |
68 | dec501fa | Christos Stavrakakis | @transaction.commit_on_success
|
69 | dec501fa | Christos Stavrakakis | def delete(volume): |
70 | dec501fa | Christos Stavrakakis | if volume.machine_id is not None: |
71 | dec501fa | Christos Stavrakakis | raise faults.BadRequest("Volume %s is still in use by server %s" |
72 | dec501fa | Christos Stavrakakis | % (volume.id, volume.machine_id)) |
73 | dec501fa | Christos Stavrakakis | volume.deleted = True
|
74 | dec501fa | Christos Stavrakakis | volume.save() |
75 | dec501fa | Christos Stavrakakis | |
76 | dec501fa | Christos Stavrakakis | log.info("Deleted volume %s", volume)
|
77 | dec501fa | Christos Stavrakakis | |
78 | dec501fa | Christos Stavrakakis | return volume
|
79 | dec501fa | Christos Stavrakakis | |
80 | dec501fa | Christos Stavrakakis | |
81 | dec501fa | Christos Stavrakakis | @transaction.commit_on_success
|
82 | dec501fa | Christos Stavrakakis | def rename(volume, new_name): |
83 | dec501fa | Christos Stavrakakis | volume.name = new_name |
84 | dec501fa | Christos Stavrakakis | volume.save() |
85 | dec501fa | Christos Stavrakakis | return volume
|
86 | dec501fa | Christos Stavrakakis | |
87 | dec501fa | Christos Stavrakakis | |
88 | dec501fa | Christos Stavrakakis | @transaction.commit_on_success
|
89 | dec501fa | Christos Stavrakakis | def update_description(volume, new_description): |
90 | dec501fa | Christos Stavrakakis | volume.description = new_description |
91 | dec501fa | Christos Stavrakakis | volume.save() |
92 | dec501fa | Christos Stavrakakis | return volume |