]> xenbits.xensource.com Git - libvirt.git/commitdiff
admin: Introduce virAdmServerLookupClient
authorErik Skultety <eskultet@redhat.com>
Fri, 22 Apr 2016 07:47:09 +0000 (09:47 +0200)
committerErik Skultety <eskultet@redhat.com>
Tue, 3 May 2016 13:52:50 +0000 (15:52 +0200)
Just like with server-related APIs, before any of client-based APIs can be
called, a reference to a client-side client object needs to be obtained. For
this purpose, a lookup method should exist. Apart from the client retrieval
logic, a new error code for non-existent client had to be added as well.

Signed-off-by: Erik Skultety <eskultet@redhat.com>
12 files changed:
daemon/admin_server.c
daemon/admin_server.h
include/libvirt/libvirt-admin.h
include/libvirt/virterror.h
src/admin/admin_protocol.x
src/admin_protocol-structs
src/libvirt-admin.c
src/libvirt_admin_private.syms
src/libvirt_admin_public.syms
src/rpc/virnetserver.c
src/rpc/virnetserver.h
src/util/virerror.c

index 0bd142c4350a418250c50518c11e1234841386f1..9ea11645711e001981dab57c05edf61ec4219fe1 100644 (file)
@@ -201,3 +201,13 @@ adminServerListClients(virNetServerPtr srv,
     virObjectListFreeCount(clts, ret);
     return ret;
 }
+
+virNetServerClientPtr
+adminServerLookupClient(virNetServerPtr srv,
+                        unsigned long long id,
+                        unsigned int flags)
+{
+    virCheckFlags(0, NULL);
+
+    return virNetServerGetClient(srv, id);
+}
index 3e4786ebdadf433ae43eff68d8bf61bf340ce0f0..a593251d7ac6aaed9e000bb4f53d5964a1413d83 100644 (file)
@@ -50,4 +50,8 @@ int adminServerListClients(virNetServerPtr srv,
                            virNetServerClientPtr **clients,
                            unsigned int flags);
 
+virNetServerClientPtr adminServerLookupClient(virNetServerPtr srv,
+                                              unsigned long long id,
+                                              unsigned int flags);
+
 #endif /* __LIBVIRTD_ADMIN_SERVER_H__ */
index 20768e218ae5e1f775dabcafa646b6949d880854..e51f2bab4ddc93b0fa5c8630d75af6a99d16b8a2 100644 (file)
@@ -219,6 +219,11 @@ int virAdmServerListClients(virAdmServerPtr srv,
                             virAdmClientPtr **clients,
                             unsigned int flags);
 
+virAdmClientPtr
+virAdmServerLookupClient(virAdmServerPtr srv,
+                         unsigned long long id,
+                         unsigned int flags);
+
 # ifdef __cplusplus
 }
 # endif
index c6abdf766954b7d719842aacd19f46713fe7a732..2ec560e063c7d171d5dd44462b2af9ae9bd9d29d 100644 (file)
@@ -314,6 +314,7 @@ typedef enum {
     VIR_ERR_MIGRATE_FINISH_OK = 93,     /* Finish API succeeded but it is expected to return NULL */
     VIR_ERR_AUTH_UNAVAILABLE = 94,     /* authentication unavailable */
     VIR_ERR_NO_SERVER = 95,             /* Server was not found */
+    VIR_ERR_NO_CLIENT = 96,             /* Client was not found */
 } virErrorNumber;
 
 /**
index e77ce9e455bca43f9364e505903c352c55a40c80..da21db8d39520b623e3df84149e31e3828ed8fad 100644 (file)
@@ -138,6 +138,16 @@ struct admin_server_list_clients_ret { /* insert@1 */
     unsigned int ret;
 };
 
+struct admin_server_lookup_client_args {
+    admin_nonnull_server srv;
+    unsigned hyper id;
+    unsigned int flags;
+};
+
+struct admin_server_lookup_client_ret {
+    admin_nonnull_client clnt;
+};
+
 /* Define the program number, protocol version and procedure numbers here. */
 const ADMIN_PROGRAM = 0x06900690;
 const ADMIN_PROTOCOL_VERSION = 1;
@@ -198,5 +208,10 @@ enum admin_procedure {
     /**
      * @generate: both
      */
-    ADMIN_PROC_SERVER_LIST_CLIENTS = 8
+    ADMIN_PROC_SERVER_LIST_CLIENTS = 8,
+
+    /**
+     * @generate: both
+     */
+    ADMIN_PROC_SERVER_LOOKUP_CLIENT = 9
 };
index 055ddd591796880aabc625959b6b90d5b0ce8820..dc2220e3ef88926992ab31d7336159eaf4520da9 100644 (file)
@@ -87,6 +87,14 @@ struct admin_server_list_clients_ret {
         } clients;
         u_int                      ret;
 };
+struct admin_server_lookup_client_args {
+        admin_nonnull_server       srv;
+        uint64_t                   id;
+        u_int                      flags;
+};
+struct admin_server_lookup_client_ret {
+        admin_nonnull_client       clnt;
+};
 enum admin_procedure {
         ADMIN_PROC_CONNECT_OPEN = 1,
         ADMIN_PROC_CONNECT_CLOSE = 2,
@@ -96,4 +104,5 @@ enum admin_procedure {
         ADMIN_PROC_SERVER_GET_THREADPOOL_PARAMETERS = 6,
         ADMIN_PROC_SERVER_SET_THREADPOOL_PARAMETERS = 7,
         ADMIN_PROC_SERVER_LIST_CLIENTS = 8,
+        ADMIN_PROC_SERVER_LOOKUP_CLIENT = 9,
 };
index f8b5bd7df0b24c60af753cee38c786edc4529947..d9cdb811f1ea9a9a5bfeed28e4e31a0106bd5eb9 100644 (file)
@@ -889,3 +889,39 @@ virAdmServerListClients(virAdmServerPtr srv,
     virDispatchError(NULL);
     return -1;
 }
+
+/**
+ * virAdmServerLookupClient:
+ * @srv: a valid server object reference
+ * @id: ID of the client to lookup on server @srv
+ * @flags: extra flags; not used yet, so callers should always pass 0
+ *
+ * Try to lookup a client on the given server based on @id.
+ *
+ * virAdmClientFree() should be used to free the resources after the
+ * client object is no longer needed.
+ *
+ * Returns the requested client or NULL in case of failure.  If the
+ * client could not be found, then VIR_ERR_NO_CLIENT error is raised.
+ */
+virAdmClientPtr
+virAdmServerLookupClient(virAdmServerPtr srv,
+                         unsigned long long id,
+                         unsigned int flags)
+{
+    virAdmClientPtr ret = NULL;
+
+    VIR_DEBUG("srv=%p, id=%llu, flags=%x", srv, id, flags);
+    virResetLastError();
+
+    virCheckAdmServerGoto(srv, error);
+    virCheckFlagsGoto(0, error);
+
+    if (!(ret = remoteAdminServerLookupClient(srv, id, flags)))
+        goto error;
+
+    return ret;
+ error:
+    virDispatchError(NULL);
+    return NULL;
+}
index 621b502ddd92ebd513ac803d8a160c89945ef389..3d7ecbcb717eba70edddb3feaf4441792312f70a 100644 (file)
@@ -16,6 +16,8 @@ xdr_admin_server_get_threadpool_parameters_args;
 xdr_admin_server_get_threadpool_parameters_ret;
 xdr_admin_server_list_clients_args;
 xdr_admin_server_list_clients_ret;
+xdr_admin_server_lookup_client_args;
+xdr_admin_server_lookup_client_ret;
 xdr_admin_server_set_threadpool_parameters_args;
 
 # datatypes.h
index bf6643a19f3dbb425e2d306f94af3b7022635b11..066ae0ce98d70ab7405e08198c7cd11f83e52bae 100644 (file)
@@ -29,6 +29,7 @@ LIBVIRT_ADMIN_1.3.0 {
         virAdmServerGetName;
         virAdmServerGetThreadPoolParameters;
         virAdmServerFree;
+        virAdmServerLookupClient;
         virAdmConnectLookupServer;
         virAdmServerSetThreadPoolParameters;
         virAdmServerListClients;
index fcc79f4c1e8dadef8b700359290f64aecd6e8c85..60541cba8c017a2e46e2d9e54db7ebfc769be4cc 100644 (file)
@@ -972,3 +972,26 @@ virNetServerGetClients(virNetServerPtr srv,
     virObjectUnlock(srv);
     return ret;
 }
+
+virNetServerClientPtr
+virNetServerGetClient(virNetServerPtr srv,
+                      unsigned long long id)
+{
+    size_t i;
+    virNetServerClientPtr ret = NULL;
+
+    virObjectLock(srv);
+
+    for (i = 0; i < srv->nclients; i++) {
+        virNetServerClientPtr client = srv->clients[i];
+        if (virNetServerClientGetID(client) == id)
+            ret = virObjectRef(client);
+    }
+
+    virObjectUnlock(srv);
+
+    if (!ret)
+        virReportError(VIR_ERR_NO_CLIENT,
+                       _("No client with matching ID '%llu'"), id);
+    return ret;
+}
index f5bb20052ad578c44bed24105c74e03ef9c8dd17..993bda76e0a5673ca32dccbfa39f9a1d5e24736d 100644 (file)
@@ -105,6 +105,9 @@ int virNetServerSetThreadPoolParameters(virNetServerPtr srv,
 
 unsigned long long virNetServerNextClientID(virNetServerPtr srv);
 
+virNetServerClientPtr virNetServerGetClient(virNetServerPtr srv,
+                                            unsigned long long id);
+
 int virNetServerGetClients(virNetServerPtr srv,
                            virNetServerClientPtr **clients);
 
index 4766e13c0e545bec08d15a78a8661f8f16b1e584..5d875e37766b0cb597472508d77c1ef1ba57c159 100644 (file)
@@ -1388,6 +1388,12 @@ virErrorMsg(virErrorNumber error, const char *info)
             else
                 errmsg = _("Server not found: %s");
             break;
+        case VIR_ERR_NO_CLIENT:
+            if (info == NULL)
+                errmsg = _("Client not found");
+            else
+                errmsg = _("Client not found: %s");
+            break;
     }
     return errmsg;
 }