コード例 #1
0
 def connect_twinax(self, o1: Object, c1: str, o2: Object, c2: str):
     """
     Connect twinax object o1 and virtual connection c1 to o2:c2
     """
     free_connections = []
     # Resolve virtual name c1 to real connection
     r_names = [
         o1.get_data("twinax", "connection%d" % i) for i in range(1, 3)
     ]
     # Check connection is already exists
     for n in r_names:
         cn, o, c = o1.get_p2p_connection(n)
         if not cn:
             free_connections += [n]
             continue
         if o.id == o2.id and c == c2:
             # Already connected
             return
     # Check twinax has free connection
     if not free_connections:
         self.logger.error("Twinax has no free connections")
         return
     # Connect first free to o2:c2
     c = free_connections[0]
     self.logger.info("Using twinax connection '%s' instead of '%s'", c, c1)
     self.connect_p2p(o1, c, o2, c2)
コード例 #2
0
    def _get_asset(o: Object):
        def get_asset_data(data):
            rd = {}
            for d in data:
                if d.interface not in rd:
                    rd[d.interface] = {}
                rd[d.interface][d.attr] = d.value
            return rd

        rev = o.get_data("asset", "revision")
        if rev == "None":
            rev = ""
        r = {
            "id": str(o.id),
            "model": {
                "id": str(o.model.id),
                "name": str(o.model.name),
                "vendor": {"id": str(o.model.vendor.id), "name": str(o.model.vendor.name)},
                "labels": [str(t) for t in o.model.labels or []],
                # Alias
                "tags": [str(t) for t in o.model.labels or []],
            },
            "serial": o.get_data("asset", "serial") or "",
            "revision": rev,
            "data": get_asset_data(o.data),
            "slots": [],
        }
        if_map = {c.name: c.interface_name for c in o.connections if c.interface_name}
        for n in o.model.connections:
            if n.direction == "i":
                c, r_object, _ = o.get_p2p_connection(n.name)
                r["slots"] += [
                    {
                        "name": n.name,
                        "direction": n.direction,
                        "protocols": [str(p) for p in n.protocols],
                    }
                ]
                if c:
                    r["slots"][-1]["asset"] = ManagedObjectDataStream._get_asset(r_object)
            elif n.direction == "s":
                r["slots"] += [
                    {
                        "name": n.name,
                        "direction": n.direction,
                        "protocols": [str(p) for p in n.protocols],
                    }
                ]
            if n.name in if_map:
                r["slots"][-1]["interface"] = if_map[n.name]
        return r
コード例 #3
0
 def resolve_object(self, name: str, m_c: str, t_object: Object, t_c: str,
                    serial: str) -> Optional["Object"]:
     """
     Resolve object type
     """
     # Check object is already exists
     c, object, c_name = t_object.get_p2p_connection(t_c)
     if c is not None:
         if c_name == m_c and object.get_data("asset", "serial") == serial:
             # Object with same serial number exists
             return object
         else:
             # Serial number/connection mismatch
             return None
     # Check connection type
     c = t_object.model.get_model_connection(t_c)
     if c is None:
         self.logger.error("Connection violation for %s SN %s", name,
                           serial)
         return None  # ERROR
     # Transceiver formfactor
     tp = c.type.name.split(" | ")
     ff = tp[1]
     m = "NoName | Transceiver | Unknown %s" % ff
     if name != "Unknown | Transceiver | Unknown":
         mtype = name[24:].upper().replace("-", "")
         if "BASE" in mtype:
             speed, ot = mtype.split("BASE", 1)
             spd = {"100": "100M", "1000": "1G", "10G": "10G"}.get(speed)
             if spd:
                 m = "NoName | Transceiver | %s | %s %s" % (spd, ff, ot)
             else:
                 self.logger.error("Unknown transceiver speed: %s", speed)
                 m = name
         else:
             m = name
     # Add vendor suffix when necessary
     if len(tp) == 3:
         m += " | %s" % tp[2]
     #
     if m in self.unk_model:
         model = self.unk_model[m]
     else:
         model = ObjectModel.objects.filter(name=m).first()
         self.unk_model[m] = model
     if not model:
         self.logger.error("Unknown model '%s'", m)
         self.register_unknown_part_no(self.get_vendor("NONAME"), m,
                                       "%s -> %s" % (name, m))
         return None
     # Create object
     self.logger.info("Creating new object. model='%s', serial='%s'", m,
                      serial)
     if self.object.container:
         container = self.object.container.id
     else:
         container = self.lost_and_found
     o = Object(
         model=model,
         data=[
             ObjectAttr(scope="",
                        interface="asset",
                        attr="serial",
                        value=serial)
         ],
         container=container,
     )
     o.save()
     o.log(
         "Created by asset_discovery",
         system="DISCOVERY",
         managed_object=self.object,
         op="CREATE",
     )
     return o