diff --git a/rally/osclients.py b/rally/osclients.py index 2e22e35d8e..a8f8a6e567 100644 --- a/rally/osclients.py +++ b/rally/osclients.py @@ -29,6 +29,7 @@ from neutronclient.neutron import client as neutron from novaclient import client as nova from oslo.config import cfg from saharaclient import client as sahara +from troveclient import client as trove from zaqarclient.queues import client as zaqar from rally import consts @@ -298,6 +299,20 @@ class Clients(object): insecure=CONF.https_insecure) return client + @cached + def trove(self, version='1.0'): + """Returns trove client.""" + client = trove.Client(version, + username=self.endpoint.username, + api_key=self.endpoint.password, + project_id=self.endpoint.tenant_name, + auth_url=self.endpoint.auth_url, + region_name=self.endpoint.region_name, + timeout=CONF.openstack_client_http_timeout, + insecure=CONF.https_insecure, + cacert=CONF.https_cacert) + return client + @cached def services(self): """Return available services names and types. diff --git a/requirements.txt b/requirements.txt index 2b7255893b..9ec6277e0b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -27,6 +27,7 @@ python-heatclient>=0.2.9 python-ceilometerclient>=1.0.6 python-ironicclient>=0.2.1 python-saharaclient>=0.7.6 +python-troveclient>=1.0.7 python-zaqarclient>=0.0.3 python-subunit>=0.0.18 requests>=2.2.0,!=2.4.0 diff --git a/tests/unit/fakes.py b/tests/unit/fakes.py index bd30ab13e7..ac52dbe44b 100644 --- a/tests/unit/fakes.py +++ b/tests/unit/fakes.py @@ -253,6 +253,10 @@ class FakeQueue(FakeResource): self.messages.create(**msg) +class FakeDbInstance(FakeResource): + pass + + class FakeMessage(FakeResource): def __init__(self, manager=None, **kwargs): super(FakeMessage, self).__init__(manager) @@ -741,6 +745,32 @@ class FakeQueuesManager(FakeManager): del self.__queues[queue.name] +class FakeDbInstanceManager(FakeManager): + def __init__(self): + super(FakeDbInstanceManager, self).__init__() + self.__db_instances = {} + + def create(self, name, flavor_id, size): + instance = FakeDbInstance(self) + instance.name = name or instance.name + instance.flavor_id = flavor_id + instance.size = size + return self._cache(instance) + + def list(self): + return self.__db_instances.values() + + def delete(self, resource): + if not isinstance(resource, basestring): + resource = resource.id + + cached = self.get(resource) + if cached is not None: + cached.status = "DELETE_COMPLETE" + del self.cache[resource] + self.resources_order.remove(resource) + + class FakeMessagesManager(FakeManager): def __init__(self, queue='myqueue'): super(FakeMessagesManager, self).__init__() @@ -1144,6 +1174,12 @@ class FakeZaqarClient(object): return self.queues.create(name, **kwargs) +class FakeTroveClient(object): + + def __init__(self): + self.instances = FakeDbInstanceManager() + + class FakeClients(object): def __init__(self, endpoint_=None): @@ -1157,6 +1193,7 @@ class FakeClients(object): self._designate = None self._ceilometer = None self._zaqar = None + self._trove = None self._endpoint = endpoint_ or endpoint.Endpoint( "http://fake.example.org:5000/v2.0/", "fake_username", @@ -1216,6 +1253,11 @@ class FakeClients(object): self._zaqar = FakeZaqarClient() return self._zaqar + def trove(self): + if not self._trove: + self._trove = FakeTroveClient() + return self._trove + class FakeRunner(object): diff --git a/tests/unit/test_osclients.py b/tests/unit/test_osclients.py index d31b54162d..d30d4e863e 100644 --- a/tests/unit/test_osclients.py +++ b/tests/unit/test_osclients.py @@ -263,6 +263,26 @@ class OSClientsTestCase(test.TestCase): conf=conf) self.assertEqual(self.clients.cache["zaqar"], fake_zaqar) + @mock.patch("rally.osclients.trove") + def test_trove(self, mock_trove): + fake_trove = fakes.FakeTroveClient() + mock_trove.Client = mock.MagicMock(return_value=fake_trove) + self.assertNotIn("trove", self.clients.cache) + client = self.clients.trove() + self.assertEqual(client, fake_trove) + kw = { + "username": self.endpoint.username, + "api_key": self.endpoint.password, + "project_id": self.endpoint.tenant_name, + "auth_url": self.endpoint.auth_url, + "region_name": self.endpoint.region_name, + "timeout": cfg.CONF.openstack_client_http_timeout, + "insecure": cfg.CONF.https_insecure, + "cacert": cfg.CONF.https_cacert + } + mock_trove.Client.assert_called_once_with("1.0", **kw) + self.assertEqual(self.clients.cache["trove"], fake_trove) + @mock.patch("rally.osclients.Clients.keystone") def test_services(self, mock_keystone): available_services = {consts.ServiceType.IDENTITY: {},