openstack-charmers / zaza-openstack-tests

OpenStack Charms Functional Test Library for Zaza
Apache License 2.0
7 stars 77 forks source link

urllib.error.URLError: <urlopen error [Errno -3] Temporary failure in name resolution> #775

Open freyes opened 2 years ago

freyes commented 2 years ago

Due to dns instability the download_image() could fail, it would be nice if it was wrapped with a retry decorator

https://github.com/openstack-charmers/zaza-openstack-tests/blob/master/zaza/openstack/utilities/openstack.py#L2290

# error codes that represent a dns issue
DNS_ISSUES = [...]

class DnsProblemError(Exception):
    pass

@retry(retry=retry_if_exception_type(DnsProblemError))
def download_image(image_url, target_file):
    ...
    try:
        urllib.request.urlretrieve(image_url, target_file)
    except urllib.error.URLError as ex:
        if type(ex.reason) == socket.gaierror and ex.reason.errno in DNS_ISSUES:
            raise DnsProblemError(ex)

Stacktrace seen in the CI

2022-05-21 12:10:00 [INFO] Downloading image bionic
2022-05-21 12:10:00 [INFO] Downloading http://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img ...
2022-05-21 12:10:10 [ERROR] {'ceph': 'zaza-5c6d9259a4b4'}
2022-05-21 12:10:10 [ERROR] Model ceph (zaza-5c6d9259a4b4)
Traceback (most recent call last):
  File "/usr/lib/python3.8/urllib/request.py", line 1354, in do_open
    h.request(req.get_method(), req.selector, req.data, headers,
  File "/usr/lib/python3.8/http/client.py", line 1256, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/usr/lib/python3.8/http/client.py", line 1302, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/usr/lib/python3.8/http/client.py", line 1251, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/usr/lib/python3.8/http/client.py", line 1011, in _send_output
    self.send(msg)
  File "/usr/lib/python3.8/http/client.py", line 951, in send
    self.connect()
  File "/usr/lib/python3.8/http/client.py", line 922, in connect
    self.sock = self._create_connection(
  File "/usr/lib/python3.8/socket.py", line 787, in create_connection
    for res in getaddrinfo(host, port, 0, SOCK_STREAM):
  File "/usr/lib/python3.8/socket.py", line 918, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -3] Temporary failure in name resolution

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ubuntu/src/review.opendev.org/openstack/charm-glance/.tox/func-target/bin/functest-run-suite", line 8, in <module>
    sys.exit(main())
  File "/home/ubuntu/src/review.opendev.org/openstack/charm-glance/.tox/func-target/lib/python3.8/site-packages/zaza/charm_lifecycle/func_test_runner.py", line 364, in main
    func_test_runner(
  File "/home/ubuntu/src/review.opendev.org/openstack/charm-glance/.tox/func-target/lib/python3.8/site-packages/zaza/charm_lifecycle/func_test_runner.py", line 277, in func_test_runner
    run_env_deployment(env_deployment, keep_model=preserve_model,
  File "/home/ubuntu/src/review.opendev.org/openstack/charm-glance/.tox/func-target/lib/python3.8/site-packages/zaza/charm_lifecycle/func_test_runner.py", line 151, in run_env_deployment
    configure.configure(
  File "/home/ubuntu/src/review.opendev.org/openstack/charm-glance/.tox/func-target/lib/python3.8/site-packages/zaza/charm_lifecycle/configure.py", line 51, in configure
    run_configure_list(functions)
  File "/home/ubuntu/src/review.opendev.org/openstack/charm-glance/.tox/func-target/lib/python3.8/site-packages/zaza/charm_lifecycle/configure.py", line 37, in run_configure_list
    utils.get_class(func)()
  File "/home/ubuntu/src/review.opendev.org/openstack/charm-glance/.tox/func-target/lib/python3.8/site-packages/zaza/openstack/charm_tests/glance/setup.py", line 164, in add_lts_image
    add_image(image_url,
  File "/home/ubuntu/src/review.opendev.org/openstack/charm-glance/.tox/func-target/lib/python3.8/site-packages/zaza/openstack/charm_tests/glance/setup.py", line 100, in add_image
    openstack_utils.create_image(
  File "/home/ubuntu/src/review.opendev.org/openstack/charm-glance/.tox/func-target/lib/python3.8/site-packages/zaza/openstack/utilities/openstack.py", line 2531, in create_image
    download_image(image_url, local_path)
  File "/home/ubuntu/src/review.opendev.org/openstack/charm-glance/.tox/func-target/lib/python3.8/site-packages/zaza/openstack/utilities/openstack.py", line 2253, in download_image
    urllib.request.urlretrieve(image_url, target_file)
  File "/usr/lib/python3.8/urllib/request.py", line 247, in urlretrieve
    with contextlib.closing(urlopen(url, data)) as fp:
  File "/usr/lib/python3.8/urllib/request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/lib/python3.8/urllib/request.py", line 525, in open
    response = self._open(req, data)
  File "/usr/lib/python3.8/urllib/request.py", line 542, in _open
    result = self._call_chain(self.handle_open, protocol, protocol +
  File "/usr/lib/python3.8/urllib/request.py", line 502, in _call_chain
    result = func(*args)
  File "/usr/lib/python3.8/urllib/request.py", line 1383, in http_open
    return self.do_open(http.client.HTTPConnection, req)
  File "/usr/lib/python3.8/urllib/request.py", line 1357, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [Errno -3] Temporary failure in name resolution>
Regis-Caelum commented 2 years ago

Hey @freyes, I can help.