[PATCH v2 2/4] conf: Add support for http(s) query strings

Peter Krempa posted 4 patches 5 years, 10 months ago
[PATCH v2 2/4] conf: Add support for http(s) query strings
Posted by Peter Krempa 5 years, 10 months ago
Add a new attribute for holding the query part for http(s) disks.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
---
 docs/formatdomain.html.in                                  | 7 ++++++-
 docs/schemas/domaincommon.rng                              | 6 ++++++
 src/conf/domain_conf.c                                     | 5 +++++
 src/util/virstoragefile.c                                  | 1 +
 src/util/virstoragefile.h                                  | 1 +
 tests/qemuxml2argvdata/disk-network-http.xml               | 2 +-
 .../qemuxml2xmloutdata/disk-network-http.x86_64-latest.xml | 2 +-
 7 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 6dbf449698..aaeb05961f 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -2847,7 +2847,7 @@
   &lt;/disk&gt;
   &lt;disk type='network' device='cdrom'&gt;
     &lt;driver name='qemu' type='raw'/&gt;
-    &lt;source protocol="http" name="url_path"&gt;
+    &lt;source protocol="http" name="url_path" query="foo=bar&amp;amp;baz=flurb&gt;
       &lt;host name="hostname" port="80"/&gt;
       &lt;cookies&gt;
         &lt;cookie name="test"&gt;somevalue&lt;/cookie&gt;
@@ -3113,6 +3113,11 @@
               ('tls' <span class="since">Since 4.5.0</span>)
               </p>

+              <p>For protocols <code>http</code> and <code>https</code> an
+              optional attribute <code>query</code> specifies the query string.
+              (<span class="since">Since 6.2.0</span>)
+              </p>
+
               <p>For "iscsi" (<span class="since">since 1.0.4</span>), the
               <code>name</code> attribute may include a logical unit number,
               separated from the target's name by a slash (e.g.,
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 5de17593c1..1807df521c 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -1869,6 +1869,9 @@
           </choice>
         </attribute>
         <attribute name="name"/>
+        <optional>
+          <attribute name="query"/>
+        </optional>
         <ref name="diskSourceCommon"/>
         <ref name="diskSourceNetworkHost"/>
         <optional>
@@ -1894,6 +1897,9 @@
           </choice>
         </attribute>
         <attribute name="name"/>
+        <optional>
+          <attribute name="query"/>
+        </optional>
         <ref name="diskSourceCommon"/>
         <ref name="diskSourceNetworkHost"/>
         <optional>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 27bc5a797b..914e03c705 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -9482,6 +9482,10 @@ virDomainDiskSourceNetworkParse(xmlNodePtr node,
     /* config file currently only works with remote disks */
     src->configFile = virXPathString("string(./config/@file)", ctxt);

+    if (src->protocol == VIR_STORAGE_NET_PROTOCOL_HTTP ||
+        src->protocol == VIR_STORAGE_NET_PROTOCOL_HTTPS)
+        src->query = virXMLPropString(node, "query");
+
     if (virDomainStorageNetworkParseHosts(node, &src->hosts, &src->nhosts) < 0)
         return -1;

@@ -24591,6 +24595,7 @@ virDomainDiskSourceFormatNetwork(virBufferPtr attrBuf,
         path = g_strdup_printf("%s/%s", src->volume, src->path);

     virBufferEscapeString(attrBuf, " name='%s'", path ? path : src->path);
+    virBufferEscapeString(attrBuf, " query='%s'", src->query);

     if (src->haveTLS != VIR_TRISTATE_BOOL_ABSENT &&
         !(flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE &&
diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
index c43e52d1f6..bccef863b4 100644
--- a/src/util/virstoragefile.c
+++ b/src/util/virstoragefile.c
@@ -2418,6 +2418,7 @@ virStorageSourceCopy(const virStorageSource *src,
     def->compat = g_strdup(src->compat);
     def->tlsAlias = g_strdup(src->tlsAlias);
     def->tlsCertdir = g_strdup(src->tlsCertdir);
+    def->query = g_strdup(src->query);

     if (src->sliceStorage)
         def->sliceStorage = virStorageSourceSliceCopy(src->sliceStorage);
diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h
index 9427057f94..7939c09cd5 100644
--- a/src/util/virstoragefile.h
+++ b/src/util/virstoragefile.h
@@ -284,6 +284,7 @@ struct _virStorageSource {
     char *snapshot; /* for storage systems supporting internal snapshots */
     char *configFile; /* some storage systems use config file as part of
                          the source definition */
+    char *query; /* query string for HTTP based protocols */
     size_t nhosts;
     virStorageNetHostDefPtr hosts;
     size_t ncookies;
diff --git a/tests/qemuxml2argvdata/disk-network-http.xml b/tests/qemuxml2argvdata/disk-network-http.xml
index 93e6617433..3abf499019 100644
--- a/tests/qemuxml2argvdata/disk-network-http.xml
+++ b/tests/qemuxml2argvdata/disk-network-http.xml
@@ -42,7 +42,7 @@
     </disk>
     <disk type='network' device='disk'>
       <driver name='qemu' type='raw'/>
-      <source protocol='https' name='test4.img'>
+      <source protocol='https' name='test4.img' query='par=val&amp;other=ble'>
         <host name='example.org' port='1234'/>
         <ssl verify='no'/>
         <cookies>
diff --git a/tests/qemuxml2xmloutdata/disk-network-http.x86_64-latest.xml b/tests/qemuxml2xmloutdata/disk-network-http.x86_64-latest.xml
index cf36331286..aaae21c5af 100644
--- a/tests/qemuxml2xmloutdata/disk-network-http.x86_64-latest.xml
+++ b/tests/qemuxml2xmloutdata/disk-network-http.x86_64-latest.xml
@@ -49,7 +49,7 @@
     </disk>
     <disk type='network' device='disk'>
       <driver name='qemu' type='raw'/>
-      <source protocol='https' name='test4.img'>
+      <source protocol='https' name='test4.img' query='par=val&amp;other=ble'>
         <host name='example.org' port='1234'/>
         <ssl verify='no'/>
         <cookies>
-- 
2.24.1

Re: [PATCH v2 2/4] conf: Add support for http(s) query strings
Posted by Ján Tomko 5 years, 10 months ago
On a Monday in 2020, Peter Krempa wrote:
>Add a new attribute for holding the query part for http(s) disks.
>
>Signed-off-by: Peter Krempa <pkrempa@redhat.com>
>---
> docs/formatdomain.html.in                                  | 7 ++++++-
> docs/schemas/domaincommon.rng                              | 6 ++++++
> src/conf/domain_conf.c                                     | 5 +++++
> src/util/virstoragefile.c                                  | 1 +
> src/util/virstoragefile.h                                  | 1 +
> tests/qemuxml2argvdata/disk-network-http.xml               | 2 +-
> .../qemuxml2xmloutdata/disk-network-http.x86_64-latest.xml | 2 +-
> 7 files changed, 21 insertions(+), 3 deletions(-)
>
>diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
>index 6dbf449698..aaeb05961f 100644
>--- a/docs/formatdomain.html.in
>+++ b/docs/formatdomain.html.in
>@@ -2847,7 +2847,7 @@
>   &lt;/disk&gt;
>   &lt;disk type='network' device='cdrom'&gt;
>     &lt;driver name='qemu' type='raw'/&gt;
>-    &lt;source protocol="http" name="url_path"&gt;
>+    &lt;source protocol="http" name="url_path" query="foo=bar&amp;amp;baz=flurb&gt;
>       &lt;host name="hostname" port="80"/&gt;
>       &lt;cookies&gt;
>         &lt;cookie name="test"&gt;somevalue&lt;/cookie&gt;
>@@ -3113,6 +3113,11 @@
>               ('tls' <span class="since">Since 4.5.0</span>)
>               </p>
>
>+              <p>For protocols <code>http</code> and <code>https</code> an
>+              optional attribute <code>query</code> specifies the query string.
>+              (<span class="since">Since 6.2.0</span>)

Should this be 6.3.0? Or are we calling this a bugfix?

>+              </p>
>+
>               <p>For "iscsi" (<span class="since">since 1.0.4</span>), the
>               <code>name</code> attribute may include a logical unit number,
>               separated from the target's name by a slash (e.g.,
>diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
>index 5de17593c1..1807df521c 100644
>--- a/docs/schemas/domaincommon.rng
>+++ b/docs/schemas/domaincommon.rng
>@@ -1869,6 +1869,9 @@
>           </choice>
>         </attribute>
>         <attribute name="name"/>
>+        <optional>
>+          <attribute name="query"/>
>+        </optional>
>         <ref name="diskSourceCommon"/>
>         <ref name="diskSourceNetworkHost"/>
>         <optional>
>@@ -1894,6 +1897,9 @@
>           </choice>
>         </attribute>
>         <attribute name="name"/>
>+        <optional>
>+          <attribute name="query"/>
>+        </optional>
>         <ref name="diskSourceCommon"/>
>         <ref name="diskSourceNetworkHost"/>
>         <optional>
>diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>index 27bc5a797b..914e03c705 100644
>--- a/src/conf/domain_conf.c
>+++ b/src/conf/domain_conf.c
>@@ -9482,6 +9482,10 @@ virDomainDiskSourceNetworkParse(xmlNodePtr node,
>     /* config file currently only works with remote disks */
>     src->configFile = virXPathString("string(./config/@file)", ctxt);
>
>+    if (src->protocol == VIR_STORAGE_NET_PROTOCOL_HTTP ||
>+        src->protocol == VIR_STORAGE_NET_PROTOCOL_HTTPS)
>+        src->query = virXMLPropString(node, "query");
>+
>     if (virDomainStorageNetworkParseHosts(node, &src->hosts, &src->nhosts) < 0)
>         return -1;
>
>@@ -24591,6 +24595,7 @@ virDomainDiskSourceFormatNetwork(virBufferPtr attrBuf,
>         path = g_strdup_printf("%s/%s", src->volume, src->path);
>
>     virBufferEscapeString(attrBuf, " name='%s'", path ? path : src->path);
>+    virBufferEscapeString(attrBuf, " query='%s'", src->query);
>
>     if (src->haveTLS != VIR_TRISTATE_BOOL_ABSENT &&
>         !(flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE &&
>diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
>index c43e52d1f6..bccef863b4 100644
>--- a/src/util/virstoragefile.c
>+++ b/src/util/virstoragefile.c
>@@ -2418,6 +2418,7 @@ virStorageSourceCopy(const virStorageSource *src,
>     def->compat = g_strdup(src->compat);
>     def->tlsAlias = g_strdup(src->tlsAlias);
>     def->tlsCertdir = g_strdup(src->tlsCertdir);
>+    def->query = g_strdup(src->query);

The string also needs to be freed in virStorageSourceClear.

>
>     if (src->sliceStorage)
>         def->sliceStorage = virStorageSourceSliceCopy(src->sliceStorage);

Reviewed-by: Ján Tomko <jtomko@redhat.com>

Jano
Re: [PATCH v2 2/4] conf: Add support for http(s) query strings
Posted by Peter Krempa 5 years, 10 months ago
On Mon, Mar 30, 2020 at 16:18:26 +0200, Ján Tomko wrote:
> On a Monday in 2020, Peter Krempa wrote:
> > Add a new attribute for holding the query part for http(s) disks.
> > 
> > Signed-off-by: Peter Krempa <pkrempa@redhat.com>
> > ---
> > docs/formatdomain.html.in                                  | 7 ++++++-
> > docs/schemas/domaincommon.rng                              | 6 ++++++
> > src/conf/domain_conf.c                                     | 5 +++++
> > src/util/virstoragefile.c                                  | 1 +
> > src/util/virstoragefile.h                                  | 1 +
> > tests/qemuxml2argvdata/disk-network-http.xml               | 2 +-
> > .../qemuxml2xmloutdata/disk-network-http.x86_64-latest.xml | 2 +-
> > 7 files changed, 21 insertions(+), 3 deletions(-)
> > 
> > diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> > index 6dbf449698..aaeb05961f 100644
> > --- a/docs/formatdomain.html.in
> > +++ b/docs/formatdomain.html.in
> > @@ -2847,7 +2847,7 @@
> >   &lt;/disk&gt;
> >   &lt;disk type='network' device='cdrom'&gt;
> >     &lt;driver name='qemu' type='raw'/&gt;
> > -    &lt;source protocol="http" name="url_path"&gt;
> > +    &lt;source protocol="http" name="url_path" query="foo=bar&amp;amp;baz=flurb&gt;
> >       &lt;host name="hostname" port="80"/&gt;
> >       &lt;cookies&gt;
> >         &lt;cookie name="test"&gt;somevalue&lt;/cookie&gt;
> > @@ -3113,6 +3113,11 @@
> >               ('tls' <span class="since">Since 4.5.0</span>)
> >               </p>
> > 
> > +              <p>For protocols <code>http</code> and <code>https</code> an
> > +              optional attribute <code>query</code> specifies the query string.
> > +              (<span class="since">Since 6.2.0</span>)
> 
> Should this be 6.3.0? Or are we calling this a bugfix?

This is breaking certain versions of virt-v2v which didn't switch to
nbdkit yet so I'm willing to call this a bugfix. 

Re: [PATCH v2 2/4] conf: Add support for http(s) query strings
Posted by Ján Tomko 5 years, 10 months ago
On a Monday in 2020, Peter Krempa wrote:
>On Mon, Mar 30, 2020 at 16:18:26 +0200, Ján Tomko wrote:
>> On a Monday in 2020, Peter Krempa wrote:
>> > Add a new attribute for holding the query part for http(s) disks.
>> >
>> > Signed-off-by: Peter Krempa <pkrempa@redhat.com>
>> > ---
>> > docs/formatdomain.html.in                                  | 7 ++++++-
>> > docs/schemas/domaincommon.rng                              | 6 ++++++
>> > src/conf/domain_conf.c                                     | 5 +++++
>> > src/util/virstoragefile.c                                  | 1 +
>> > src/util/virstoragefile.h                                  | 1 +
>> > tests/qemuxml2argvdata/disk-network-http.xml               | 2 +-
>> > .../qemuxml2xmloutdata/disk-network-http.x86_64-latest.xml | 2 +-
>> > 7 files changed, 21 insertions(+), 3 deletions(-)
>> >
>> > diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
>> > index 6dbf449698..aaeb05961f 100644
>> > --- a/docs/formatdomain.html.in
>> > +++ b/docs/formatdomain.html.in
>> > @@ -2847,7 +2847,7 @@
>> >   &lt;/disk&gt;
>> >   &lt;disk type='network' device='cdrom'&gt;
>> >     &lt;driver name='qemu' type='raw'/&gt;
>> > -    &lt;source protocol="http" name="url_path"&gt;
>> > +    &lt;source protocol="http" name="url_path" query="foo=bar&amp;amp;baz=flurb&gt;
>> >       &lt;host name="hostname" port="80"/&gt;
>> >       &lt;cookies&gt;
>> >         &lt;cookie name="test"&gt;somevalue&lt;/cookie&gt;
>> > @@ -3113,6 +3113,11 @@
>> >               ('tls' <span class="since">Since 4.5.0</span>)
>> >               </p>
>> >
>> > +              <p>For protocols <code>http</code> and <code>https</code> an
>> > +              optional attribute <code>query</code> specifies the query string.
>> > +              (<span class="since">Since 6.2.0</span>)
>>
>> Should this be 6.3.0? Or are we calling this a bugfix?
>
>This is breaking certain versions of virt-v2v which didn't switch to
>nbdkit yet so I'm willing to call this a bugfix.
>

Fine by me.

Jano