Skip to content

Commit

Permalink
testing: fix test_ssh_import_id.py (canonical#954)
Browse files Browse the repository at this point in the history
test_ssh_import_id.py occassionally fails because cloud-init finishes
before the keys have been fully imported. A retry has been added to the
test.
  • Loading branch information
TheRealFalcon committed Aug 10, 2021
1 parent 27e49b7 commit 3cb256f
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 0 deletions.
6 changes: 6 additions & 0 deletions tests/integration_tests/modules/test_ssh_import_id.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

import pytest

from tests.integration_tests.util import retry

USER_DATA = """\
#cloud-config
Expand All @@ -26,6 +27,11 @@
class TestSshImportId:

@pytest.mark.user_data(USER_DATA)
# Retry is needed here because ssh import id is one of the last modules
# run, and it fires off a web request, then continues with the rest of
# cloud-init. It is possible cloud-init's status is "done" before the
# id's have been fully imported.
@retry(tries=30, delay=1)
def test_ssh_import_id(self, client):
ssh_output = client.read_from_file(
"/home/ubuntu/.ssh/authorized_keys")
Expand Down
30 changes: 30 additions & 0 deletions tests/integration_tests/util.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import functools
import logging
import multiprocessing
import os
Expand Down Expand Up @@ -64,3 +65,32 @@ def get_test_rsa_keypair(key_name: str = 'test1') -> key_pair:
with private_key_path.open() as private_file:
private_key = private_file.read()
return key_pair(public_key, private_key)


def retry(*, tries: int = 30, delay: int = 1):
"""Decorator for retries.
Retry a function until code no longer raises an exception or
max tries is reached.
Example:
@retry(tries=5, delay=1)
def try_something_that_may_not_be_ready():
...
"""
def _retry(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
last_error = None
for _ in range(tries):
try:
func(*args, **kwargs)
break
except Exception as e:
last_error = e
time.sleep(delay)
else:
if last_error:
raise last_error
return wrapper
return _retry

0 comments on commit 3cb256f

Please sign in to comment.