Fixed intermittent timeout/failing functional tests

In web-download import method functional tests we are trying to download
a file from 'https://www.openstack.org/assets/openstack-logo/2016R/OpenStack-Logo-Horizontal.eps.zip'.
Here we are assuming image is downloaded and will be active within 20
seconds else will be marked as failed. As of now these tests never
fails in local environment but, external networking will always be unreliable
from the CI environment which sometimes causes these tests to either
timeout or failure.

Instead of using external URL to download the image, deploying local http
server to dowload local image.

Closes-Bug: #1797571
Change-Id: I781666327f092ad439c23eca57128b8fd0334c89
This commit is contained in:
Abhishek Kekane 2018-10-09 06:14:27 +00:00
parent 02a405a410
commit 6951f8daac
3 changed files with 54 additions and 6 deletions

View File

@ -364,6 +364,8 @@ store_type_preference = %(store_type_location_strategy_preference)s
[glance_store]
filesystem_store_datadir=%(image_dir)s
default_store = %(default_store)s
[import_filtering_opts]
allowed_ports = []
"""
self.paste_conf_base = """[pipeline:glance-api]
pipeline =
@ -549,6 +551,8 @@ default_backend = %(default_backend)s
filesystem_store_datadir=%(image_dir_backend_1)s
[file2]
filesystem_store_datadir=%(image_dir_backend_2)s
[import_filtering_opts]
allowed_ports = []
"""
self.paste_conf_base = """[pipeline:glance-api]
pipeline =

View File

@ -341,8 +341,11 @@ class TestImages(functional.FunctionalTest):
'content-type': 'application/json',
'X-Roles': 'admin',
})
image_data_uri = ('https://www.openstack.org/assets/openstack-logo/'
'2016R/OpenStack-Logo-Horizontal.eps.zip')
# Start http server locally
pid, port = test_utils.start_standalone_http_server()
image_data_uri = 'http://localhost:%s/' % port
data = jsonutils.dumps({'method': {
'name': 'web-download',
'uri': image_data_uri
@ -369,6 +372,9 @@ class TestImages(functional.FunctionalTest):
os_hash_value=expect_h,
status='active')
# kill the local http server
os.kill(pid, signal.SIGKILL)
# Deleting image should work
path = self._url('/v2/images/%s' % image_id)
response = requests.delete(path, headers=self._headers())
@ -4901,8 +4907,11 @@ class TestImagesMultipleBackend(functional.MultipleBackendFunctionalTest):
'content-type': 'application/json',
'X-Roles': 'admin',
})
image_data_uri = ('https://www.openstack.org/assets/openstack-logo/'
'2016R/OpenStack-Logo-Horizontal.eps.zip')
# Start http server locally
pid, port = test_utils.start_standalone_http_server()
image_data_uri = 'http://localhost:%s/' % port
data = jsonutils.dumps({'method': {
'name': 'web-download',
'uri': image_data_uri
@ -4928,6 +4937,9 @@ class TestImagesMultipleBackend(functional.MultipleBackendFunctionalTest):
checksum=expect_c,
os_hash_value=expect_h,
status='active')
# kill the local http server
os.kill(pid, signal.SIGKILL)
# Ensure image is created in default backend
path = self._url('/v2/images/%s' % image_id)
response = requests.get(path, headers=self._headers())
@ -5055,8 +5067,11 @@ class TestImagesMultipleBackend(functional.MultipleBackendFunctionalTest):
'X-Roles': 'admin',
'X-Image-Meta-Store': 'file2'
})
image_data_uri = ('https://www.openstack.org/assets/openstack-logo/'
'2016R/OpenStack-Logo-Horizontal.eps.zip')
# Start http server locally
pid, port = test_utils.start_standalone_http_server()
image_data_uri = 'http://localhost:%s/' % port
data = jsonutils.dumps({'method': {
'name': 'web-download',
'uri': image_data_uri
@ -5082,6 +5097,10 @@ class TestImagesMultipleBackend(functional.MultipleBackendFunctionalTest):
checksum=expect_c,
os_hash_value=expect_h,
status='active')
# kill the local http server
os.kill(pid, signal.SIGKILL)
# Ensure image is created in different backend
path = self._url('/v2/images/%s' % image_id)
response = requests.get(path, headers=self._headers())

View File

@ -713,3 +713,28 @@ def is_sqlite_version_prior_to(major, minor):
import sqlite3
tup = sqlite3.sqlite_version_info
return tup[0] < major or (tup[0] == major and tup[1] < minor)
def start_standalone_http_server():
def _get_http_handler_class():
class StaticHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def do_GET(self):
data = b"Hello World!!!"
self.send_response(http.OK)
self.send_header('Content-Length', str(len(data)))
self.end_headers()
self.wfile.write(data)
return
return StaticHTTPRequestHandler
server_address = ('127.0.0.1', 0)
handler_class = _get_http_handler_class()
httpd = BaseHTTPServer.HTTPServer(server_address, handler_class)
port = httpd.socket.getsockname()[1]
pid = os.fork()
if pid == 0:
httpd.serve_forever()
else:
return pid, port