From 130a6a6ff0223537219f70aea30ee14136e81040 Mon Sep 17 00:00:00 2001
From: Iustin Pop <iustin@google.com>
Date: Sun, 22 Jun 2008 10:57:52 +0000
Subject: [PATCH] =?UTF-8?q?Add=20a=20=E2=80=98tags=E2=80=99=20field=20to?=
 =?UTF-8?q?=20instance=20and=20node=20listing?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Currently there isn't any easy way to list all nodes or instance and
their tags; you have to query each node in turn, or list all the tags
via something like β€œgnt-cluster search-tags '.*'”. Of course, this is
not optimal.

The patch adds a new fields to β€œgnt-instance list” and β€œgnt-node list”
called β€˜tags’, that will list the tags of the object in comma-separated
form. This field will be empty if there are no tags (when using a
separator this output can still be parsed by other scripts).

At opcode level, there is a new fields called β€˜tags’ that returns a
(python) list of the object tags.

Reviewed-by: ultrotter
---
 lib/cmdlib.py         | 8 ++++++--
 man/gnt-instance.sgml | 7 +++++++
 man/gnt-node.sgml     | 7 +++++++
 scripts/gnt-instance  | 5 ++++-
 scripts/gnt-node      | 6 +++---
 5 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/lib/cmdlib.py b/lib/cmdlib.py
index 1789d2006..cf028bcd5 100644
--- a/lib/cmdlib.py
+++ b/lib/cmdlib.py
@@ -1271,7 +1271,7 @@ class LUQueryNodes(NoHooksLU):
 
     _CheckOutputFields(static=["name", "pinst_cnt", "sinst_cnt",
                                "pinst_list", "sinst_list",
-                               "pip", "sip"],
+                               "pip", "sip", "tags"],
                        dynamic=self.dynamic_fields,
                        selected=self.op.output_fields)
 
@@ -1342,6 +1342,8 @@ class LUQueryNodes(NoHooksLU):
           val = node.primary_ip
         elif field == "sip":
           val = node.secondary_ip
+        elif field == "tags":
+          val = list(node.GetTags())
         elif field in self.dynamic_fields:
           val = live_data[node.name].get(field, None)
         else:
@@ -2488,7 +2490,7 @@ class LUQueryInstances(NoHooksLU):
     _CheckOutputFields(static=["name", "os", "pnode", "snodes",
                                "admin_state", "admin_ram",
                                "disk_template", "ip", "mac", "bridge",
-                               "sda_size", "sdb_size", "vcpus"],
+                               "sda_size", "sdb_size", "vcpus", "tags"],
                        dynamic=self.dynamic_fields,
                        selected=self.op.output_fields)
 
@@ -2581,6 +2583,8 @@ class LUQueryInstances(NoHooksLU):
             val = disk.size
         elif field == "vcpus":
           val = instance.vcpus
+        elif field == "tags":
+          val = list(instance.GetTags())
         else:
           raise errors.ParameterError(field)
         iout.append(val)
diff --git a/man/gnt-instance.sgml b/man/gnt-instance.sgml
index d1f8a9444..0095fbf9a 100644
--- a/man/gnt-instance.sgml
+++ b/man/gnt-instance.sgml
@@ -575,6 +575,13 @@
                 instance</simpara>
               </listitem>
             </varlistentry>
+            <varlistentry>
+              <term>tags</term>
+              <listitem>
+                <simpara>comma-separated list of the instances's
+                tags</simpara>
+              </listitem>
+            </varlistentry>
           </variablelist>
         </para>
 
diff --git a/man/gnt-node.sgml b/man/gnt-node.sgml
index cae8a8f4b..65b8d81f5 100644
--- a/man/gnt-node.sgml
+++ b/man/gnt-node.sgml
@@ -326,6 +326,13 @@
               changes in this value)</simpara>
             </listitem>
           </varlistentry>
+          <varlistentry>
+            <term>tags</term>
+            <listitem>
+              <simpara>comma-separated list of the node's
+              tags</simpara>
+            </listitem>
+          </varlistentry>
         </variablelist>
       </para>
 
diff --git a/scripts/gnt-instance b/scripts/gnt-instance
index 497a528a7..06caf943f 100755
--- a/scripts/gnt-instance
+++ b/scripts/gnt-instance
@@ -188,7 +188,7 @@ def ListInstances(opts, args):
       "ip": "IP Address", "mac": "MAC Address",
       "bridge": "Bridge", "vcpus": "VCPUs",
       "sda_size": "Disk/0", "sdb_size": "Disk/1",
-      "status": "Status",
+      "status": "Status", "tags": "Tags",
       }
   else:
     headers = None
@@ -200,6 +200,7 @@ def ListInstances(opts, args):
 
   numfields = ["admin_ram", "oper_ram", "sda_size", "sdb_size", "vcpus"]
 
+  list_type_fields = ("tags",)
   # change raw values to nicer strings
   for row in output:
     for idx, field in enumerate(selected_fields):
@@ -224,6 +225,8 @@ def ListInstances(opts, args):
       elif field == "sda_size" or field == "sdb_size":
         if val is None:
           val = "N/A"
+      elif field in list_type_fields:
+        val = ",".join(val)
       row[idx] = str(val)
 
   data = GenerateTable(separator=opts.separator, headers=headers,
diff --git a/scripts/gnt-node b/scripts/gnt-node
index 3c2189a94..6b310964d 100755
--- a/scripts/gnt-node
+++ b/scripts/gnt-node
@@ -70,6 +70,7 @@ def ListNodes(opts, args):
       "mtotal": "MTotal", "mnode": "MNode", "mfree": "MFree",
       "bootid": "BootID",
       "ctotal": "CTotal",
+      "tags": "Tags",
       }
   else:
     headers = None
@@ -84,13 +85,12 @@ def ListNodes(opts, args):
                "pinst_cnt", "sinst_cnt",
                "ctotal"]
 
+  list_type_fields = ("pinst_list", "sinst_list", "tags")
   # change raw values to nicer strings
   for row in output:
     for idx, field in enumerate(selected_fields):
       val = row[idx]
-      if field == "pinst_list":
-        val = ",".join(val)
-      elif field == "sinst_list":
+      if field in list_type_fields:
         val = ",".join(val)
       elif val is None:
         val = "?"
-- 
GitLab