[libvirt] [RFC 3/3] qemu: Introduce qemuBuildMasterKeyCommandLine

John Ferlan jferlan at redhat.com
Wed Mar 23 12:41:05 UTC 2016



On 03/22/2016 09:01 AM, Peter Krempa wrote:
> On Mon, Mar 21, 2016 at 14:29:02 -0400, John Ferlan wrote:
>> Using the masterKey and if the capability exists build an -object secret
>> command line to pass a masterKey file to qemu. The qemuBuildHasMasterKey
>> is expected to be reused by other objects which would need to know not
>> only if the masterKey has been provided, but if the secret object can be
>> used for their own purposes.
>>
>> Additionally, generate qemuDomainGetMasterKeyAlias which will be used by
>> later patches to define the 'keyid' (eg, masterKey) to be used by other
>> secrets to provide the id to qemu for the master key.
>>
>> Although the path to the domain libDir and the masterKey file are created
>> after qemuBuildCommandLine completes successfully, it's still possible to
>> generate the path and use it. No different than code paths that use the
>> domain libDir to create socket files (e.g. monitor.sock).
>>
>> Signed-off-by: John Ferlan <jferlan at redhat.com>
>> ---
>>  src/qemu/qemu_command.c                            | 67 ++++++++++++++++++++++
>>  src/qemu/qemu_domain.c                             | 17 ++++++
>>  src/qemu/qemu_domain.h                             |  2 +
>>  .../qemuxml2argvdata/qemuxml2argv-master-key.args  | 23 ++++++++
>>  tests/qemuxml2argvdata/qemuxml2argv-master-key.xml | 30 ++++++++++
>>  tests/qemuxml2argvtest.c                           |  2 +
>>  6 files changed, 141 insertions(+)
>>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-master-key.args
>>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-master-key.xml
>>
>> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
>> index eb02553..04e75fd 100644
>> --- a/src/qemu/qemu_command.c
>> +++ b/src/qemu/qemu_command.c
>> @@ -151,6 +151,70 @@ VIR_ENUM_IMPL(qemuNumaPolicy, VIR_DOMAIN_NUMATUNE_MEM_LAST,
>>                "interleave");
>>  
>>  /**
>> + * qemuBuildHasMasterKey:
>> + * @qemuCaps: QEMU binary capabilities
>> + *
>> + * Return true if this binary supports the secret -object, false otherwise.
>> + */
>> +static bool
>> +qemuBuildHasMasterKey(virQEMUCapsPtr qemuCaps)
>> +{
>> +    return virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_SECRET);
>> +}
> 
> This doesn't seem to be terribly useful. Especially since you have to
> check for priv->masterKey anyways.
> 

I thought it might be useful for other CommmandLine functions that may
someday need to determine if the secret -object is supported before
making decisions whether to use it or go with the existing mechanism.

But given other feedback, this'll probably be moot anyway.

>> +
>> +
>> +/**
>> + * qemuBuildMasterKeyCommandLine:
>> + * @cmd: the command to modify
>> + * @qemuCaps qemu capabilities object
>> + * @domainLibDir: location to find the master key
>> +
>> + * Formats the command line for a master key if available
>> + *
>> + * Returns 0 on success, -1 w/ error message on failure
>> + */
>> +static int
>> +qemuBuildMasterKeyCommandLine(virCommandPtr cmd,
>> +                              virQEMUCapsPtr qemuCaps,
>> +                              const char *domainLibDir)
>> +{
>> +    int ret = -1;
>> +    char *alias = NULL;
>> +    char *path = NULL;
>> +
>> +    /* If the -object secret does not exist, then just return. This just
>> +     * means the domain won't be able to use a secret master key and is
>> +     * not a failure.
>> +     */
>> +    if (!qemuBuildHasMasterKey(qemuCaps)) {
>> +        VIR_INFO("secret object is not supported by this QEMU binary");
>> +        return 0;
> 
> Here is the correct place to generate the key. I don't really see the
> benefit of doing it even for qemu that does not support this feature.
> 

Cannot disagree, but my conundrum was not having the priv object in
qemuBuildCommandLine, so choose something (libDir) that I can use.
This'll all get flipped in the next pass, but figured I'd at least try
to explain what was rattling through the rafters while making an initial
pass.

>> +    }
>> +
>> +    if (!(alias = qemuDomainGetMasterKeyAlias()))
>> +        return -1;
>> +
>> +    /* Get the path... NB, the path will not exist yet as domainLibDir
>> +     * and the master secret file gets created after we've successfully
>> +     * built the command line
>> +     */
>> +    if (!(path = qemuDomainGetMasterKeyFilePath(domainLibDir)))
>> +        goto cleanup;
>> +
>> +    virCommandAddArg(cmd, "-object");
>> +    virCommandAddArgFormat(cmd, "secret,id=%s,format=base64,file=%s",
>> +                           alias, path);
>> +
>> +    ret = 0;
>> +
>> + cleanup:
>> +    VIR_FREE(alias);
>> +    VIR_FREE(path);
>> +    return ret;
>> +}
>> +
>> +
>> +/**
>>   * qemuVirCommandGetFDSet:
>>   * @cmd: the command to modify
>>   * @fd: fd to reassign to the child
> 
> [...]
> 
>> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
>> index 507ae9e..53d6705 100644
>> --- a/src/qemu/qemu_domain.c
>> +++ b/src/qemu/qemu_domain.c
>> @@ -468,6 +468,23 @@ qemuDomainJobInfoToParams(qemuDomainJobInfoPtr jobInfo,
>>  }
>>  
>>  
>> +/* qemuDomainGetMasterKeyAlias:
>> + *
>> + * Generate and return the masterKey alias
>> + *
>> + * Returns NULL or a string containing the master key alias
>> + */
>> +char *
>> +qemuDomainGetMasterKeyAlias(void)
> 
> You've added src/qemu/qemu_alias.c, so this belongs there.
> 

Coin flip - I chose here mainly because qemu_alias.c is primarily
dealing with Device aliases, but also because qemuDomainStorageAlias is
here.  IDC either way and will move it there.

Tks -

John
>> +{
>> +    char *alias;
>> +
>> +    ignore_value(VIR_STRDUP(alias, "masterKey0"));
>> +
>> +    return alias;
>> +}
>> +
>> +
>>  /* qemuDomainGetMasterKeyFilePath:
>>   * @libDir: Directory path to domain lib files
>>   *
> 
> Peter
> 




More information about the libvir-list mailing list