Blame SOURCES/0015-New-API-functions-to-enable-search-queries-of-collec.patch

546e1e
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
546e1e
From: "Eduardo Lima (Etrunko)" <etrunko@redhat.com>
546e1e
Date: Fri, 7 Apr 2017 16:25:46 -0300
546e1e
Subject: [PATCH] New API functions to enable search queries of collections
546e1e
546e1e
Currently it is not possible to specify search query to optimize the
546e1e
collections returned by the REST API. It is necessary to retrieve and
546e1e
parse the full results and then iterate over the data to find what you
546e1e
are really looking for.
546e1e
546e1e
This patch introduces the search functionality for the APIs that are
546e1e
currently supported, improving bandwidth usage and also the need to
546e1e
iterate over the results.
546e1e
546e1e
Like the previous patch, this patch also introduces an auxiliary
546e1e
function in ovirt-collection to retrieve a sub-collection with a search
546e1e
query.
546e1e
546e1e
Signed-off-by: Eduardo Lima (Etrunko) <etrunko@redhat.com>
546e1e
---
546e1e
 govirt/govirt.sym                 |  4 +++
546e1e
 govirt/ovirt-api.c                | 60 +++++++++++++++++++++++++++++++
546e1e
 govirt/ovirt-api.h                |  3 ++
546e1e
 govirt/ovirt-collection-private.h |  6 ++++
546e1e
 govirt/ovirt-collection.c         | 31 ++++++++++++++++
546e1e
 5 files changed, 104 insertions(+)
546e1e
546e1e
diff --git a/govirt/govirt.sym b/govirt/govirt.sym
546e1e
index 8371779..d02e77f 100644
546e1e
--- a/govirt/govirt.sym
546e1e
+++ b/govirt/govirt.sym
546e1e
@@ -105,6 +105,10 @@ GOVIRT_0.3.2 {
546e1e
         ovirt_resource_delete;
546e1e
         ovirt_resource_delete_async;
546e1e
         ovirt_resource_delete_finish;
546e1e
+
546e1e
+        ovirt_api_search_storage_domains;
546e1e
+        ovirt_api_search_vms;
546e1e
+        ovirt_api_search_vm_pools;
546e1e
 } GOVIRT_0.3.1;
546e1e
 
546e1e
 GOVIRT_0.3.4 {
546e1e
diff --git a/govirt/ovirt-api.c b/govirt/ovirt-api.c
546e1e
index 37c0935..ca3fdcf 100644
546e1e
--- a/govirt/ovirt-api.c
546e1e
+++ b/govirt/ovirt-api.c
546e1e
@@ -135,6 +135,26 @@ OvirtCollection *ovirt_api_get_vms(OvirtApi *api)
546e1e
     return api->priv->vms;
546e1e
 }
546e1e
 
546e1e
+/**
546e1e
+ * ovirt_api_search_vms:
546e1e
+ * @api: a #OvirtApi
546e1e
+ * @query: search query
546e1e
+ *
546e1e
+ * Return value: (transfer full):
546e1e
+ */
546e1e
+OvirtCollection *ovirt_api_search_vms(OvirtApi *api, const char *query)
546e1e
+{
546e1e
+    g_return_val_if_fail(OVIRT_IS_API(api), NULL);
546e1e
+
546e1e
+    return ovirt_sub_collection_new_from_resource_search(OVIRT_RESOURCE(api),
546e1e
+                                                         "vms/search",
546e1e
+                                                         "vms",
546e1e
+                                                         OVIRT_TYPE_VM,
546e1e
+                                                         "vm",
546e1e
+                                                         query);
546e1e
+}
546e1e
+
546e1e
+
546e1e
 /**
546e1e
  * ovirt_api_get_vm_pools:
546e1e
  * @api: a #OvirtApi
546e1e
@@ -160,6 +180,26 @@ OvirtCollection *ovirt_api_get_vm_pools(OvirtApi *api)
546e1e
 }
546e1e
 
546e1e
 
546e1e
+/**
546e1e
+ * ovirt_api_search_vm_pools:
546e1e
+ * @api: a #OvirtApi
546e1e
+ * @query: search query
546e1e
+ *
546e1e
+ * Return value: (transfer full):
546e1e
+ */
546e1e
+OvirtCollection *ovirt_api_search_vm_pools(OvirtApi *api, const char *query)
546e1e
+{
546e1e
+    g_return_val_if_fail(OVIRT_IS_API(api), NULL);
546e1e
+
546e1e
+    return ovirt_sub_collection_new_from_resource_search(OVIRT_RESOURCE(api),
546e1e
+                                                         "vmpools/search",
546e1e
+                                                         "vmpools",
546e1e
+                                                         OVIRT_TYPE_VM_POOL,
546e1e
+                                                         "vmpool",
546e1e
+                                                         query);
546e1e
+}
546e1e
+
546e1e
+
546e1e
 /**
546e1e
  * ovirt_api_get_storage_domains:
546e1e
  * @api: a #OvirtApi
546e1e
@@ -183,3 +223,23 @@ OvirtCollection *ovirt_api_get_storage_domains(OvirtApi *api)
546e1e
 
546e1e
     return api->priv->storage_domains;
546e1e
 }
546e1e
+
546e1e
+
546e1e
+/**
546e1e
+ * ovirt_api_search_storage_domains:
546e1e
+ * @api: a #OvirtApi
546e1e
+ * @query: search query
546e1e
+ *
546e1e
+ * Return value: (transfer full):
546e1e
+ */
546e1e
+OvirtCollection *ovirt_api_search_storage_domains(OvirtApi *api, const char *query)
546e1e
+{
546e1e
+    g_return_val_if_fail(OVIRT_IS_API(api), NULL);
546e1e
+
546e1e
+    return ovirt_sub_collection_new_from_resource_search(OVIRT_RESOURCE(api),
546e1e
+                                                         "storagedomains/search",
546e1e
+                                                         "storage_domains",
546e1e
+                                                         OVIRT_TYPE_STORAGE_DOMAIN,
546e1e
+                                                         "storage_domain",
546e1e
+                                                         query);
546e1e
+}
546e1e
diff --git a/govirt/ovirt-api.h b/govirt/ovirt-api.h
546e1e
index 5f0d4e9..1bf6c02 100644
546e1e
--- a/govirt/ovirt-api.h
546e1e
+++ b/govirt/ovirt-api.h
546e1e
@@ -62,8 +62,11 @@ GType ovirt_api_get_type(void);
546e1e
 OvirtApi *ovirt_api_new(void);
546e1e
 
546e1e
 OvirtCollection *ovirt_api_get_storage_domains(OvirtApi *api);
546e1e
+OvirtCollection *ovirt_api_search_storage_domains(OvirtApi *api, const char *query);
546e1e
 OvirtCollection *ovirt_api_get_vms(OvirtApi *api);
546e1e
+OvirtCollection *ovirt_api_search_vms(OvirtApi *api, const char *query);
546e1e
 OvirtCollection *ovirt_api_get_vm_pools(OvirtApi *api);
546e1e
+OvirtCollection *ovirt_api_search_vm_pools(OvirtApi *api, const char *query);
546e1e
 
546e1e
 G_END_DECLS
546e1e
 
546e1e
diff --git a/govirt/ovirt-collection-private.h b/govirt/ovirt-collection-private.h
546e1e
index d955fc6..cf7e603 100644
546e1e
--- a/govirt/ovirt-collection-private.h
546e1e
+++ b/govirt/ovirt-collection-private.h
546e1e
@@ -46,6 +46,12 @@ OvirtCollection *ovirt_sub_collection_new_from_resource(OvirtResource *resource,
546e1e
                                                         const char *collection_name,
546e1e
                                                         GType resource_type,
546e1e
                                                         const char *resource_name);
546e1e
+OvirtCollection *ovirt_sub_collection_new_from_resource_search(OvirtResource *resource,
546e1e
+                                                               const char *href,
546e1e
+                                                               const char *collection_name,
546e1e
+                                                               GType resource_type,
546e1e
+                                                               const char *resource_name,
546e1e
+                                                               const char *query);
546e1e
 
546e1e
 G_END_DECLS
546e1e
 
546e1e
diff --git a/govirt/ovirt-collection.c b/govirt/ovirt-collection.c
546e1e
index 6ec1c6e..d36d750 100644
546e1e
--- a/govirt/ovirt-collection.c
546e1e
+++ b/govirt/ovirt-collection.c
546e1e
@@ -358,6 +358,37 @@ OvirtCollection *ovirt_sub_collection_new_from_resource(OvirtResource *resource,
546e1e
     return ovirt_collection_new(link, collection_name, resource_type, resource_name);
546e1e
 }
546e1e
 
546e1e
+OvirtCollection *ovirt_sub_collection_new_from_resource_search(OvirtResource *resource,
546e1e
+                                                               const char *href,
546e1e
+                                                               const char *collection_name,
546e1e
+                                                               GType resource_type,
546e1e
+                                                               const char *resource_name,
546e1e
+                                                               const char *query)
546e1e
+{
546e1e
+    const char *link;
546e1e
+    char *substr;
546e1e
+    gchar *link_query, *escaped_query;
546e1e
+    OvirtCollection *collection;
546e1e
+
546e1e
+    link = ovirt_resource_get_sub_collection(resource, href);
546e1e
+    if (link == NULL)
546e1e
+        return NULL;
546e1e
+
546e1e
+    /* link is will be something like "/ovirt-engine/api/vms?search={query}", so
546e1e
+     * we need to strip out {query} substring.
546e1e
+     */
546e1e
+    substr = g_strrstr(link, "{query}");
546e1e
+    if (substr != NULL)
546e1e
+        *substr = '\0';
546e1e
+
546e1e
+    escaped_query = g_uri_escape_string(query, NULL, FALSE);
546e1e
+    link_query = g_strconcat(link, escaped_query, NULL);
546e1e
+    collection = ovirt_collection_new(link_query, collection_name, resource_type, resource_name);
546e1e
+    g_free(escaped_query);
546e1e
+    g_free(link_query);
546e1e
+
546e1e
+    return collection;
546e1e
+}
546e1e
 
546e1e
 /**
546e1e
  * ovirt_collection_fetch: