+def _FormatInstanceNicInfo(idx, nic):
+ """Helper function for L{_FormatInstanceInfo()}"""
+ (ip, mac, mode, link, _, netinfo) = nic
+ network_name = None
+ if netinfo:
+ network_name = netinfo["name"]
+ return [
+ ("nic/%d" % idx, ""),
+ ("MAC", str(mac)),
+ ("IP", str(ip)),
+ ("mode", str(mode)),
+ ("link", str(link)),
+ ("network", str(network_name)),
+ ]
+
+
+def _FormatInstanceNodesInfo(instance):
+ """Helper function for L{_FormatInstanceInfo()}"""
+ pgroup = ("%s (UUID %s)" %
+ (instance["pnode_group_name"], instance["pnode_group_uuid"]))
+ secs = utils.CommaJoin(("%s (group %s, group UUID %s)" %
+ (name, group_name, group_uuid))
+ for (name, group_name, group_uuid) in
+ zip(instance["snodes"],
+ instance["snodes_group_names"],
+ instance["snodes_group_uuids"]))
+ return [
+ [
+ ("primary", instance["pnode"]),
+ ("group", pgroup),
+ ],
+ [("secondaries", secs)],
+ ]
+
+
+def _GetVncConsoleInfo(instance):
+ """Helper function for L{_FormatInstanceInfo()}"""
+ vnc_bind_address = instance["hv_actual"].get(constants.HV_VNC_BIND_ADDRESS,
+ None)
+ if vnc_bind_address:
+ port = instance["network_port"]
+ display = int(port) - constants.VNC_BASE_PORT
+ if display > 0 and vnc_bind_address == constants.IP4_ADDRESS_ANY:
+ vnc_console_port = "%s:%s (display %s)" % (instance["pnode"],
+ port,
+ display)
+ elif display > 0 and netutils.IP4Address.IsValid(vnc_bind_address):
+ vnc_console_port = ("%s:%s (node %s) (display %s)" %
+ (vnc_bind_address, port,
+ instance["pnode"], display))
+ else:
+ # vnc bind address is a file
+ vnc_console_port = "%s:%s" % (instance["pnode"],
+ vnc_bind_address)
+ ret = "vnc to %s" % vnc_console_port
+ else:
+ ret = None
+ return ret
+
+
+def _FormatInstanceInfo(instance, roman_integers):
+ """Format instance information for L{cli.PrintGenericInfo()}"""
+ istate = "configured to be %s" % instance["config_state"]
+ if instance["run_state"]:
+ istate += ", actual state is %s" % instance["run_state"]
+ info = [
+ ("Instance name", instance["name"]),
+ ("UUID", instance["uuid"]),
+ ("Serial number",
+ str(compat.TryToRoman(instance["serial_no"], convert=roman_integers))),
+ ("Creation time", utils.FormatTime(instance["ctime"])),
+ ("Modification time", utils.FormatTime(instance["mtime"])),
+ ("State", istate),
+ ("Nodes", _FormatInstanceNodesInfo(instance)),
+ ("Operating system", instance["os"]),
+ ("Operating system parameters",
+ FormatParamsDictInfo(instance["os_instance"], instance["os_actual"])),
+ ]
+
+ if "network_port" in instance:
+ info.append(("Allocated network port",
+ str(compat.TryToRoman(instance["network_port"],
+ convert=roman_integers))))
+ info.append(("Hypervisor", instance["hypervisor"]))
+ console = _GetVncConsoleInfo(instance)
+ if console:
+ info.append(("console connection", console))
+ # deprecated "memory" value, kept for one version for compatibility
+ # TODO(ganeti 2.7) remove.
+ be_actual = copy.deepcopy(instance["be_actual"])
+ be_actual["memory"] = be_actual[constants.BE_MAXMEM]
+ info.extend([
+ ("Hypervisor parameters",
+ FormatParamsDictInfo(instance["hv_instance"], instance["hv_actual"])),
+ ("Back-end parameters",
+ FormatParamsDictInfo(instance["be_instance"], be_actual)),
+ ("NICs", [
+ _FormatInstanceNicInfo(idx, nic)
+ for (idx, nic) in enumerate(instance["nics"])
+ ]),
+ ("Disk template", instance["disk_template"]),
+ ("Disks", [
+ _FormatBlockDevInfo(idx, True, device, roman_integers)
+ for (idx, device) in enumerate(instance["disks"])
+ ]),
+ ])
+ return info