summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/functional/conftest.py52
1 files changed, 48 insertions, 4 deletions
diff --git a/tests/functional/conftest.py b/tests/functional/conftest.py
index 06f12c6..a3455af 100644
--- a/tests/functional/conftest.py
+++ b/tests/functional/conftest.py
@@ -19,8 +19,18 @@ def fixture_dir(test_dir):
return test_dir / "functional" / "fixtures"
-def reset_gitlab(gl):
- # previously tools/reset_gitlab.py
+def reset_gitlab(gl: gitlab.Gitlab) -> None:
+ # Mark our resources for deletion. It takes time for them to actually be deleted
+ # though.
+ _reset_gitlab_delete_resources(gl=gl)
+
+ # Wait for all resources to be deleted
+ _reset_gitlab_wait_deletion_finish(gl=gl)
+
+
+def _reset_gitlab_delete_resources(gl: gitlab.Gitlab) -> None:
+ """Mark for deletion, resources (such as projects, groups, users) that shouldn't
+ exist. Once marked they will still take time to be deleted."""
for project in gl.projects.list():
logging.info(f"Mark for deletion project: {project.name!r}")
for deploy_token in project.deploytokens.list():
@@ -47,13 +57,24 @@ def reset_gitlab(gl):
logging.info(f"Mark for deletion user: {user.username!r}")
user.delete(hard_delete=True)
+
+def _reset_gitlab_wait_deletion_finish(gl: gitlab.Gitlab) -> None:
+ """Wait for all of our resources to be deleted.
+
+ If anything exists then mark it again for deletion in case initial call to delete
+ didn't work, which has been seen :("""
+
max_iterations = int(TIMEOUT / SLEEP_INTERVAL)
# Ensure everything has been reset
start_time = time.perf_counter()
def wait_for_maximum_list_length(
- rest_manager: gitlab.base.RESTManager, description: str, max_length: int = 0
+ rest_manager: gitlab.base.RESTManager,
+ description: str,
+ max_length: int = 0,
+ should_delete_func=lambda x: True,
+ delete_kwargs={},
) -> None:
"""Wait for the list() length to be no greater than expected maximum or fail
test if timeout is exceeded"""
@@ -66,6 +87,19 @@ def reset_gitlab(gl):
f"Iteration: {count} Waiting for {description!r} items to be deleted: "
f"{[x.name for x in items]}"
)
+ for item in items:
+ if should_delete_func(item):
+ logging.info(
+ f"Marking {description!r} item again for deletion: "
+ f"{item.name!r}"
+ )
+ try:
+ item.delete(**delete_kwargs)
+ except gitlab.exceptions.GitlabDeleteError as exc:
+ logging.info(
+ f"{description!r} item already marked for deletion: "
+ f"{item.name!r} {exc}"
+ )
time.sleep(SLEEP_INTERVAL)
items = rest_manager.list()
@@ -83,8 +117,18 @@ def reset_gitlab(gl):
wait_for_maximum_list_length(rest_manager=gl.projects, description="projects")
wait_for_maximum_list_length(rest_manager=gl.groups, description="groups")
wait_for_maximum_list_length(rest_manager=gl.variables, description="variables")
+
+ def should_delete_user(user):
+ if user.username == "root":
+ return False
+ return True
+
wait_for_maximum_list_length(
- rest_manager=gl.users, description="users", max_length=1
+ rest_manager=gl.users,
+ description="users",
+ max_length=1,
+ should_delete_func=should_delete_user,
+ delete_kwargs={"hard_delete": True},
)