diff --git a/openstack_dashboard/dashboards/project/databases/tables.py b/openstack_dashboard/dashboards/project/databases/tables.py index 98a553b05a..69e7f8401d 100644 --- a/openstack_dashboard/dashboards/project/databases/tables.py +++ b/openstack_dashboard/dashboards/project/databases/tables.py @@ -67,7 +67,7 @@ class DeleteUser(tables.DeleteAction): def delete(self, request, obj_id): datum = self.table.get_object_by_id(obj_id) try: - api.trove.users_delete(request, datum.instance.id, datum.name) + api.trove.user_delete(request, datum.instance.id, datum.name) except Exception: msg = _('Error deleting database user.') exceptions.handle(request, msg) diff --git a/openstack_dashboard/dashboards/project/databases/tests.py b/openstack_dashboard/dashboards/project/databases/tests.py index d44753946e..0feb2c4338 100644 --- a/openstack_dashboard/dashboards/project/databases/tests.py +++ b/openstack_dashboard/dashboards/project/databases/tests.py @@ -82,8 +82,7 @@ class DatabaseTests(test.TestCase): # Mock database instances databases = self.databases.list() last_record = databases[-1] - databases = common.Paginated(databases, - next_marker="foo") + databases = common.Paginated(databases, next_marker="foo") api.trove.instance_list(IsA(http.HttpRequest), marker=None)\ .AndReturn(databases) # Mock flavors @@ -236,3 +235,43 @@ class DatabaseTests(test.TestCase): def test_details_with_hostname(self): database = self.databases.list()[1] self._test_details(database, with_designate=True) + + @test.create_stubs( + {api.trove: ('instance_get', 'flavor_get', 'users_list', + 'user_list_access', 'user_delete')}) + def test_user_delete(self): + database = self.databases.first() + user = self.database_users.first() + user_db = self.database_user_dbs.first() + + database_id = database.id + # Instead of using the user's ID, the api uses the user's name. BOOO! + user_id = user.name + + # views.py: DetailView.get_data + api.trove.instance_get(IsA(http.HttpRequest), IsA(unicode))\ + .AndReturn(database) + api.trove.flavor_get(IsA(http.HttpRequest), IsA(str))\ + .AndReturn(self.flavors.first()) + + # tabs.py: UserTab.get_user_data + api.trove.users_list(IsA(http.HttpRequest), + database_id).AndReturn([user]) + api.trove.user_list_access(IsA(http.HttpRequest), + database_id, + user_id).AndReturn([user_db]) + + # tables.py: DeleteUser.delete + api.trove.user_delete(IsA(http.HttpRequest), + database_id, + user_id).AndReturn(None) + + self.mox.ReplayAll() + + details_url = reverse('horizon:project:databases:detail', + args=[database_id]) + url = details_url + '?tab=instance_details__users_tab' + action_string = u"users__delete__%s" % user_id + form_data = {'action': action_string} + res = self.client.post(url, form_data) + self.assertRedirectsNoFollow(res, url) diff --git a/openstack_dashboard/test/test_data/trove_data.py b/openstack_dashboard/test/test_data/trove_data.py index f741bf7256..7c9d372a34 100644 --- a/openstack_dashboard/test/test_data/trove_data.py +++ b/openstack_dashboard/test/test_data/trove_data.py @@ -13,7 +13,9 @@ # under the License. from troveclient.v1 import backups +from troveclient.v1 import databases from troveclient.v1 import instances +from troveclient.v1 import users from openstack_dashboard.test.test_data import utils @@ -25,17 +27,17 @@ DATABASE_DATA_ONE = { "links": [], "created": "2013-08-12T22:00:03", "ip": [ - "10.0.0.3" + "10.0.0.3", ], "volume": { "used": 0.13, - "size": 1 + "size": 1, }, "flavor": { "id": "1", - "links": [] + "links": [], }, - "id": "6ddc36d9-73db-4e23-b52e-368937d72719" + "id": "6ddc36d9-73db-4e23-b52e-368937d72719", } DATABASE_DATA_TWO = { @@ -47,13 +49,13 @@ DATABASE_DATA_TWO = { "hostname": "trove.instance-2.com", "volume": { "used": 0.13, - "size": 1 + "size": 1, }, "flavor": { "id": "1", - "links": [] + "links": [], }, - "id": "4d7b3f57-44f5-41d2-8e86-36b88cad572a" + "id": "4d7b3f57-44f5-41d2-8e86-36b88cad572a", } BACKUP_ONE = { @@ -65,7 +67,7 @@ BACKUP_ONE = { "created": "2013-08-15T18:10:14", "size": 0.13, "id": "0edb3c14-8919-4583-9add-00df9e524081", - "description": "Long description of backup" + "description": "Long description of backup", } @@ -78,7 +80,19 @@ BACKUP_TWO = { "created": "2013-08-10T20:20:37", "size": 0.13, "id": "e4602a3c-2bca-478f-b059-b6c215510fb4", - "description": "Longer description of backup" + "description": "Longer description of backup", +} + + +USER_ONE = { + "name": "Test_User", + "host": "%", + "databases": [DATABASE_DATA_ONE["name"]], +} + + +USER_DB_ONE = { + "name": "db1", } @@ -89,10 +103,17 @@ def data(TEST): DATABASE_DATA_TWO) bkup1 = backups.Backup(backups.Backups(None), BACKUP_ONE) bkup2 = backups.Backup(backups.Backups(None), BACKUP_TWO) + user1 = users.User(users.Users(None), USER_ONE) + user_db1 = databases.Database(databases.Databases(None), + USER_DB_ONE) TEST.databases = utils.TestDataContainer() TEST.database_backups = utils.TestDataContainer() + TEST.database_users = utils.TestDataContainer() + TEST.database_user_dbs = utils.TestDataContainer() TEST.databases.add(database1) TEST.databases.add(database2) TEST.database_backups.add(bkup1) TEST.database_backups.add(bkup2) + TEST.database_users.add(user1) + TEST.database_user_dbs.add(user_db1)