[PATCH] virsh: Provide completer for some pool-X-as commands

Abhiram Tilak posted 1 patch 3 months, 1 week ago
Failed in applying to current master (apply log)
There is a newer version of this series
src/libvirt_private.syms     |  2 ++
tools/virsh-completer-pool.c | 48 +++++++++++++++++++++++++++++++++++-
tools/virsh-completer-pool.h | 10 ++++++++
tools/virsh-pool.c           |  8 ++++++
4 files changed, 67 insertions(+), 1 deletion(-)
[PATCH] virsh: Provide completer for some pool-X-as commands
Posted by Abhiram Tilak 3 months, 1 week ago
Provides completers for auth-type and source-format commands for
virsh pool-create-as and pool-define-as commands. Use Empty completers
for options where completions are not required. I left the ones where
I was not sure if they need completers.

Related Issue: https://gitlab.com/libvirt/libvirt/-/issues/9
Signed-off-by: Abhiram Tilak <atp.exp@gmail.com>
---
 src/libvirt_private.syms     |  2 ++
 tools/virsh-completer-pool.c | 48 +++++++++++++++++++++++++++++++++++-
 tools/virsh-completer-pool.h | 10 ++++++++
 tools/virsh-pool.c           |  8 ++++++
 4 files changed, 67 insertions(+), 1 deletion(-)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 6b6bcc368a..5a413ca832 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1117,6 +1117,8 @@ virStorageAuthDefCopy;
 virStorageAuthDefFormat;
 virStorageAuthDefFree;
 virStorageAuthDefParse;
+virStorageAuthTypeFromString;
+virStorageAuthTypeToString;
 virStorageFileFeatureTypeFromString;
 virStorageFileFeatureTypeToString;
 virStorageFileFormatTypeFromString;
diff --git a/tools/virsh-completer-pool.c b/tools/virsh-completer-pool.c
index 3568bb985b..4a771d894e 100644
--- a/tools/virsh-completer-pool.c
+++ b/tools/virsh-completer-pool.c
@@ -84,7 +84,6 @@ virshPoolEventNameCompleter(vshControl *ctl G_GNUC_UNUSED,
     return g_steal_pointer(&tmp);
 }
 
-
 char **
 virshPoolTypeCompleter(vshControl *ctl,
                        const vshCmd *cmd,
@@ -106,3 +105,50 @@ virshPoolTypeCompleter(vshControl *ctl,
 
     return virshCommaStringListComplete(type_str, (const char **)tmp);
 }
+
+char **
+virshPoolFormatCompleter(vshControl *ctl G_GNUC_UNUSED,
+                         const vshCmd *cmd G_GNUC_UNUSED,
+                         unsigned int flags)
+{
+    size_t i = 0, j = 0;
+    g_auto(GStrv) tmp = NULL;
+    size_t nformats = VIR_STORAGE_POOL_FS_LAST + VIR_STORAGE_POOL_NETFS_LAST +
+	              VIR_STORAGE_POOL_DISK_LAST + VIR_STORAGE_POOL_LOGICAL_LAST;
+
+    virCheckFlags(0, NULL);
+
+    tmp = g_new0(char *, nformats + 1);
+
+    /* Club all PoolFormats for completion */
+    for (i = 0; i < VIR_STORAGE_POOL_FS_LAST; i++)
+        tmp[j++] = g_strdup(virStoragePoolFormatFileSystemTypeToString(i));
+
+    for (i = 0; i < VIR_STORAGE_POOL_NETFS_LAST; i++)
+        tmp[j++] = g_strdup(virStoragePoolFormatFileSystemNetTypeToString(i));
+
+    for (i = 0; i < VIR_STORAGE_POOL_DISK_LAST; i++)
+        tmp[j++] = g_strdup(virStoragePoolFormatDiskTypeToString(i));
+
+    for (i = 0; i < VIR_STORAGE_POOL_LOGICAL_LAST; i++)
+        tmp[j++] = g_strdup(virStoragePoolFormatLogicalTypeToString(i));
+
+    return g_steal_pointer(&tmp);
+}
+
+char ** virshPoolAuthTypeCompleter(vshControl *ctl G_GNUC_UNUSED,
+                         const vshCmd *cmd G_GNUC_UNUSED,
+                         unsigned int flags)
+{
+    size_t i = 0;
+    g_auto(GStrv) tmp = NULL;
+
+    virCheckFlags(0, NULL);
+
+    tmp = g_new0(char *, VIR_STORAGE_AUTH_TYPE_LAST + 1);
+
+    for (i = 0; i < VIR_STORAGE_AUTH_TYPE_LAST; i++)
+        tmp[i] = g_strdup(virStorageAuthTypeToString(i));
+
+    return g_steal_pointer(&tmp);
+}
diff --git a/tools/virsh-completer-pool.h b/tools/virsh-completer-pool.h
index bff3e5742b..4a53f99577 100644
--- a/tools/virsh-completer-pool.h
+++ b/tools/virsh-completer-pool.h
@@ -40,3 +40,13 @@ char **
 virshPoolTypeCompleter(vshControl *ctl,
                        const vshCmd *cmd,
                        unsigned int flags);
+
+char **
+virshPoolFormatCompleter(vshControl *ctl,
+                         const vshCmd *cmd,
+                         unsigned int flags);
+
+char **
+virshPoolAuthTypeCompleter(vshControl *ctl,
+                         const vshCmd *cmd,
+                         unsigned int flags);
diff --git a/tools/virsh-pool.c b/tools/virsh-pool.c
index 67cc1b94cf..1a294bb0f6 100644
--- a/tools/virsh-pool.c
+++ b/tools/virsh-pool.c
@@ -81,26 +81,32 @@
     }, \
     {.name = "source-path", \
      .type = VSH_OT_STRING, \
+     .completer = virshCompletePathLocalExisting, \
      .help = N_("source path for underlying storage") \
     }, \
     {.name = "source-dev", \
      .type = VSH_OT_STRING, \
+     .completer = virshCompleteEmpty, \
      .help = N_("source device for underlying storage") \
     }, \
     {.name = "source-name", \
      .type = VSH_OT_STRING, \
+     .completer = virshCompleteEmpty, \
      .help = N_("source name for underlying storage") \
     }, \
     {.name = "target", \
      .type = VSH_OT_STRING, \
+     .completer = virshCompleteEmpty, \
      .help = N_("target for underlying storage") \
     }, \
     {.name = "source-format", \
      .type = VSH_OT_STRING, \
+     .completer = virshPoolFormatCompleter, \
      .help = N_("format for underlying storage") \
     }, \
     {.name = "auth-type", \
      .type = VSH_OT_STRING, \
+     .completer = virshPoolAuthTypeCompleter, \
      .help = N_("auth type to be used for underlying storage") \
     }, \
     {.name = "auth-username", \
@@ -118,6 +124,7 @@
     }, \
     {.name = "adapter-name", \
      .type = VSH_OT_STRING, \
+     .completer = virshCompleteEmpty, \
      .help = N_("adapter name to be used for underlying storage") \
     }, \
     {.name = "adapter-wwnn", \
@@ -146,6 +153,7 @@
     }, \
     {.name = "source-protocol-ver", \
      .type = VSH_OT_STRING, \
+     .completer = virshCompleteEmpty, \
      .help = N_("nfsvers value for NFS pool mount option") \
     }, \
     {.name = "source-initiator", \
-- 
2.34.1
Re: [PATCH] virsh: Provide completer for some pool-X-as commands
Posted by Peter Krempa 3 months, 1 week ago
On Mon, May 27, 2024 at 18:34:38 +0000, Abhiram Tilak wrote:
> Provides completers for auth-type and source-format commands for
> virsh pool-create-as and pool-define-as commands. Use Empty completers
> for options where completions are not required. I left the ones where
> I was not sure if they need completers.
> 
> Related Issue: https://gitlab.com/libvirt/libvirt/-/issues/9
> Signed-off-by: Abhiram Tilak <atp.exp@gmail.com>
> ---
>  src/libvirt_private.syms     |  2 ++
>  tools/virsh-completer-pool.c | 48 +++++++++++++++++++++++++++++++++++-
>  tools/virsh-completer-pool.h | 10 ++++++++
>  tools/virsh-pool.c           |  8 ++++++
>  4 files changed, 67 insertions(+), 1 deletion(-)
> 
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 6b6bcc368a..5a413ca832 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1117,6 +1117,8 @@ virStorageAuthDefCopy;
>  virStorageAuthDefFormat;
>  virStorageAuthDefFree;
>  virStorageAuthDefParse;
> +virStorageAuthTypeFromString;
> +virStorageAuthTypeToString;
>  virStorageFileFeatureTypeFromString;
>  virStorageFileFeatureTypeToString;
>  virStorageFileFormatTypeFromString;
> diff --git a/tools/virsh-completer-pool.c b/tools/virsh-completer-pool.c
> index 3568bb985b..4a771d894e 100644
> --- a/tools/virsh-completer-pool.c
> +++ b/tools/virsh-completer-pool.c
> @@ -84,7 +84,6 @@ virshPoolEventNameCompleter(vshControl *ctl G_GNUC_UNUSED,
>      return g_steal_pointer(&tmp);
>  }
>  
> -

Spurious whitespace change.

>  char **
>  virshPoolTypeCompleter(vshControl *ctl,
>                         const vshCmd *cmd,
> @@ -106,3 +105,50 @@ virshPoolTypeCompleter(vshControl *ctl,
>  
>      return virshCommaStringListComplete(type_str, (const char **)tmp);
>  }
> +

Two empty lines between functions in this file.

> +char **
> +virshPoolFormatCompleter(vshControl *ctl G_GNUC_UNUSED,
> +                         const vshCmd *cmd G_GNUC_UNUSED,
> +                         unsigned int flags)
> +{
> +    size_t i = 0, j = 0;

One declaration per line please;

> +    g_auto(GStrv) tmp = NULL;
> +    size_t nformats = VIR_STORAGE_POOL_FS_LAST + VIR_STORAGE_POOL_NETFS_LAST +
> +	              VIR_STORAGE_POOL_DISK_LAST + VIR_STORAGE_POOL_LOGICAL_LAST;
> +
> +    virCheckFlags(0, NULL);
> +
> +    tmp = g_new0(char *, nformats + 1);
> +
> +    /* Club all PoolFormats for completion */
> +    for (i = 0; i < VIR_STORAGE_POOL_FS_LAST; i++)
> +        tmp[j++] = g_strdup(virStoragePoolFormatFileSystemTypeToString(i));
> +
> +    for (i = 0; i < VIR_STORAGE_POOL_NETFS_LAST; i++)
> +        tmp[j++] = g_strdup(virStoragePoolFormatFileSystemNetTypeToString(i));
> +
> +    for (i = 0; i < VIR_STORAGE_POOL_DISK_LAST; i++)
> +        tmp[j++] = g_strdup(virStoragePoolFormatDiskTypeToString(i));

I don't think it makes sense to complete the "unknown" value here ...

> +
> +    for (i = 0; i < VIR_STORAGE_POOL_LOGICAL_LAST; i++)
> +        tmp[j++] = g_strdup(virStoragePoolFormatLogicalTypeToString(i));

... and here.

> +
> +    return g_steal_pointer(&tmp);
> +}
> +
> +char ** virshPoolAuthTypeCompleter(vshControl *ctl G_GNUC_UNUSED,
> +                         const vshCmd *cmd G_GNUC_UNUSED,
> +                         unsigned int flags)

Wrong header formatting style, and two lines between functions please.

> +{
> +    size_t i = 0;
> +    g_auto(GStrv) tmp = NULL;
> +
> +    virCheckFlags(0, NULL);
> +
> +    tmp = g_new0(char *, VIR_STORAGE_AUTH_TYPE_LAST + 1);
> +
> +    for (i = 0; i < VIR_STORAGE_AUTH_TYPE_LAST; i++)
> +        tmp[i] = g_strdup(virStorageAuthTypeToString(i));
> +
> +    return g_steal_pointer(&tmp);
> +}
> diff --git a/tools/virsh-completer-pool.h b/tools/virsh-completer-pool.h
> index bff3e5742b..4a53f99577 100644
> --- a/tools/virsh-completer-pool.h
> +++ b/tools/virsh-completer-pool.h
> @@ -40,3 +40,13 @@ char **
>  virshPoolTypeCompleter(vshControl *ctl,
>                         const vshCmd *cmd,
>                         unsigned int flags);
> +
> +char **
> +virshPoolFormatCompleter(vshControl *ctl,
> +                         const vshCmd *cmd,
> +                         unsigned int flags);
> +
> +char **
> +virshPoolAuthTypeCompleter(vshControl *ctl,
> +                         const vshCmd *cmd,
> +                         unsigned int flags);
> diff --git a/tools/virsh-pool.c b/tools/virsh-pool.c
> index 67cc1b94cf..1a294bb0f6 100644
> --- a/tools/virsh-pool.c
> +++ b/tools/virsh-pool.c
> @@ -81,26 +81,32 @@
>      }, \
>      {.name = "source-path", \
>       .type = VSH_OT_STRING, \
> +     .completer = virshCompletePathLocalExisting, \
>       .help = N_("source path for underlying storage") \
>      }, \
>      {.name = "source-dev", \
>       .type = VSH_OT_STRING, \
> +     .completer = virshCompleteEmpty, \

This is taking the path to a block device, so this should complete
existing filenames.


>       .help = N_("source device for underlying storage") \
>      }, \
>      {.name = "source-name", \
>       .type = VSH_OT_STRING, \
> +     .completer = virshCompleteEmpty, \
>       .help = N_("source name for underlying storage") \
>      }, \
>      {.name = "target", \
>       .type = VSH_OT_STRING, \
> +     .completer = virshCompleteEmpty, \
>       .help = N_("target for underlying storage") \
>      }, \
>      {.name = "source-format", \
>       .type = VSH_OT_STRING, \
> +     .completer = virshPoolFormatCompleter, \
>       .help = N_("format for underlying storage") \
>      }, \
>      {.name = "auth-type", \
>       .type = VSH_OT_STRING, \
> +     .completer = virshPoolAuthTypeCompleter, \
>       .help = N_("auth type to be used for underlying storage") \
>      }, \
>      {.name = "auth-username", \
> @@ -118,6 +124,7 @@
>      }, \
>      {.name = "adapter-name", \
>       .type = VSH_OT_STRING, \
> +     .completer = virshCompleteEmpty, \

This parameter takes a host SCSI adapter name, which can be completed
from data from the nodedev driver.

virshCompleteEmpty is meant exclusively for user options which we can't
complete.

>       .help = N_("adapter name to be used for underlying storage") \
>      }, \
>      {.name = "adapter-wwnn", \
> @@ -146,6 +153,7 @@
>      }, \
>      {.name = "source-protocol-ver", \
>       .type = VSH_OT_STRING, \
> +     .completer = virshCompleteEmpty, \
>       .help = N_("nfsvers value for NFS pool mount option") \
>      }, \
>      {.name = "source-initiator", \
> -- 
> 2.34.1
> 
Re: [PATCH] virsh: Provide completer for some pool-X-as commands
Posted by atp exp 3 months, 1 week ago
On Tue, 28 May 2024 at 17:35, Peter Krempa <pkrempa@redhat.com> wrote:

> On Mon, May 27, 2024 at 18:34:38 +0000, Abhiram Tilak wrote:
> > Provides completers for auth-type and source-format commands for
> > virsh pool-create-as and pool-define-as commands. Use Empty completers
> > for options where completions are not required. I left the ones where
> > I was not sure if they need completers.
> >
> > Related Issue: https://gitlab.com/libvirt/libvirt/-/issues/9
> > Signed-off-by: Abhiram Tilak <atp.exp@gmail.com>
> > ---
> >  src/libvirt_private.syms     |  2 ++
> >  tools/virsh-completer-pool.c | 48 +++++++++++++++++++++++++++++++++++-
> >  tools/virsh-completer-pool.h | 10 ++++++++
> >  tools/virsh-pool.c           |  8 ++++++
> >  4 files changed, 67 insertions(+), 1 deletion(-)
> >
> > diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> > index 6b6bcc368a..5a413ca832 100644
> > --- a/src/libvirt_private.syms
> > +++ b/src/libvirt_private.syms
> > @@ -1117,6 +1117,8 @@ virStorageAuthDefCopy;
> >  virStorageAuthDefFormat;
> >  virStorageAuthDefFree;
> >  virStorageAuthDefParse;
> > +virStorageAuthTypeFromString;
> > +virStorageAuthTypeToString;
> >  virStorageFileFeatureTypeFromString;
> >  virStorageFileFeatureTypeToString;
> >  virStorageFileFormatTypeFromString;
> > diff --git a/tools/virsh-completer-pool.c b/tools/virsh-completer-pool.c
> > index 3568bb985b..4a771d894e 100644
> > --- a/tools/virsh-completer-pool.c
> > +++ b/tools/virsh-completer-pool.c
> > @@ -84,7 +84,6 @@ virshPoolEventNameCompleter(vshControl *ctl
> G_GNUC_UNUSED,
> >      return g_steal_pointer(&tmp);
> >  }
> >
> > -
>
> Spurious whitespace change.
>
> >  char **
> >  virshPoolTypeCompleter(vshControl *ctl,
> >                         const vshCmd *cmd,
> > @@ -106,3 +105,50 @@ virshPoolTypeCompleter(vshControl *ctl,
> >
> >      return virshCommaStringListComplete(type_str, (const char **)tmp);
> >  }
> > +
>
> Two empty lines between functions in this file.
>
> > +char **
> > +virshPoolFormatCompleter(vshControl *ctl G_GNUC_UNUSED,
> > +                         const vshCmd *cmd G_GNUC_UNUSED,
> > +                         unsigned int flags)
> > +{
> > +    size_t i = 0, j = 0;
>
> One declaration per line please;
>
> > +    g_auto(GStrv) tmp = NULL;
> > +    size_t nformats = VIR_STORAGE_POOL_FS_LAST +
> VIR_STORAGE_POOL_NETFS_LAST +
> > +                   VIR_STORAGE_POOL_DISK_LAST +
> VIR_STORAGE_POOL_LOGICAL_LAST;
> > +
> > +    virCheckFlags(0, NULL);
> > +
> > +    tmp = g_new0(char *, nformats + 1);
> > +
> > +    /* Club all PoolFormats for completion */
> > +    for (i = 0; i < VIR_STORAGE_POOL_FS_LAST; i++)
> > +        tmp[j++] =
> g_strdup(virStoragePoolFormatFileSystemTypeToString(i));
> > +
> > +    for (i = 0; i < VIR_STORAGE_POOL_NETFS_LAST; i++)
> > +        tmp[j++] =
> g_strdup(virStoragePoolFormatFileSystemNetTypeToString(i));
> > +
> > +    for (i = 0; i < VIR_STORAGE_POOL_DISK_LAST; i++)
> > +        tmp[j++] = g_strdup(virStoragePoolFormatDiskTypeToString(i));
>
> I don't think it makes sense to complete the "unknown" value here ...
>
> Thanks for pointing this out. I totally missed it.


> > +
> > +    for (i = 0; i < VIR_STORAGE_POOL_LOGICAL_LAST; i++)
> > +        tmp[j++] = g_strdup(virStoragePoolFormatLogicalTypeToString(i));
>
> ... and here.
>
> > +
> > +    return g_steal_pointer(&tmp);
> > +}
> > +
> > +char ** virshPoolAuthTypeCompleter(vshControl *ctl G_GNUC_UNUSED,
> > +                         const vshCmd *cmd G_GNUC_UNUSED,
> > +                         unsigned int flags)
>
> Wrong header formatting style, and two lines between functions please.
>
> > +{
> > +    size_t i = 0;
> > +    g_auto(GStrv) tmp = NULL;
> > +
> > +    virCheckFlags(0, NULL);
> > +
> > +    tmp = g_new0(char *, VIR_STORAGE_AUTH_TYPE_LAST + 1);
> > +
> > +    for (i = 0; i < VIR_STORAGE_AUTH_TYPE_LAST; i++)
> > +        tmp[i] = g_strdup(virStorageAuthTypeToString(i));
> > +
> > +    return g_steal_pointer(&tmp);
> > +}
> > diff --git a/tools/virsh-completer-pool.h b/tools/virsh-completer-pool.h
> > index bff3e5742b..4a53f99577 100644
> > --- a/tools/virsh-completer-pool.h
> > +++ b/tools/virsh-completer-pool.h
> > @@ -40,3 +40,13 @@ char **
> >  virshPoolTypeCompleter(vshControl *ctl,
> >                         const vshCmd *cmd,
> >                         unsigned int flags);
> > +
> > +char **
> > +virshPoolFormatCompleter(vshControl *ctl,
> > +                         const vshCmd *cmd,
> > +                         unsigned int flags);
> > +
> > +char **
> > +virshPoolAuthTypeCompleter(vshControl *ctl,
> > +                         const vshCmd *cmd,
> > +                         unsigned int flags);
> > diff --git a/tools/virsh-pool.c b/tools/virsh-pool.c
> > index 67cc1b94cf..1a294bb0f6 100644
> > --- a/tools/virsh-pool.c
> > +++ b/tools/virsh-pool.c
> > @@ -81,26 +81,32 @@
> >      }, \
> >      {.name = "source-path", \
> >       .type = VSH_OT_STRING, \
> > +     .completer = virshCompletePathLocalExisting, \
> >       .help = N_("source path for underlying storage") \
> >      }, \
> >      {.name = "source-dev", \
> >       .type = VSH_OT_STRING, \
> > +     .completer = virshCompleteEmpty, \
>
> This is taking the path to a block device, so this should complete
> existing filenames.
>

But lot of times the device isn't "locally" available by virsh, for
instance
the first example in the docs:
https://libvirt.org/formatstorage.html#source-elements

Here the element:
 <device path="iqn.2013-06.com.example:iscsi-pool"/>

We can't expect the completer to predict this, even though giving
PathLocalExisting completer can help show the local ones, I guess
I will add it anyway. Similarly the `target` can also have Path completer.

>
> >       .help = N_("source device for underlying storage") \
> >      }, \
> >      {.name = "source-name", \
> >       .type = VSH_OT_STRING, \
> > +     .completer = virshCompleteEmpty, \
> >       .help = N_("source name for underlying storage") \
> >      }, \
> >      {.name = "target", \
> >       .type = VSH_OT_STRING, \
> > +     .completer = virshCompleteEmpty, \
> >       .help = N_("target for underlying storage") \
> >      }, \
> >      {.name = "source-format", \
> >       .type = VSH_OT_STRING, \
> > +     .completer = virshPoolFormatCompleter, \
> >       .help = N_("format for underlying storage") \
> >      }, \
> >      {.name = "auth-type", \
> >       .type = VSH_OT_STRING, \
> > +     .completer = virshPoolAuthTypeCompleter, \
> >       .help = N_("auth type to be used for underlying storage") \
> >      }, \
> >      {.name = "auth-username", \
> > @@ -118,6 +124,7 @@
> >      }, \
> >      {.name = "adapter-name", \
> >       .type = VSH_OT_STRING, \
> > +     .completer = virshCompleteEmpty, \
>
> This parameter takes a host SCSI adapter name, which can be completed
> from data from the nodedev driver.
>
> virshCompleteEmpty is meant exclusively for user options which we can't
> complete.
>
> Turns out there is already a completer for it, will just use that, and be
more
specific to get only scsi adapter.


> >       .help = N_("adapter name to be used for underlying storage") \
> >      }, \
> >      {.name = "adapter-wwnn", \
> > @@ -146,6 +153,7 @@
> >      }, \
> >      {.name = "source-protocol-ver", \
> >       .type = VSH_OT_STRING, \
> > +     .completer = virshCompleteEmpty, \
> >       .help = N_("nfsvers value for NFS pool mount option") \
> >      }, \
> >      {.name = "source-initiator", \
> > --
> > 2.34.1
> >
>
>
There are other formatting errors too that overlooked, will fix soon.


-- 
Abhiram
Re: [PATCH] virsh: Provide completer for some pool-X-as commands
Posted by atp exp 3 months, 1 week ago
This patch was considerably old (like 10 days), it got stuck in the mailing
list and
had to resend this. I didn't rebase this to master before sending, hence
the conflicts.

On Tue, 28 May 2024 at 00:06, Abhiram Tilak <atp.exp@gmail.com> wrote:

> Provides completers for auth-type and source-format commands for
> virsh pool-create-as and pool-define-as commands. Use Empty completers
> for options where completions are not required. I left the ones where
> I was not sure if they need completers.
>
> Related Issue: https://gitlab.com/libvirt/libvirt/-/issues/9
> Signed-off-by: Abhiram Tilak <atp.exp@gmail.com>
> ---
>  src/libvirt_private.syms     |  2 ++
>  tools/virsh-completer-pool.c | 48 +++++++++++++++++++++++++++++++++++-
>  tools/virsh-completer-pool.h | 10 ++++++++
>  tools/virsh-pool.c           |  8 ++++++
>  4 files changed, 67 insertions(+), 1 deletion(-)
>
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 6b6bcc368a..5a413ca832 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1117,6 +1117,8 @@ virStorageAuthDefCopy;
>  virStorageAuthDefFormat;
>  virStorageAuthDefFree;
>  virStorageAuthDefParse;
> +virStorageAuthTypeFromString;
> +virStorageAuthTypeToString;
>  virStorageFileFeatureTypeFromString;
>  virStorageFileFeatureTypeToString;
>  virStorageFileFormatTypeFromString;
> diff --git a/tools/virsh-completer-pool.c b/tools/virsh-completer-pool.c
> index 3568bb985b..4a771d894e 100644
> --- a/tools/virsh-completer-pool.c
> +++ b/tools/virsh-completer-pool.c
> @@ -84,7 +84,6 @@ virshPoolEventNameCompleter(vshControl *ctl
> G_GNUC_UNUSED,
>      return g_steal_pointer(&tmp);
>  }
>
> -
>  char **
>  virshPoolTypeCompleter(vshControl *ctl,
>                         const vshCmd *cmd,
> @@ -106,3 +105,50 @@ virshPoolTypeCompleter(vshControl *ctl,
>
>      return virshCommaStringListComplete(type_str, (const char **)tmp);
>  }
> +
> +char **
> +virshPoolFormatCompleter(vshControl *ctl G_GNUC_UNUSED,
> +                         const vshCmd *cmd G_GNUC_UNUSED,
> +                         unsigned int flags)
> +{
> +    size_t i = 0, j = 0;
> +    g_auto(GStrv) tmp = NULL;
> +    size_t nformats = VIR_STORAGE_POOL_FS_LAST +
> VIR_STORAGE_POOL_NETFS_LAST +
> +                     VIR_STORAGE_POOL_DISK_LAST +
> VIR_STORAGE_POOL_LOGICAL_LAST;
> +
> +    virCheckFlags(0, NULL);
> +
> +    tmp = g_new0(char *, nformats + 1);
> +
> +    /* Club all PoolFormats for completion */
> +    for (i = 0; i < VIR_STORAGE_POOL_FS_LAST; i++)
> +        tmp[j++] =
> g_strdup(virStoragePoolFormatFileSystemTypeToString(i));
> +
> +    for (i = 0; i < VIR_STORAGE_POOL_NETFS_LAST; i++)
> +        tmp[j++] =
> g_strdup(virStoragePoolFormatFileSystemNetTypeToString(i));
> +
> +    for (i = 0; i < VIR_STORAGE_POOL_DISK_LAST; i++)
> +        tmp[j++] = g_strdup(virStoragePoolFormatDiskTypeToString(i));
> +
> +    for (i = 0; i < VIR_STORAGE_POOL_LOGICAL_LAST; i++)
> +        tmp[j++] = g_strdup(virStoragePoolFormatLogicalTypeToString(i));
> +
> +    return g_steal_pointer(&tmp);
> +}
> +
> +char ** virshPoolAuthTypeCompleter(vshControl *ctl G_GNUC_UNUSED,
> +                         const vshCmd *cmd G_GNUC_UNUSED,
> +                         unsigned int flags)
> +{
> +    size_t i = 0;
> +    g_auto(GStrv) tmp = NULL;
> +
> +    virCheckFlags(0, NULL);
> +
> +    tmp = g_new0(char *, VIR_STORAGE_AUTH_TYPE_LAST + 1);
> +
> +    for (i = 0; i < VIR_STORAGE_AUTH_TYPE_LAST; i++)
> +        tmp[i] = g_strdup(virStorageAuthTypeToString(i));
> +
> +    return g_steal_pointer(&tmp);
> +}
> diff --git a/tools/virsh-completer-pool.h b/tools/virsh-completer-pool.h
> index bff3e5742b..4a53f99577 100644
> --- a/tools/virsh-completer-pool.h
> +++ b/tools/virsh-completer-pool.h
> @@ -40,3 +40,13 @@ char **
>  virshPoolTypeCompleter(vshControl *ctl,
>                         const vshCmd *cmd,
>                         unsigned int flags);
> +
> +char **
> +virshPoolFormatCompleter(vshControl *ctl,
> +                         const vshCmd *cmd,
> +                         unsigned int flags);
> +
> +char **
> +virshPoolAuthTypeCompleter(vshControl *ctl,
> +                         const vshCmd *cmd,
> +                         unsigned int flags);
> diff --git a/tools/virsh-pool.c b/tools/virsh-pool.c
> index 67cc1b94cf..1a294bb0f6 100644
> --- a/tools/virsh-pool.c
> +++ b/tools/virsh-pool.c
> @@ -81,26 +81,32 @@
>      }, \
>      {.name = "source-path", \
>       .type = VSH_OT_STRING, \
> +     .completer = virshCompletePathLocalExisting, \
>       .help = N_("source path for underlying storage") \
>      }, \
>      {.name = "source-dev", \
>       .type = VSH_OT_STRING, \
> +     .completer = virshCompleteEmpty, \
>       .help = N_("source device for underlying storage") \
>      }, \
>      {.name = "source-name", \
>       .type = VSH_OT_STRING, \
> +     .completer = virshCompleteEmpty, \
>       .help = N_("source name for underlying storage") \
>      }, \
>      {.name = "target", \
>       .type = VSH_OT_STRING, \
> +     .completer = virshCompleteEmpty, \
>       .help = N_("target for underlying storage") \
>      }, \
>      {.name = "source-format", \
>       .type = VSH_OT_STRING, \
> +     .completer = virshPoolFormatCompleter, \
>       .help = N_("format for underlying storage") \
>      }, \
>      {.name = "auth-type", \
>       .type = VSH_OT_STRING, \
> +     .completer = virshPoolAuthTypeCompleter, \
>       .help = N_("auth type to be used for underlying storage") \
>      }, \
>      {.name = "auth-username", \
> @@ -118,6 +124,7 @@
>      }, \
>      {.name = "adapter-name", \
>       .type = VSH_OT_STRING, \
> +     .completer = virshCompleteEmpty, \
>       .help = N_("adapter name to be used for underlying storage") \
>      }, \
>      {.name = "adapter-wwnn", \
> @@ -146,6 +153,7 @@
>      }, \
>      {.name = "source-protocol-ver", \
>       .type = VSH_OT_STRING, \
> +     .completer = virshCompleteEmpty, \
>       .help = N_("nfsvers value for NFS pool mount option") \
>      }, \
>      {.name = "source-initiator", \
> --
> 2.34.1
>
>

-- 
Abhiram