On 9/9/21 6:13 PM, Pavel Hrdina wrote: > Signed-off-by: Pavel Hrdina <phrdina@xxxxxxxxxx> > --- > docs/manpages/virsh.rst | 14 +++++++++ > tools/virsh-domain.c | 65 +++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 79 insertions(+) > > diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst > index 9561b3f59d..36fc94808d 100644 > --- a/docs/manpages/virsh.rst > +++ b/docs/manpages/virsh.rst > @@ -4515,6 +4515,20 @@ Output the IP address and port number for the VNC display. If the information > is not available the processes will provide an exit code of 1. > > > +setappid > +-------- > + > +**Syntax:** > + > +:: > + > + setappid domain appid > + > +Set the Fibre Channel appid string for domain that is used to create VMID to > +tag the traffic. Accepts only printable characters and maximal length is 128 > +characters. To remove the appid from VM don't pass any appid. > + > + > DEVICE COMMANDS > =============== > > diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c > index e5bd1fdd75..07d9c7f954 100644 > --- a/tools/virsh-domain.c > +++ b/tools/virsh-domain.c > @@ -14070,6 +14070,65 @@ cmdDomDirtyRateCalc(vshControl *ctl, const vshCmd *cmd) > } > > > +/* > + * "setappid" command > + */ > +static const vshCmdInfo info_setappid[] = { > + {.name = "help", > + .data = N_("Set domain Fibre Channel appid") > + }, > + {.name = "desc", > + .data = N_("Set the Fibre Channel appid string for domain that is " > + "used to create VMID to tag the traffic. Accepts only " > + "printable characters and maximal length is 128 characters. " > + "To remove the appid from VM don't pass any appid.") I wonder whether removal semantic with an extra flag, e.g. 'virsh setappid --clear' wouldn't be better. If we ever add new option to this function users will be forced to pass current APPID when using the new option so that the APPID doesn't get cleared. For instance: setappid --appid APPID --magic vs setappid --magic > + }, > + {.name = NULL} > +}; > + > +static const vshCmdOptDef opts_setappid[] = { > + VIRSH_COMMON_OPT_DOMAIN_FULL(0), > + VIRSH_COMMON_OPT_DOMAIN_CONFIG, > + VIRSH_COMMON_OPT_DOMAIN_LIVE, > + VIRSH_COMMON_OPT_DOMAIN_CURRENT, > + {.name = "appid", > + .type = VSH_OT_STRING, > + .help = N_("User provided appid string"), > + }, > + {.name = NULL} > +}; > + > +static bool > +cmdSetAppid(vshControl *ctl, const vshCmd *cmd) > +{ > + g_autoptr(virshDomain) dom = NULL; > + bool config = vshCommandOptBool(cmd, "config"); > + bool live = vshCommandOptBool(cmd, "live"); > + bool current = vshCommandOptBool(cmd, "current"); > + const char *appid = NULL; > + unsigned int flags = VIR_DOMAIN_AFFECT_CURRENT; > + > + VSH_EXCLUSIVE_OPTIONS_VAR(current, live); > + VSH_EXCLUSIVE_OPTIONS_VAR(current, config); > + > + if (config) > + flags |= VIR_DOMAIN_AFFECT_CONFIG; > + if (live) > + flags |= VIR_DOMAIN_AFFECT_LIVE; > + > + if (!(dom = virshCommandOptDomain(ctl, cmd, NULL))) > + return false; > + > + if (vshCommandOptStringReq(ctl, cmd, "appid", &appid) < 0) > + return false; > + > + if (virDomainSetFibreChannelAppid(dom, (char *)appid, flags) < 0) Probably a leftover? This typecast shouldn't be needed. > + return false; > + > + return true; > +} Michal