def create_pdu( key, attr, preset_file=os.path.join(os.path.dirname(__file__), "presets/apc_pdu.json"), ): """Add PDU to the model """ preset_file = (attr["snmp_preset"] if "snmp_preset" in attr and attr["snmp_preset"] else preset_file) with open( preset_file) as preset_handler, GRAPH_REF.get_session() as session: query = [] data = json.load(preset_handler) outlet_count = data["OIDs"]["OutletCount"]["defaultValue"] attr["name"] = (attr["name"] if "name" in attr and attr["name"] else data["assetName"]) s_attr = [ "staticOidFile", "port", "host", "interface", "mask", ] + CREATE_SHARED_ATTR props_stm = qh.get_props_stm( { **attr, **data, **{ "key": key, "type": "pdu" } }, supported_attr=s_attr) # create PDU asset query.append( "CREATE (pdu:Asset:PDU:SNMPSim {{ {} }})".format(props_stm)) # Add PDU OIDS to the model for oid_key, oid_props in data["OIDs"].items(): if "serial_number" in attr and attr["serial_number"]: oid_props["defaultValue"] = attr["serial_number"] else: oid_props["defaultValue"] = qh.generate_id() if oid_key == "MAC": if "mac_address" in attr and attr["mac_address"]: oid_props["defaultValue"] = attr["mac_address"] else: oid_props["defaultValue"] = qh.generate_mac() s_attr = ["OID", "OIDName", "defaultValue", "dataType"] props_stm = qh.get_props_stm({ **oid_props, **{ "OIDName": oid_key } }, supported_attr=s_attr) query.append( "CREATE (:OID {{ {props_stm} }})<-[:HAS_OID]-(pdu)".format( props_stm=props_stm)) # Outlet-specific OIDs for oid_key, oid_props in data["outletOIDs"].items(): # For outlet state, Outlet asset will need to be created if oid_key == "OutletState": oid_desc = dict( (y, x) for x, y in oid_props["oidDesc"].items()) desc_stm = qh.get_oid_desc_stm(oid_desc) query.append( "CREATE (oidDesc:OIDDesc {{ {} }})".format(desc_stm)) for j in range(outlet_count): out_key = int("{}{}".format(key, str(j + 1))) props_stm = qh.get_props_stm({ "key": out_key, "name": "out" + str(j + 1), "type": "outlet" }) # create outlet per OID query.append( "CREATE (out{}:Asset:Outlet:Component {{ {} }})". format(out_key, props_stm)) # set outlet relationships query.append( "CREATE (out{})-[:POWERED_BY]->(pdu)".format(out_key)) query.append( "CREATE (pdu)-[:HAS_COMPONENT]->(out{})".format( out_key)) # create OID associated with outlet & pdu for oid_n, oid in enumerate(oid_props["OID"]): out_key = int("{}{}".format(key, str(j + 1))) oid = oid + "." + str(j + 1) oid_node_name = "{oid_name}{outlet_num}{oid_num}".format( oid_name=oid_key, outlet_num=j, oid_num=oid_n) props_stm = qh.get_props_stm({ "OID": oid, "OIDName": oid_key, "dataType": oid_props["dataType"], "defaultValue": oid_props["defaultValue"], }) query.append( "CREATE ({oid_node_name}:OID {{ {props_stm} }})". format(oid_node_name=oid_node_name, props_stm=props_stm)) # set the relationships (outlet powerd by state oid etc..) query.append( "CREATE (out{})-[:POWERED_BY]->({})".format( out_key, oid_node_name)) query.append( "CREATE ({})-[:HAS_STATE_DETAILS]->(oidDesc)". format(oid_node_name)) query.append("CREATE (pdu)-[:HAS_OID]->({})".format( oid_node_name)) else: oid = oid_props["OID"] props_stm = qh.get_props_stm({ "OID": oid, "OIDName": oid_key, "dataType": oid_props["dataType"], "defaultValue": oid_props["defaultValue"], }) query.append("CREATE ({}:OID {{ {} }})".format( oid_key, props_stm)) query.append("CREATE (pdu)-[:HAS_OID]->({})".format(oid_key)) # print("\n".join(query)) session.run("\n".join(query))
def create_ups( key, attr, preset_file=os.path.join(os.path.dirname(__file__), "presets/apc_ups.json"), ): """Add UPS to the system model """ preset_file = (attr["snmp_preset"] if "snmp_preset" in attr and attr["snmp_preset"] else preset_file) with open( preset_file) as preset_handler, GRAPH_REF.get_session() as session: query = [] data = json.load(preset_handler) attr["name"] = (attr["name"] if "name" in attr and attr["name"] else data["assetName"]) attr["runtime"] = json.dumps(data["modelRuntime"], sort_keys=True) s_attr = [ "staticOidFile", "port", "host", "outputPowerCapacity", "minPowerOnBatteryLevel", "fullRechargeTime", "runtime", "power_source", "power_consumption", "work_dir", "interface", "mask", ] + CREATE_SHARED_ATTR props_stm = qh.get_props_stm( { **attr, **data, **{ "key": key, "type": "ups" } }, supported_attr=s_attr) # create UPS asset query.append( "CREATE (ups:Asset:UPS:SNMPSim {{ {} }})".format(props_stm)) # add batteries (only one for now) query.append( "CREATE (bat:UPSBattery:Battery { name: 'bat1', type: 'battery' })" ) query.append("CREATE (ups)-[:HAS_BATTERY]->(bat)") query.append("CREATE (ups)-[:POWERED_BY]->(bat)") # Add UPS OIDs for oid_key, oid_props in data["OIDs"].items(): if oid_key == "SerialNumber": if "serial_number" in attr and attr["serial_number"]: oid_props["defaultValue"] = attr["serial_number"] else: oid_props["defaultValue"] = qh.generate_id() if oid_key == "MAC": if "mac_address" in attr and attr["mac_address"]: oid_props["defaultValue"] = attr["mac_address"] else: oid_props["defaultValue"] = qh.generate_mac() props = {**oid_props, **{"OIDName": oid_key}} props_stm = qh.get_props_stm( props, ["OID", "dataType", "defaultValue", "OIDName"]) query.append("CREATE ({}:OID {{ {} }})".format(oid_key, props_stm)) query.append("CREATE (ups)-[:HAS_OID]->({})".format(oid_key)) if "oidDesc" in oid_props and oid_props["oidDesc"]: oid_desc = dict( (y, x) for x, y in oid_props["oidDesc"].items()) desc_stm = qh.get_oid_desc_stm(oid_desc) query.append("CREATE ({}Desc:OIDDesc {{ {} }})".format( oid_key, desc_stm)) query.append( "CREATE ({})-[:HAS_STATE_DETAILS]->({}Desc)".format( oid_key, oid_key)) if oid_key == "PowerOff": query.append( "CREATE (ups)-[:POWERED_BY]->({})".format(oid_key)) # Set output outlets for i in range(data["numOutlets"]): props = { "name": "out" + str(i + 1), "type": "outlet", "key": int("{}{}".format(key, str(i + 1))), } props_stm = qh.get_props_stm(props) query.append( "CREATE (out{}:Asset:Outlet:Component {{ {} }})".format( i, props_stm)) query.append("CREATE (ups)-[:HAS_COMPONENT]->(out{})".format(i)) query.append("CREATE (out{})-[:POWERED_BY]->(ups)".format(i)) session.run("\n".join(query))