tools/minicluster/utils.py (58 lines of code) (raw):
#!/usr/bin/env python
import os
import requests
from socket import socket
import time
import yaml
import print_utils
HTTP_LOCALHOST = "http://localhost"
max_retry_attempts = 100
default_host = "localhost"
healthcheck_path = "/health"
sleep_time_secs = 1
#
# Load configs from file
#
def default_config(config='config.yaml', dir=""):
config_file = os.path.join(
os.path.dirname(os.path.abspath(__file__)) + dir, config
)
with open(config_file, "r") as f:
config = yaml.load(f, Loader=yaml.FullLoader)
return config
#
# Returns whether the zk listening on the given port is ready.
#
def is_zk_ready(port):
cmd = "bash -c 'echo ruok | nc localhost {}'".format(port)
return os.popen(cmd).read().strip() == "imok"
#
# Returns a free port on the host.
#
def find_free_port():
s = socket()
s.bind(('', 0))
port = s.getsockname()[1]
s.close()
return port
#
# Goes through the input list and replaces any integer it finds with a random
# free port. If one of the elements is a list itself, we will recursively
# perform this operation in there.
#
def randomize_ports(array):
for i in range(0, len(array)):
if type(array[i]) is int:
array[i] = find_free_port()
elif type(array[i]) is list:
array[i] = randomize_ports(array[i])
else:
raise Exception("randomize_ports must only be called on lists " +
"of lists or integers")
return array
#
# Run health check for peloton apps
#
def wait_for_up(app, port, path=healthcheck_path):
count = 0
error = ""
url = "http://%s:%s/%s" % (default_host, port, path)
while count < max_retry_attempts:
try:
r = requests.get(url)
if r.status_code == 200:
print_utils.okgreen("started %s" % app)
return
except Exception as e:
if count % 5 == 1:
msg = "app %s is not up yet, retrying at %s" % (app, url)
print_utils.warn(msg)
error = str(e)
time.sleep(sleep_time_secs)
count += 1
raise Exception(
"failed to start %s on %d after %d attempts, err: %s"
% (app, port, max_retry_attempts, error)
)