docker-nodepupper/nodepupper/nodeops.py

80 lines
2.1 KiB
Python
Raw Permalink Normal View History

2019-04-14 17:04:24 -07:00
from urllib.parse import urlparse
2018-10-08 22:31:05 -07:00
import ZODB
2019-04-12 14:39:34 -07:00
from relstorage.storage import RelStorage
from relstorage.options import Options
from relstorage.adapters.mysql import MySQLAdapter
2018-10-08 22:31:05 -07:00
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
2018-10-14 22:44:22 -07:00
def parent_names(self):
return [n.fqdn for n in self.parents]
2019-01-26 15:10:57 -08:00
def class_names(self):
return list(self.classes.keys())
2018-10-08 22:31:05 -07:00
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):
2019-04-14 17:04:24 -07:00
def __init__(self, db_uri):
uri = urlparse(db_uri)
2019-06-03 21:19:23 -07:00
self.mysql = MySQLAdapter(host=uri.hostname, port=uri.port,
user=uri.username, passwd=uri.password,
db=uri.path[1:], options=Options(keep_history=False))
2019-04-12 14:39:34 -07:00
self.storage = RelStorage(adapter=self.mysql)
2018-10-08 22:31:05 -07:00
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()
2019-05-07 19:44:20 -07:00
2019-05-08 08:49:17 -07:00
def rename_node(self, c, node, newname):
2019-05-07 19:44:20 -07:00
# 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
2019-05-08 22:33:04 -07:00
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