TUN-5397: Log cloudflared output when it fails to connect tunnel

This commit is contained in:
Nuno Diegues 2021-11-09 17:30:57 +00:00
parent 1ee540a166
commit 794635fb54
3 changed files with 38 additions and 12 deletions

View File

@ -155,7 +155,7 @@ stretch: &stretch
post-cache: post-cache:
# Creates and routes a Named Tunnel for this build. Also constructs config file from env vars. # Creates and routes a Named Tunnel for this build. Also constructs config file from env vars.
- python3 component-tests/setup.py --type create - python3 component-tests/setup.py --type create
- pytest component-tests - pytest component-tests -o log_cli=true --log-cli-level=INFO
# The Named Tunnel is deleted and its route unprovisioned here. # The Named Tunnel is deleted and its route unprovisioned here.
- python3 component-tests/setup.py --type cleanup - python3 component-tests/setup.py --type cleanup
update-homebrew: update-homebrew:

View File

@ -75,7 +75,7 @@ class TestLogging:
} }
config = component_tests_config(extra_config) config = component_tests_config(extra_config)
with start_cloudflared(tmp_path, config, new_process=True, capture_output=False): with start_cloudflared(tmp_path, config, new_process=True, capture_output=False):
wait_tunnel_ready(tunnel_url=config.get_url()) wait_tunnel_ready(tunnel_url=config.get_url(), cfd_logs=str(log_file))
assert_log_in_file(log_file) assert_log_in_file(log_file)
assert_json_log(log_file) assert_json_log(log_file)
@ -88,5 +88,5 @@ class TestLogging:
} }
config = component_tests_config(extra_config) config = component_tests_config(extra_config)
with start_cloudflared(tmp_path, config, new_process=True, capture_output=False): with start_cloudflared(tmp_path, config, new_process=True, capture_output=False):
wait_tunnel_ready(tunnel_url=config.get_url()) wait_tunnel_ready(tunnel_url=config.get_url(), cfd_logs=str(log_dir))
assert_log_to_dir(config, log_dir) assert_log_to_dir(config, log_dir)

View File

@ -1,12 +1,13 @@
from contextlib import contextmanager
import logging import logging
import requests import os
from retrying import retry
import subprocess import subprocess
import yaml from contextlib import contextmanager
from time import sleep from time import sleep
import requests
import yaml
from retrying import retry
from constants import METRICS_PORT, MAX_RETRIES, BACKOFF_SECS from constants import METRICS_PORT, MAX_RETRIES, BACKOFF_SECS
LOGGER = logging.getLogger(__name__) LOGGER = logging.getLogger(__name__)
@ -19,7 +20,8 @@ def write_config(directory, config):
return config_path return config_path
def start_cloudflared(directory, config, cfd_args=["run"], cfd_pre_args=["tunnel"], new_process=False, allow_input=False, capture_output=True, root=False): def start_cloudflared(directory, config, cfd_args=["run"], cfd_pre_args=["tunnel"], new_process=False,
allow_input=False, capture_output=True, root=False):
config_path = write_config(directory, config.full_config) config_path = write_config(directory, config.full_config)
cmd = cloudflared_cmd(config, config_path, cfd_args, cfd_pre_args, root) cmd = cloudflared_cmd(config, config_path, cfd_args, cfd_pre_args, root)
if new_process: if new_process:
@ -53,18 +55,42 @@ def run_cloudflared_background(cmd, allow_input, capture_output):
LOGGER.info(f"cloudflared log: {cfd.stderr.read()}") LOGGER.info(f"cloudflared log: {cfd.stderr.read()}")
def wait_tunnel_ready(tunnel_url=None, require_min_connections=1, cfd_logs=None):
try:
inner_wait_tunnel_ready(tunnel_url, require_min_connections)
except Exception as e:
if cfd_logs is not None:
_log_cloudflared_logs(cfd_logs)
raise e
@retry(stop_max_attempt_number=MAX_RETRIES, wait_fixed=BACKOFF_SECS * 1000) @retry(stop_max_attempt_number=MAX_RETRIES, wait_fixed=BACKOFF_SECS * 1000)
def wait_tunnel_ready(tunnel_url=None, require_min_connections=1): def inner_wait_tunnel_ready(tunnel_url=None, require_min_connections=1):
metrics_url = f'http://localhost:{METRICS_PORT}/ready' metrics_url = f'http://localhost:{METRICS_PORT}/ready'
with requests.Session() as s: with requests.Session() as s:
resp = send_request(s, metrics_url, True) resp = send_request(s, metrics_url, True)
assert resp.json()[
"readyConnections"] >= require_min_connections, f"Ready endpoint returned {resp.json()} but we expect at least {require_min_connections} connections" assert resp.json()["readyConnections"] >= require_min_connections, \
f"Ready endpoint returned {resp.json()} but we expect at least {require_min_connections} connections"
if tunnel_url is not None: if tunnel_url is not None:
send_request(s, tunnel_url, True) send_request(s, tunnel_url, True)
def _log_cloudflared_logs(cfd_logs):
log_file = cfd_logs
if os.path.isdir(cfd_logs):
files = os.listdir(cfd_logs)
if len(files) == 0:
return
log_file = os.path.join(cfd_logs, files[0])
with open(log_file, "r") as f:
LOGGER.warning("Cloudflared Tunnel was not ready:")
for line in f.readlines():
LOGGER.warning(line)
@retry(stop_max_attempt_number=MAX_RETRIES * BACKOFF_SECS, wait_fixed=1000) @retry(stop_max_attempt_number=MAX_RETRIES * BACKOFF_SECS, wait_fixed=1000)
def check_tunnel_not_connected(): def check_tunnel_not_connected():
url = f'http://localhost:{METRICS_PORT}/ready' url = f'http://localhost:{METRICS_PORT}/ready'