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