@@ -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
158158def 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
491502def 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})\
0 commit comments