mknet/instrumented/deploy_minio.py

79 lines
2.5 KiB
Python
Executable file

#!/bin/python3
import yaml, os, sys, time, pathlib, unshare, socket, shutil
STORAGE_PATH = os.path.join(os.getcwd(), '.minio-testnet')
MINIO_PATH = '/srv'
HOSTS_PATH = os.path.join(STORAGE_PATH, 'hosts.txt')
UNIX_SOCK = os.path.join(STORAGE_PATH, 'deploy.sock')
DATA_PATH = lambda nid: os.path.join(STORAGE_PATH, 'data'+str(nid))
def main():
unshare.unshare(unshare.CLONE_NEWNS)
os.system("mount --make-rprivate /") # see https://stackoverflow.com/a/41580252
if int(os.environ['ID']) == 1: leader()
else: follower()
def leader():
shutil.rmtree(STORAGE_PATH, ignore_errors=True)
os.makedirs(STORAGE_PATH)
os.makedirs(MINIO_PATH, exist_ok=True)
print(STORAGE_PATH)
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.bind(UNIX_SOCK)
sock.listen()
n_serv = n_servers()
fl = [ co for co, addr in [ sock.accept() for i in range(n_serv - 1) ]]
ips = [ co.makefile().readline().strip() for co in fl ] + [ os.environ['IP'] ]
print(f"ips: {ips}")
gen_hosts(ips)
[ co.send(f"{n_serv}\n".encode()) for co in fl ]
os.system(f"mount --bind {HOSTS_PATH} /etc/hosts")
data_path = DATA_PATH(os.environ['ID'])
os.makedirs(data_path)
os.system(f"mount --bind {data_path} {MINIO_PATH}")
run_minio(n_serv)
def follower():
co = None
while True:
time.sleep(3)
try:
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.connect(UNIX_SOCK)
co = sock.makefile()
break
except Exception as err:
print('conn failed, wait,', err)
sock.send(f"{os.environ['IP']}\n".encode())
n_serv = int(co.readline())
os.system(f"mount --bind {HOSTS_PATH} /etc/hosts")
data_path = DATA_PATH(os.environ['ID'])
os.makedirs(data_path)
run_minio(n_serv)
def run_minio(count):
#print("minio server --console-address ':9001' --address [" + os.environ['IP'] + "]:9000 http://minio{1.."+str(count)+"}"+MINIO_PATH+" > "+ STORAGE_PATH + "/minio."+ os.environ['ID'] +".log 2>&1")
os.system("minio server --console-address ':9001' --address [" + os.environ['IP'] + "]:9000 http://minio{1.."+str(count)+"}"+MINIO_PATH+" > "+ STORAGE_PATH + "/minio."+ os.environ['ID'] +".log 2>&1")
def gen_hosts(ips):
with open(HOSTS_PATH, 'w') as f:
for idx,ip in enumerate(ips):
f.write(f"{ip} minio{idx+1}\n")
def n_servers():
with open('.current_state.yml', 'r') as f:
netw = yaml.safe_load(f)
n_servers = len(netw['servers'])
return n_servers
__name__ == '__main__' and main()