Skip to content

Commit 1a681dc

Browse files
committed
More modeller improvements
1 parent b25a85e commit 1a681dc

3 files changed

Lines changed: 87 additions & 64 deletions

File tree

enginecore/enginecore/model/system_modeler.py

Lines changed: 86 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ def remove_link(source_key, dest_key):
105105
"""
106106

107107
with graph_ref.get_session() as session:
108-
result = session.run("""
108+
session.run("""
109109
MATCH (src:Asset {key: $src_key})<-[power_link:POWERED_BY]-(dst:Asset {key: $dest_key})
110110
DELETE power_link
111111
""", src_key=source_key, dest_key=dest_key)
@@ -156,14 +156,18 @@ def link_assets(source_key, dest_key):
156156

157157

158158
def create_outlet(key, attr):
159-
"""Add outlet to the model """
159+
"""Add outlet to the model
160+
161+
Args:
162+
key(int): unique key to be assigned
163+
attr(dict): asset properties
164+
"""
160165

161166
with graph_ref.get_session() as session:
162167
attr['name'] = attr['name'] if 'name' in attr and attr['name'] else "out-{}".format(key)
163-
attr['type'] = 'outlet'
164-
attr['key'] = key
165168

166-
props_stm = _get_props_stm(attr, supported_attr=["name", "type", "key", "off_delay", "on_delay"])
169+
s_attr = ["name", "type", "key", "off_delay", "on_delay"]
170+
props_stm = _get_props_stm({**attr, **{'type': 'outlet', 'key': key}}, supported_attr=s_attr)
167171
session.run("CREATE (:Asset:Outlet {{ {} }})".format(props_stm))
168172

169173

@@ -486,95 +490,115 @@ def create_ups(key, attr, preset_file=os.path.join(os.path.dirname(__file__), 'p
486490
outkey=int("{}{}".format(key,str(i+1))))
487491

488492

493+
def _get_oid_desc_stm(oid_desc, oid_name):
494+
"""Format dict attributes as neo4j props"""
495+
496+
# existing = dict(
497+
# filter(lambda k: attr[k[0]] != None and (not supported_attr or k[0] in supported_attr), oid_desc.items())
498+
# )
499+
return 'OIDName: "{}",'.format(oid_name) + ','.join(map(lambda k: '{}: "{}"'.format(oid_desc[k], k), oid_desc))
489500

490501

491502
def create_pdu(key, attr, preset_file=os.path.join(os.path.dirname(__file__), 'presets/apc_pdu.json')):
492503
"""Add PDU to the model """
504+
493505
preset_file = attr['snmp_preset'] if 'snmp_preset' in attr and attr['snmp_preset'] else preset_file
494506
with open(preset_file) as f, graph_ref.get_session() as session:
507+
508+
query = []
495509
data = json.load(f)
496510
outlet_count = data['OIDs']['OutletCount']['defaultValue']
497-
name = attr['name'] if 'name' in attr and attr['name'] else data['assetName']
498511

499-
session.run("\
500-
CREATE (:Asset:PDU:SNMPSim { \
501-
name: $name,\
502-
key: $key,\
503-
staticOidFile: $oid_file,\
504-
type: 'pdu',\
505-
port: $port\
506-
})",
507-
key=key,
508-
name=name,
509-
oid_file=data['staticOidFile'],
510-
port=attr['port']
511-
)
512-
513-
set_properties(key, attr)
512+
attr['name'] = attr['name'] if 'name' in attr and attr['name'] else data['assetName']
513+
s_attr = ["name", "type", "key", "off_delay", "on_delay", "staticOidFile", "port", "host"]
514+
props_stm = _get_props_stm({**attr, **data, **{'key': key, 'type': 'pdu'}}, supported_attr=s_attr)
515+
516+
# create PDU asset
517+
query.append("CREATE (pdu:Asset:PDU:SNMPSim {{ {} }})".format(props_stm))
514518

515519
# Add PDU OIDS to the model
516520
for k, v in data["OIDs"].items():
517521
if k == 'SerialNumber':
518522
v['defaultValue'] = _generate_id()
519-
520523
if k == 'MAC':
521524
v['defaultValue'] = _generate_mac()
522525

523-
session.run("\
524-
MATCH (pdu:PDU {key: $pkey})\
525-
CREATE (oid:OID { \
526-
OID: $oid,\
527-
OIDName: $name,\
528-
name: $name, \
529-
defaultValue: $dv,\
530-
dataType: $dt \
531-
})<-[:HAS_OID]-(pdu)", pkey=key, oid=v['OID'], name=k, dv=v['defaultValue'], dt=v['dataType'])
526+
props_stm = _get_props_stm({**v, **{'OIDName': k}}, supported_attr=["OID", "OIDName", "defaultValue", "dataType"])
527+
query.append("CREATE (:OID {{ {props_stm} }})<-[:HAS_OID]-(pdu)".format(oid_name=k, props_stm=props_stm))
528+
529+
print("\n".join(query))
530+
session.run("\n".join(query))
532531

533532
# Outlet-specific OIDs
534533
for k, v in data["outletOIDs"].items():
535534

536535
if k == "OutletState":
537536
if 'oidDesc' in v:
538537
oid_desc = dict((y,x) for x,y in v["oidDesc"].items())
539-
query = "\
540-
CREATE (OutletStateDetails:OIDDesc {{\
541-
OIDName: $name, \
542-
{}: \"switchOn\",\
543-
{}: \"switchOff\", \
544-
{}: \"immediateReboot\",\
545-
{}: \"delayedOn\",\
546-
{}: \"delayedOff\"\
547-
}})\
548-
".format(
549-
oid_desc["switchOn"],
550-
oid_desc["switchOff"],
551-
oid_desc["immediateReboot"],
552-
oid_desc["delayedOn"],
553-
oid_desc["delayedOff"]
554-
)
555-
556-
session.run(query, name="{}-{}".format(k,key))
538+
539+
desc_stm = _get_oid_desc_stm(oid_desc, oid_name="{}-{}".format(k,key))
540+
query.append("CREATE (oidDesc:OIDDesc {{ {} }})<-[:HAS_OID]-(pdu)".format(desc_stm))
541+
542+
# query = "\
543+
# CREATE (OutletStateDetails:OIDDesc {{\
544+
# OIDName: $name, \
545+
# {}: \"switchOn\",\
546+
# {}: \"switchOff\", \
547+
# {}: \"immediateReboot\",\
548+
# {}: \"delayedOn\",\
549+
# {}: \"delayedOff\"\
550+
# }})\
551+
# ".format(
552+
# oid_desc["switchOn"],
553+
# oid_desc["switchOff"],
554+
# oid_desc["immediateReboot"],
555+
# oid_desc["delayedOn"],
556+
# oid_desc["delayedOff"]
557+
# )
558+
# print(query)
559+
560+
# session.run(query, name="{}-{}".format(k,key))
557561

558562
for j in range(outlet_count):
559-
session.run("\
560-
MATCH (pdu:PDU {key: $pkey})\
561-
CREATE (out1:Asset:Outlet:Component { \
562-
name: $outname,\
563-
key: $outkey,\
564-
type: 'outlet'\
565-
})\
566-
CREATE (out1)-[:POWERED_BY]->(pdu)\
567-
CREATE (pdu)-[:HAS_COMPONENT]->(out1)\
568-
",
569-
pkey=key,
570-
outname='out'+str(j+1),
571-
outkey=int("{}{}".format(key,str(j+1))))
563+
564+
out_key = int("{}{}".format(key,str(j+1)))
565+
props_stm = _get_props_stm({'key': out_key, 'name': 'out'+str(j+1), 'type': 'outlet'})
566+
567+
# create outlet per OID
568+
query.append("CREATE (out{}:Asset:Outlet:Component {{ {} }}".format(out_key, props_stm))
569+
570+
# set outlet relationships
571+
query.append("CREATE (out{})-[:POWERED_BY]->(pdu)".format(out_key))
572+
query.append("CREATE (pdu)-[:HAS_COMPONENT]->(out{})".format(out_key))
573+
574+
# session.run("\
575+
# MATCH (pdu:PDU {key: $pkey})\
576+
# CREATE (out1:Asset:Outlet:Component { \
577+
# name: $outname,\
578+
# key: $outkey,\
579+
# type: 'outlet'\
580+
# })\
581+
# CREATE (out1)-[:POWERED_BY]->(pdu)\
582+
# CREATE (pdu)-[:HAS_COMPONENT]->(out1)\
583+
# ",
584+
# pkey=key,
585+
# outname='out'+str(j+1),
586+
# outkey=int("{}{}".format(key,str(j+1))))
572587

573588

574589
for j in range(outlet_count):
575590
for oid in v['OID']:
591+
592+
out_key = int("{}{}".format(key,str(j+1)))
576593
oid = oid + "." + str(j+1)
577594

595+
596+
query.append("CREATE (oid:OID {{ {} }})")
597+
598+
query.append("CREATE (out{})-[:POWERED_BY]->(oid)".format(out_key))
599+
query.append("CREATE (oid)-[:HAS_STATE_DETAILS]->(oidDesc)")
600+
query.append("CREATE (pdu)-[:HAS_OID]->(oid)")
601+
578602
session.run("\
579603
MATCH (pdu:PDU {key: $pkey})\
580604
MATCH (oidDesc:OIDDesc {OIDName: $oid_desc})\

enginecore/enginecore/state/assets.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import os
1616
import pwd
1717
import grp
18-
import signal
1918
import tempfile
2019
import atexit
2120
import json

enginecore/enginecore/state/state_initializer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ def initialize(force_snmp_init=False):
1010
graph_ref = GraphReference()
1111
redis_store = redis.StrictRedis(host='localhost', port=6379)
1212

13-
results = graph_ref.get_session().run(
13+
results = graph_ref.get_session().run( # TODO: context manager
1414
"""
1515
MATCH (asset:Asset) OPTIONAL MATCH (asset:Asset)-[:HAS_OID]->(oid)
1616
return asset, collect(oid) as oids

0 commit comments

Comments
 (0)