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

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