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)
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
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