You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by qu...@apache.org on 2017/11/08 03:36:44 UTC

[3/4] libcloud git commit: Test retries in destroy_node

Test retries in destroy_node

Signed-off-by: Quentin Pradet <qu...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/55b16c85
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/55b16c85
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/55b16c85

Branch: refs/heads/trunk
Commit: 55b16c8582478b88f5d8b4cf7cfbcd9562a78ecf
Parents: aaaa101
Author: Lucas Di Pentima <ld...@veritasgenetics.com>
Authored: Mon Nov 6 19:22:09 2017 -0300
Committer: Quentin Pradet <qu...@apache.org>
Committed: Wed Nov 8 07:32:06 2017 +0400

----------------------------------------------------------------------
 libcloud/test/compute/test_azure_arm.py | 38 ++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/55b16c85/libcloud/test/compute/test_azure_arm.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_azure_arm.py b/libcloud/test/compute/test_azure_arm.py
index a32917d..bd8cfa0 100644
--- a/libcloud/test/compute/test_azure_arm.py
+++ b/libcloud/test/compute/test_azure_arm.py
@@ -166,6 +166,44 @@ class AzureNodeDriverTests(LibcloudTestCase):
         self.assertTrue(ret)
 
     @mock.patch('time.sleep', return_value=None)
+    def test_destroy_node__retry(self, time_sleep_mock):
+        def error(e, **kwargs):
+            raise e(**kwargs)
+        node = self.driver.list_nodes()[0]
+        AzureMockHttp.responses = [
+            # 202 - The delete will happen asynchronously
+            lambda f: error(BaseHTTPError, code=202, message='Deleting'),
+            # 200 means the node is still here - Try 1
+            lambda f: (httplib.OK, None, {}, 'OK'),
+            # 200 means the node is still here - Try 2
+            lambda f: (httplib.OK, None, {}, 'OK'),
+            # 200 means the node is still here - Try 3
+            lambda f: (httplib.OK, None, {}, 'OK'),
+            # 404 means node is gone - 4th retry: success!
+            lambda f: error(BaseHTTPError, code=404, message='Not found'),
+        ]
+        ret = self.driver.destroy_node(node)
+        self.assertTrue(ret)
+        self.assertEqual(4, time_sleep_mock.call_count)  # Retries
+
+    @mock.patch('time.sleep', return_value=None)
+    def test_destroy_node__destroy_nic_retries(self, time_sleep_mock):
+        def error(e, **kwargs):
+            raise e(**kwargs)
+        node = self.driver.list_nodes()[0]
+        err = BaseHTTPError(code=400, message='[NicInUse] Cannot destroy')
+        with mock.patch.object(self.driver, 'ex_destroy_nic') as m:
+            m.side_effect = [err] * 5 + [True]  # 5 errors before a success
+            ret = self.driver.destroy_node(node)
+            self.assertTrue(ret)
+            self.assertEqual(6, m.call_count)  # 6th call was a success
+
+            m.side_effect = [err] * 10 + [True]  # 10 errors before a success
+            with self.assertRaises(BaseHTTPError):
+                self.driver.destroy_node(node)
+                self.assertEqual(10, m.call_count)  # try 10 times & fail
+
+    @mock.patch('time.sleep', return_value=None)
     def test_destroy_node__async(self, time_sleep_mock):
         def error(e, **kwargs):
             raise e(**kwargs)