diff --git a/lib/cmdlib.py b/lib/cmdlib.py index 09d2bbcf247575f0a15f2031db4fe0cfbe15aebf..333de53d6aee879e7d31aed42f89f73081b3e655 100644 --- a/lib/cmdlib.py +++ b/lib/cmdlib.py @@ -2224,7 +2224,7 @@ class LUQueryNodes(NoHooksLU): "name", "pinst_cnt", "sinst_cnt", "pinst_list", "sinst_list", "pip", "sip", "tags", - "serial_no", + "serial_no", "ctime", "mtime", "master_candidate", "master", "offline", @@ -2348,6 +2348,10 @@ class LUQueryNodes(NoHooksLU): val = list(node.GetTags()) elif field == "serial_no": val = node.serial_no + elif field == "ctime": + val = node.ctime + elif field == "mtime": + val = node.mtime elif field == "master_candidate": val = node.master_candidate elif field == "master": @@ -3042,6 +3046,8 @@ class LUQueryClusterInfo(NoHooksLU): "master_netdev": cluster.master_netdev, "volume_group_name": cluster.volume_group_name, "file_storage_dir": cluster.file_storage_dir, + "ctime": cluster.ctime, + "mtime": cluster.mtime, } return result @@ -3919,7 +3925,9 @@ class LUQueryInstances(NoHooksLU): r"(nic)\.(bridge)/([0-9]+)", r"(nic)\.(macs|ips|modes|links|bridges)", r"(disk|nic)\.(count)", - "serial_no", "hypervisor", "hvparams",] + + "serial_no", "hypervisor", "hvparams", + "ctime", "mtime", + ] + ["hv/%s" % name for name in constants.HVS_PARAMETERS] + ["be/%s" % name @@ -4104,6 +4112,10 @@ class LUQueryInstances(NoHooksLU): val = list(instance.GetTags()) elif field == "serial_no": val = instance.serial_no + elif field == "ctime": + val = instance.ctime + elif field == "mtime": + val = instance.mtime elif field == "network_port": val = instance.network_port elif field == "hypervisor": @@ -6734,6 +6746,9 @@ class LUQueryInstanceData(NoHooksLU): "hv_actual": cluster.FillHV(instance), "be_instance": instance.beparams, "be_actual": cluster.FillBE(instance), + "serial_no": instance.serial_no, + "mtime": instance.mtime, + "ctime": instance.ctime, } result[instance.name] = idict diff --git a/man/gnt-instance.sgml b/man/gnt-instance.sgml index 7b907d0f451ccf6ca549cf7d81f659704e5fda8b..17a8073748c8ab5e81ce3863cac5dc22ece18d75 100644 --- a/man/gnt-instance.sgml +++ b/man/gnt-instance.sgml @@ -986,6 +986,34 @@ instance5: 11225 to track modifications</simpara> </listitem> </varlistentry> + <varlistentry> + <term>ctime</term> + <listitem> + <para> + the creation time of the instance; note that this + field contains spaces and as such it's harder to parse + </para> + <para> + if this attribute is not present (e.g. when upgrading + from older versions), then "N/A" will be shown instead + </para> + </listitem> + </varlistentry> + <varlistentry> + <term>mtime</term> + <listitem> + <para> + the last modification time of the instance; note that + this field contains spaces and as such it's harder to + parse + </para> + <para> + if this attribute is not present (e.g. when upgrading + from older versions), then "N/A" will be shown instead + </para> + </listitem> + </varlistentry> + <varlistentry> <term>network_port</term> <listitem> diff --git a/man/gnt-node.sgml b/man/gnt-node.sgml index 840d31ef27bb56d24d0ad1a5163be1741a6336c4..d60810e3c3127f6dab5ce73037683019bb782a37 100644 --- a/man/gnt-node.sgml +++ b/man/gnt-node.sgml @@ -379,12 +379,38 @@ <varlistentry> <term>serial_no</term> <listitem> - <simpara>the so called 'serial number' of the instance; + <simpara>the so called 'serial number' of the node; this is a numeric field that is incremented each time - the instance is modified, and it can be used to detect + the node is modified, and it can be used to detect modifications</simpara> </listitem> </varlistentry> + <varlistentry> + <term>ctime</term> + <listitem> + <para> + the creation time of the node; note that this field + contains spaces and as such it's harder to parse + </para> + <para> + if this attribute is not present (e.g. when upgrading + from older versions), then "N/A" will be shown instead + </para> + </listitem> + </varlistentry> + <varlistentry> + <term>mtime</term> + <listitem> + <para> + the last modification time of the node; note that this + field contains spaces and as such it's harder to parse + </para> + <para> + if this attribute is not present (e.g. when upgrading + from older versions), then "N/A" will be shown instead + </para> + </listitem> + </varlistentry> <varlistentry> <term>ctotal</term> <listitem> diff --git a/scripts/gnt-cluster b/scripts/gnt-cluster index b2594fc4c05b10cb2493d141b56099b29990c1f6..0ac37fc5ad5dd55623ce330a8d31b6453c394b18 100755 --- a/scripts/gnt-cluster +++ b/scripts/gnt-cluster @@ -221,6 +221,9 @@ def ShowClusterConfig(opts, args): ToStdout("Cluster name: %s", result["name"]) + ToStdout("Creation time: %s", utils.FormatTime(result["ctime"])) + ToStdout("Modification time: %s", utils.FormatTime(result["mtime"])) + ToStdout("Master node: %s", result["master"]) ToStdout("Architecture (this node): %s (%s)", diff --git a/scripts/gnt-instance b/scripts/gnt-instance index f89e49754c782249c417712b563966069da1034c..aeb6189228c0ba42cc77e7f6122f160ea3e05cfa 100755 --- a/scripts/gnt-instance +++ b/scripts/gnt-instance @@ -27,6 +27,7 @@ import sys import os import itertools import simplejson +import time from optparse import make_option from cStringIO import StringIO @@ -226,6 +227,7 @@ def ListInstances(opts, args): "nic.count": "NICs", "nic.ips": "NIC_IPs", "nic.modes": "NIC_modes", "nic.links": "NIC_links", "nic.bridges": "NIC_bridges", "nic.macs": "NIC_MACs", + "ctime": "CTime", "mtime": "MTime", } else: headers = None @@ -260,6 +262,8 @@ def ListInstances(opts, args): elif field == "sda_size" or field == "sdb_size": if val is None: val = "N/A" + elif field == "ctime" or field == "mtime": + val = utils.FormatTime(val) elif field in list_type_fields: val = ",".join(str(item) for item in val) elif val is None: @@ -1169,6 +1173,9 @@ def ShowInstanceConfig(opts, args): for instance_name in result: instance = result[instance_name] buf.write("Instance name: %s\n" % instance["name"]) + buf.write("Serial number: %s\n" % instance["serial_no"]) + buf.write("Creation time: %s\n" % utils.FormatTime(instance["ctime"])) + buf.write("Modification time: %s\n" % utils.FormatTime(instance["mtime"])) buf.write("State: configured to be %s" % instance["config_state"]) if not opts.static: buf.write(", actual state is %s" % instance["run_state"]) diff --git a/scripts/gnt-node b/scripts/gnt-node index 6b0302c3057303d8632c7dbd06cb4e059ad3dd7e..29c9a1e05706605a702ac3dc3cfdef4506e7cb9c 100755 --- a/scripts/gnt-node +++ b/scripts/gnt-node @@ -57,6 +57,7 @@ _LIST_HEADERS = { "master": "IsMaster", "offline": "Offline", "drained": "Drained", "role": "Role", + "ctime": "CTime", "mtime": "MTime", } #: User-facing storage unit types @@ -175,6 +176,8 @@ def ListNodes(opts, args): val = 'Y' else: val = 'N' + elif field == "ctime" or field == "mtime": + val = utils.FormatTime(val) elif val is None: val = "?" row[idx] = str(val)