1+ import logging
12import tempfile
23import time
34import uuid
910import gitlab
1011import gitlab .base
1112
12- SLEEP_INTERVAL = 0.1
13+ SLEEP_INTERVAL = 0.5
1314TIMEOUT = 60 # seconds before timeout will occur
1415
1516
@@ -21,47 +22,69 @@ def fixture_dir(test_dir):
2122def reset_gitlab (gl ):
2223# previously tools/reset_gitlab.py
2324for project in gl .projects .list ():
25+ logging .info (f"Marking for deletion project:{ project .path_with_namespace !r} " )
2426for deploy_token in project .deploytokens .list ():
27+ logging .info (
28+ f"Marking for deletion token:{ deploy_token .username !r} in "
29+ f"project:{ project .path_with_namespace !r} "
30+ )
2531deploy_token .delete ()
2632project .delete ()
2733for group in gl .groups .list ():
34+ logging .info (f"Marking for deletion group:{ group .full_path !r} " )
2835for deploy_token in group .deploytokens .list ():
36+ logging .info (
37+ f"Marking for deletion token:{ deploy_token .username !r} in "
38+ f"group:{ group .path_with_namespace !r} "
39+ )
2940deploy_token .delete ()
3041group .delete ()
3142for variable in gl .variables .list ():
43+ logging .info (f"Marking for deletion variable:{ variable .key !r} " )
3244variable .delete ()
3345for user in gl .users .list ():
3446if user .username != "root" :
47+ logging .info (f"Marking for deletion user:{ user .username !r} " )
3548user .delete (hard_delete = True )
3649
3750max_iterations = int (TIMEOUT / SLEEP_INTERVAL )
3851
3952# Ensure everything has been reset
4053start_time = time .perf_counter ()
4154
42- def wait_for_maximum_list_length (
55+ def wait_for_list_size (
4356rest_manager :gitlab .base .RESTManager ,description :str ,max_length :int = 0
4457 )-> None :
4558"""Wait for the list() length to be no greater than expected maximum or fail
4659 test if timeout is exceeded"""
47- for _ in range (max_iterations ):
48- if len (rest_manager .list ())<= max_length :
60+ logging .info (f"Checking{ description !r} has no more than{ max_length } items" )
61+ for count in range (max_iterations ):
62+ items = rest_manager .list ()
63+ if len (items )<= max_length :
4964break
65+ logging .info (
66+ f"Iteration:{ count } Waiting for{ description !r} items to be deleted: "
67+ f"{ [x .name for x in items ]} "
68+ )
5069time .sleep (SLEEP_INTERVAL )
51- assert len (rest_manager .list ())<= max_length , (
52- f"Did not delete required items for{ description } . "
53- f"Elapsed_time:{ time .perf_counter ()- start_time } "
70+
71+ elapsed_time = time .perf_counter ()- start_time
72+ error_message = (
73+ f"More than{ max_length } { description !r} items still remaining and timeout "
74+ f"({ elapsed_time } ) exceeded:{ [x .name for x in items ]} "
5475 )
76+ if len (items )> max_length :
77+ logging .error (error_message )
78+ assert len (items )<= max_length ,error_message
5579
56- wait_for_maximum_list_length (rest_manager = gl .projects ,description = "projects" )
57- wait_for_maximum_list_length (rest_manager = gl .groups ,description = "groups" )
58- wait_for_maximum_list_length (rest_manager = gl .variables ,description = "variables" )
59- wait_for_maximum_list_length (
60- rest_manager = gl .users ,description = "users" ,max_length = 1
61- )
80+ wait_for_list_size (rest_manager = gl .projects ,description = "projects" )
81+ wait_for_list_size (rest_manager = gl .groups ,description = "groups" )
82+ wait_for_list_size (rest_manager = gl .variables ,description = "variables" )
83+ wait_for_list_size (rest_manager = gl .users ,description = "users" ,max_length = 1 )
6284
6385
6486def set_token (container ,fixture_dir ):
87+ logging .info ("Creating API token." )
6588set_token_rb = fixture_dir / "set_token.rb"
6689
6790with open (set_token_rb ,"r" )as f :
@@ -76,6 +99,7 @@ def set_token(container, fixture_dir):
7699set_token_command ,
77100 ]
78101output = check_output (rails_command ).decode ().strip ()
102+ logging .info ("Finished creating API token." )
79103
80104return output
81105
@@ -85,7 +109,7 @@ def pytest_report_collectionfinish(config, startdir, items):
85109"" ,
86110"Starting GitLab container." ,
87111"Waiting for GitLab to reconfigure." ,
88- "Thismay take a few minutes." ,
112+ "Thiswill take a few minutes." ,
89113 ]
90114
91115
@@ -129,6 +153,7 @@ def check_is_alive():
129153 """
130154
131155def _check (container ):
156+ logging .info ("Checking if GitLab container is up..." )
132157logs = ["docker" ,"logs" ,container ]
133158return "gitlab Reconfigured!" in check_output (logs ).decode ()
134159
@@ -144,7 +169,7 @@ def wait_for_sidekiq(gl):
144169 """
145170
146171def _wait (timeout = 30 ,step = 0.5 ):
147- for _ in range (timeout ):
172+ for count in range (timeout ):
148173time .sleep (step )
149174busy = False
150175processes = gl .sidekiq .process_metrics ()["processes" ]
@@ -153,6 +178,7 @@ def _wait(timeout=30, step=0.5):
153178busy = True
154179if not busy :
155180return True
181+ logging .info (f"sidekiq busy{ count } of{ timeout } " )
156182return False
157183
158184return _wait
@@ -163,9 +189,11 @@ def gitlab_config(check_is_alive, docker_ip, docker_services, temp_dir, fixture_
163189config_file = temp_dir / "python-gitlab.cfg"
164190port = docker_services .port_for ("gitlab" ,80 )
165191
192+ logging .info ("Waiting for GitLab container to become ready." )
166193docker_services .wait_until_responsive (
167- timeout = 200 ,pause = 5 ,check = lambda :check_is_alive ("gitlab-test" )
194+ timeout = 200 ,pause = 10 ,check = lambda :check_is_alive ("gitlab-test" )
168195 )
196+ logging .info ("GitLab container is now ready." )
169197
170198token = set_token ("gitlab-test" ,fixture_dir = fixture_dir )
171199
@@ -188,7 +216,9 @@ def gitlab_config(check_is_alive, docker_ip, docker_services, temp_dir, fixture_
188216def gl (gitlab_config ):
189217"""Helper instance to make fixtures and asserts directly via the API."""
190218
219+ logging .info ("Instantiating python-gitlab gitlab.Gitlab instance" )
191220instance = gitlab .Gitlab .from_config ("local" , [gitlab_config ])
221+
192222reset_gitlab (instance )
193223
194224return instance