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

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