summaryrefslogtreecommitdiff
path: root/openstackclient/tests
diff options
context:
space:
mode:
authorMatt Riedemann <mriedem@us.ibm.com>2015-05-29 11:55:09 -0700
committerMatt Riedemann <mriedem@us.ibm.com>2015-05-29 14:32:51 -0700
commit224d375ef4120998dc51fbf55f1778d1ccf118a0 (patch)
tree0347f83242d39d28c8164c860e4d9c834fff4337 /openstackclient/tests
parent211c14c638b9bf393932be42d4f04a4dd12a84bc (diff)
downloadpython-openstackclient-224d375ef4120998dc51fbf55f1778d1ccf118a0.tar.gz
Add --wait to server delete
This allows the server delete command to wait for the server to be deleted (obviously). The wait method is the same model that Tempest uses, i.e. wait for a 404 on server GET (successful deletion), fail if the server went to ERROR status, or fail if a timeout is reached. The default timeout of 300 seconds is also what Tempest uses. Closes-Bug: #1460112 Change-Id: I0e66c400903e82832944d1cad61e7eb30177c3e8
Diffstat (limited to 'openstackclient/tests')
-rw-r--r--openstackclient/tests/common/test_utils.py39
-rw-r--r--openstackclient/tests/compute/v2/test_server.py47
2 files changed, 86 insertions, 0 deletions
diff --git a/openstackclient/tests/common/test_utils.py b/openstackclient/tests/common/test_utils.py
index cda0b135..d9f5b7a5 100644
--- a/openstackclient/tests/common/test_utils.py
+++ b/openstackclient/tests/common/test_utils.py
@@ -13,6 +13,9 @@
# under the License.
#
+import time
+import uuid
+
import mock
from openstackclient.common import exceptions
@@ -120,6 +123,42 @@ class TestUtils(test_utils.TestCase):
utils.sort_items,
items, sort_str)
+ @mock.patch.object(time, 'sleep')
+ def test_wait_for_delete_ok(self, mock_sleep):
+ # Tests the normal flow that the resource is deleted with a 404 coming
+ # back on the 2nd iteration of the wait loop.
+ resource = mock.MagicMock(status='ACTIVE', progress=None)
+ mock_get = mock.Mock(side_effect=[resource,
+ exceptions.NotFound(404)])
+ manager = mock.MagicMock(get=mock_get)
+ res_id = str(uuid.uuid4())
+ callback = mock.Mock()
+ self.assertTrue(utils.wait_for_delete(manager, res_id,
+ callback=callback))
+ mock_sleep.assert_called_once_with(5)
+ callback.assert_called_once_with(0)
+
+ @mock.patch.object(time, 'sleep')
+ def test_wait_for_delete_timeout(self, mock_sleep):
+ # Tests that we fail if the resource is not deleted before the timeout.
+ resource = mock.MagicMock(status='ACTIVE')
+ mock_get = mock.Mock(return_value=resource)
+ manager = mock.MagicMock(get=mock_get)
+ res_id = str(uuid.uuid4())
+ self.assertFalse(utils.wait_for_delete(manager, res_id, sleep_time=1,
+ timeout=1))
+ mock_sleep.assert_called_once_with(1)
+
+ @mock.patch.object(time, 'sleep')
+ def test_wait_for_delete_error(self, mock_sleep):
+ # Tests that we fail if the resource goes to error state while waiting.
+ resource = mock.MagicMock(status='ERROR')
+ mock_get = mock.Mock(return_value=resource)
+ manager = mock.MagicMock(get=mock_get)
+ res_id = str(uuid.uuid4())
+ self.assertFalse(utils.wait_for_delete(manager, res_id))
+ self.assertFalse(mock_sleep.called)
+
class NoUniqueMatch(Exception):
pass
diff --git a/openstackclient/tests/compute/v2/test_server.py b/openstackclient/tests/compute/v2/test_server.py
index baf53742..a8a1936d 100644
--- a/openstackclient/tests/compute/v2/test_server.py
+++ b/openstackclient/tests/compute/v2/test_server.py
@@ -16,6 +16,7 @@
import copy
import mock
+from openstackclient.common import utils as common_utils
from openstackclient.compute.v2 import server
from openstackclient.tests.compute.v2 import fakes as compute_fakes
from openstackclient.tests import fakes
@@ -319,6 +320,52 @@ class TestServerDelete(TestServer):
compute_fakes.server_id,
)
+ @mock.patch.object(common_utils, 'wait_for_delete', return_value=True)
+ def test_server_delete_wait_ok(self, mock_wait_for_delete):
+ arglist = [
+ compute_fakes.server_id, '--wait'
+ ]
+ verifylist = [
+ ('servers', [compute_fakes.server_id]),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # DisplayCommandBase.take_action() returns two tuples
+ self.cmd.take_action(parsed_args)
+
+ self.servers_mock.delete.assert_called_with(
+ compute_fakes.server_id,
+ )
+
+ mock_wait_for_delete.assert_called_once_with(
+ self.servers_mock,
+ compute_fakes.server_id,
+ callback=server._show_progress
+ )
+
+ @mock.patch.object(common_utils, 'wait_for_delete', return_value=False)
+ def test_server_delete_wait_fails(self, mock_wait_for_delete):
+ arglist = [
+ compute_fakes.server_id, '--wait'
+ ]
+ verifylist = [
+ ('servers', [compute_fakes.server_id]),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # DisplayCommandBase.take_action() returns two tuples
+ self.assertRaises(SystemExit, self.cmd.take_action, parsed_args)
+
+ self.servers_mock.delete.assert_called_with(
+ compute_fakes.server_id,
+ )
+
+ mock_wait_for_delete.assert_called_once_with(
+ self.servers_mock,
+ compute_fakes.server_id,
+ callback=server._show_progress
+ )
+
class TestServerImageCreate(TestServer):