From 4a8e7dbe6b19e589e277e13d565578d98161572f Mon Sep 17 00:00:00 2001
From: Huanxuan Ao <huanxuan.ao@easystack.cn>
Date: Tue, 17 Jan 2017 22:33:08 +0800
Subject: [PATCH] Fix functional test for creating subnet

subnet create failed by some bad random
subnet range, so retry it with new random
range when the test failed.

Change-Id: If528ff419b51dd5c5232f81d4b26abae542bd820
---
 .../functional/network/v2/test_floating_ip.py | 39 ++++++++++++-------
 1 file changed, 26 insertions(+), 13 deletions(-)

diff --git a/openstackclient/tests/functional/network/v2/test_floating_ip.py b/openstackclient/tests/functional/network/v2/test_floating_ip.py
index fa9607a074..8fbec3d5f7 100644
--- a/openstackclient/tests/functional/network/v2/test_floating_ip.py
+++ b/openstackclient/tests/functional/network/v2/test_floating_ip.py
@@ -31,25 +31,38 @@ class FloatingIpTests(base.TestCase):
         cls.re_description = re.compile("description\s+\|\s+([^|]+?)\s+\|")
         cls.re_network_id = re.compile("floating_network_id\s+\|\s+(\S+)")
 
-        # Make a random subnet
-        cls.subnet = ".".join(map(
-            str,
-            (random.randint(0, 223) for _ in range(3))
-        )) + ".0/26"
-
         # Create a network for the floating ip
         raw_output = cls.openstack(
             'network create --external ' + cls.NETWORK_NAME
         )
         cls.network_id = re.search(cls.re_id, raw_output).group(1)
 
-        # Create a subnet for the network
-        raw_output = cls.openstack(
-            'subnet create ' +
-            '--network ' + cls.NETWORK_NAME + ' ' +
-            '--subnet-range ' + cls.subnet + ' ' +
-            cls.SUBNET_NAME
-        )
+        # Try random subnet range for subnet creating
+        # Because we can not determine ahead of time what subnets are already
+        # in use, possibly by another test running in parallel, try 4 times
+        for i in range(4):
+            # Make a random subnet
+            cls.subnet = ".".join(map(
+                str,
+                (random.randint(0, 223) for _ in range(3))
+            )) + ".0/26"
+            try:
+                # Create a subnet for the network
+                raw_output = cls.openstack(
+                    'subnet create ' +
+                    '--network ' + cls.NETWORK_NAME + ' ' +
+                    '--subnet-range ' + cls.subnet + ' ' +
+                    cls.SUBNET_NAME
+                )
+            except Exception:
+                if (i == 3):
+                    # raise the exception at the last time
+                    raise
+                pass
+            else:
+                # break and no longer retry if create sucessfully
+                break
+
         cls.subnet_id = re.search(cls.re_id, raw_output).group(1)
 
     @classmethod