Skip to content
Snippets Groups Projects
schnapps 2.25 KiB
Newer Older
#!/usr/bin/env python3

import datetime
import argparse
import pathlib
import json
import random
import sys

PATH = pathlib.Path("/tmp/test-schnapps.json")


def load_data():
    if not PATH.exists():
        with PATH.open("w") as f:
            json.dump({"snapshots": []}, f)
    with PATH.open() as f:
        return json.load(f)


def store_data(data):
    with PATH.open("w") as f:
        json.dump(data, f)


def handle_list(options):
    print(json.dumps(load_data()))

    return 0


def handle_create(options):
    now = datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S +0000")
    data = load_data()
    new_id = max(e["number"] for e in data["snapshots"] or [{"number": 0}]) + 1
    data["snapshots"].append(
        {
            "number": new_id,
            "created": now,
            "type": options.t,
            "size": f"{random.randint(1, 100000) / 100}MiB",
            "description": options.descr,
        }
    )
    store_data(data)

    print(f"Snapshot number {new_id} created")

    return 0


def handle_delete(options):
    data = load_data()
    orig_len = len(data["snapshots"])
    data["snapshots"] = [e for e in data["snapshots"] if e["number"] != options.id]
    store_data(data)

    return 1 if orig_len == len(data["snapshots"]) else 0


def handle_rollback(options):
    data = load_data()
    ids = [e["number"] for e in data["snapshots"]]
    if options.id not in ids:
        return 1

    return 0


CMD_MAP = {
    "list": handle_list,
    "create": handle_create,
    "delete": handle_delete,
    "rollback": handle_rollback,
}


def main():

    parser = argparse.ArgumentParser(prog="schnapps")

    subcmds = parser.add_subparsers(dest="cmd")
    subcmds.required = True

    list_cmd = subcmds.add_parser("list")
    list_cmd.add_argument("-j", default=False, action="store_true")

    create_cmd = subcmds.add_parser("create")
    create_cmd.add_argument("-t", choices=["single"], required=True)
    create_cmd.add_argument("descr")

    delete_cmd = subcmds.add_parser("delete")
    delete_cmd.add_argument("id", type=int)

    rollback_cmd = subcmds.add_parser("rollback")
    rollback_cmd.add_argument("id", type=int)

    options = parser.parse_args()
    sys.exit(CMD_MAP[options.cmd](options))


if __name__ == "__main__":
    main()