Remove races in floating ip functional tests
Multiple subnets with the same name are occasionally created when running tests in parallel. Change-Id: Ifb85e39ee53b529e2b97abf782c7fba93d48e9e2 Signed-off-by: Dean Troyer <dtroyer@gmail.com>
This commit is contained in:
parent
eed615e7d0
commit
31c47adebb
@ -24,12 +24,9 @@ class FloatingIpTests(common.NetworkTests):
|
|||||||
def setUpClass(cls):
|
def setUpClass(cls):
|
||||||
common.NetworkTests.setUpClass()
|
common.NetworkTests.setUpClass()
|
||||||
if cls.haz_network:
|
if cls.haz_network:
|
||||||
|
# Create common networks that all tests share
|
||||||
cls.EXTERNAL_NETWORK_NAME = uuid.uuid4().hex
|
cls.EXTERNAL_NETWORK_NAME = uuid.uuid4().hex
|
||||||
cls.EXTERNAL_SUBNET_NAME = uuid.uuid4().hex
|
|
||||||
cls.PRIVATE_NETWORK_NAME = uuid.uuid4().hex
|
cls.PRIVATE_NETWORK_NAME = uuid.uuid4().hex
|
||||||
cls.PRIVATE_SUBNET_NAME = uuid.uuid4().hex
|
|
||||||
cls.ROUTER = uuid.uuid4().hex
|
|
||||||
cls.PORT_NAME = uuid.uuid4().hex
|
|
||||||
|
|
||||||
# Create a network for the floating ip
|
# Create a network for the floating ip
|
||||||
json_output = json.loads(cls.openstack(
|
json_output = json.loads(cls.openstack(
|
||||||
@ -46,56 +43,10 @@ class FloatingIpTests(common.NetworkTests):
|
|||||||
))
|
))
|
||||||
cls.private_network_id = json_output["id"]
|
cls.private_network_id = json_output["id"]
|
||||||
|
|
||||||
# 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.external_subnet = ".".join(map(
|
|
||||||
str,
|
|
||||||
(random.randint(0, 223) for _ in range(3))
|
|
||||||
)) + ".0/26"
|
|
||||||
cls.private_subnet = ".".join(map(
|
|
||||||
str,
|
|
||||||
(random.randint(0, 223) for _ in range(3))
|
|
||||||
)) + ".0/26"
|
|
||||||
try:
|
|
||||||
# Create a subnet for the network
|
|
||||||
json_output = json.loads(cls.openstack(
|
|
||||||
'subnet create -f json ' +
|
|
||||||
'--network ' + cls.EXTERNAL_NETWORK_NAME + ' ' +
|
|
||||||
'--subnet-range ' + cls.external_subnet + ' ' +
|
|
||||||
cls.EXTERNAL_SUBNET_NAME
|
|
||||||
))
|
|
||||||
cls.external_subnet_id = json_output["id"]
|
|
||||||
# Create a subnet for the private network
|
|
||||||
json_output = json.loads(cls.openstack(
|
|
||||||
'subnet create -f json ' +
|
|
||||||
'--network ' + cls.PRIVATE_NETWORK_NAME + ' ' +
|
|
||||||
'--subnet-range ' + cls.private_subnet + ' ' +
|
|
||||||
cls.PRIVATE_SUBNET_NAME
|
|
||||||
))
|
|
||||||
cls.private_subnet_id = json_output["id"]
|
|
||||||
except Exception:
|
|
||||||
if (i == 3):
|
|
||||||
# raise the exception at the last time
|
|
||||||
raise
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
# break and no longer retry if create successfully
|
|
||||||
break
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def tearDownClass(cls):
|
def tearDownClass(cls):
|
||||||
try:
|
try:
|
||||||
if cls.haz_network:
|
if cls.haz_network:
|
||||||
del_output = cls.openstack(
|
|
||||||
'subnet delete ' +
|
|
||||||
cls.EXTERNAL_SUBNET_NAME + ' ' +
|
|
||||||
cls.PRIVATE_SUBNET_NAME
|
|
||||||
)
|
|
||||||
cls.assertOutput('', del_output)
|
|
||||||
del_output = cls.openstack(
|
del_output = cls.openstack(
|
||||||
'network delete ' +
|
'network delete ' +
|
||||||
cls.EXTERNAL_NETWORK_NAME + ' ' +
|
cls.EXTERNAL_NETWORK_NAME + ' ' +
|
||||||
@ -114,11 +65,50 @@ class FloatingIpTests(common.NetworkTests):
|
|||||||
# Verify setup
|
# Verify setup
|
||||||
self.assertIsNotNone(self.external_network_id)
|
self.assertIsNotNone(self.external_network_id)
|
||||||
self.assertIsNotNone(self.private_network_id)
|
self.assertIsNotNone(self.private_network_id)
|
||||||
self.assertIsNotNone(self.external_subnet_id)
|
|
||||||
self.assertIsNotNone(self.private_subnet_id)
|
def _create_subnet(self, network_name, subnet_name):
|
||||||
|
subnet_id = None
|
||||||
|
|
||||||
|
# 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
|
||||||
|
subnet = ".".join(map(
|
||||||
|
str,
|
||||||
|
(random.randint(0, 223) for _ in range(3))
|
||||||
|
)) + ".0/26"
|
||||||
|
try:
|
||||||
|
# Create a subnet for the network
|
||||||
|
json_output = json.loads(self.openstack(
|
||||||
|
'subnet create -f json ' +
|
||||||
|
'--network ' + network_name + ' ' +
|
||||||
|
'--subnet-range ' + subnet + ' ' +
|
||||||
|
subnet_name
|
||||||
|
))
|
||||||
|
self.assertIsNotNone(json_output["id"])
|
||||||
|
subnet_id = json_output["id"]
|
||||||
|
except Exception:
|
||||||
|
if (i == 3):
|
||||||
|
# raise the exception at the last time
|
||||||
|
raise
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
# break and no longer retry if create successfully
|
||||||
|
break
|
||||||
|
return subnet_id
|
||||||
|
|
||||||
def test_floating_ip_delete(self):
|
def test_floating_ip_delete(self):
|
||||||
"""Test create, delete multiple"""
|
"""Test create, delete multiple"""
|
||||||
|
|
||||||
|
# Subnets must exist even if not directly referenced here
|
||||||
|
ext_subnet_id = self._create_subnet(
|
||||||
|
self.EXTERNAL_NETWORK_NAME,
|
||||||
|
"ext-test-delete"
|
||||||
|
)
|
||||||
|
self.addCleanup(self.openstack, 'subnet delete ' + ext_subnet_id)
|
||||||
|
|
||||||
json_output = json.loads(self.openstack(
|
json_output = json.loads(self.openstack(
|
||||||
'floating ip create -f json ' +
|
'floating ip create -f json ' +
|
||||||
'--description aaaa ' +
|
'--description aaaa ' +
|
||||||
@ -151,6 +141,14 @@ class FloatingIpTests(common.NetworkTests):
|
|||||||
|
|
||||||
def test_floating_ip_list(self):
|
def test_floating_ip_list(self):
|
||||||
"""Test create defaults, list filters, delete"""
|
"""Test create defaults, list filters, delete"""
|
||||||
|
|
||||||
|
# Subnets must exist even if not directly referenced here
|
||||||
|
ext_subnet_id = self._create_subnet(
|
||||||
|
self.EXTERNAL_NETWORK_NAME,
|
||||||
|
"ext-test-delete"
|
||||||
|
)
|
||||||
|
self.addCleanup(self.openstack, 'subnet delete ' + ext_subnet_id)
|
||||||
|
|
||||||
json_output = json.loads(self.openstack(
|
json_output = json.loads(self.openstack(
|
||||||
'floating ip create -f json ' +
|
'floating ip create -f json ' +
|
||||||
'--description aaaa ' +
|
'--description aaaa ' +
|
||||||
@ -237,6 +235,22 @@ class FloatingIpTests(common.NetworkTests):
|
|||||||
|
|
||||||
def test_floating_ip_set_and_unset_port(self):
|
def test_floating_ip_set_and_unset_port(self):
|
||||||
"""Test Floating IP Set and Unset port"""
|
"""Test Floating IP Set and Unset port"""
|
||||||
|
|
||||||
|
# Subnets must exist even if not directly referenced here
|
||||||
|
ext_subnet_id = self._create_subnet(
|
||||||
|
self.EXTERNAL_NETWORK_NAME,
|
||||||
|
"ext-test-delete"
|
||||||
|
)
|
||||||
|
self.addCleanup(self.openstack, 'subnet delete ' + ext_subnet_id)
|
||||||
|
priv_subnet_id = self._create_subnet(
|
||||||
|
self.PRIVATE_NETWORK_NAME,
|
||||||
|
"priv-test-delete"
|
||||||
|
)
|
||||||
|
self.addCleanup(self.openstack, 'subnet delete ' + priv_subnet_id)
|
||||||
|
|
||||||
|
self.ROUTER = uuid.uuid4().hex
|
||||||
|
self.PORT_NAME = uuid.uuid4().hex
|
||||||
|
|
||||||
json_output = json.loads(self.openstack(
|
json_output = json.loads(self.openstack(
|
||||||
'floating ip create -f json ' +
|
'floating ip create -f json ' +
|
||||||
'--description aaaa ' +
|
'--description aaaa ' +
|
||||||
@ -253,7 +267,7 @@ class FloatingIpTests(common.NetworkTests):
|
|||||||
json_output = json.loads(self.openstack(
|
json_output = json.loads(self.openstack(
|
||||||
'port create -f json ' +
|
'port create -f json ' +
|
||||||
'--network ' + self.PRIVATE_NETWORK_NAME + ' ' +
|
'--network ' + self.PRIVATE_NETWORK_NAME + ' ' +
|
||||||
'--fixed-ip subnet=' + self.PRIVATE_SUBNET_NAME + ' ' +
|
'--fixed-ip subnet=' + priv_subnet_id + ' ' +
|
||||||
self.PORT_NAME
|
self.PORT_NAME
|
||||||
))
|
))
|
||||||
self.assertIsNotNone(json_output["id"])
|
self.assertIsNotNone(json_output["id"])
|
||||||
|
Loading…
x
Reference in New Issue
Block a user