[PATCH v2 5/9] virnetdaemon: Add post exec restart support for multiple servers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Since the daemon can manage and add (at fresh start) multiple servers,
we also should be able to add them from a JSON state file in case of a
daemon restart. This patch introduces virNetDaemonAddServersPostExec
method which harvests the data about servers from a JSON file supporting
both old format with a single server and a new one storing an array of
servers. The method makes use of the original virNetDaemonAddServerPostExec,
declaring the latter as static.
Patch also updates virnetdaemontest accordingly.
---
 daemon/libvirtd.c                                  |   8 +-
 src/libvirt_remote.syms                            |   3 +-
 src/locking/lock_daemon.c                          |  16 +--
 src/rpc/virnetdaemon.c                             |  96 +++++++++++-----
 src/rpc/virnetdaemon.h                             |  28 ++++-
 src/rpc/virnetserver.c                             |   4 +
 src/rpc/virnetserver.h                             |   1 +
 .../input-data-admin-nomdns-names.json             | 128 +++++++++++++++++++++
 .../output-data-admin-nomdns-names.json            | 128 +++++++++++++++++++++
 .../output-data-admin-nomdns-nonames.json          |   2 +
 .../virnetdaemondata/output-data-anon-clients.json |   1 +
 .../output-data-initial-nomdns.json                |   1 +
 tests/virnetdaemondata/output-data-initial.json    |   1 +
 tests/virnetdaemontest.c                           |  52 +++------
 14 files changed, 390 insertions(+), 79 deletions(-)
 create mode 100644 tests/virnetdaemondata/input-data-admin-nomdns-names.json
 create mode 100644 tests/virnetdaemondata/output-data-admin-nomdns-names.json

diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c
index de4953d..5920a96 100644
--- a/daemon/libvirtd.c
+++ b/daemon/libvirtd.c
@@ -1159,6 +1159,8 @@ int main(int argc, char **argv) {
     bool implicit_conf = false;
     char *run_dir = NULL;
     mode_t old_umask;
+    const char *server_names[] = { "libvirtd", "admin" };
+    virNetDaemonFallbackData fbData = { .fb_server_names = server_names };
 
     struct option opts[] = {
         { "verbose", no_argument, &verbose, 'v'},
@@ -1390,7 +1392,7 @@ int main(int argc, char **argv) {
                                 config->keepalive_interval,
                                 config->keepalive_count,
                                 config->mdns_adv ? config->mdns_name : NULL,
-                                "libvirtd",
+                                server_names[0],
                                 remoteClientInitHook,
                                 NULL,
                                 remoteClientFreeFunc,
@@ -1399,12 +1401,14 @@ int main(int argc, char **argv) {
         goto cleanup;
     }
 
+    virNetDaemonRegisterFallbackData(&fbData);
     if (!(dmn = virNetDaemonNew()) ||
         virNetDaemonAddServer(dmn, srv) < 0) {
         ret = VIR_DAEMON_ERR_INIT;
         goto cleanup;
     }
 
+
     /* Beyond this point, nothing should rely on using
      * getuid/geteuid() == 0, for privilege level checks.
      */
@@ -1465,7 +1469,7 @@ int main(int argc, char **argv) {
                                    config->admin_keepalive_interval,
                                    config->admin_keepalive_count,
                                    NULL,
-                                   "admin",
+                                   server_names[1],
                                    remoteAdmClientInitHook,
                                    NULL,
                                    remoteAdmClientFreeFunc,
diff --git a/src/libvirt_remote.syms b/src/libvirt_remote.syms
index 90a453c..4d31b69 100644
--- a/src/libvirt_remote.syms
+++ b/src/libvirt_remote.syms
@@ -59,7 +59,7 @@ virNetClientStreamSetError;
 
 # rpc/virnetdaemon.h
 virNetDaemonAddServer;
-virNetDaemonAddServerPostExec;
+virNetDaemonAddServersPostExec;
 virNetDaemonAddShutdownInhibition;
 virNetDaemonAddSignalHandler;
 virNetDaemonAutoShutdown;
@@ -71,6 +71,7 @@ virNetDaemonNew;
 virNetDaemonNewPostExecRestart;
 virNetDaemonPreExecRestart;
 virNetDaemonQuit;
+virNetDaemonRegisterFallbackData;
 virNetDaemonRemoveShutdownInhibition;
 virNetDaemonRun;
 virNetDaemonUpdateServices;
diff --git a/src/locking/lock_daemon.c b/src/locking/lock_daemon.c
index 8c07fd6..94f9b11 100644
--- a/src/locking/lock_daemon.c
+++ b/src/locking/lock_daemon.c
@@ -182,7 +182,6 @@ virLockDaemonNewPostExecRestart(virJSONValuePtr object, bool privileged)
     virLockDaemonPtr lockd;
     virJSONValuePtr child;
     virJSONValuePtr lockspaces;
-    virNetServerPtr srv;
     size_t i;
     int n;
 
@@ -254,12 +253,12 @@ virLockDaemonNewPostExecRestart(virJSONValuePtr object, bool privileged)
     if (!(lockd->dmn = virNetDaemonNewPostExecRestart(child)))
         goto error;
 
-    if (!(srv = virNetDaemonAddServerPostExec(lockd->dmn,
-                                              virLockDaemonClientNew,
-                                              virLockDaemonClientNewPostExecRestart,
-                                              virLockDaemonClientPreExecRestart,
-                                              virLockDaemonClientFree,
-                                              (void*)(intptr_t)(privileged ? 0x1 : 0x0))))
+    if (virNetDaemonAddServersPostExec(lockd->dmn,
+                                       virLockDaemonClientNew,
+                                       virLockDaemonClientNewPostExecRestart,
+                                       virLockDaemonClientPreExecRestart,
+                                       virLockDaemonClientFree,
+                                       (void*)(intptr_t)(privileged ? 0x1 : 0x0)) < 0)
         goto error;
 
     return lockd;
@@ -1148,6 +1147,8 @@ int main(int argc, char **argv) {
     bool privileged = false;
     virLockDaemonConfigPtr config = NULL;
     int rv;
+    const char *server_names[] = { "virtlockd" };
+    virNetDaemonFallbackData fbData = { .fb_server_names = server_names };
 
     struct option opts[] = {
         { "verbose", no_argument, &verbose, 'v'},
@@ -1314,6 +1315,7 @@ int main(int argc, char **argv) {
     }
     umask(old_umask);
 
+    virNetDaemonRegisterFallbackData(&fbData);
     if ((rv = virLockDaemonPostExecRestart(state_file,
                                            pid_file,
                                            &pid_file_fd,
diff --git a/src/rpc/virnetdaemon.c b/src/rpc/virnetdaemon.c
index bdfcfb7..a3dde4e 100644
--- a/src/rpc/virnetdaemon.c
+++ b/src/rpc/virnetdaemon.c
@@ -82,8 +82,8 @@ struct _virNetDaemon {
     int autoShutdownInhibitFd;
 };
 
-
 static virClassPtr virNetDaemonClass;
+static virNetDaemonFallbackDataPtr fbData;
 
 static void
 virNetDaemonDispose(void *obj)
@@ -205,38 +205,20 @@ virNetDaemonGetServer(virNetDaemonPtr dmn,
     return srv;
 }
 
-virNetServerPtr
+static int
 virNetDaemonAddServerPostExec(virNetDaemonPtr dmn,
+                              virJSONValuePtr object,
+                              const char *fallbackName,
                               virNetServerClientPrivNew clientPrivNew,
                               virNetServerClientPrivNewPostExecRestart clientPrivNewPostExecRestart,
                               virNetServerClientPrivPreExecRestart clientPrivPreExecRestart,
                               virFreeCallback clientPrivFree,
                               void *clientPrivOpaque)
 {
-    virJSONValuePtr object = NULL;
     virNetServerPtr srv = NULL;
 
-    virObjectLock(dmn);
-
-    if (!dmn->srvObject) {
-        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                       _("Cannot add more servers post-exec than "
-                         "there were pre-exec"));
-        goto error;
-    }
-
-    if (virJSONValueIsArray(dmn->srvObject)) {
-        object = virJSONValueArraySteal(dmn->srvObject, 0);
-        if (virJSONValueArraySize(dmn->srvObject) == 0) {
-            virJSONValueFree(dmn->srvObject);
-            dmn->srvObject = NULL;
-        }
-    } else {
-        object = dmn->srvObject;
-        dmn->srvObject = NULL;
-    }
-
     srv = virNetServerNewPostExecRestart(object,
+                                         fallbackName,
                                          clientPrivNew,
                                          clientPrivNewPostExecRestart,
                                          clientPrivPreExecRestart,
@@ -246,17 +228,67 @@ virNetDaemonAddServerPostExec(virNetDaemonPtr dmn,
     if (!srv || VIR_APPEND_ELEMENT_COPY(dmn->servers, dmn->nservers, srv) < 0)
         goto error;
 
-    virJSONValueFree(object);
-    virObjectUnlock(dmn);
-    return srv;
+    return 0;
 
  error:
-    virObjectUnlock(dmn);
     virObjectUnref(srv);
-    virJSONValueFree(object);
-    return NULL;
+    return -1;
 }
 
+int
+virNetDaemonAddServersPostExec(virNetDaemonPtr dmn,
+                               virNetServerClientPrivNew clientPrivNew,
+                               virNetServerClientPrivNewPostExecRestart clientPrivNewPostExecRestart,
+                               virNetServerClientPrivPreExecRestart clientPrivPreExecRestart,
+                               virFreeCallback clientPrivFree,
+                               void *clientPrivOpaque)
+{
+    int nservers;
+    int ret = -1;
+    size_t i;
+    bool new_version;
+
+    virObjectLock(dmn);
+
+    if (!dmn->srvObject) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("Cannot add more servers post-exec than "
+                         "there were pre-exec"));
+        goto cleanup;
+    }
+
+    if (virJSONValueIsArray(dmn->srvObject)) {
+        nservers = virJSONValueArraySize(dmn->srvObject);
+        new_version = true;
+    } else {
+        nservers = 1;
+        new_version = false;
+    }
+
+    for (i = 0; i < nservers; i++) {
+        virJSONValuePtr object;
+        if (new_version)
+            object = virJSONValueArrayGet(dmn->srvObject, i);
+        else
+            object = dmn->srvObject;
+        if (virNetDaemonAddServerPostExec(dmn,
+                                          object,
+                                          fbData->fb_server_names[i],
+                                          clientPrivNew,
+                                          clientPrivNewPostExecRestart,
+                                          clientPrivPreExecRestart,
+                                          clientPrivFree,
+                                          clientPrivOpaque) < 0)
+            goto cleanup;
+    }
+
+    ret = 0;
+ cleanup:
+    virJSONValueFree(dmn->srvObject);
+    dmn->srvObject = NULL;
+    virObjectUnlock(dmn);
+    return ret;
+}
 
 virNetDaemonPtr
 virNetDaemonNewPostExecRestart(virJSONValuePtr object)
@@ -755,3 +787,9 @@ virNetDaemonHasClients(virNetDaemonPtr dmn)
 
     return false;
 }
+
+void
+virNetDaemonRegisterFallbackData(virNetDaemonFallbackDataPtr data)
+{
+    fbData = data;
+}
diff --git a/src/rpc/virnetdaemon.h b/src/rpc/virnetdaemon.h
index bb32053..8ad799a 100644
--- a/src/rpc/virnetdaemon.h
+++ b/src/rpc/virnetdaemon.h
@@ -35,16 +35,30 @@
 # include "virnetserverservice.h"
 # include "virnetserver.h"
 
+typedef struct _virNetDaemonFallbackData virNetDaemonFallbackData;
+typedef virNetDaemonFallbackData *virNetDaemonFallbackDataPtr;
+
+/* NOTE: Fallback data are necessary for virtlockd which reinitializes its state
+ * from a JSON after being restarted. New admin API requires a server to have
+ * a name which previously wasn't required and virtlockd had formatted its state
+ * without this information, so after an upgrade we need to give the daemon
+ * a hint about what the server names might be according to their formatted order
+ * in a JSON file.
+ */
+struct _virNetDaemonFallbackData {
+    const char **fb_server_names;
+};
+
 virNetDaemonPtr virNetDaemonNew(void);
 
 int virNetDaemonAddServer(virNetDaemonPtr dmn, virNetServerPtr);
 
-virNetServerPtr virNetDaemonAddServerPostExec(virNetDaemonPtr dmn,
-                                              virNetServerClientPrivNew clientPrivNew,
-                                              virNetServerClientPrivNewPostExecRestart clientPrivNewPostExecRestart,
-                                              virNetServerClientPrivPreExecRestart clientPrivPreExecRestart,
-                                              virFreeCallback clientPrivFree,
-                                              void *clientPrivOpaque);
+int virNetDaemonAddServersPostExec(virNetDaemonPtr dmn,
+                                   virNetServerClientPrivNew clientPrivNew,
+                                   virNetServerClientPrivNewPostExecRestart clientPrivNewPostExecRestart,
+                                   virNetServerClientPrivPreExecRestart clientPrivPreExecRestart,
+                                   virFreeCallback clientPrivFree,
+                                   void *clientPrivOpaque);
 
 virNetDaemonPtr virNetDaemonNewPostExecRestart(virJSONValuePtr object);
 
@@ -81,4 +95,6 @@ bool virNetDaemonHasClients(virNetDaemonPtr dmn);
 virNetServerPtr virNetDaemonGetServer(virNetDaemonPtr dmn,
                                       int subServerID);
 
+void virNetDaemonRegisterFallbackData(virNetDaemonFallbackDataPtr data);
+
 #endif /* __VIR_NET_DAEMON_H__ */
diff --git a/src/rpc/virnetserver.c b/src/rpc/virnetserver.c
index ffc1b0d..c0a205f 100644
--- a/src/rpc/virnetserver.c
+++ b/src/rpc/virnetserver.c
@@ -367,6 +367,7 @@ virNetServerPtr virNetServerNew(size_t min_workers,
 
 
 virNetServerPtr virNetServerNewPostExecRestart(virJSONValuePtr object,
+                                               const char *fallbackName,
                                                virNetServerClientPrivNew clientPrivNew,
                                                virNetServerClientPrivNewPostExecRestart clientPrivNewPostExecRestart,
                                                virNetServerClientPrivPreExecRestart clientPrivPreExecRestart,
@@ -388,6 +389,9 @@ virNetServerPtr virNetServerNewPostExecRestart(virJSONValuePtr object,
     const char *mdnsGroupName = NULL;
     const char *serverName = NULL;
 
+    if (!(serverName = virJSONValueObjectGetString(object, "name")))
+        serverName = fallbackName;
+
     if (virJSONValueObjectGetNumberUint(object, "min_workers", &min_workers) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                        _("Missing min_workers data in JSON document"));
diff --git a/src/rpc/virnetserver.h b/src/rpc/virnetserver.h
index fb04aa3..96137cc 100644
--- a/src/rpc/virnetserver.h
+++ b/src/rpc/virnetserver.h
@@ -49,6 +49,7 @@ virNetServerPtr virNetServerNew(size_t min_workers,
                                 void *clientPrivOpaque);
 
 virNetServerPtr virNetServerNewPostExecRestart(virJSONValuePtr object,
+                                               const char *fallbackName,
                                                virNetServerClientPrivNew clientPrivNew,
                                                virNetServerClientPrivNewPostExecRestart clientPrivNewPostExecRestart,
                                                virNetServerClientPrivPreExecRestart clientPrivPreExecRestart,
diff --git a/tests/virnetdaemondata/input-data-admin-nomdns-names.json b/tests/virnetdaemondata/input-data-admin-nomdns-names.json
new file mode 100644
index 0000000..c9d22e1
--- /dev/null
+++ b/tests/virnetdaemondata/input-data-admin-nomdns-names.json
@@ -0,0 +1,128 @@
+{
+    "servers": [
+    {
+        "name": "adminTestServer0",
+        "min_workers": 10,
+        "max_workers": 50,
+        "priority_workers": 5,
+        "max_clients": 100,
+        "keepaliveInterval": 120,
+        "keepaliveCount": 5,
+        "keepaliveRequired": true,
+        "services": [
+        {
+            "auth": 0,
+            "readonly": true,
+            "nrequests_client_max": 2,
+            "socks": [
+            {
+                "fd": 100,
+                "errfd": -1,
+                "pid": 0,
+                "isClient": false
+            }
+            ]
+        },
+        {
+            "auth": 2,
+            "readonly": false,
+            "nrequests_client_max": 5,
+            "socks": [
+            {
+                "fd": 101,
+                "errfd": -1,
+                "pid": 0,
+                "isClient": false
+            }
+            ]
+        }
+        ],
+        "clients": [
+        {
+            "auth": 1,
+            "readonly": true,
+            "nrequests_max": 15,
+            "sock": {
+            "fd": 102,
+            "errfd": -1,
+            "pid": -1,
+            "isClient": true
+            }
+        },
+        {
+            "auth": 2,
+            "readonly": true,
+            "nrequests_max": 66,
+            "sock": {
+            "fd": 103,
+            "errfd": -1,
+            "pid": -1,
+            "isClient": true
+            }
+        }
+        ]
+    },
+    {
+        "name": "adminTestServer1",
+        "min_workers": 2,
+        "max_workers": 50,
+        "priority_workers": 5,
+        "max_clients": 100,
+        "keepaliveInterval": 120,
+        "keepaliveCount": 5,
+        "keepaliveRequired": true,
+        "services": [
+        {
+            "auth": 0,
+            "readonly": true,
+            "nrequests_client_max": 2,
+            "socks": [
+            {
+                "fd": 100,
+                "errfd": -1,
+                "pid": 0,
+                "isClient": false
+            }
+            ]
+        },
+        {
+            "auth": 2,
+            "readonly": false,
+            "nrequests_client_max": 5,
+            "socks": [
+            {
+                "fd": 101,
+                "errfd": -1,
+                "pid": 0,
+                "isClient": false
+            }
+            ]
+        }
+        ],
+        "clients": [
+        {
+            "auth": 1,
+            "readonly": true,
+            "nrequests_max": 15,
+            "sock": {
+            "fd": 102,
+            "errfd": -1,
+            "pid": -1,
+            "isClient": true
+            }
+        },
+        {
+            "auth": 2,
+            "readonly": true,
+            "nrequests_max": 66,
+            "sock": {
+            "fd": 103,
+            "errfd": -1,
+            "pid": -1,
+            "isClient": true
+            }
+        }
+        ]
+    }
+    ]
+}
diff --git a/tests/virnetdaemondata/output-data-admin-nomdns-names.json b/tests/virnetdaemondata/output-data-admin-nomdns-names.json
new file mode 100644
index 0000000..40c66a7
--- /dev/null
+++ b/tests/virnetdaemondata/output-data-admin-nomdns-names.json
@@ -0,0 +1,128 @@
+{
+    "servers": [
+        {
+            "name": "adminTestServer0",
+            "min_workers": 10,
+            "max_workers": 50,
+            "priority_workers": 5,
+            "max_clients": 100,
+            "max_anonymous_clients": 100,
+            "keepaliveInterval": 120,
+            "keepaliveCount": 5,
+            "services": [
+                {
+                    "auth": 0,
+                    "readonly": true,
+                    "nrequests_client_max": 2,
+                    "socks": [
+                        {
+                            "fd": 100,
+                            "errfd": -1,
+                            "pid": 0,
+                            "isClient": false
+                        }
+                    ]
+                },
+                {
+                    "auth": 2,
+                    "readonly": false,
+                    "nrequests_client_max": 5,
+                    "socks": [
+                        {
+                            "fd": 101,
+                            "errfd": -1,
+                            "pid": 0,
+                            "isClient": false
+                        }
+                    ]
+                }
+            ],
+            "clients": [
+                {
+                    "auth": 1,
+                    "readonly": true,
+                    "nrequests_max": 15,
+                    "sock": {
+                        "fd": 102,
+                        "errfd": -1,
+                        "pid": -1,
+                        "isClient": true
+                    }
+                },
+                {
+                    "auth": 2,
+                    "readonly": true,
+                    "nrequests_max": 66,
+                    "sock": {
+                        "fd": 103,
+                        "errfd": -1,
+                        "pid": -1,
+                        "isClient": true
+                    }
+                }
+            ]
+        },
+        {
+            "name": "adminTestServer1",
+            "min_workers": 2,
+            "max_workers": 50,
+            "priority_workers": 5,
+            "max_clients": 100,
+            "max_anonymous_clients": 100,
+            "keepaliveInterval": 120,
+            "keepaliveCount": 5,
+            "services": [
+                {
+                    "auth": 0,
+                    "readonly": true,
+                    "nrequests_client_max": 2,
+                    "socks": [
+                        {
+                            "fd": 100,
+                            "errfd": -1,
+                            "pid": 0,
+                            "isClient": false
+                        }
+                    ]
+                },
+                {
+                    "auth": 2,
+                    "readonly": false,
+                    "nrequests_client_max": 5,
+                    "socks": [
+                        {
+                            "fd": 101,
+                            "errfd": -1,
+                            "pid": 0,
+                            "isClient": false
+                        }
+                    ]
+                }
+            ],
+            "clients": [
+                {
+                    "auth": 1,
+                    "readonly": true,
+                    "nrequests_max": 15,
+                    "sock": {
+                        "fd": 102,
+                        "errfd": -1,
+                        "pid": -1,
+                        "isClient": true
+                    }
+                },
+                {
+                    "auth": 2,
+                    "readonly": true,
+                    "nrequests_max": 66,
+                    "sock": {
+                        "fd": 103,
+                        "errfd": -1,
+                        "pid": -1,
+                        "isClient": true
+                    }
+                }
+            ]
+        }
+    ]
+}
diff --git a/tests/virnetdaemondata/output-data-admin-nomdns-nonames.json b/tests/virnetdaemondata/output-data-admin-nomdns-nonames.json
index a814aeb..4b09311 100644
--- a/tests/virnetdaemondata/output-data-admin-nomdns-nonames.json
+++ b/tests/virnetdaemondata/output-data-admin-nomdns-nonames.json
@@ -1,6 +1,7 @@
 {
     "servers": [
         {
+            "name": "testServer0",
             "min_workers": 10,
             "max_workers": 50,
             "priority_workers": 5,
@@ -62,6 +63,7 @@
             ]
         },
         {
+            "name": "testServer1",
             "min_workers": 2,
             "max_workers": 50,
             "priority_workers": 5,
diff --git a/tests/virnetdaemondata/output-data-anon-clients.json b/tests/virnetdaemondata/output-data-anon-clients.json
index 05fc0ae..043f072 100644
--- a/tests/virnetdaemondata/output-data-anon-clients.json
+++ b/tests/virnetdaemondata/output-data-anon-clients.json
@@ -1,6 +1,7 @@
 {
     "servers": [
         {
+            "name": "testServer0",
             "min_workers": 10,
             "max_workers": 50,
             "priority_workers": 5,
diff --git a/tests/virnetdaemondata/output-data-initial-nomdns.json b/tests/virnetdaemondata/output-data-initial-nomdns.json
index 400e47b..00bebc3 100644
--- a/tests/virnetdaemondata/output-data-initial-nomdns.json
+++ b/tests/virnetdaemondata/output-data-initial-nomdns.json
@@ -1,6 +1,7 @@
 {
     "servers": [
         {
+            "name": "testServer0",
             "min_workers": 10,
             "max_workers": 50,
             "priority_workers": 5,
diff --git a/tests/virnetdaemondata/output-data-initial.json b/tests/virnetdaemondata/output-data-initial.json
index e875cff..63a4872 100644
--- a/tests/virnetdaemondata/output-data-initial.json
+++ b/tests/virnetdaemondata/output-data-initial.json
@@ -1,6 +1,7 @@
 {
     "servers": [
         {
+            "name": "testServer0",
             "min_workers": 10,
             "max_workers": 50,
             "priority_workers": 5,
diff --git a/tests/virnetdaemontest.c b/tests/virnetdaemontest.c
index 89d3ca1..3569253 100644
--- a/tests/virnetdaemontest.c
+++ b/tests/virnetdaemontest.c
@@ -28,7 +28,7 @@
 
 #ifdef HAVE_SOCKETPAIR
 static virNetServerPtr
-testCreateServer(const char *host, int family)
+testCreateServer(const char *host, int family, const char *name)
 {
     virNetServerPtr srv = NULL;
     virNetServerServicePtr svc1 = NULL, svc2 = NULL;
@@ -51,7 +51,7 @@ testCreateServer(const char *host, int family)
 
     if (!(srv = virNetServerNew(10, 50, 5, 100, 10,
                                 120, 5,
-                                mdns_group, "test-server",
+                                mdns_group, name,
                                 NULL,
                                 NULL,
                                 NULL,
@@ -133,7 +133,7 @@ testCreateServer(const char *host, int family)
     goto cleanup;
 }
 
-static char *testGenerateJSON(void)
+static char *testGenerateJSON(const char *server_name)
 {
     virNetDaemonPtr dmn = NULL;
     virNetServerPtr srv = NULL;
@@ -155,7 +155,7 @@ static char *testGenerateJSON(void)
 
     if (!(srv = testCreateServer(
               has_ipv4 ? "127.0.0.1" : "::1",
-              has_ipv4 ? AF_INET : AF_INET6)))
+              has_ipv4 ? AF_INET : AF_INET6, server_name)))
         goto cleanup;
 
     if (!(dmn = virNetDaemonNew()))
@@ -184,16 +184,13 @@ static char *testGenerateJSON(void)
 
 struct testExecRestartData {
     const char *jsonfile;
-    int nservers;
-    bool pass;
+    virNetDaemonFallbackDataPtr fbData;
 };
 
 static int testExecRestart(const void *opaque)
 {
-    size_t i;
     int ret = -1;
     virNetDaemonPtr dmn = NULL;
-    virNetServerPtr srv = NULL;
     const struct testExecRestartData *data = opaque;
     char *infile = NULL, *outfile = NULL;
     char *injsonstr = NULL, *outjsonstr = NULL;
@@ -238,13 +235,9 @@ static int testExecRestart(const void *opaque)
     if (!(dmn = virNetDaemonNewPostExecRestart(injson)))
         goto cleanup;
 
-    for (i = 0; i < data->nservers; i++) {
-        if (!(srv = virNetDaemonAddServerPostExec(dmn,
-                                                  NULL, NULL, NULL,
-                                                  NULL, NULL)))
-            goto cleanup;
-        srv = NULL;
-    }
+    virNetDaemonRegisterFallbackData(data->fbData);
+    if (virNetDaemonAddServersPostExec(dmn, NULL, NULL, NULL, NULL, NULL) < 0)
+        goto cleanup;
 
     if (!(outjson = virNetDaemonPreExecRestart(dmn)))
         goto cleanup;
@@ -255,19 +248,11 @@ static int testExecRestart(const void *opaque)
     if (virtTestCompareToFile(outjsonstr, outfile) < 0)
         goto cleanup;
 
-    if (!data->pass) {
-        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", "Test should've failed");
-        goto cleanup;
-    }
-
     ret = 0;
  cleanup:
-    if (ret < 0) {
-        if (!data->pass)
-            ret = 0;
-        else
-            virDispatchError(NULL);
-    }
+    if (ret < 0)
+        virDispatchError(NULL);
+
     VIR_FREE(infile);
     VIR_FREE(outfile);
     VIR_FREE(injsonstr);
@@ -287,6 +272,8 @@ static int
 mymain(void)
 {
     int ret = 0;
+    const char *server_names[] = { "testServer0", "testServer1" };
+    virNetDaemonFallbackData fbData = { .fb_server_names = server_names };
 
     if (virInitialize() < 0 ||
         virEventRegisterDefaultImpl() < 0) {
@@ -300,7 +287,7 @@ mymain(void)
      * numbers with 100, 101, 102, 103.
      */
     if (getenv("VIR_GENERATE_JSON")) {
-        char *json = testGenerateJSON();
+        char *json = testGenerateJSON(server_names[0]);
         if (!json)
             return EXIT_FAILURE;
 
@@ -309,26 +296,23 @@ mymain(void)
         return ret;
     }
 
-# define EXEC_RESTART_TEST_FULL(file, servers, pass)    \
+# define EXEC_RESTART_TEST(file)                        \
     do {                                                \
         struct testExecRestartData data = {             \
-            file, servers, pass                         \
+            file, &fbData                               \
         };                                              \
         if (virtTestRun("ExecRestart " file,            \
                         testExecRestart, &data) < 0)    \
             ret = -1;                                   \
     } while (0)
 
-# define EXEC_RESTART_TEST(file) EXEC_RESTART_TEST_FULL(file, 1, true)
-
 # ifdef WITH_AVAHI
     EXEC_RESTART_TEST("initial");
 # endif
     EXEC_RESTART_TEST("initial-nomdns");
     EXEC_RESTART_TEST("anon-clients");
-
-    EXEC_RESTART_TEST_FULL("anon-clients", 2, false);
-    EXEC_RESTART_TEST_FULL("admin-nomdns-nonames", 2, true);
+    EXEC_RESTART_TEST("admin-nomdns-nonames");
+    EXEC_RESTART_TEST("admin-nomdns-names");
 
     return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
 }
-- 
2.4.3

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list



[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]