summaryrefslogtreecommitdiffstats
path: root/nova/tests
diff options
context:
space:
mode:
Diffstat (limited to 'nova/tests')
-rw-r--r--nova/tests/api/openstack/fakes.py6
-rw-r--r--nova/tests/image/test_glance.py196
-rw-r--r--nova/tests/test_xenapi.py6
3 files changed, 189 insertions, 19 deletions
diff --git a/nova/tests/api/openstack/fakes.py b/nova/tests/api/openstack/fakes.py
index 20e675a8c..43ca2aec9 100644
--- a/nova/tests/api/openstack/fakes.py
+++ b/nova/tests/api/openstack/fakes.py
@@ -262,7 +262,11 @@ def stub_out_glance_add_image(stubs, sent_to_glance):
def stub_out_glance(stubs):
def fake_get_remote_image_service():
client = glance_stubs.StubGlanceClient(_make_image_fixtures())
- return nova.image.glance.GlanceImageService(client)
+ client_wrapper = nova.image.glance.GlanceClientWrapper()
+ client_wrapper.host = 'fake_host'
+ client_wrapper.port = 9292
+ client_wrapper.client = client
+ return nova.image.glance.GlanceImageService(client=client_wrapper)
stubs.Set(nova.image.glance,
'get_default_image_service',
fake_get_remote_image_service)
diff --git a/nova/tests/image/test_glance.py b/nova/tests/image/test_glance.py
index d6c9f8606..4616f0949 100644
--- a/nova/tests/image/test_glance.py
+++ b/nova/tests/image/test_glance.py
@@ -17,6 +17,8 @@
import datetime
+import random
+import time
import glance.common.exception as glance_exception
@@ -91,11 +93,23 @@ class TestGlanceImageService(test.TestCase):
def setUp(self):
super(TestGlanceImageService, self).setUp()
fakes.stub_out_compute_api_snapshot(self.stubs)
+
client = glance_stubs.StubGlanceClient()
- self.service = glance.GlanceImageService(client=client)
+ self.service = self._create_image_service(client)
self.context = context.RequestContext('fake', 'fake', auth_token=True)
self.service.delete_all()
+ def _create_image_service(self, client):
+ def _fake_create_glance_client(context, host, port):
+ return client
+
+ self.stubs.Set(glance, '_create_glance_client',
+ _fake_create_glance_client)
+
+ client_wrapper = glance.GlanceClientWrapper(
+ 'fake', 'fake_host', 9292)
+ return glance.GlanceImageService(client=client_wrapper)
+
@staticmethod
def _make_fixture(**kwargs):
fixture = {'name': None,
@@ -430,29 +444,27 @@ class TestGlanceImageService(test.TestCase):
def test_download_with_retries(self):
tries = [0]
- class GlanceBusyException(Exception):
- pass
-
class MyGlanceStubClient(glance_stubs.StubGlanceClient):
"""A client that fails the first time, then succeeds."""
def get_image(self, image_id):
if tries[0] == 0:
tries[0] = 1
- raise GlanceBusyException()
+ raise glance_exception.ClientConnectionError()
else:
return {}, []
client = MyGlanceStubClient()
- service = glance.GlanceImageService(client=client)
+ service = self._create_image_service(client)
image_id = 1 # doesn't matter
writer = NullWriter()
# When retries are disabled, we should get an exception
self.flags(glance_num_retries=0)
- self.assertRaises(GlanceBusyException, service.download, self.context,
- image_id, writer)
+ self.assertRaises(exception.GlanceConnectionFailed,
+ service.download, self.context, image_id, writer)
# Now lets enable retries. No exception should happen now.
+ tries = [0]
self.flags(glance_num_retries=1)
service.download(self.context, image_id, writer)
@@ -463,7 +475,7 @@ class TestGlanceImageService(test.TestCase):
raise glance_exception.Forbidden()
client = MyGlanceStubClient()
- service = glance.GlanceImageService(client=client)
+ service = self._create_image_service(client)
image_id = 1 # doesn't matter
writer = NullWriter()
self.assertRaises(exception.ImageNotAuthorized, service.download,
@@ -472,13 +484,173 @@ class TestGlanceImageService(test.TestCase):
def test_glance_client_image_id(self):
fixture = self._make_fixture(name='test image')
image_id = self.service.create(self.context, fixture)['id']
- client, same_id = glance._get_glance_client(self.context, image_id)
+ (service, same_id) = glance.get_remote_image_service(
+ self.context, image_id)
self.assertEquals(same_id, image_id)
def test_glance_client_image_ref(self):
fixture = self._make_fixture(name='test image')
image_id = self.service.create(self.context, fixture)['id']
image_url = 'http://something-less-likely/%s' % image_id
- client, same_id = glance._get_glance_client(self.context, image_url)
+ (service, same_id) = glance.get_remote_image_service(
+ self.context, image_url)
self.assertEquals(same_id, image_id)
- self.assertEquals(client.host, 'something-less-likely')
+ self.assertEquals(service._client.host,
+ 'something-less-likely')
+
+
+def _create_failing_glance_client(info):
+ class MyGlanceStubClient(glance_stubs.StubGlanceClient):
+ """A client that fails the first time, then succeeds."""
+ def get_image(self, image_id):
+ info['num_calls'] += 1
+ if info['num_calls'] == 1:
+ raise glance_exception.ClientConnectionError()
+ return {}, []
+
+ return MyGlanceStubClient()
+
+
+class TestGlanceClientWrapper(test.TestCase):
+
+ def setUp(self):
+ super(TestGlanceClientWrapper, self).setUp()
+ self.flags(glance_api_servers=['host1:9292', 'host2:9293',
+ 'host3:9294'])
+
+ # Make the test run fast
+ def _fake_sleep(secs):
+ pass
+ self.stubs.Set(time, 'sleep', _fake_sleep)
+
+ def test_static_client_without_retries(self):
+ self.flags(glance_num_retries=0)
+
+ ctxt = context.RequestContext('fake', 'fake')
+ fake_host = 'host4'
+ fake_port = 9295
+
+ info = {'num_calls': 0}
+
+ def _fake_create_glance_client(context, host, port):
+ self.assertEqual(host, fake_host)
+ self.assertEqual(port, fake_port)
+ return _create_failing_glance_client(info)
+
+ self.stubs.Set(glance, '_create_glance_client',
+ _fake_create_glance_client)
+
+ client = glance.GlanceClientWrapper(context=ctxt,
+ host=fake_host, port=fake_port)
+ self.assertRaises(exception.GlanceConnectionFailed,
+ client.call, ctxt, 'get_image', 'meow')
+ self.assertEqual(info['num_calls'], 1)
+
+ def test_default_client_without_retries(self):
+ self.flags(glance_num_retries=0)
+
+ ctxt = context.RequestContext('fake', 'fake')
+
+ info = {'num_calls': 0,
+ 'host': 'host1',
+ 'port': 9292}
+
+ # Leave the list in a known-order
+ def _fake_shuffle(servers):
+ pass
+
+ def _fake_create_glance_client(context, host, port):
+ self.assertEqual(host, info['host'])
+ self.assertEqual(port, info['port'])
+ return _create_failing_glance_client(info)
+
+ self.stubs.Set(random, 'shuffle', _fake_shuffle)
+ self.stubs.Set(glance, '_create_glance_client',
+ _fake_create_glance_client)
+
+ client = glance.GlanceClientWrapper()
+ client2 = glance.GlanceClientWrapper()
+ self.assertRaises(exception.GlanceConnectionFailed,
+ client.call, ctxt, 'get_image', 'meow')
+ self.assertEqual(info['num_calls'], 1)
+
+ info = {'num_calls': 0,
+ 'host': 'host2',
+ 'port': 9293}
+
+ def _fake_shuffle2(servers):
+ # fake shuffle in a known manner
+ servers.append(servers.pop(0))
+
+ self.stubs.Set(random, 'shuffle', _fake_shuffle2)
+
+ self.assertRaises(exception.GlanceConnectionFailed,
+ client2.call, ctxt, 'get_image', 'meow')
+ self.assertEqual(info['num_calls'], 1)
+
+ def test_static_client_with_retries(self):
+ self.flags(glance_num_retries=1)
+
+ ctxt = context.RequestContext('fake', 'fake')
+ fake_host = 'host4'
+ fake_port = 9295
+
+ info = {'num_calls': 0}
+
+ def _fake_create_glance_client(context, host, port):
+ self.assertEqual(host, fake_host)
+ self.assertEqual(port, fake_port)
+ return _create_failing_glance_client(info)
+
+ self.stubs.Set(glance, '_create_glance_client',
+ _fake_create_glance_client)
+
+ client = glance.GlanceClientWrapper(context=ctxt,
+ host=fake_host, port=fake_port)
+ client.call(ctxt, 'get_image', 'meow')
+ self.assertEqual(info['num_calls'], 2)
+
+ def test_default_client_with_retries(self):
+ self.flags(glance_num_retries=1)
+
+ ctxt = context.RequestContext('fake', 'fake')
+
+ info = {'num_calls': 0,
+ 'host0': 'host1',
+ 'port0': 9292,
+ 'host1': 'host2',
+ 'port1': 9293}
+
+ # Leave the list in a known-order
+ def _fake_shuffle(servers):
+ pass
+
+ def _fake_create_glance_client(context, host, port):
+ attempt = info['num_calls']
+ self.assertEqual(host, info['host%s' % attempt])
+ self.assertEqual(port, info['port%s' % attempt])
+ return _create_failing_glance_client(info)
+
+ self.stubs.Set(random, 'shuffle', _fake_shuffle)
+ self.stubs.Set(glance, '_create_glance_client',
+ _fake_create_glance_client)
+
+ client = glance.GlanceClientWrapper()
+ client2 = glance.GlanceClientWrapper()
+ client.call(ctxt, 'get_image', 'meow')
+ self.assertEqual(info['num_calls'], 2)
+
+ def _fake_shuffle2(servers):
+ # fake shuffle in a known manner
+ servers.append(servers.pop(0))
+
+ self.stubs.Set(random, 'shuffle', _fake_shuffle2)
+
+ info = {'num_calls': 0,
+ 'host0': 'host2',
+ 'port0': 9293,
+ 'host1': 'host3',
+ 'port1': 9294}
+
+ client2.call(ctxt, 'get_image', 'meow')
+ self.assertEqual(info['num_calls'], 2)
diff --git a/nova/tests/test_xenapi.py b/nova/tests/test_xenapi.py
index df35d54ba..069a98c14 100644
--- a/nova/tests/test_xenapi.py
+++ b/nova/tests/test_xenapi.py
@@ -20,7 +20,6 @@ import ast
import contextlib
import cPickle as pickle
import functools
-import mox
import os
import re
@@ -31,7 +30,6 @@ from nova import context
from nova import db
from nova import exception
from nova import flags
-from nova.image import glance
from nova.openstack.common import importutils
from nova.openstack.common import jsonutils
from nova.openstack.common import log as logging
@@ -2053,8 +2051,6 @@ class VmUtilsTestCase(test.TestCase):
def test_upload_image(self):
"""Ensure image properties include instance system metadata
as well as few local settings."""
- def fake_pick_glance_api_server():
- return ("host", 80)
def fake_instance_system_metadata_get(context, uuid):
return dict(image_a=1, image_b=2, image_c='c', d='d')
@@ -2076,8 +2072,6 @@ class VmUtilsTestCase(test.TestCase):
def fake_dumps(thing):
return thing
- self.stubs.Set(glance, "pick_glance_api_server",
- fake_pick_glance_api_server)
self.stubs.Set(db, "instance_system_metadata_get",
fake_instance_system_metadata_get)
self.stubs.Set(vm_utils, "get_sr_path", fake_get_sr_path)