~ubuntu-cloud-archive/ubuntu/precise/nova/trunk

« back to all changes in this revision

Viewing changes to nova/image/glance.py

  • Committer: Bazaar Package Importer
  • Author(s): Chuck Short
  • Date: 2011-06-17 13:29:16 UTC
  • mto: (94.1.1 raring-proposed)
  • mto: This revision was merged to the branch mainline in revision 27.
  • Revision ID: james.westby@ubuntu.com-20110617132916-u3vv6rxmtvnfn4cj
Tags: upstream-2011.3~d2~20110617.1191
ImportĀ upstreamĀ versionĀ 2011.3~d2~20110617.1191

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
from __future__ import absolute_import
21
21
 
22
22
import datetime
 
23
import random
23
24
 
24
25
from glance.common import exception as glance_exception
25
26
 
39
40
GlanceClient = utils.import_class('glance.client.Client')
40
41
 
41
42
 
 
43
def pick_glance_api_server():
 
44
    """Return which Glance API server to use for the request
 
45
 
 
46
    This method provides a very primitive form of load-balancing suitable for
 
47
    testing and sandbox environments. In production, it would be better to use
 
48
    one IP and route that to a real load-balancer.
 
49
 
 
50
        Returns (host, port)
 
51
    """
 
52
    host_port = random.choice(FLAGS.glance_api_servers)
 
53
    host, port_str = host_port.split(':')
 
54
    port = int(port_str)
 
55
    return host, port
 
56
 
 
57
 
42
58
class GlanceImageService(service.BaseImageService):
43
59
    """Provides storage and retrieval of disk image objects within Glance."""
44
60
 
51
67
                          GLANCE_ONLY_ATTRS
52
68
 
53
69
    def __init__(self, client=None):
54
 
        # FIXME(sirp): can we avoid dependency-injection here by using
55
 
        # stubbing out a fake?
56
 
        if client is None:
57
 
            self.client = GlanceClient(FLAGS.glance_host, FLAGS.glance_port)
58
 
        else:
59
 
            self.client = client
60
 
 
61
 
    def index(self, context, filters=None):
 
70
        self._client = client
 
71
 
 
72
    def _get_client(self):
 
73
        # NOTE(sirp): we want to load balance each request across glance
 
74
        # servers. Since GlanceImageService is a long-lived object, `client`
 
75
        # is made to choose a new server each time via this property.
 
76
        if self._client is not None:
 
77
            return self._client
 
78
        glance_host, glance_port = pick_glance_api_server()
 
79
        return GlanceClient(glance_host, glance_port)
 
80
 
 
81
    def _set_client(self, client):
 
82
        self._client = client
 
83
 
 
84
    client = property(_get_client, _set_client)
 
85
 
 
86
    def index(self, context, filters=None, marker=None, limit=None):
62
87
        """Calls out to Glance for a list of images available."""
63
88
        # NOTE(sirp): We need to use `get_images_detailed` and not
64
89
        # `get_images` here because we need `is_public` and `properties`
65
90
        # included so we can filter by user
66
91
        filtered = []
67
 
        image_metas = self.client.get_images_detailed(filters=filters)
 
92
        image_metas = self.client.get_images_detailed(filters=filters,
 
93
                                                      marker=marker,
 
94
                                                      limit=limit)
68
95
        for image_meta in image_metas:
69
96
            if self._is_image_available(context, image_meta):
70
97
                meta_subset = utils.subset_dict(image_meta, ('id', 'name'))
71
98
                filtered.append(meta_subset)
72
99
        return filtered
73
100
 
74
 
    def detail(self, context, filters=None):
 
101
    def detail(self, context, filters=None, marker=None, limit=None):
75
102
        """Calls out to Glance for a list of detailed image information."""
76
103
        filtered = []
77
 
        image_metas = self.client.get_images_detailed(filters=filters)
 
104
        image_metas = self.client.get_images_detailed(filters=filters,
 
105
                                                      marker=marker,
 
106
                                                      limit=limit)
78
107
        for image_meta in image_metas:
79
108
            if self._is_image_available(context, image_meta):
80
109
                base_image_meta = self._translate_to_base(image_meta)