From 019f8a5e32ff0f8c442bed8edf4d58a0c91016b3 Mon Sep 17 00:00:00 2001 From: dave Date: Wed, 8 May 2019 08:49:17 -0700 Subject: [PATCH] api rename classes --- nodepupper/daemon.py | 19 ++++++++++++++----- nodepupper/nodeops.py | 2 +- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/nodepupper/daemon.py b/nodepupper/daemon.py index 58aeb32..d12359b 100644 --- a/nodepupper/daemon.py +++ b/nodepupper/daemon.py @@ -95,7 +95,7 @@ class AppWeb(object): if name and fqdn: # existing node obj = c.root.nodes[fqdn] if name != fqdn: - self.nodes.rename(c, obj, name) + self.nodes.rename_node(c, obj, name) else: # new node if name in c.root.nodes: raise Exception("node already exists") @@ -162,32 +162,41 @@ class NodesApi(object): self.nodes = nodedb def GET(self, node=None): + cherrypy.response.headers["Content-type"] = "text/plain" with self.nodes.db.transaction() as c: if not node: - yield yamldump({"nodes": list(c.root.nodes.keys())}) - return + return yamldump({"nodes": list(c.root.nodes.keys())}) node = c.root.nodes[node] output = { + "fqdn": node.fqdn, "body": yaml.load(node.body), "parents": node.parent_names(), "classes": {clsname: yaml.load(clsa.conf) for clsname, clsa in node.classes.items()} } - yield yamldump(output) + return yamldump(output) def PUT(self, node): nodeyaml = yaml.load(cherrypy.request.body.read().decode('utf-8')) with self.nodes.db.transaction() as c: + # load node newnode = c.root.nodes.get(node) + # do renaming if required + if newnode and nodeyaml["fqdn"] != newnode.fqdn: + self.nodes.rename_node(c, newnode, nodeyaml["fqdn"]) + # create node if one wasn't found if not newnode: newnode = c.root.nodes[node] = NObject(node, "{}") - newnode.body = yamldump(nodeyaml["body"]) + # restore class links newnode.classes.clear() for clsname, clsbody in nodeyaml["classes"].items(): newnode.classes[clsname] = NClassAttachment(c.root.classes[clsname], yamldump(clsbody)) + # restore parent links newnode.parents.clear() for parent in nodeyaml["parents"]: newnode.parents.append(c.root.nodes[parent]) + # update body + newnode.body = yamldump(nodeyaml["body"]) def DELETE(self, node): with self.nodes.db.transaction() as c: diff --git a/nodepupper/nodeops.py b/nodepupper/nodeops.py index 01fb063..31ea0b7 100644 --- a/nodepupper/nodeops.py +++ b/nodepupper/nodeops.py @@ -57,7 +57,7 @@ class NodeOps(object): if "classes" not in c.root(): c.root.classes = BTrees.OOBTree.BTree() - def rename(self, c, node, newname): + def rename_node(self, c, node, newname): # check new name isnt taken if newname in c.root.nodes: raise Exception(f"{newname} already exists")