示例#1
0
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))
示例#2
0
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))