partition-sim 0.1.0

Simulate network partitions in a docker cluster.
Documentation
#!/usr/bin/env python3

import uuid
import requests
import argparse
import socket
from pprint import pprint
import os


def my_local_ip():
    return socket.gethostbyname(socket.getfqdn())


def parse_args():
    parser = argparse.ArgumentParser("Register a service with Consul")
    parser.add_argument(
        "--consul-base-url",
        type=str,
        default=f'http://{os.getenv("CONSUL_ADDR", "127.0.0.1")}:8500',
        help="Base URL (without trailing slash) for the Consul HTTP API"
    )
    parser.add_argument(
        "--name",
        type=str,
        required=True,
        help="Name of the service to register"
    )
    parser.add_argument(
        "--port",
        type=int,
        nargs="+",
        required=True,
        help="Ports for the service to register"
    )
    parser.add_argument(
        "--address",
        type=str,
        default=my_local_ip(),
        help="Address of the service to register"
    )
    return parser.parse_args()



def main():
    args = parse_args()
    for port in args.port:
        output = register_service(
            name=args.name,
            id=f"{args.name}-{str(args.address)}-{str(port)}",
            port=port,
            address=args.address,
            base_url=args.consul_base_url
        )
        pprint(output)


def register_service(
    base_url: str,
    name: str,
    id: str,
    port: int,
    address: str
):
    data = {
        "Name": name,
        "ID": id,
        "Port": port,
        "Address": address,
        "Check": {
            "DeregisterCriticalServiceAfter": "15s",
            "HTTP": f"http://{address}:{port}/health",
            "Interval": "10s"
        },
        "Meta": {
            "raft-infra-test-node": "true"
        }
    }
    pprint(data, indent=4)
    response = requests.put(
        f"{base_url}/v1/agent/service/register",
        json=data,
        headers={"Content-Type": "application/json"}
    )
    response.raise_for_status()
    return response


if __name__ == '__main__':
    main()