1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 """
17 Resource class and its manager for volumes on Block Storage V1 API
18 """
19
20 from yakumo import base
21 from yakumo.constant import UNDEF
22 from yakumo import mapper
23
24 from yakumo.cinder.v1.snapshot import Resource as Snapshot
25 from yakumo.cinder.v1.volume_type import Resource as VolumeType
26 from yakumo.nova.v2.image import Resource as NovaV2Image
27 from yakumo.glance.v1.image import Resource as GlanceV1Image
28 from yakumo.glance.v2.image import Resource as GlanceV2Image
29
30
31 ATTRIBUTE_MAPPING = [
32 ('id', 'id', mapper.Noop),
33 ('name', 'display_name', mapper.Noop),
34 ('description', 'display_description', mapper.Noop),
35 ('availability_zone', 'availability_zone', mapper.Noop),
36 ('size', 'size', mapper.Noop),
37 ('status', 'status', mapper.Noop),
38 ('attachments', 'attachments', mapper.Noop),
39 ('volume_type', 'volume_type',
40 mapper.Resource('cinder.volume_type')),
41 ('source_image', 'imageRef', mapper.Resource('image')),
42 ('source_snapshot', 'snapshot_id',
43 mapper.Resource('cinder.volume_snapshot')),
44 ('source_volume', 'source_volid',
45 mapper.Resource('cinder.volume')),
46 ('is_bootable', 'bootable', mapper.BoolStr),
47 ('is_encrypted', 'encrypted', mapper.Noop),
48 ('is_multiattach', 'multiattach', mapper.Noop),
49 ('project', 'os-vol-tenant-attr:tenant_id',
50 mapper.Resource('project')),
51 ('driver_data', 'os-volume-replication:driver_data', mapper.Noop),
52 ('extended_status', 'os-volume-replication:extended_status',
53 mapper.Noop),
54 ('host', 'os-vol-host-attr:hos', mapper.Noop),
55 ('metadata', 'metadata', mapper.Noop),
56 ('created_at', 'created_at', mapper.DateTime),
57 ]
58
59
61 """resource class for volumes on Block Storage V1 API"""
62
63 _stable_state = ['available', 'in-use', 'error', 'error_deleting']
64
74
86
99
100
102 """manager class for roles on Block Storage V1 API"""
103
104 resource_class = Resource
105 service_type = 'volume'
106 _attr_mapping = ATTRIBUTE_MAPPING
107 _json_resource_key = 'volume'
108 _json_resources_key = 'volumes'
109 _hidden_methods = ["update"]
110 _url_resource_list_path = '/volumes/detail'
111 _url_resource_path = '/volumes'
112
118
129
133 """
134 Create a volume
135
136 @keyword name: Volume name
137 @type name: str
138 @keyword description: Description
139 @type description: str
140 @keyword size: Size in GB
141 @type size: int
142 @keyword project: Project
143 @type project: yakumo.project.Resource
144 @keyword availability_zone: Availability zone
145 @type availability_zone: yakumo.availability_zone.Resource
146 @keyword source: Source image/snapshot/volume (optional)
147 @type source: one of yakumo.image.Resource,
148 yakumo.volume_snapshot.Resource and yakumo.volume.Resource
149 @keyword volume_type: Volume type
150 @type volume_type: yakumo.cinder.v1.volume_type.Resource
151 @keyword metadata: Metadata (key=value)
152 @type metadata: dict
153 @return: Created volume
154 @type: yakumo.cinder.v1.volume.Resource
155 """
156
157 source_image = None
158 source_volume = None
159 source_snapshot = None
160 if isinstance(source, Resource):
161 source_volume = source
162 elif isinstance(source, Snapshot):
163 source_snapshot = source
164 elif isinstance(source, (GlanceV1Image, GlanceV2Image, NovaV2Image)):
165 source_image = source
166 return super(Manager, self).create(project=project,
167 availability_zone=availability_zone,
168 size=size, name=name,
169 description=description,
170 source_volume=source_volume,
171 source_snapshot=source_snapshot,
172 source_image=source_image,
173 volume_type=volume_type,
174 metadata=metadata)
175