Make troveclient optional

Fixes bug 1221906

Change-Id: I3d022fca2f6bc1f0f5143373259882f2522f7958
This commit is contained in:
Matthias Runge 2013-09-13 12:05:31 +02:00
parent 0e73640530
commit c9022fa065
8 changed files with 96 additions and 43 deletions

View File

@ -16,8 +16,12 @@
from django.conf import settings # noqa
from troveclient import auth
from troveclient import client
try:
from troveclient import auth
from troveclient import client
with_trove = True
except ImportError:
with_trove = False
class TokenAuth(object):
@ -39,12 +43,16 @@ class TokenAuth(object):
}
}
}
if not with_trove:
return None
return auth.ServiceCatalog(catalog,
service_type=self.service_type,
service_name=self.service_name)
def troveclient(request):
if not with_trove:
return None
return client.Dbaas(username=request.user,
api_key=None,
auth_strategy=TokenAuth)

View File

@ -27,6 +27,10 @@ DETAILS_URL = reverse('horizon:project:database_backups:detail', args=['id'])
class DatabasesBackupsTests(test.TestCase):
def setUp(self):
if not api.trove.with_trove:
self.skipTest('Skip trove related tests.')
super(DatabasesBackupsTests, self).setUp()
@test.create_stubs({api.trove: ('backup_list', )})
def test_index(self):
@ -61,7 +65,8 @@ class DatabasesBackupsTests(test.TestCase):
self.mox.ReplayAll()
res = self.client.get(BACKUP_URL)
self.assertTemplateUsed(res, 'project/database_backups/backup.html')
self.assertTemplateUsed(res,
'project/database_backups/backup.html')
@test.create_stubs({api.trove: ('instance_list',)})
def test_launch_backup_exception(self):
@ -72,7 +77,8 @@ class DatabasesBackupsTests(test.TestCase):
res = self.client.get(BACKUP_URL)
self.assertMessageCount(res, error=1)
self.assertTemplateUsed(res, 'project/database_backups/backup.html')
self.assertTemplateUsed(res,
'project/database_backups/backup.html')
@test.create_stubs({api.trove: ('backup_get',)})
def test_detail_backup(self):
@ -83,7 +89,8 @@ class DatabasesBackupsTests(test.TestCase):
self.mox.ReplayAll()
res = self.client.get(DETAILS_URL)
self.assertTemplateUsed(res, 'project/database_backups/details.html')
self.assertTemplateUsed(res,
'project/database_backups/details.html')
@test.create_stubs({api.trove: ('backup_get',)})
def test_detail_backup_notfound(self):

View File

@ -22,8 +22,9 @@ from mox import IsA # noqa
from openstack_dashboard import api
from openstack_dashboard.test import helpers as test
from troveclient import common
if api.trove.with_trove:
from troveclient import common
INDEX_URL = reverse('horizon:project:databases:index')
LAUNCH_URL = reverse('horizon:project:databases:launch')
@ -31,6 +32,10 @@ DETAILS_URL = reverse('horizon:project:databases:detail', args=['id'])
class DatabaseTests(test.TestCase):
def setUp(self):
if not api.trove.with_trove:
self.skipTest('Skip trove related tests.')
super(DatabaseTests, self).setUp()
@test.create_stubs(
{api.trove: ('instance_list', 'flavor_list')})
@ -79,7 +84,8 @@ class DatabaseTests(test.TestCase):
{api.trove: ('instance_list', 'flavor_list')})
def test_index_pagination(self):
# Mock database instances
databases = common.Paginated(self.databases.list(), next_marker="foo")
databases = common.Paginated(self.databases.list(),
next_marker="foo")
api.trove.instance_list(IsA(http.HttpRequest), marker=None)\
.AndReturn(databases)
# Mock flavors

View File

@ -25,7 +25,11 @@ from keystoneclient import exceptions as keystoneclient
from neutronclient.common import exceptions as neutronclient
from novaclient import exceptions as novaclient
from swiftclient import client as swiftclient
from troveclient import exceptions as troveclient
try:
from troveclient import exceptions as troveclient
with_trove = True
except ImportError:
with_trove = False
UNAUTHORIZED = (keystoneclient.Unauthorized,
@ -38,8 +42,7 @@ UNAUTHORIZED = (keystoneclient.Unauthorized,
neutronclient.Unauthorized,
neutronclient.Forbidden,
heatclient.HTTPUnauthorized,
heatclient.HTTPForbidden,
troveclient.Unauthorized)
heatclient.HTTPForbidden,)
NOT_FOUND = (keystoneclient.NotFound,
cinderclient.NotFound,
@ -47,8 +50,7 @@ NOT_FOUND = (keystoneclient.NotFound,
glanceclient.NotFound,
neutronclient.NetworkNotFoundClient,
neutronclient.PortNotFoundClient,
heatclient.HTTPNotFound,
troveclient.NotFound)
heatclient.HTTPNotFound,)
# NOTE(gabriel): This is very broad, and may need to be dialed in.
RECOVERABLE = (keystoneclient.ClientException,
@ -66,5 +68,9 @@ RECOVERABLE = (keystoneclient.ClientException,
neutronclient.AlreadyAttachedClient,
neutronclient.StateInvalidClient,
swiftclient.ClientException,
heatclient.HTTPException,
troveclient.ClientException)
heatclient.HTTPException,)
if with_trove:
UNAUTHORIZED += (troveclient.Unauthorized,)
NOT_FOUND += (troveclient.NotFound,)
RECOVERABLE += (troveclient.ClientException,)

View File

@ -38,7 +38,11 @@ from keystoneclient.v2_0 import client as keystone_client
from neutronclient.v2_0 import client as neutron_client
from novaclient.v1_1 import client as nova_client
from swiftclient import client as swift_client
from troveclient import client as trove_client
try:
from troveclient import client as trove_client
with_trove = True
except ImportError:
with_trove = False
import httplib2
import mox
@ -265,7 +269,8 @@ class APITestCase(TestCase):
self._original_cinderclient = api.cinder.cinderclient
self._original_heatclient = api.heat.heatclient
self._original_ceilometerclient = api.ceilometer.ceilometerclient
self._original_troveclient = api.trove.troveclient
if with_trove:
self._original_troveclient = api.trove.troveclient
# Replace the clients with our stubs.
api.glance.glanceclient = lambda request: self.stub_glanceclient()
@ -276,7 +281,8 @@ class APITestCase(TestCase):
api.heat.heatclient = lambda request: self.stub_heatclient()
api.ceilometer.ceilometerclient = lambda request: \
self.stub_ceilometerclient()
api.trove.troveclient = lambda request: self.stub_troveclient()
if with_trove:
api.trove.troveclient = lambda request: self.stub_troveclient()
def tearDown(self):
super(APITestCase, self).tearDown()
@ -287,7 +293,8 @@ class APITestCase(TestCase):
api.cinder.cinderclient = self._original_cinderclient
api.heat.heatclient = self._original_heatclient
api.ceilometer.ceilometerclient = self._original_ceilometerclient
api.trove.troveclient = self._original_troveclient
if with_trove:
api.trove.troveclient = self._original_troveclient
def stub_novaclient(self):
if not hasattr(self, "novaclient"):
@ -353,11 +360,12 @@ class APITestCase(TestCase):
CreateMock(ceilometer_client.Client)
return self.ceilometerclient
def stub_troveclient(self):
if not hasattr(self, "troveclient"):
self.mox.StubOutWithMock(trove_client, 'Client')
self.troveclient = self.mox.CreateMock(trove_client.Client)
return self.troveclient
if with_trove:
def stub_troveclient(self):
if not hasattr(self, "troveclient"):
self.mox.StubOutWithMock(trove_client, 'Client')
self.troveclient = self.mox.CreateMock(trove_client.Client)
return self.troveclient
@unittest.skipUnless(os.environ.get('WITH_SELENIUM', False),

View File

@ -19,7 +19,11 @@ from keystoneclient import exceptions as keystone_exceptions
from neutronclient.common import exceptions as neutron_exceptions
from novaclient import exceptions as nova_exceptions
from swiftclient import client as swift_exceptions
from troveclient import exceptions as trove_exceptions
try:
from troveclient import exceptions as trove_exceptions
with_trove = True
except ImportError:
with_trove = False
from openstack_dashboard.test.test_data import utils
@ -74,8 +78,10 @@ def data(TEST):
cinder_exception = cinder_exceptions.BadRequest
TEST.exceptions.cinder = create_stubbed_exception(cinder_exception)
trove_exception = trove_exceptions.ClientException
TEST.exceptions.trove = create_stubbed_exception(trove_exception)
if with_trove:
trove_exception = trove_exceptions.ClientException
TEST.exceptions.trove = create_stubbed_exception(trove_exception)
trove_auth = trove_exceptions.Unauthorized
TEST.exceptions.trove_unauthorized = create_stubbed_exception(trove_auth)
trove_auth = trove_exceptions.Unauthorized
TEST.exceptions.trove_unauthorized = \
create_stubbed_exception(trove_auth)

View File

@ -14,8 +14,12 @@
# License for the specific language governing permissions and limitations
# under the License.
from troveclient import backups
from troveclient import instances
try:
from troveclient import backups
from troveclient import instances
with_trove = True
except ImportError:
with_trove = False
from openstack_dashboard.test.test_data import utils
@ -66,14 +70,14 @@ BACKUP_TWO = {
"description": "Longer description of backup"
}
if with_trove:
def data(TEST):
database = instances.Instance(instances.Instances(None), DATABASE_DATA)
bkup1 = backups.Backup(backups.Backups(None), BACKUP_ONE)
bkup2 = backups.Backup(backups.Backups(None), BACKUP_TWO)
def data(TEST):
database = instances.Instance(instances.Instances(None), DATABASE_DATA)
bkup1 = backups.Backup(backups.Backups(None), BACKUP_ONE)
bkup2 = backups.Backup(backups.Backups(None), BACKUP_TWO)
TEST.databases = utils.TestDataContainer()
TEST.database_backups = utils.TestDataContainer()
TEST.databases.add(database)
TEST.database_backups.add(bkup1)
TEST.database_backups.add(bkup2)
TEST.databases = utils.TestDataContainer()
TEST.database_backups = utils.TestDataContainer()
TEST.databases.add(database)
TEST.database_backups.add(bkup1)
TEST.database_backups.add(bkup2)

View File

@ -11,6 +11,12 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
try:
import troveclient
with_trove = True
assert troveclient
except ImportError:
with_trove = False
def load_test_data(load_onto=None):
@ -23,7 +29,8 @@ def load_test_data(load_onto=None):
from openstack_dashboard.test.test_data import neutron_data
from openstack_dashboard.test.test_data import nova_data
from openstack_dashboard.test.test_data import swift_data
from openstack_dashboard.test.test_data import trove_data
if with_trove:
from openstack_dashboard.test.test_data import trove_data
# The order of these loaders matters, some depend on others.
loaders = (exceptions.data,
@ -34,8 +41,9 @@ def load_test_data(load_onto=None):
neutron_data.data,
swift_data.data,
heat_data.data,
ceilometer_data.data,
trove_data.data)
ceilometer_data.data,)
if with_trove:
loaders += (trove_data.data,)
if load_onto:
for data_func in loaders:
data_func(load_onto)