aboutsummaryrefslogtreecommitdiff
path: root/example/deploy_minio.py
blob: 8ee84304023348047f706c256be1eff28ca656c6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#!/usr/bin/env python3
import json, os, sys, time, pathlib, 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():
    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 = os.environ['SIZE']
    fl = [ co for co, addr in [ sock.accept() for i in range(n_serv - 1) ]]

    identities = [ json.loads(co.makefile().readline()) for co in fl ] + [ { "ip": os.environ['IP'], "path": make_data() } ]
    print(f"ident: {identities}")
    msg = f"{json.dumps(identities)}\n".encode()
    [ co.send(msg) for co in fl ]

    run_minio(identities)

def follower():
    co = None
    while True:
        time.sleep(1)
        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)
    my_identity = json.dumps({ "ip": os.environ['IP'], "path": make_data() })
    sock.send(f"{my_identity}\n".encode())
    identities = json.loads(co.readline())

    run_minio(identities)

def make_data():
    data_path = DATA_PATH(os.environ['ID'])
    os.makedirs(data_path)
    return data_path

def run_minio(identities):
    cmd = f"minio server --console-address ':9001' --address [{os.environ['IP']}]:9000"
    for ident in identities:
        cmd += f" http://[{ident['ip']}]:9000{ident['path']}"
    cmd += f" > {os.path.join(STORAGE_PATH, 'minio'+os.environ['ID']+'.log')} 2>&1"
    print("launch: ", cmd)
    os.system(cmd)

__name__ == '__main__' and main()