From 855cbcc4abfb10974a12e7761c2d1aa67de0c641 Mon Sep 17 00:00:00 2001 From: dave Date: Mon, 15 Apr 2019 21:36:44 -0700 Subject: [PATCH] import/export cli. v0.0.2 --- Dockerfile | 2 -- nodepupper/cli.py | 21 +++++++++++++++++++++ nodepupper/daemon.py | 3 ++- setup.py | 2 +- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 2dcb968..7bb5d8e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -28,8 +28,6 @@ RUN pip3 install -U pip && \ python3 setup.py install && \ useradd --uid 1000 app -VOLUME /data/ - ADD start /start ENTRYPOINT ["/start"] diff --git a/nodepupper/cli.py b/nodepupper/cli.py index a7560d4..f890516 100644 --- a/nodepupper/cli.py +++ b/nodepupper/cli.py @@ -8,6 +8,9 @@ import tempfile import subprocess +import sys + + APPNAME = "npcli" CONFDIR = user_config_dir(APPNAME) CONFPATH = os.path.join(CONFDIR, "conf.json") @@ -74,6 +77,9 @@ def main(): spr_dump = spr_action.add_parser("dump", help="dump the database") + spr_import = spr_action.add_parser("import", help="import a database dump") + spr_import.add_argument("fname", help="db dump yaml file to import") + args = parser.parse_args() r = requests.session() @@ -131,6 +137,21 @@ def main(): print(yaml.dump(dump, default_flow_style=False)) + elif args.action == "import": + with open(args.fname) as f: + dump = yaml.load(f) + + for clsname in dump["classes"]: + r.put(args.host.rstrip("/") + "/api/class/" + clsname).raise_for_status() + + # just make the nodes first + for nodename, nodebody in dump["nodes"].items(): + putnode(nodename, yaml.dump({"body": {}, "classes": {}, "parents": []})).raise_for_status() + + # then fill out node bodies to avoid missing parent ordering issues + for nodename, nodebody in dump["nodes"].items(): + putnode(nodename, yaml.dump(nodebody)).raise_for_status() + if __name__ == "__main__": main() diff --git a/nodepupper/daemon.py b/nodepupper/daemon.py index 3e29eef..86e8fd5 100644 --- a/nodepupper/daemon.py +++ b/nodepupper/daemon.py @@ -206,7 +206,8 @@ class ClassesApi(object): def PUT(self, cls): with self.nodes.db.transaction() as c: - c.root.classes[cls] = NClass(cls) + if cls not in c.root.classes: + c.root.classes[cls] = NClass(cls) def DELETE(self, cls): with self.nodes.db.transaction() as c: diff --git a/setup.py b/setup.py index f89b109..4533b31 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ from setuptools import setup import os -__version__ = "0.0.1" +__version__ = "0.0.2" with open(os.path.join(os.path.dirname(__file__), "requirements.txt")) as f: __requirements__ = [line.strip() for line in f.readlines()]