def load_collector(key, _data): if _data["state"] == "running": state = colorize(_data["state"], color.GREEN) else: state = colorize(_data["state"], color.RED) line = [ " "+colorize(key, color.BOLD), state, "", fmt_tid(_data, stats_data), fmt_thr_tasks(key, stats_data), fmt_thr_cpu_usage(key, prev_stats_data, stats_data), fmt_thr_cpu_time(key, stats_data), "", "", "", "", "", "|" if nodenames else "", ] for nodename in nodenames: speaker = data["monitor"].get("nodes", {}).get(nodename, {}).get("speaker") if speaker: status = "up" status = colorize_status(status, lpad=0).replace(status, unicons[status]) else: status = "" line.append(status) out.append(line)
def load_daemon(): key = "daemon" state = colorize("running", color.GREEN) line = [ " "+colorize(key, color.BOLD), "%s" % state, "", str(data.get("pid", "")) if stats_data else "", "", fmt_thr_cpu_usage(key, prev_stats_data, stats_data), fmt_thr_cpu_time(key, stats_data), fmt_thr_mem_total(key, stats_data), "", "", "", "", "|" if nodenames else "", ] for nodename in nodenames: speaker = data["monitor"].get("nodes", {}).get(nodename, {}).get("speaker") if speaker: status = "up" status = colorize_status(status, lpad=0).replace(status, unicons[status]) else: status = "" line.append(status) out.append(line)
def test_colorize_status(): """ Status, colorization """ sta1 = Status() ret = colorize_status(sta1, lpad=0) assert ret == "undef" sta1 = 0 ret = colorize_status(sta1, lpad=0) assert ret == "up" sta1 = None ret = colorize_status(sta1, lpad=0) assert ret == "undef" sta1 = "warn" ret = colorize_status(sta1, lpad=0) assert ret == "warn" sta1 = "n/a" ret = colorize_status(sta1, lpad=0) assert ret == "n/a" sta1 = "unsupported" ret = colorize_status(sta1, lpad=0) assert ret == "unsupported"
def load_arbitrators(): if "arbitrators" not in sections: return arbitrators = [] arbitrators_name = {} for nodename, ndata in data["monitor"]["nodes"].items(): for aid, adata in ndata.get("arbitrators", {}).items(): if aid not in arbitrators: arbitrators.append(aid) arbitrators_name[aid] = adata["name"] if len(arbitrators) == 0: return load_header("Arbitrators") for aid in arbitrators: line = [ colorize(" " + arbitrators_name[aid], color.BOLD), "", "", "", "", "", "", "", "", "", "", "", "|" if nodenames else "", ] for nodename in nodenames: status = data["monitor"]["nodes"].get(nodename, {}).get( "arbitrators", {}).get(aid, {}).get("status", "undef") if status != "up": line[1] = colorize_status("warn", lpad=0) status = colorize_status(status, lpad=0).replace( status, unicons[status]) line.append(status) out.append(line) out.append([])
def load_hb(key, _data): state = _data.get("state", "") if state == "running": state = colorize(state, color.GREEN) else: state = colorize(state, color.RED) if _data.get("alerts"): state += colorize("!", color.BROWN) cf = _data.get("config", {}) addr = cf.get("addr", "") port = cf.get("port", "") dev = cf.get("dev", "") relay = cf.get("relay", "") if addr and port: config = addr + ":" + str(port) elif dev: config = os.path.basename(dev) elif relay: config = relay else: config = "" line = [ " " + colorize(key, color.BOLD), state, config, fmt_tid(_data, stats_data), fmt_thr_tasks(key, stats_data), fmt_thr_cpu_usage(key, prev_stats_data, stats_data), fmt_thr_cpu_time(key, stats_data), "", "", "", "", "", "|" if nodenames else "", ] peers = _data.get("peers", {}) for nodename in nodenames: beating = peers.get(nodename, {}).get("beating") if beating is None: status = "n/a" elif beating: status = "up" else: status = "down" status = colorize_status(status, lpad=0).replace(status, unicons[status]) line.append(status) out.append(line)
def colorize_json(s): import re from core.status import colorize_status s = re.sub( r'(")(error|ok|err|up|down|warn|n/a|stdby up|stdby down)(")', lambda m: m.group(1) + colorize_status(m.group(2), lpad=0) + m.group(3), s) s = re.sub(r'((?!"DEFAULT":)("[\w: ,@-]+":))', colorize(r'\1', color.LIGHTBLUE), s) s = re.sub(r'("DEFAULT":)( {)', colorize(r'\1', color.BROWN) + r'\2', s) s = re.sub(r'("[\w:-]+#[\w\.:-]+":)( {)', colorize(r'\1', color.BROWN) + r'\2', s) s = re.sub(r'(@[\w-]+)(":)', colorize(r'\1', color.RED) + colorize(r'\2', color.LIGHTBLUE), s) s = re.sub(r'({.+})', colorize(r'\1', color.GREEN), s) return s
def load_svc(path, prefix=""): if path not in services: return data = services[path] if path in slave_parents and prefix == "": return try: topology = services[path].topology except KeyError: topology = "" if services[path].get("drp", False): topology = "drp " + topology # status status = colorize_status(data["avail"], lpad=0) if data["overall"] == "warn": status += colorize("!", color.BROWN) if data["placement"] == "non-optimal": status += colorize("^", color.RED) # info info = { "topology": data.get("topology", ""), "orchestrate": data.get("orchestrate", "-"), "status": "%d/1" % data["n_up"] if data["n_up"] is not None else 0, } if data.get("scale") is not None: info["status"] = "%d/%d" % (data["n_up"], data.get("scale")) elif data.get("wrapper"): info = { "topology": "", "orchestrate": "", "status": "", } elif topology == "flex": info["status"] = "%d/%d" % (data["n_up"], data["flex_target"]) if data["avail"] == "n/a": info["status"] = "" info = "%(orchestrate)-5s %(status)-5s" % info line = [ " "+colorize(prefix+strip_path(path, os.environ.get("OSVC_NAMESPACE")), color.BOLD), status, info, fmt_svc_uptime(path, stats_data), fmt_svc_tasks(path, prev_stats_data), fmt_svc_cpu_usage(path, prev_stats_data, stats_data), fmt_svc_cpu_time(path, stats_data), fmt_svc_mem_total(path, stats_data), fmt_svc_blk_rb(path, stats_data), fmt_svc_blk_wb(path, stats_data), fmt_svc_blk_rbps(path, prev_stats_data, stats_data), fmt_svc_blk_wbps(path, prev_stats_data, stats_data), "|" if nodenames else "", ] if not nodenames: states = [] if data["frozen"] == "frozen": frozen = "frozen" elif data["frozen"] == "thawed": frozen = "" elif data["frozen"] == "n/a": frozen = "" elif data["frozen"] == "mixed": frozen = "part-frozen" else: frozen = "" if frozen: states.append(frozen) if data["provisioned"] is True: provisioned = "" elif data["provisioned"] is False: provisioned = "unprovisioned" elif data["provisioned"] == "n/a": provisioned = "" elif data["provisioned"] == "mixed": provisioned = "part-provisioned" else: provisioned = "" if provisioned: states.append(provisioned) mon_status_counts = {} ge = None for nodename in avail_nodenames: try: _data = data["nodes"][nodename] except KeyError: continue if _data is None: continue ge = _data.get("global_expect") st = _data.get("mon") if st not in ("idle", None): if st not in mon_status_counts: mon_status_counts[st] = 1 else: mon_status_counts[st] += 1 if ge: states.append(">"+ge) for s, n in mon_status_counts.items(): states.append("%s(%d)" % (s, n)) line.append(", ".join(states)) for nodename in nodenames: if nodename not in data["nodes"]: line.append("") elif data["nodes"][nodename] is None: line.append(colorize("?", color.RED)) elif data["nodes"][nodename] is not None: val = [] # frozen unicon if data["nodes"][nodename]["frozen"]: frozen_icon = colorize(unicons["frozen"], color.BLUE) else: frozen_icon = "" # avail status unicon if data["wrapper"]: avail_icon = "" else: avail = data["nodes"][nodename]["avail"] if avail == "unknown": avail_icon = colorize("?", color.RED) else: avail_icon = colorize_status(avail, lpad=0, agg_status=data["avail"]).replace(avail, unicons[avail]) if data["nodes"][nodename].get("preserved"): avail_icon += colorize("?", color.LIGHTBLUE) # overall status unicon if data["wrapper"]: overall_icon = "" else: overall = data["nodes"][nodename]["overall"] if overall == "warn": overall_icon = colorize_status(overall, lpad=0).replace(overall, unicons[overall]) else: overall_icon = "" # mon status smon = data["nodes"][nodename]["mon"] if smon == "idle": # don't display 'idle', as its to normal status and thus repeated as nauseam smon = "" else: smon = " " + smon # global expect if smon == "": global_expect = data["nodes"][nodename]["global_expect"] if global_expect: global_expect = colorize(" >" + str(global_expect), color.LIGHTBLUE) else: global_expect = "" else: global_expect = "" # leader if data["wrapper"]: leader = "" else: if data["nodes"][nodename]["placement"] == "leader": leader = colorize("^", color.LIGHTBLUE) else: leader = "" # provisioned if data["nodes"][nodename].get("provisioned") is False: provisioned = colorize("P", color.RED) else: provisioned = "" val.append(avail_icon) val.append(overall_icon) val.append(leader) val.append(frozen_icon) val.append(provisioned) val.append(smon) val.append(global_expect) line.append("".join(val)) out.append(line) for child in sorted(list(data.get("slaves", []))): load_svc(child, prefix=prefix+" ")