[libvirt] [PATCH 2/2] qemu: always generate the same alias for tls-creds-x509 object

John Ferlan jferlan at redhat.com
Tue Oct 18 15:05:25 UTC 2016



On 10/18/2016 10:57 AM, Pavel Hrdina wrote:
> On Tue, Oct 18, 2016 at 10:37:37AM -0400, John Ferlan wrote:
>>
>>
>> On 10/18/2016 09:58 AM, Pavel Hrdina wrote:
>>> There was inconsistency between alias used to create tls-creds-x509
>>> object and alias used to link that object to chardev while hotpluging.
>>>
>>> In XML we have for example alias "serial0", but on qemu command line we
>>> generate "charserial0".
>>>
>>> The issue was that code, that creates QMP command to hotplug chardev
>>> devices uses only the second alias "charserial0" and that alias is also
>>> used to link the tls-creds-x509 object.
>>
>> Which two objects used the same ID in hotplug?
>>
>> tlsProps would use obj%s_tls0
>>
>> and this changes it to be essentially objchar%s_tls0
>>
>> Essentially I'm trying to figure out from the commit message prior to
>> this patch what was created incorrectly.
> 
> The issue is that while hotpluging chardev device those QMP command are created
> as I've described:
> 
> {
>     "execute":"object-add",
>     "arguments": {
>         "qom-type":"tls-creds-x509",
>         "id":"objchannel3_tls0",
>               ^^^^^^^^^^^^^^^^
>         "props": {
>             "dir":"/etc/pki/libvirt-chardev",
>             "endpoint":"server",
>             "verify-peer":false
>         }
>     },
>     "id":"libvirt-29"
> }
> 
> {
>     "execute":"chardev-add",
>     "arguments": {
>         "id":"charchannel3",
>         "backend": {
>             "type":"socket",
>             "data": {
>                 "addr": {
>                     "type":"inet",
>                     "data": {
>                         "host":"localhost",
>                         "port":"3344"
>                     }
>                 },
>                 "wait":false,
>                 "telnet":false,
>                 "server":true,
>                 "tls-creds":"objcharchannel3_tls0"
>                              ^^^^^^^^^^^^^^^^^^^^
>             }
>         }
>     },
>     "id":"libvirt-30"
> }
> 
> And as you can see the alias used to create tls-creds-x509 object is different
> than the one used while attaching chardev.  That's because function
> qemuMonitorJSONAttachCharDevCommand() takes as first argument "charchannel3"
> instead of "channel3".  So the logical solution is to use "charchannel3" as base
> while creating "obj%s_tls0" alias.

Ah... OK I see...  I wasn't visualizing the chardev-add from the commit
message.

tks -

John

> 
>>> This patch unifies the aliases for tls-creds-x509 to be always generated
>>> from "charserial0".
>>>
>>> Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
>>> ---
>>>  src/qemu/qemu_command.c                                          | 4 ++--
>>>  src/qemu/qemu_hotplug.c                                          | 9 +++++++--
>>>  .../qemuxml2argv-serial-tcp-tlsx509-chardev-verify.args          | 4 ++--
>>>  .../qemuxml2argv-serial-tcp-tlsx509-chardev.args                 | 4 ++--
>>>  4 files changed, 13 insertions(+), 8 deletions(-)
>>>
>>
>>
>>
>>> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
>>> index 74f65c0..8d87e69 100644
>>> --- a/src/qemu/qemu_command.c
>>> +++ b/src/qemu/qemu_command.c
>>> @@ -4949,10 +4949,10 @@ qemuBuildChrChardevStr(virLogManagerPtr logManager,
>>>              if (qemuBuildTLSx509CommandLine(cmd, cfg->chardevTLSx509certdir,
>>>                                              dev->data.tcp.listen,
>>>                                              cfg->chardevTLSx509verify,
>>> -                                            alias, qemuCaps) < 0)
>>> +                                            charAlias, qemuCaps) < 0)
>>>                  goto error;
>>>  
>>> -            if (!(objalias = qemuAliasTLSObjFromChardevAlias(alias)))
>>> +            if (!(objalias = qemuAliasTLSObjFromChardevAlias(charAlias)))
>>>                  goto error;
>>>              virBufferAsprintf(&buf, ",tls-creds=%s", objalias);
>>>              VIR_FREE(objalias);
>>> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
>>> index c2ba935..e39bd8b 100644
>>> --- a/src/qemu/qemu_hotplug.c
>>> +++ b/src/qemu/qemu_hotplug.c
>>> @@ -1738,7 +1738,7 @@ int qemuDomainAttachChrDevice(virQEMUDriverPtr driver,
>>>                                           &tlsProps) < 0)
>>>              goto cleanup;
>>>  
>>> -        if (!(tlsAlias = qemuAliasTLSObjFromChardevAlias(chr->info.alias)))
>>> +        if (!(tlsAlias = qemuAliasTLSObjFromChardevAlias(charAlias)))
>>>              goto cleanup;
>>>          dev->data.tcp.tlscreds = true;
>>>      }
>>> @@ -4387,6 +4387,7 @@ int qemuDomainDetachChrDevice(virQEMUDriverPtr driver,
>>>      virDomainChrDefPtr tmpChr;
>>>      char *objAlias = NULL;
>>>      char *devstr = NULL;
>>> +    char *charAlias = NULL;
>>>  
>>>      if (!(tmpChr = virDomainChrFind(vmdef, chr))) {
>>>          virReportError(VIR_ERR_OPERATION_INVALID, "%s",
>>> @@ -4397,11 +4398,14 @@ int qemuDomainDetachChrDevice(virQEMUDriverPtr driver,
>>>      if (!tmpChr->info.alias && qemuAssignDeviceChrAlias(vmdef, tmpChr, -1) < 0)
>>>          goto cleanup;
>>>  
>>> +    if (virAsprintf(&charAlias, "char%s", tmpChr->info.alias) < 0)
>>> +        goto cleanup;
>>> +
>>
>> This would seemingly need to go after the subsequent line...  Although I
>> think the subsequent line gets removed if use a qemu_alias.c helper.
> 
> The helper would be called here, so I'll move it after that assert.
> 
> Thanks
> 
> Pavel
> 
>>
>>>      sa_assert(tmpChr->info.alias);
>>>  
>>>      if (tmpChr->source.type == VIR_DOMAIN_CHR_TYPE_TCP &&
>>>          cfg->chardevTLS &&
>>> -        !(objAlias = qemuAliasTLSObjFromChardevAlias(tmpChr->info.alias)))
>>> +        !(objAlias = qemuAliasTLSObjFromChardevAlias(charAlias)))
>>>          goto cleanup;
>>>  
>>>      if (qemuBuildChrDeviceStr(&devstr, vmdef, chr, priv->qemuCaps) < 0)
>>> @@ -4427,6 +4431,7 @@ int qemuDomainDetachChrDevice(virQEMUDriverPtr driver,
>>>   cleanup:
>>>      qemuDomainResetDeviceRemoval(vm);
>>>      VIR_FREE(devstr);
>>> +    VIR_FREE(charAlias);
>>>      virObjectUnref(cfg);
>>>      return ret;
>>>  
>>> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-tlsx509-chardev-verify.args b/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-tlsx509-chardev-verify.args
>>> index f521e33..003d11d 100644
>>> --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-tlsx509-chardev-verify.args
>>> +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-tlsx509-chardev-verify.args
>>> @@ -25,9 +25,9 @@ server,nowait \
>>>  -chardev udp,id=charserial0,host=127.0.0.1,port=2222,localaddr=127.0.0.1,\
>>>  localport=1111 \
>>>  -device isa-serial,chardev=charserial0,id=serial0 \
>>> --object tls-creds-x509,id=objserial1_tls0,dir=/etc/pki/libvirt-chardev,\
>>> +-object tls-creds-x509,id=objcharserial1_tls0,dir=/etc/pki/libvirt-chardev,\
>>>  endpoint=client,verify-peer=yes \
>>>  -chardev socket,id=charserial1,host=127.0.0.1,port=5555,\
>>> -tls-creds=objserial1_tls0 \
>>> +tls-creds=objcharserial1_tls0 \
>>>  -device isa-serial,chardev=charserial1,id=serial1 \
>>>  -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
>>> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-tlsx509-chardev.args b/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-tlsx509-chardev.args
>>> index 4c8c23e..b456cce 100644
>>> --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-tlsx509-chardev.args
>>> +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-tlsx509-chardev.args
>>> @@ -25,9 +25,9 @@ server,nowait \
>>>  -chardev udp,id=charserial0,host=127.0.0.1,port=2222,localaddr=127.0.0.1,\
>>>  localport=1111 \
>>>  -device isa-serial,chardev=charserial0,id=serial0 \
>>> --object tls-creds-x509,id=objserial1_tls0,dir=/etc/pki/libvirt-chardev,\
>>> +-object tls-creds-x509,id=objcharserial1_tls0,dir=/etc/pki/libvirt-chardev,\
>>>  endpoint=client,verify-peer=no \
>>>  -chardev socket,id=charserial1,host=127.0.0.1,port=5555,\
>>> -tls-creds=objserial1_tls0 \
>>> +tls-creds=objcharserial1_tls0 \
>>>  -device isa-serial,chardev=charserial1,id=serial1 \
>>>  -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
>>>




More information about the libvir-list mailing list