From a13c37049a4a9c38ccc3acb0d78ed2717a29244c Mon Sep 17 00:00:00 2001 From: Quentin Date: Wed, 8 Dec 2021 15:43:59 +0100 Subject: [PATCH 1/6] Add minio, a README and some small enhancements --- README.md | 43 +++++++++++++++++++++++++++ example/deploy_garage.sh | 8 ++--- example/deploy_minio.py | 64 ++++++++++++++++++++++++++++++++++++++++ main.py | 6 ++-- 4 files changed, 115 insertions(+), 6 deletions(-) create mode 100644 README.md create mode 100755 example/deploy_minio.py diff --git a/README.md b/README.md new file mode 100644 index 0000000..270d616 --- /dev/null +++ b/README.md @@ -0,0 +1,43 @@ +# mknet + +Show usage: + +```help +python3 main.py +``` + +## Example + +```bash +sudo rm -rf /tmp/garage-testnet/ # always start by deleting previous run +sudo python3 main.py create ./config.yml +sudo python3 main.py run-all example/deploy_garage.sh +sudo python3 main.py run dc1:dc1s1 garage -c /tmp/garage-testnet/dc1/dc1s1/garage.toml status +sudo python3 main.py destroy +``` + +## Instrumented daemons + +If you want to use the scripts provided in the `example` folder, +you must add to your path some tools. + +### Garage (`deploy_garage.sh`) + +```bash +# see versions on https://garagehq.deuxfleurs.fr/_releases.html +export GRG_ARCH=x86_64-unknown-linux-musl +export GRG_VERSION=v0.5.0 + +sudo wget https://garagehq.deuxfleurs.fr/_releases/${GRG_VERSION}/${GRG_ARCH}/garage -O /usr/local/bin/garage +sudo chmod +x /usr/local/bin/garage + +garage help +``` + +### Minio (`deploy_minio.py`) + +``` +sudo wget https://dl.min.io/server/minio/release/linux-amd64/minio -O /usr/local/bin/minio +sudo chmod +x /usr/local/bin/minio +``` + diff --git a/example/deploy_garage.sh b/example/deploy_garage.sh index e91b387..0dc9b38 100755 --- a/example/deploy_garage.sh +++ b/example/deploy_garage.sh @@ -46,15 +46,15 @@ EOF RUST_LOG=garage=debug ${GARAGE_PATH} server 2>> ${NODE_STORAGE_PATH}/logs & disown sleep 2 -CONFIG_NODE_FPATH=(${STORAGE_PATH}/*{,/*}/garage.toml) +CONFIG_NODE_FPATH=$(find /tmp/garage-testnet/ -maxdepth 3 -name garage.toml|head -n 1) SELF_ID=$(${GARAGE_PATH} node id 2>/dev/null) SHORT_ID=$(echo ${SELF_ID} | cut -c-64) -${GARAGE_PATH} -c ${CONFIG_NODE_FPATH[0]} node connect ${SELF_ID} -${GARAGE_PATH} -c ${CONFIG_NODE_FPATH[0]} layout assign ${SHORT_ID} -z ${ZONE:-unzonned-${HOST}} -c 1 -t ${HOST} +${GARAGE_PATH} -c ${CONFIG_NODE_FPATH} node connect ${SELF_ID} +${GARAGE_PATH} -c ${CONFIG_NODE_FPATH} layout assign ${SHORT_ID} -z ${ZONE:-unzonned-${HOST}} -c 1 -t ${HOST} -if [ ${CONFIG_NODE_FPATH[0]} == ${GARAGE_CONFIG_FILE} ]; then +if [ ${CONFIG_NODE_FPATH} == ${GARAGE_CONFIG_FILE} ]; then sleep 2 ${GARAGE_PATH} layout show ${GARAGE_PATH} layout apply --version 1 diff --git a/example/deploy_minio.py b/example/deploy_minio.py new file mode 100755 index 0000000..8ee8430 --- /dev/null +++ b/example/deploy_minio.py @@ -0,0 +1,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() diff --git a/main.py b/main.py index c243a2f..456da52 100755 --- a/main.py +++ b/main.py @@ -1,4 +1,4 @@ -#!/bin/env python +#!/usr/bin/env python import ipaddress import os import shutil @@ -305,7 +305,7 @@ def run(netns, cmd): if len(cmd) == 0: cmd = [os.getenv("SHELL") or "/bin/sh"] - os.execve("/bin/env", ["/bin/env", "ip", "netns" , "exec", name ] + cmd, env) + os.execve("/usr/bin/env", ["/usr/bin/env", "ip", "netns" , "exec", name ] + cmd, env) def runall(cmd): with open(".current_state.yml", "r") as file: @@ -321,6 +321,7 @@ def runall(cmd): env["HOST"] = server.name env["IP"] = str(server.ip) env["ID"] = str(number) + env["SIZE"] = str(len(config['servers'])) name = f'testnet-{zone.name}-{server.name}' net.ns.run(name, cmd, env) number +=1 @@ -330,6 +331,7 @@ def runall(cmd): env["HOST"] = zone.name env["IP"] = str(zone.ip) env["ID"] = str(number) + env["SIZE"] = str(len(config['servers'])) name = f'testnet-{zone.name}-{zone.name}' net.ns.run(name, cmd, env) first = False From abccfb88b8cc873b4f399d38a3151bbbe12c360d Mon Sep 17 00:00:00 2001 From: Quentin Date: Wed, 8 Dec 2021 16:26:56 +0100 Subject: [PATCH 2/6] Make mknet installable via pip --- main.py => mknet | 11 ++++++----- setup.py | 6 ++++++ 2 files changed, 12 insertions(+), 5 deletions(-) rename main.py => mknet (97%) create mode 100644 setup.py diff --git a/main.py b/mknet similarity index 97% rename from main.py rename to mknet index 456da52..8eb276a 100755 --- a/main.py +++ b/mknet @@ -345,11 +345,12 @@ def destroy(): if __name__ == "__main__": if len(sys.argv) < 2: - print("""Usage: - mk-testnet create [config_path] # create a new network. config_path defailt to config.yml - mk-testnet run-all [args...] # run a command as each host. set the IP, NAME and ZONE environment variables - mk-testnet run [cmd [args...]] # run command in host named . Use zonename:name if multiple zones hosts server with same name. If cmd is empty, run a shell - mk-testnet destroy # destroy the current environment""") + progname = os.path.basename(sys.argv[0]) if len(sys.argv) > 0 else "mknet" + print(f"""Usage: + {progname} create [config_path] # create a new network. config_path defailt to config.yml + {progname} run-all [args...] # run a command as each host. set the IP, NAME and ZONE environment variables + {progname} run [cmd [args...]] # run command in host named . Use zonename:name if multiple zones hosts server with same name. If cmd is empty, run a shell + {progname} destroy # destroy the current environment""") exit() cmd = sys.argv[1] if cmd == "create": diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..fda29c5 --- /dev/null +++ b/setup.py @@ -0,0 +1,6 @@ +from distutils.core import setup +setup(name='mknet', + version='1.0', + scripts=['mknet'], + py_modules=['net'], + ) From 322e949de0b416118365fbfb9448e5e5a1be6b23 Mon Sep 17 00:00:00 2001 From: Quentin Date: Wed, 8 Dec 2021 16:30:28 +0100 Subject: [PATCH 3/6] Update documentation to use pip --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 270d616..43574e7 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,19 @@ # mknet -Show usage: +## Installation -```help -python3 main.py +```bash +sudo pip3 install https://git.deuxfleurs.fr/trinity-1686a/mknet ``` -## Example +## Usage ```bash sudo rm -rf /tmp/garage-testnet/ # always start by deleting previous run -sudo python3 main.py create ./config.yml -sudo python3 main.py run-all example/deploy_garage.sh -sudo python3 main.py run dc1:dc1s1 garage -c /tmp/garage-testnet/dc1/dc1s1/garage.toml status -sudo python3 main.py destroy +sudo mknet create ./config.yml +sudo mknet run-all example/deploy_garage.sh +sudo mknet run dc1:dc1s1 garage -c /tmp/garage-testnet/dc1/dc1s1/garage.toml status +sudo mknet destroy ``` ## Instrumented daemons From 69871eeee82c5e95e28fa94555a774d415cfdd90 Mon Sep 17 00:00:00 2001 From: Quentin Date: Wed, 8 Dec 2021 16:36:33 +0100 Subject: [PATCH 4/6] Remove MINIO_PATH --- example/deploy_minio.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/example/deploy_minio.py b/example/deploy_minio.py index 8ee8430..4488974 100755 --- a/example/deploy_minio.py +++ b/example/deploy_minio.py @@ -2,7 +2,6 @@ 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)) @@ -14,7 +13,6 @@ def main(): 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) From 1607ceaf5c6d2e5f9b8656dedd53049c66eaa079 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Wed, 8 Dec 2021 18:06:53 +0100 Subject: [PATCH 5/6] fix pip instruction --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 43574e7..92abc61 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ## Installation ```bash -sudo pip3 install https://git.deuxfleurs.fr/trinity-1686a/mknet +sudo pip3 install git+https://git.deuxfleurs.fr/trinity-1686a/mknet ``` ## Usage From 9719f4b294b4d295ed62848c3a82a5271eb86139 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Mon, 13 Dec 2021 10:53:42 +0100 Subject: [PATCH 6/6] Change env name + fix python casting --- example/deploy_minio.py | 4 ++-- mknet | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/example/deploy_minio.py b/example/deploy_minio.py index 4488974..431b983 100755 --- a/example/deploy_minio.py +++ b/example/deploy_minio.py @@ -19,7 +19,7 @@ def leader(): sock.bind(UNIX_SOCK) sock.listen() - n_serv = os.environ['SIZE'] + n_serv = int(os.environ['SERVER_COUNT']) 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() } ] @@ -52,7 +52,7 @@ def make_data(): return data_path def run_minio(identities): - cmd = f"minio server --console-address ':9001' --address [{os.environ['IP']}]:9000" + cmd = f"minio server --console-address ':9001' --address ':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" diff --git a/mknet b/mknet index 8eb276a..9081aeb 100755 --- a/mknet +++ b/mknet @@ -321,7 +321,7 @@ def runall(cmd): env["HOST"] = server.name env["IP"] = str(server.ip) env["ID"] = str(number) - env["SIZE"] = str(len(config['servers'])) + env["SERVER_COUNT"] = str(len(config['servers'])) name = f'testnet-{zone.name}-{server.name}' net.ns.run(name, cmd, env) number +=1 @@ -331,7 +331,7 @@ def runall(cmd): env["HOST"] = zone.name env["IP"] = str(zone.ip) env["ID"] = str(number) - env["SIZE"] = str(len(config['servers'])) + env["SERVER_COUNT"] = str(len(config['servers'])) name = f'testnet-{zone.name}-{zone.name}' net.ns.run(name, cmd, env) first = False