39
40
GlanceClient = utils.import_class('glance.client.Client')
43
def pick_glance_api_server():
44
"""Return which Glance API server to use for the request
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.
52
host_port = random.choice(FLAGS.glance_api_servers)
53
host, port_str = host_port.split(':')
42
58
class GlanceImageService(service.BaseImageService):
43
59
"""Provides storage and retrieval of disk image objects within Glance."""
53
69
def __init__(self, client=None):
54
# FIXME(sirp): can we avoid dependency-injection here by using
55
# stubbing out a fake?
57
self.client = GlanceClient(FLAGS.glance_host, FLAGS.glance_port)
61
def index(self, context, filters=None):
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:
78
glance_host, glance_port = pick_glance_api_server()
79
return GlanceClient(glance_host, glance_port)
81
def _set_client(self, client):
84
client = property(_get_client, _set_client)
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
67
image_metas = self.client.get_images_detailed(filters=filters)
92
image_metas = self.client.get_images_detailed(filters=filters,
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)
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."""
77
image_metas = self.client.get_images_detailed(filters=filters)
104
image_metas = self.client.get_images_detailed(filters=filters,
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)