aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQuentin <quentin@deuxfleurs.fr>2021-12-08 15:43:59 +0100
committerQuentin <quentin@deuxfleurs.fr>2021-12-08 15:43:59 +0100
commita13c37049a4a9c38ccc3acb0d78ed2717a29244c (patch)
tree604a4881805abbaa59b7e421c3b8f92fb2c5ed7f
parent79bd5f17a68232b7fde4f1c8986ce2b24456d040 (diff)
downloadmknet-a13c37049a4a9c38ccc3acb0d78ed2717a29244c.tar.gz
mknet-a13c37049a4a9c38ccc3acb0d78ed2717a29244c.zip
Add minio, a README and some small enhancements
-rw-r--r--README.md43
-rwxr-xr-xexample/deploy_garage.sh8
-rwxr-xr-xexample/deploy_minio.py64
-rwxr-xr-xmain.py6
4 files changed, 115 insertions, 6 deletions
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