nova/nova/api/openstack/compute/views/images.py

152 lines
5.3 KiB
Python

# vim: tabstop=4 shiftwidth=4 softtabstop=4
# Copyright 2010-2011 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import os.path
from nova.api.openstack import common
from nova.image import glance
class ViewBuilder(common.ViewBuilder):
_collection_name = "images"
def basic(self, request, image):
"""Return a dictionary with basic image attributes."""
return {
"image": {
"id": image.get("id"),
"name": image.get("name"),
"links": self._get_links(request,
image["id"],
self._collection_name),
},
}
def show(self, request, image):
"""Return a dictionary with image details."""
image_dict = {
"id": image.get("id"),
"name": image.get("name"),
"minRam": int(image.get("min_ram") or 0),
"minDisk": int(image.get("min_disk") or 0),
"metadata": image.get("properties", {}),
"created": self._format_date(image.get("created_at")),
"updated": self._format_date(image.get("updated_at")),
"status": self._get_status(image),
"progress": self._get_progress(image),
"links": self._get_links(request,
image["id"],
self._collection_name),
}
instance_uuid = image.get("properties", {}).get("instance_uuid")
if instance_uuid is not None:
server_ref = self._get_href_link(request, instance_uuid, 'servers')
image_dict["server"] = {
"id": instance_uuid,
"links": [{
"rel": "self",
"href": server_ref,
},
{
"rel": "bookmark",
"href": self._get_bookmark_link(request,
instance_uuid,
'servers'),
}],
}
return dict(image=image_dict)
def detail(self, request, images):
"""Show a list of images with details."""
list_func = self.show
return self._list_view(list_func, request, images)
def index(self, request, images):
"""Show a list of images with basic attributes."""
list_func = self.basic
return self._list_view(list_func, request, images)
def _list_view(self, list_func, request, images):
"""Provide a view for a list of images."""
image_list = [list_func(request, image)["image"] for image in images]
images_links = self._get_collection_links(request,
images,
self._collection_name)
images_dict = dict(images=image_list)
if images_links:
images_dict["images_links"] = images_links
return images_dict
def _get_links(self, request, identifier, collection_name):
"""Return a list of links for this image."""
return [{
"rel": "self",
"href": self._get_href_link(request, identifier, collection_name),
},
{
"rel": "bookmark",
"href": self._get_bookmark_link(request,
identifier,
collection_name),
},
{
"rel": "alternate",
"type": "application/vnd.openstack.image",
"href": self._get_alternate_link(request, identifier),
}]
def _get_alternate_link(self, request, identifier):
"""Create an alternate link for a specific image id."""
glance_url = glance.generate_glance_url()
glance_url = self._update_glance_link_prefix(glance_url)
return os.path.join(glance_url,
request.environ["nova.context"].project_id,
self._collection_name,
str(identifier))
@staticmethod
def _format_date(date_string):
"""Return standard format for given date."""
if date_string is not None:
return date_string.strftime('%Y-%m-%dT%H:%M:%SZ')
@staticmethod
def _get_status(image):
"""Update the status field to standardize format."""
return {
'active': 'ACTIVE',
'queued': 'SAVING',
'saving': 'SAVING',
'deleted': 'DELETED',
'pending_delete': 'DELETED',
'killed': 'ERROR',
}.get(image.get("status"), 'UNKNOWN')
@staticmethod
def _get_progress(image):
return {
"queued": 25,
"saving": 50,
"active": 100,
}.get(image.get("status"), 0)