1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 """
17 Resource class and its manager for images in Image V1 API
18 """
19
20 from yakumo import base
21 from yakumo.constant import UNDEF
22 from yakumo import mapper
23 from yakumo import utils
24
25
26 ATTRIBUTE_MAPPING = [
27 ('id', 'id', mapper.Noop),
28 ('name', 'name', mapper.Noop),
29 ('disk_format', 'disk_format', mapper.Noop),
30 ('container_format', 'container_format', mapper.Noop),
31 ('size', 'size', mapper.Noop),
32 ('virtual_size', 'virtual_size', mapper.Noop),
33 ('checksum', 'checksum', mapper.Noop),
34 ('min_ram', 'min_ram', mapper.Noop),
35 ('min_disk', 'min_disk', mapper.Noop),
36 ('owner', 'owner', mapper.Noop),
37 ('properties', 'properties', mapper.Noop),
38 ('is_public', 'is_public', mapper.Noop),
39 ('status', 'status', mapper.Noop),
40 ('created_at', 'created_at', mapper.DateTime),
41 ('updated_at', 'updated_at', mapper.DateTime),
42 ('deleted_at', 'deleted_at', mapper.DateTime),
43 ('is_deleted', 'deleted', mapper.Noop),
44 ]
45
46
48 """resource class for images on Image V1 API"""
49
50 _stable_state = ['active', 'killed', 'deleted', 'deactivated']
51
52 - def update(self, name=UNDEF, uri=UNDEF, disk_format=UNDEF,
53 container_format=UNDEF, size=UNDEF, virtual_size=UNDEF,
54 checksum=UNDEF, min_ram=UNDEF, min_disk=UNDEF, owner=UNDEF,
55 properties=UNDEF, is_public=UNDEF, file=None):
56 """
57 Update properties of an image
58
59 @keyword name: Image name
60 @type name: str
61 @keyword uri: URI to the Image
62 @type uri: str
63 @keyword disk_format: Disk format
64 @type disk_format: str
65 @keyword container_format: Container format
66 @type container_format: str
67 @keyword size: Actual file size
68 @type size: int
69 @keyword virtual_size: Virtual disk size
70 @type virtual_size: int
71 @keyword checksum: Checksum
72 @type checksum: str
73 @keyword min_ram: Minimum RAM size of the VM with the image
74 @type min_ram: int
75 @keyword owner: Owner of the image
76 @type owner: str
77 @keyword properties: Properties
78 @type properties: dict
79 @keyword is_public: Whether this is public or not
80 @type is_public: bool
81 @keyword file: File to upload
82 @type file: str
83 @rtype: None
84 """
85
86 attrs = dict(name=name, uri=uri, disk_format=disk_format,
87 container_format=container_format, size=size,
88 virtual_size=virtual_size, checksum=checksum,
89 min_ram=min_ram, min_disk=min_disk, owner=owner,
90 properties=properties, is_public=is_public)
91 json_params = self._attr2json(attrs)
92 headers = {}
93 for key, value in json_params.items():
94 headers['x-image-meta-%s' % key] = value
95
96 if file:
97 headers['x-image-meta-size'] = os.path.getsize(file)
98 self._http.put_raw(self._url_resource_path, self._id,
99 headers=headers,
100 data=gen_chunk(file))
101 elif uri:
102 headers['x-image-meta-uri'] = uri
103 self._http.put_raw(self._url_resource_path, self._id,
104 headers=headers)
105 else:
106 self._http.put_raw(self._url_resource_path, self._id,
107 headers=headers)
108 self.reload()
109
111 """
112 Download an image into a local file
113
114 @keyword file: File name to save (required)
115 @type file: str
116 @rtype: None
117 """
118 try:
119 self._http.get_file(self._url_resource_path, self._id, file=file)
120 except:
121 pass
122
123
125 """manager class for images on Image V1 API"""
126
127 resource_class = Resource
128 service_type = 'image'
129 _attr_mapping = ATTRIBUTE_MAPPING
130 _json_resource_key = 'image'
131 _json_resources_key = 'images'
132 _url_resource_list_path = '/v1/images/detail'
133 _url_resource_path = '/v1/images'
134
135 - def create(self, name=UNDEF, uri=UNDEF, disk_format=UNDEF,
136 container_format=UNDEF, size=UNDEF, virtual_size=UNDEF,
137 checksum=UNDEF, min_ram=UNDEF, min_disk=UNDEF, owner=UNDEF,
138 properties=UNDEF, is_public=UNDEF, file=None):
139 """
140 Register an image
141
142 @keyword name: Image name
143 @type name: str
144 @keyword uri: URL to an image
145 @type uri: str
146 @keyword disk_format: Disk format (raw, qcow2, vmdk, ...)
147 @type disk_format: str
148 @keyword container_format: Container format (bare, vmdk, ...)
149 @type container_format: str
150 @keyword size: Image file size in GB
151 @type size: int
152 @keyword virtual_size: Virtual disk size in GB
153 @type virtual_size: int
154 @keyword checksum: Image checksum
155 @type checksum: str
156 @keyword min_ram: Minimum RAM size required for VMs in MB
157 @type min_ram: int
158 @keyword min_disk: Minimum disk size required for VMs in GB
159 @type min_disk: int
160 @keyword owner: Image owner
161 @type owner: str
162 @keyword properties: Image properties
163 @type properties: dict
164 @keyword is_public: Whether the image is public or not
165 @type is_public: bool
166 @keyword file: Filename to upload
167 @type file: str
168 @return: Created image
169 @rtype: yakumo.glance.v1.image.Resource
170 """
171 attrs = dict(name=name, uri=uri, disk_format=disk_format,
172 container_format=container_format, size=size,
173 virtual_size=virtual_size, checksum=checksum,
174 min_ram=min_ram, min_disk=min_disk, owner=owner,
175 properties=properties, is_public=is_public)
176 json_params = self._attr2json(attrs)
177 headers = {}
178 for key, value in json_params.items():
179 headers['x-image-meta-%s' % key] = value
180
181 if file:
182 headers['x-image-meta-size'] = os.path.getsize(file)
183 ret = self._http.post_raw(self._url_resource_path, headers=headers,
184 data=utils.gen_chunk(file))
185 elif uri:
186 headers['x-image-meta-uri'] = uri
187 ret = self._http.post_raw(self._url_resource_path, headers=headers)
188 else:
189 ret = self._http.post_raw(self._url_resource_path, headers=headers)
190
191 return self.get_empty(
192 ret[self._json_resource_key][self._id_attr])
193
195 """
196 Get an image
197
198 @param id: Image UUID
199 @type id: str
200 @return: Image
201 @rtype: yakumo.glance.v1.image.Resource
202 """
203 try:
204 ret = self._http.head(self._url_resource_path, id)
205 json_params = {}
206 for json_param in self._to_attr_mapping.keys():
207 h = 'x-image-meta-%s' % json_param
208 if h in ret:
209 json_params[json_param] = ret[h]
210 attrs = self._json2attr(json_params)
211 return self.resource_class(self, **attrs)
212 except:
213 raise
214 return None
215