Make troveclient optional
Fixes bug 1221906 Change-Id: I3d022fca2f6bc1f0f5143373259882f2522f7958
This commit is contained in:
parent
0e73640530
commit
c9022fa065
|
@ -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)
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,)
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue