Hello Michal,

Thanks for the feedback. I have sent a follow up v3 version of my patch.

Warm Regards,
Nitesh Konkar.


On Mon, Feb 22, 2016 at 6:02 PM, Michal Privoznik <mprivozn@redhat.com> wrote:
On 19.02.2016 12:53, Nitesh Konkar wrote:
> The virsh attach virsh detach interface command fails  when both live and config
> are set and when the  interface gets attached to different pci slots
> on live and config xml respectively.
>
> When we attach an interface with both --live and --config,
> the first time they get the same PCI slots, but the second time
> onwards it differs and hence the virsh detach-interface --live
> --config command fails. This patch makes sure that when both
> --live --config are set , qemuDomainDetachDeviceFlags is called
> twice, once with config xml and once with live xml.
>
> Steps to see the issue:
> virsh attach-interface --domain DomainName --type network --source default --mac 52:54:00:4b:76:5f --live --config
> virsh  detach-interface --domain DomainName --type network --mac 52:54:00:4b:76:5f --live --config
> virsh attach-interface --domain DomainName --type network --source default --mac 52:54:00:4b:76:5f --live --config
> virsh  detach-interface --domain DomainName --type network --mac 52:54:00:4b:76:5f --live --config
>

Okay, I can see the problem but I find the solution a bit hackish.

> Signed-off-by:nitkon12@linux.vnet.ibm.com
> ---
>  tools/virsh-domain.c | 14 ++++++++++++--
>  1 file changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
> index 62acecb..43c8436 100644
> --- a/tools/virsh-domain.c
> +++ b/tools/virsh-domain.c
> @@ -10815,7 +10815,7 @@ cmdDetachInterface(vshControl *ctl, const vshCmd *cmd)
>      char buf[64];
>      int diff_mac;
>      size_t i;
> -    int ret;
> +    int ret, flag_live_config_both = 0;

This new flag makes me confused. I know what you're trying to achieve
with it, but the name could be better. How about configDetached?
Moreover, it's a boolean not an int.

>      bool functionReturn = false;
>      unsigned int flags = VIR_DOMAIN_AFFECT_CURRENT;
>      bool current = vshCommandOptBool(cmd, "current");
> @@ -10830,7 +10830,7 @@ cmdDetachInterface(vshControl *ctl, const vshCmd *cmd)
>
>      if (config || persistent)
>          flags |= VIR_DOMAIN_AFFECT_CONFIG;
> -    if (live)
> +    if (!(config || persistent) && live) // Only Live
>          flags |= VIR_DOMAIN_AFFECT_LIVE;

I don't think I follow. But maybe I'm misguided by --persistent.
Historically it just an alias for --config. But not in this case. I
wonder why.

>
>      if (!(dom = virshCommandOptDomain(ctl, cmd, NULL)))
> @@ -10851,6 +10851,8 @@ cmdDetachInterface(vshControl *ctl, const vshCmd *cmd)
>      else
>          doc = virDomainGetXMLDesc(dom, 0);
>
> +    forlivexml:
> +

I'd rather avoid introducing this kind of label. How about putting the
important code (interface lookup in domain XML) into a separate function
and call it twice if needed? That way you can also avoid using
@flag_live_config_both.

>      if (!doc)
>          goto cleanup;
>
> @@ -10921,6 +10923,14 @@ cmdDetachInterface(vshControl *ctl, const vshCmd *cmd)
>      if (ret != 0) {
>          vshError(ctl, "%s", _("Failed to detach interface"));
>      } else {
> +        if ((config || persistent) && live && flag_live_config_both == 0) {//executed only when live config both in cmd.
> +             doc = virDomainGetXMLDesc(dom, 0);
> +             flag_live_config_both=1; //Need to execute this code only once
> +             flags |= VIR_DOMAIN_AFFECT_LIVE; //set live flag
> +             flags &= (~VIR_DOMAIN_AFFECT_CONFIG ); // need to unset config flag as config xml detach is already done.
> +             mac=NULL;
> +             goto forlivexml;
> +             }
>          vshPrint(ctl, "%s", _("Interface detached successfully\n"));
>          functionReturn = true;
>      }
>

Then, this patch does not comply with our formatting rules. Run 'make
syntax-check' to see all the problems.

Looking forward to v3.

Michal