[libvirt] [PATCH 11/20] Add volume encryption information handling.

Daniel P. Berrange berrange at redhat.com
Thu Aug 6 16:35:06 UTC 2009


On Tue, Aug 04, 2009 at 10:28:26PM +0200, Miloslav Trma?? wrote:
> Define an <encryption> tag specifying volume encryption format and
> format-depenedent parameters (e.g. passphrase, cipher name, key
> length, key).
> 
> Currently the only defined parameter is a reference to a "secret"
> (passphrase/key) managed using the virSecret* API.
> 
> Only the qcow/qcow2 encryption format, and a "default" format used to
> let libvirt choose the format during volume creation, is currently
> supported.
> 
> This patch does not add any users; the <encryption> tag is added in
> the following patches to both volumes (to support encrypted volume
> creation) and domains.
> 
> Changes since the first submission;
> - Use <secret type='passphrase' secret_id='...'>
>   instead of <passphrase> with in-line passphrase.
> - Use a generic "sequence of secrets" representation.
> - Output the <secret> elements unconditionally (they don't reveal the
>   secrets any more).
> - Add format "default", to be used during volume creation only.
> - Use "%s", _("...") for all error messages without parameters.
> - Add a schema for <encryption>.
> - Document <encryption>.


> diff --git a/docs/schemas/storageencryption.rng b/docs/schemas/storageencryption.rng
> new file mode 100644
> index 0000000..69a2841
> --- /dev/null
> +++ b/docs/schemas/storageencryption.rng
> @@ -0,0 +1,37 @@
> +<!-- A Relax NG schema for the libvirt volume encryption XML format -->
> +<grammar xmlns="http://relaxng.org/ns/structure/1.0"
> +    datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
> +
> +  <define name='encryption'>
> +    <optional>
> +      <element name='encryption'>
> +	<attribute name='format'>
> +	  <choice>
> +	    <value>unencrypted</value>
> +	    <value>default</value>
> +	    <value>qcow</value>
> +	  </choice>
> +	</attribute>

I don't think we should include 'unencrypted' here. If a volume is
not encrypted, we should simply omit the <encryption> element
entirely in the domain  / storage volume XML doc.

> +	<zeroOrMore>
> +	  <ref name='secret'/>
> +	</zeroOrMore>
> +      </element>
> +    </optional>
> +  </define>
> +
> +  <define name='secret'>
> +    <element name='secret'>
> +      <attribute name='type'>
> +	<choice>
> +	  <value>passphrase</value>
> +	</choice>
> +      </attribute>
> +      <optional>
> +        <attribute name='secret_id'>
> +          <text/>
> +        </attribute>

Lets just call this attribute  'uuid' - no need to have 
the word 'secret' prefixed on it too.


> +      </optional>
> +    </element>
> +  </define>
> +
> +</grammar>


> +static int
> +virStorageEncryptionSecretFormat(virConnectPtr conn,
> +                                 virBufferPtr buf,
> +                                 virStorageEncryptionSecretPtr secret)
> +{
> +    const char *type;
> +
> +    type = virStorageEncryptionSecretTypeTypeToString(secret->type);
> +    if (!type) {
> +        virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s",
> +                              _("unexpected volume encryption secret type"));
> +        return -1;
> +    }
> +
> +    virBufferVSprintf(buf, "    <secret type='%s'", type);
> +    if (secret->secret_id != NULL)
> +      virBufferEscapeString(buf, " secret_id='%s'", secret->secret_id);
> +    virBufferAddLit(buf, "/>\n");
> +    return 0;
> +}

Tiny indentation bug crept in there.

> +
> +int
> +virStorageEncryptionFormat(virConnectPtr conn,
> +                           virBufferPtr buf,
> +                           virStorageEncryptionPtr enc)
> +{
> +    const char *format;
> +    size_t i;
> +
> +    format = virStorageEncryptionFormatTypeToString(enc->format);
> +    if (!format) {
> +        virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
> +                              "%s", _("unexpected encryption format"));
> +        return -1;
> +    }
> +    virBufferVSprintf(buf, "  <encryption format='%s'>\n", format);
> +
> +    for (i = 0; i < enc->nsecrets; i++) {
> +      if (virStorageEncryptionSecretFormat(conn, buf, enc->secrets[i]) < 0)
> +        return -1;
> +    }


And there too.

> +
> +    virBufferAddLit(buf, "  </encryption>\n");
> +
> +    return 0;
> +}



I think this is generally ok, aside from those minor stylist changes.

Daniel
-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list