docker-nodepupper/nodepupper/nodeops.py

80 lines
2.1 KiB
Python

from urllib.parse import urlparse
import ZODB
from relstorage.storage import RelStorage
from relstorage.options import Options
from relstorage.adapters.mysql import MySQLAdapter
import persistent
import persistent.list
import persistent.mapping
import BTrees.OOBTree
def plist():
return persistent.list.PersistentList()
def pmap():
return persistent.mapping.PersistentMapping()
class NObject(persistent.Persistent):
def __init__(self, fqdn, body):
self.fqdn = fqdn
self.parents = plist()
self.classes = pmap()
self.body = body
def parent_names(self):
return [n.fqdn for n in self.parents]
def class_names(self):
return list(self.classes.keys())
class NClass(persistent.Persistent):
def __init__(self, name):
self.name = name
class NClassAttachment(persistent.Persistent):
def __init__(self, cls, conf):
self.cls = cls
self.conf = conf
class NodeOps(object):
def __init__(self, db_uri):
uri = urlparse(db_uri)
self.mysql = MySQLAdapter(host=uri.hostname, port=uri.port,
user=uri.username, passwd=uri.password,
db=uri.path[1:], options=Options(keep_history=False))
self.storage = RelStorage(adapter=self.mysql)
self.db = ZODB.DB(self.storage)
with self.db.transaction() as c:
if "nodes" not in c.root():
c.root.nodes = BTrees.OOBTree.BTree()
if "classes" not in c.root():
c.root.classes = BTrees.OOBTree.BTree()
def rename_node(self, c, node, newname):
# check new name isnt taken
if newname in c.root.nodes:
raise Exception(f"{newname} already exists")
# move in root
del c.root.nodes[node.fqdn]
node.fqdn = newname
c.root.nodes[node.fqdn] = node
def rename_cls(self, c, cls, newname):
# check new name isnt taken
if newname in c.root.classes:
raise Exception(f"{newname} already exists")
# move in root
del c.root.classes[cls.name]
cls.name = newname
c.root.classes[cls.name] = cls