Skip to content

Commit f1245a3

Browse files
authored
test(e2e): retry transient forward proxy stale policy responses (#1929)
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
1 parent 5ca39b0 commit f1245a3

2 files changed

Lines changed: 36 additions & 13 deletions

File tree

e2e/rust/tests/forward_proxy_graphql_l7.rs

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,19 @@ def forward_persisted_get_status(hash_value):
218218
error.read()
219219
return error.code
220220
221+
# The sandbox may resolve policy binary symlinks shortly after the entrypoint
222+
# starts, bumping the policy generation during the first forward request.
223+
# Retry expected-allowed forward requests so the test still targets L7 behavior.
224+
def retry_forward_allowed(label, request_fn):
225+
last_status = None
226+
for attempt in range(6):
227+
last_status = request_fn()
228+
if last_status != 403:
229+
return last_status
230+
DETAILS[f"{{label}}_transient_403_attempts"] = attempt + 1
231+
time.sleep(0.3)
232+
return last_status
233+
221234
def proxy_parts(*names):
222235
proxy_url = next((os.environ.get(name) for name in names if os.environ.get(name)), None)
223236
parsed = urllib.parse.urlparse(proxy_url)
@@ -379,14 +392,14 @@ def connect_chunked_status(query):
379392
return connect_http_status("connect_chunked_query_allowed", request)
380393
381394
results = {{
382-
"forward_query_allowed": forward_status(QUERY_VIEWER),
383-
"forward_get_query_allowed": forward_get_status(QUERY_VIEWER),
395+
"forward_query_allowed": retry_forward_allowed("forward_query_allowed", lambda: forward_status(QUERY_VIEWER)),
396+
"forward_get_query_allowed": retry_forward_allowed("forward_get_query_allowed", lambda: forward_get_status(QUERY_VIEWER)),
384397
"forward_duplicate_get_denied": forward_duplicate_get_status(),
385-
"forward_persisted_get_allowed": forward_persisted_get_status("abc123"),
398+
"forward_persisted_get_allowed": retry_forward_allowed("forward_persisted_get_allowed", lambda: forward_persisted_get_status("abc123")),
386399
"forward_unregistered_persisted_get_denied": forward_persisted_get_status("missing"),
387-
"forward_chunked_query_allowed": forward_chunked_status(QUERY_VIEWER),
400+
"forward_chunked_query_allowed": retry_forward_allowed("forward_chunked_query_allowed", lambda: forward_chunked_status(QUERY_VIEWER)),
388401
"forward_unlisted_field_denied": forward_status(QUERY_REPOSITORY),
389-
"forward_mutation_allowed": forward_status(MUTATION_CREATE),
402+
"forward_mutation_allowed": retry_forward_allowed("forward_mutation_allowed", lambda: forward_status(MUTATION_CREATE)),
390403
"forward_deny_rule_denied": forward_status(MUTATION_DELETE),
391404
"connect_query_allowed": connect_status(QUERY_VIEWER, "connect_query_allowed"),
392405
"connect_get_query_allowed": connect_get_status(QUERY_VIEWER, "connect_get_query_allowed"),

e2e/rust/tests/forward_proxy_l7_bypass.rs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -109,15 +109,25 @@ async fn forward_proxy_allows_l7_permitted_request() {
109109

110110
let script = format!(
111111
r#"
112-
import urllib.request, urllib.error, json, sys
112+
import urllib.request, urllib.error, json, sys, time
113113
url = "http://{host}:{port}/allowed"
114-
try:
115-
resp = urllib.request.urlopen(url, timeout=15)
116-
print(json.dumps({{"status": resp.status, "error": None}}))
117-
except urllib.error.HTTPError as e:
118-
print(json.dumps({{"status": e.code, "error": str(e)}}))
119-
except Exception as e:
120-
print(json.dumps({{"status": -1, "error": str(e)}}))
114+
# Retry expected-allowed requests across the startup symlink-resolution reload,
115+
# which can transiently surface as a stale-policy 403 in the forward proxy.
116+
last = {{"status": -1, "error": "not attempted"}}
117+
for attempt in range(6):
118+
try:
119+
resp = urllib.request.urlopen(url, timeout=15)
120+
last = {{"status": resp.status, "error": None, "attempt": attempt + 1}}
121+
break
122+
except urllib.error.HTTPError as e:
123+
last = {{"status": e.code, "error": str(e), "attempt": attempt + 1}}
124+
if e.code != 403:
125+
break
126+
time.sleep(0.3)
127+
except Exception as e:
128+
last = {{"status": -1, "error": str(e), "attempt": attempt + 1}}
129+
break
130+
print(json.dumps(last))
121131
"#,
122132
host = server.host,
123133
port = server.port,

0 commit comments

Comments
 (0)