[PATCH v2 3/4] schema: add TPM emulator <source dir='..'>

marcandre.lureau@redhat.com posted 4 patches 1 year, 5 months ago
[PATCH v2 3/4] schema: add TPM emulator <source dir='..'>
Posted by marcandre.lureau@redhat.com 1 year, 5 months ago
From: Marc-André Lureau <marcandre.lureau@redhat.com>

Learn to parse a directory for the TPM state.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 docs/formatdomain.rst                           |  3 +++
 src/conf/domain_conf.c                          | 13 ++++++++++---
 src/conf/domain_conf.h                          |  1 +
 src/conf/schemas/domaincommon.rng               | 15 ++++++++++++---
 tests/qemuxmlconfdata/tpm-emulator-tpm2-enc.xml |  1 +
 5 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
index 4818113bc2..24dcc6daaa 100644
--- a/docs/formatdomain.rst
+++ b/docs/formatdomain.rst
@@ -8183,6 +8183,9 @@ Example: usage of the TPM Emulator
 
       This attribute requires that swtpm v0.7 or later is installed.
 
+    ``dir``
+      The path to the TPM state storage directory.
+
    :since:`Since v10.8.0`
 
 ``persistent_state``
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 18c58d16dc..d1e9e4a50c 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -10865,13 +10865,16 @@ virDomainTPMDefParseXML(virDomainXMLOption *xmlopt,
 
         source_node = virXPathNode("./backend/source", ctxt);
         if (source_node) {
-            path = virXMLPropString(source_node, "file");
+            if ((path = virXMLPropString(source_node, "file"))) {
+                def->data.emulator.storage_type = VIR_DOMAIN_TPM_STORAGE_FILE;
+            } else if ((path = virXMLPropString(source_node, "dir"))) {
+                def->data.emulator.storage_type = VIR_DOMAIN_TPM_STORAGE_DIR;
+            }
             if (!path) {
                 virReportError(VIR_ERR_XML_ERROR, "%s",
-                               _("missing TPM file source"));
+                               _("missing TPM file or directory source"));
                 goto error;
             }
-            def->data.emulator.storage_type = VIR_DOMAIN_TPM_STORAGE_FILE;
             def->data.emulator.storagepath = g_steal_pointer(&path);
         }
 
@@ -25084,6 +25087,10 @@ virDomainTPMDefFormat(virBuffer *buf,
                 virBufferAsprintf(&backendChildBuf, "<source file='%s'/>\n",
                                   def->data.emulator.storagepath);
                 break;
+            case VIR_DOMAIN_TPM_STORAGE_DIR:
+                virBufferAsprintf(&backendChildBuf, "<source dir='%s'/>\n",
+                                  def->data.emulator.storagepath);
+                break;
             case VIR_DOMAIN_TPM_STORAGE_DEFAULT:
                 break;
         }
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 371e6ecf6c..4e4ae2e048 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1465,6 +1465,7 @@ typedef enum {
 
 typedef enum {
     VIR_DOMAIN_TPM_STORAGE_DEFAULT,
+    VIR_DOMAIN_TPM_STORAGE_DIR,
     VIR_DOMAIN_TPM_STORAGE_FILE,
 } virDomainTPMStorage;
 
diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng
index 62d3f0e6fe..f6b47ae97e 100644
--- a/src/conf/schemas/domaincommon.rng
+++ b/src/conf/schemas/domaincommon.rng
@@ -5985,9 +5985,18 @@
   <define name="tpm-backend-emulator-source">
     <optional>
       <element name="source">
-        <attribute name="file">
-          <ref name="filePath"/>
-        </attribute>
+        <choice>
+          <group>
+            <attribute name="dir">
+              <ref name="absDirPath"/>
+            </attribute>
+          </group>
+          <group>
+            <attribute name="file">
+              <ref name="filePath"/>
+            </attribute>
+          </group>
+        </choice>
       </element>
     </optional>
   </define>
diff --git a/tests/qemuxmlconfdata/tpm-emulator-tpm2-enc.xml b/tests/qemuxmlconfdata/tpm-emulator-tpm2-enc.xml
index 9c2279b28b..016c68296c 100644
--- a/tests/qemuxmlconfdata/tpm-emulator-tpm2-enc.xml
+++ b/tests/qemuxmlconfdata/tpm-emulator-tpm2-enc.xml
@@ -30,6 +30,7 @@
     <tpm model='tpm-tis'>
       <backend type='emulator' version='2.0'>
         <encryption secret='32ee7e76-2178-47a1-ab7b-269e6e348015'/>
+        <source dir='/some/dir'/>
       </backend>
     </tpm>
     <audio id='1' type='none'/>
-- 
2.45.2.827.g557ae147e6
Re: [PATCH v2 3/4] schema: add TPM emulator <source dir='..'>
Posted by Martin Kletzander 1 year, 4 months ago
On Tue, Sep 10, 2024 at 11:05:59AM +0400, marcandre.lureau@redhat.com wrote:
>From: Marc-André Lureau <marcandre.lureau@redhat.com>
>
>Learn to parse a directory for the TPM state.
>
>Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
>---
> docs/formatdomain.rst                           |  3 +++
> src/conf/domain_conf.c                          | 13 ++++++++++---
> src/conf/domain_conf.h                          |  1 +
> src/conf/schemas/domaincommon.rng               | 15 ++++++++++++---
> tests/qemuxmlconfdata/tpm-emulator-tpm2-enc.xml |  1 +
> 5 files changed, 27 insertions(+), 6 deletions(-)
>
>diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
>index 4818113bc2..24dcc6daaa 100644
>--- a/docs/formatdomain.rst
>+++ b/docs/formatdomain.rst
>@@ -8183,6 +8183,9 @@ Example: usage of the TPM Emulator
>
>       This attribute requires that swtpm v0.7 or later is installed.
>
>+    ``dir``
>+      The path to the TPM state storage directory.
>+
>    :since:`Since v10.8.0`
>
> ``persistent_state``
>diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>index 18c58d16dc..d1e9e4a50c 100644
>--- a/src/conf/domain_conf.c
>+++ b/src/conf/domain_conf.c
>@@ -10865,13 +10865,16 @@ virDomainTPMDefParseXML(virDomainXMLOption *xmlopt,
>
>         source_node = virXPathNode("./backend/source", ctxt);
>         if (source_node) {
>-            path = virXMLPropString(source_node, "file");
>+            if ((path = virXMLPropString(source_node, "file"))) {
>+                def->data.emulator.storage_type = VIR_DOMAIN_TPM_STORAGE_FILE;
>+            } else if ((path = virXMLPropString(source_node, "dir"))) {
>+                def->data.emulator.storage_type = VIR_DOMAIN_TPM_STORAGE_DIR;
>+            }

It would be nicer to figure out which one to use based on a value of an
attribute rather than what attribute we stumble upon first.  Daniel
mentioned <backend type="..."> but that is already used for the type of
the backend, however we could have <source type="(dir|file)"> and maybe
leave the path in as is in the docs (instead of having different
attribute names).
Re: [PATCH v2 3/4] schema: add TPM emulator <source dir='..'>
Posted by Marc-André Lureau 1 year, 4 months ago
Hi

On Wed, Oct 2, 2024 at 11:19 AM Martin Kletzander <mkletzan@redhat.com> wrote:
>
> On Tue, Sep 10, 2024 at 11:05:59AM +0400, marcandre.lureau@redhat.com wrote:
> >From: Marc-André Lureau <marcandre.lureau@redhat.com>
> >
> >Learn to parse a directory for the TPM state.
> >
> >Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> >---
> > docs/formatdomain.rst                           |  3 +++
> > src/conf/domain_conf.c                          | 13 ++++++++++---
> > src/conf/domain_conf.h                          |  1 +
> > src/conf/schemas/domaincommon.rng               | 15 ++++++++++++---
> > tests/qemuxmlconfdata/tpm-emulator-tpm2-enc.xml |  1 +
> > 5 files changed, 27 insertions(+), 6 deletions(-)
> >
> >diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
> >index 4818113bc2..24dcc6daaa 100644
> >--- a/docs/formatdomain.rst
> >+++ b/docs/formatdomain.rst
> >@@ -8183,6 +8183,9 @@ Example: usage of the TPM Emulator
> >
> >       This attribute requires that swtpm v0.7 or later is installed.
> >
> >+    ``dir``
> >+      The path to the TPM state storage directory.
> >+
> >    :since:`Since v10.8.0`
> >
> > ``persistent_state``
> >diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> >index 18c58d16dc..d1e9e4a50c 100644
> >--- a/src/conf/domain_conf.c
> >+++ b/src/conf/domain_conf.c
> >@@ -10865,13 +10865,16 @@ virDomainTPMDefParseXML(virDomainXMLOption *xmlopt,
> >
> >         source_node = virXPathNode("./backend/source", ctxt);
> >         if (source_node) {
> >-            path = virXMLPropString(source_node, "file");
> >+            if ((path = virXMLPropString(source_node, "file"))) {
> >+                def->data.emulator.storage_type = VIR_DOMAIN_TPM_STORAGE_FILE;
> >+            } else if ((path = virXMLPropString(source_node, "dir"))) {
> >+                def->data.emulator.storage_type = VIR_DOMAIN_TPM_STORAGE_DIR;
> >+            }
>
> It would be nicer to figure out which one to use based on a value of an
> attribute rather than what attribute we stumble upon first.  Daniel
> mentioned <backend type="..."> but that is already used for the type of
> the backend, however we could have <source type="(dir|file)"> and maybe
> leave the path in as is in the docs (instead of having different
> attribute names).

Not sure I follow. Doesnt the XML schema prevent having several
<source>, or "file" and "dir" attributes (or "type" for what you
suggest).

So you would rather have:

<source type="file">'/path/to/state'</source>

rather than:

<source file='/path/to/state'/>

libvirt domain for <disk> for example uses the second form. I find it
more idiomatic now.
Re: [PATCH v2 3/4] schema: add TPM emulator <source dir='..'>
Posted by Daniel P. Berrangé 1 year, 4 months ago
On Wed, Oct 02, 2024 at 11:30:39AM +0400, Marc-André Lureau wrote:
> Hi
> 
> On Wed, Oct 2, 2024 at 11:19 AM Martin Kletzander <mkletzan@redhat.com> wrote:
> >
> > On Tue, Sep 10, 2024 at 11:05:59AM +0400, marcandre.lureau@redhat.com wrote:
> > >From: Marc-André Lureau <marcandre.lureau@redhat.com>
> > >
> > >Learn to parse a directory for the TPM state.
> > >
> > >Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > >---
> > > docs/formatdomain.rst                           |  3 +++
> > > src/conf/domain_conf.c                          | 13 ++++++++++---
> > > src/conf/domain_conf.h                          |  1 +
> > > src/conf/schemas/domaincommon.rng               | 15 ++++++++++++---
> > > tests/qemuxmlconfdata/tpm-emulator-tpm2-enc.xml |  1 +
> > > 5 files changed, 27 insertions(+), 6 deletions(-)
> > >
> > >diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
> > >index 4818113bc2..24dcc6daaa 100644
> > >--- a/docs/formatdomain.rst
> > >+++ b/docs/formatdomain.rst
> > >@@ -8183,6 +8183,9 @@ Example: usage of the TPM Emulator
> > >
> > >       This attribute requires that swtpm v0.7 or later is installed.
> > >
> > >+    ``dir``
> > >+      The path to the TPM state storage directory.
> > >+
> > >    :since:`Since v10.8.0`
> > >
> > > ``persistent_state``
> > >diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> > >index 18c58d16dc..d1e9e4a50c 100644
> > >--- a/src/conf/domain_conf.c
> > >+++ b/src/conf/domain_conf.c
> > >@@ -10865,13 +10865,16 @@ virDomainTPMDefParseXML(virDomainXMLOption *xmlopt,
> > >
> > >         source_node = virXPathNode("./backend/source", ctxt);
> > >         if (source_node) {
> > >-            path = virXMLPropString(source_node, "file");
> > >+            if ((path = virXMLPropString(source_node, "file"))) {
> > >+                def->data.emulator.storage_type = VIR_DOMAIN_TPM_STORAGE_FILE;
> > >+            } else if ((path = virXMLPropString(source_node, "dir"))) {
> > >+                def->data.emulator.storage_type = VIR_DOMAIN_TPM_STORAGE_DIR;
> > >+            }
> >
> > It would be nicer to figure out which one to use based on a value of an
> > attribute rather than what attribute we stumble upon first.  Daniel
> > mentioned <backend type="..."> but that is already used for the type of
> > the backend, however we could have <source type="(dir|file)"> and maybe
> > leave the path in as is in the docs (instead of having different
> > attribute names).
> 
> Not sure I follow. Doesnt the XML schema prevent having several
> <source>, or "file" and "dir" attributes (or "type" for what you
> suggest).
> 
> So you would rather have:
> 
> <source type="file">'/path/to/state'</source>
> 
> rather than:
> 
> <source file='/path/to/state'/>
> 
> libvirt domain for <disk> for example uses the second form. I find it
> more idiomatic now.

That isn't a valid comparison, because there is a "type" attribute on
the parent <disk> element that dictates what schema branch is followed
for <source>.

The TPM *must* have an equivalent attribute somewhere that dictates
the schema branch for <source>.

This means either we put "type=file|dir" on the <source>, or we invent
a new "source=file|dir" on the parent <tpm> element. I tend to favour
the former, since "type" is the common attribute name we use for
schema branch discriminators.

With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|
Re: [PATCH v2 3/4] schema: add TPM emulator <source dir='..'>
Posted by Martin Kletzander 1 year, 4 months ago
On Wed, Oct 02, 2024 at 11:30:39AM +0400, Marc-André Lureau wrote:
>Hi
>
>On Wed, Oct 2, 2024 at 11:19 AM Martin Kletzander <mkletzan@redhat.com> wrote:
>>
>> On Tue, Sep 10, 2024 at 11:05:59AM +0400, marcandre.lureau@redhat.com wrote:
>> >From: Marc-André Lureau <marcandre.lureau@redhat.com>
>> >
>> >Learn to parse a directory for the TPM state.
>> >
>> >Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
>> >---
>> > docs/formatdomain.rst                           |  3 +++
>> > src/conf/domain_conf.c                          | 13 ++++++++++---
>> > src/conf/domain_conf.h                          |  1 +
>> > src/conf/schemas/domaincommon.rng               | 15 ++++++++++++---
>> > tests/qemuxmlconfdata/tpm-emulator-tpm2-enc.xml |  1 +
>> > 5 files changed, 27 insertions(+), 6 deletions(-)
>> >
>> >diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
>> >index 4818113bc2..24dcc6daaa 100644
>> >--- a/docs/formatdomain.rst
>> >+++ b/docs/formatdomain.rst
>> >@@ -8183,6 +8183,9 @@ Example: usage of the TPM Emulator
>> >
>> >       This attribute requires that swtpm v0.7 or later is installed.
>> >
>> >+    ``dir``
>> >+      The path to the TPM state storage directory.
>> >+
>> >    :since:`Since v10.8.0`
>> >
>> > ``persistent_state``
>> >diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>> >index 18c58d16dc..d1e9e4a50c 100644
>> >--- a/src/conf/domain_conf.c
>> >+++ b/src/conf/domain_conf.c
>> >@@ -10865,13 +10865,16 @@ virDomainTPMDefParseXML(virDomainXMLOption *xmlopt,
>> >
>> >         source_node = virXPathNode("./backend/source", ctxt);
>> >         if (source_node) {
>> >-            path = virXMLPropString(source_node, "file");
>> >+            if ((path = virXMLPropString(source_node, "file"))) {
>> >+                def->data.emulator.storage_type = VIR_DOMAIN_TPM_STORAGE_FILE;
>> >+            } else if ((path = virXMLPropString(source_node, "dir"))) {
>> >+                def->data.emulator.storage_type = VIR_DOMAIN_TPM_STORAGE_DIR;
>> >+            }
>>
>> It would be nicer to figure out which one to use based on a value of an
>> attribute rather than what attribute we stumble upon first.  Daniel
>> mentioned <backend type="..."> but that is already used for the type of
>> the backend, however we could have <source type="(dir|file)"> and maybe
>> leave the path in as is in the docs (instead of having different
>> attribute names).
>
>Not sure I follow. Doesnt the XML schema prevent having several
><source>, or "file" and "dir" attributes (or "type" for what you
>suggest).
>
>So you would rather have:
>
><source type="file">'/path/to/state'</source>
>
>rather than:
>
><source file='/path/to/state'/>
>
>libvirt domain for <disk> for example uses the second form. I find it
>more idiomatic now.
>

I meant <source type="(dir|file)" path="/path/to/state"/>
Re: [PATCH v2 3/4] schema: add TPM emulator <source dir='..'>
Posted by Marc-André Lureau 1 year, 4 months ago
Hi

On Wed, Oct 2, 2024 at 11:34 AM Martin Kletzander <mkletzan@redhat.com> wrote:
>
> On Wed, Oct 02, 2024 at 11:30:39AM +0400, Marc-André Lureau wrote:
> >Hi
> >
> >On Wed, Oct 2, 2024 at 11:19 AM Martin Kletzander <mkletzan@redhat.com> wrote:
> >>
> >> On Tue, Sep 10, 2024 at 11:05:59AM +0400, marcandre.lureau@redhat.com wrote:
> >> >From: Marc-André Lureau <marcandre.lureau@redhat.com>
> >> >
> >> >Learn to parse a directory for the TPM state.
> >> >
> >> >Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> >> >---
> >> > docs/formatdomain.rst                           |  3 +++
> >> > src/conf/domain_conf.c                          | 13 ++++++++++---
> >> > src/conf/domain_conf.h                          |  1 +
> >> > src/conf/schemas/domaincommon.rng               | 15 ++++++++++++---
> >> > tests/qemuxmlconfdata/tpm-emulator-tpm2-enc.xml |  1 +
> >> > 5 files changed, 27 insertions(+), 6 deletions(-)
> >> >
> >> >diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
> >> >index 4818113bc2..24dcc6daaa 100644
> >> >--- a/docs/formatdomain.rst
> >> >+++ b/docs/formatdomain.rst
> >> >@@ -8183,6 +8183,9 @@ Example: usage of the TPM Emulator
> >> >
> >> >       This attribute requires that swtpm v0.7 or later is installed.
> >> >
> >> >+    ``dir``
> >> >+      The path to the TPM state storage directory.
> >> >+
> >> >    :since:`Since v10.8.0`
> >> >
> >> > ``persistent_state``
> >> >diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> >> >index 18c58d16dc..d1e9e4a50c 100644
> >> >--- a/src/conf/domain_conf.c
> >> >+++ b/src/conf/domain_conf.c
> >> >@@ -10865,13 +10865,16 @@ virDomainTPMDefParseXML(virDomainXMLOption *xmlopt,
> >> >
> >> >         source_node = virXPathNode("./backend/source", ctxt);
> >> >         if (source_node) {
> >> >-            path = virXMLPropString(source_node, "file");
> >> >+            if ((path = virXMLPropString(source_node, "file"))) {
> >> >+                def->data.emulator.storage_type = VIR_DOMAIN_TPM_STORAGE_FILE;
> >> >+            } else if ((path = virXMLPropString(source_node, "dir"))) {
> >> >+                def->data.emulator.storage_type = VIR_DOMAIN_TPM_STORAGE_DIR;
> >> >+            }
> >>
> >> It would be nicer to figure out which one to use based on a value of an
> >> attribute rather than what attribute we stumble upon first.  Daniel
> >> mentioned <backend type="..."> but that is already used for the type of
> >> the backend, however we could have <source type="(dir|file)"> and maybe
> >> leave the path in as is in the docs (instead of having different
> >> attribute names).
> >
> >Not sure I follow. Doesnt the XML schema prevent having several
> ><source>, or "file" and "dir" attributes (or "type" for what you
> >suggest).
> >
> >So you would rather have:
> >
> ><source type="file">'/path/to/state'</source>
> >
> >rather than:
> >
> ><source file='/path/to/state'/>
> >
> >libvirt domain for <disk> for example uses the second form. I find it
> >more idiomatic now.
> >
>
> I meant <source type="(dir|file)" path="/path/to/state"/>

I don't want to bikeshed that. I prefer consistency with other <source
file='...'>, but someone should decide and move on.
Re: [PATCH v2 3/4] schema: add TPM emulator <source dir='..'>
Posted by Martin Kletzander 1 year, 4 months ago
On Wed, Oct 02, 2024 at 03:43:22PM +0400, Marc-André Lureau wrote:
>Hi
>
>On Wed, Oct 2, 2024 at 11:34 AM Martin Kletzander <mkletzan@redhat.com> wrote:
>>
>> On Wed, Oct 02, 2024 at 11:30:39AM +0400, Marc-André Lureau wrote:
>> >Hi
>> >
>> >On Wed, Oct 2, 2024 at 11:19 AM Martin Kletzander <mkletzan@redhat.com> wrote:
>> >>
>> >> On Tue, Sep 10, 2024 at 11:05:59AM +0400, marcandre.lureau@redhat.com wrote:
>> >> >From: Marc-André Lureau <marcandre.lureau@redhat.com>
>> >> >
>> >> >Learn to parse a directory for the TPM state.
>> >> >
>> >> >Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
>> >> >---
>> >> > docs/formatdomain.rst                           |  3 +++
>> >> > src/conf/domain_conf.c                          | 13 ++++++++++---
>> >> > src/conf/domain_conf.h                          |  1 +
>> >> > src/conf/schemas/domaincommon.rng               | 15 ++++++++++++---
>> >> > tests/qemuxmlconfdata/tpm-emulator-tpm2-enc.xml |  1 +
>> >> > 5 files changed, 27 insertions(+), 6 deletions(-)
>> >> >
>> >> >diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
>> >> >index 4818113bc2..24dcc6daaa 100644
>> >> >--- a/docs/formatdomain.rst
>> >> >+++ b/docs/formatdomain.rst
>> >> >@@ -8183,6 +8183,9 @@ Example: usage of the TPM Emulator
>> >> >
>> >> >       This attribute requires that swtpm v0.7 or later is installed.
>> >> >
>> >> >+    ``dir``
>> >> >+      The path to the TPM state storage directory.
>> >> >+
>> >> >    :since:`Since v10.8.0`
>> >> >
>> >> > ``persistent_state``
>> >> >diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>> >> >index 18c58d16dc..d1e9e4a50c 100644
>> >> >--- a/src/conf/domain_conf.c
>> >> >+++ b/src/conf/domain_conf.c
>> >> >@@ -10865,13 +10865,16 @@ virDomainTPMDefParseXML(virDomainXMLOption *xmlopt,
>> >> >
>> >> >         source_node = virXPathNode("./backend/source", ctxt);
>> >> >         if (source_node) {
>> >> >-            path = virXMLPropString(source_node, "file");
>> >> >+            if ((path = virXMLPropString(source_node, "file"))) {
>> >> >+                def->data.emulator.storage_type = VIR_DOMAIN_TPM_STORAGE_FILE;
>> >> >+            } else if ((path = virXMLPropString(source_node, "dir"))) {
>> >> >+                def->data.emulator.storage_type = VIR_DOMAIN_TPM_STORAGE_DIR;
>> >> >+            }
>> >>
>> >> It would be nicer to figure out which one to use based on a value of an
>> >> attribute rather than what attribute we stumble upon first.  Daniel
>> >> mentioned <backend type="..."> but that is already used for the type of
>> >> the backend, however we could have <source type="(dir|file)"> and maybe
>> >> leave the path in as is in the docs (instead of having different
>> >> attribute names).
>> >
>> >Not sure I follow. Doesnt the XML schema prevent having several
>> ><source>, or "file" and "dir" attributes (or "type" for what you
>> >suggest).
>> >
>> >So you would rather have:
>> >
>> ><source type="file">'/path/to/state'</source>
>> >
>> >rather than:
>> >
>> ><source file='/path/to/state'/>
>> >
>> >libvirt domain for <disk> for example uses the second form. I find it
>> >more idiomatic now.
>> >
>>
>> I meant <source type="(dir|file)" path="/path/to/state"/>
>
>I don't want to bikeshed that. I prefer consistency with other <source
>file='...'>,

Compared to disks we have:

<source file=
<source dir=
<source dev=
<source protocol=
...
and more, based on the "type" of the device (backend).

>but someone should decide and move on.
>

I think Daniel also suggested something similar in his review of v1:

https://lists.libvirt.org/archives/list/devel@lists.libvirt.org/message/BVZGGFSHXNZQV5CA3TSOGSUQ2T5ZITIB/

with the only difference that the <backend> already has a type attribute
so it does not work precisely, but the basis of the point is similar I
think.
Re: [PATCH v2 3/4] schema: add TPM emulator <source dir='..'>
Posted by Marc-André Lureau 1 year, 4 months ago
Hi Martin, Daniel

On Wed, Oct 2, 2024 at 6:01 PM Martin Kletzander <mkletzan@redhat.com> wrote:
>
> On Wed, Oct 02, 2024 at 03:43:22PM +0400, Marc-André Lureau wrote:
> >Hi
> >
> >On Wed, Oct 2, 2024 at 11:34 AM Martin Kletzander <mkletzan@redhat.com> wrote:
> >>
> >> On Wed, Oct 02, 2024 at 11:30:39AM +0400, Marc-André Lureau wrote:
> >> >Hi
> >> >
> >> >On Wed, Oct 2, 2024 at 11:19 AM Martin Kletzander <mkletzan@redhat.com> wrote:
> >> >>
> >> >> On Tue, Sep 10, 2024 at 11:05:59AM +0400, marcandre.lureau@redhat.com wrote:
> >> >> >From: Marc-André Lureau <marcandre.lureau@redhat.com>
> >> >> >
> >> >> >Learn to parse a directory for the TPM state.
> >> >> >
> >> >> >Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> >> >> >---
> >> >> > docs/formatdomain.rst                           |  3 +++
> >> >> > src/conf/domain_conf.c                          | 13 ++++++++++---
> >> >> > src/conf/domain_conf.h                          |  1 +
> >> >> > src/conf/schemas/domaincommon.rng               | 15 ++++++++++++---
> >> >> > tests/qemuxmlconfdata/tpm-emulator-tpm2-enc.xml |  1 +
> >> >> > 5 files changed, 27 insertions(+), 6 deletions(-)
> >> >> >
> >> >> >diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
> >> >> >index 4818113bc2..24dcc6daaa 100644
> >> >> >--- a/docs/formatdomain.rst
> >> >> >+++ b/docs/formatdomain.rst
> >> >> >@@ -8183,6 +8183,9 @@ Example: usage of the TPM Emulator
> >> >> >
> >> >> >       This attribute requires that swtpm v0.7 or later is installed.
> >> >> >
> >> >> >+    ``dir``
> >> >> >+      The path to the TPM state storage directory.
> >> >> >+
> >> >> >    :since:`Since v10.8.0`
> >> >> >
> >> >> > ``persistent_state``
> >> >> >diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> >> >> >index 18c58d16dc..d1e9e4a50c 100644
> >> >> >--- a/src/conf/domain_conf.c
> >> >> >+++ b/src/conf/domain_conf.c
> >> >> >@@ -10865,13 +10865,16 @@ virDomainTPMDefParseXML(virDomainXMLOption *xmlopt,
> >> >> >
> >> >> >         source_node = virXPathNode("./backend/source", ctxt);
> >> >> >         if (source_node) {
> >> >> >-            path = virXMLPropString(source_node, "file");
> >> >> >+            if ((path = virXMLPropString(source_node, "file"))) {
> >> >> >+                def->data.emulator.storage_type = VIR_DOMAIN_TPM_STORAGE_FILE;
> >> >> >+            } else if ((path = virXMLPropString(source_node, "dir"))) {
> >> >> >+                def->data.emulator.storage_type = VIR_DOMAIN_TPM_STORAGE_DIR;
> >> >> >+            }
> >> >>
> >> >> It would be nicer to figure out which one to use based on a value of an
> >> >> attribute rather than what attribute we stumble upon first.  Daniel
> >> >> mentioned <backend type="..."> but that is already used for the type of
> >> >> the backend, however we could have <source type="(dir|file)"> and maybe
> >> >> leave the path in as is in the docs (instead of having different
> >> >> attribute names).
> >> >
> >> >Not sure I follow. Doesnt the XML schema prevent having several
> >> ><source>, or "file" and "dir" attributes (or "type" for what you
> >> >suggest).
> >> >
> >> >So you would rather have:
> >> >
> >> ><source type="file">'/path/to/state'</source>
> >> >
> >> >rather than:
> >> >
> >> ><source file='/path/to/state'/>
> >> >
> >> >libvirt domain for <disk> for example uses the second form. I find it
> >> >more idiomatic now.
> >> >
> >>
> >> I meant <source type="(dir|file)" path="/path/to/state"/>
> >
> >I don't want to bikeshed that. I prefer consistency with other <source
> >file='...'>,
>
> Compared to disks we have:
>
> <source file=
> <source dir=
> <source dev=
> <source protocol=
> ...
> and more, based on the "type" of the device (backend).
>
> >but someone should decide and move on.
> >
>
> I think Daniel also suggested something similar in his review of v1:
>
> https://lists.libvirt.org/archives/list/devel@lists.libvirt.org/message/BVZGGFSHXNZQV5CA3TSOGSUQ2T5ZITIB/
>
> with the only difference that the <backend> already has a type attribute
> so it does not work precisely, but the basis of the point is similar I
> think.

I still don't understand what you suggest.

diff --git a/tests/qemuxmlconfdata/tpm-emulator-tpm2.xml
b/tests/qemuxmlconfdata/tpm-emulator-tpm2.xml
index 4c61e2645b..6ff8404d84 100644
--- a/tests/qemuxmlconfdata/tpm-emulator-tpm2.xml
+++ b/tests/qemuxmlconfdata/tpm-emulator-tpm2.xml
@@ -28,13 +28,13 @@
     <input type='mouse' bus='ps2'/>
     <input type='keyboard' bus='ps2'/>
     <tpm model='tpm-tis'>
-      <backend type='emulator' version='2.0' debug='3'>
+      <backend type='emulator' version='2.0' debug='3' storage='path' >
         <encryption secret='b4a117f1-8af2-44a4-91b8-7f0d2d4d68a3'/>
         <active_pcr_banks>
           <sha256/>
           <sha512/>
         </active_pcr_banks>
-        <source file='/path/to/state'/>
+        <source>/path/to/state'<source/>
       </backend>
     </tpm>
     <audio id='1' type='none'/>


It feels wrong, please enlighten me :)
Re: [PATCH v2 3/4] schema: add TPM emulator <source dir='..'>
Posted by Stefan Berger 1 year, 4 months ago

On 9/10/24 3:05 AM, marcandre.lureau@redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
> 
> Learn to parse a directory for the TPM state.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>

> ---
>   docs/formatdomain.rst                           |  3 +++
>   src/conf/domain_conf.c                          | 13 ++++++++++---
>   src/conf/domain_conf.h                          |  1 +
>   src/conf/schemas/domaincommon.rng               | 15 ++++++++++++---
>   tests/qemuxmlconfdata/tpm-emulator-tpm2-enc.xml |  1 +
>   5 files changed, 27 insertions(+), 6 deletions(-)
> 
> diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
> index 4818113bc2..24dcc6daaa 100644
> --- a/docs/formatdomain.rst
> +++ b/docs/formatdomain.rst
> @@ -8183,6 +8183,9 @@ Example: usage of the TPM Emulator
>   
>         This attribute requires that swtpm v0.7 or later is installed.
>   
> +    ``dir``
> +      The path to the TPM state storage directory.
> +
>      :since:`Since v10.8.0`
>   
>   ``persistent_state``
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 18c58d16dc..d1e9e4a50c 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -10865,13 +10865,16 @@ virDomainTPMDefParseXML(virDomainXMLOption *xmlopt,
>   
>           source_node = virXPathNode("./backend/source", ctxt);
>           if (source_node) {
> -            path = virXMLPropString(source_node, "file");
> +            if ((path = virXMLPropString(source_node, "file"))) {
> +                def->data.emulator.storage_type = VIR_DOMAIN_TPM_STORAGE_FILE;
> +            } else if ((path = virXMLPropString(source_node, "dir"))) {
> +                def->data.emulator.storage_type = VIR_DOMAIN_TPM_STORAGE_DIR;
> +            }
>               if (!path) {
>                   virReportError(VIR_ERR_XML_ERROR, "%s",
> -                               _("missing TPM file source"));
> +                               _("missing TPM file or directory source"));
>                   goto error;
>               }
> -            def->data.emulator.storage_type = VIR_DOMAIN_TPM_STORAGE_FILE;
>               def->data.emulator.storagepath = g_steal_pointer(&path);
>           }
>   
> @@ -25084,6 +25087,10 @@ virDomainTPMDefFormat(virBuffer *buf,
>                   virBufferAsprintf(&backendChildBuf, "<source file='%s'/>\n",
>                                     def->data.emulator.storagepath);
>                   break;
> +            case VIR_DOMAIN_TPM_STORAGE_DIR:
> +                virBufferAsprintf(&backendChildBuf, "<source dir='%s'/>\n",
> +                                  def->data.emulator.storagepath);
> +                break;
>               case VIR_DOMAIN_TPM_STORAGE_DEFAULT:
>                   break;
>           }
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 371e6ecf6c..4e4ae2e048 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -1465,6 +1465,7 @@ typedef enum {
>   
>   typedef enum {
>       VIR_DOMAIN_TPM_STORAGE_DEFAULT,
> +    VIR_DOMAIN_TPM_STORAGE_DIR,
>       VIR_DOMAIN_TPM_STORAGE_FILE,
>   } virDomainTPMStorage;
>   
> diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng
> index 62d3f0e6fe..f6b47ae97e 100644
> --- a/src/conf/schemas/domaincommon.rng
> +++ b/src/conf/schemas/domaincommon.rng
> @@ -5985,9 +5985,18 @@
>     <define name="tpm-backend-emulator-source">
>       <optional>
>         <element name="source">
> -        <attribute name="file">
> -          <ref name="filePath"/>
> -        </attribute>
> +        <choice>
> +          <group>
> +            <attribute name="dir">
> +              <ref name="absDirPath"/>
> +            </attribute>
> +          </group>
> +          <group>
> +            <attribute name="file">
> +              <ref name="filePath"/>
> +            </attribute>
> +          </group>
> +        </choice>
>         </element>
>       </optional>
>     </define>
> diff --git a/tests/qemuxmlconfdata/tpm-emulator-tpm2-enc.xml b/tests/qemuxmlconfdata/tpm-emulator-tpm2-enc.xml
> index 9c2279b28b..016c68296c 100644
> --- a/tests/qemuxmlconfdata/tpm-emulator-tpm2-enc.xml
> +++ b/tests/qemuxmlconfdata/tpm-emulator-tpm2-enc.xml
> @@ -30,6 +30,7 @@
>       <tpm model='tpm-tis'>
>         <backend type='emulator' version='2.0'>
>           <encryption secret='32ee7e76-2178-47a1-ab7b-269e6e348015'/>
> +        <source dir='/some/dir'/>
>         </backend>
>       </tpm>
>       <audio id='1' type='none'/>