[libvirt] [PATCH v3 2/6] virnetdaemon: Add post exec restart support for multiple servers

Erik Skultety eskultet at redhat.com
Mon Nov 30 15:03:01 UTC 2015


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.
---
 src/locking/lock_daemon.c                          |   1 +
 src/logging/log_daemon.c                           |   1 +
 src/rpc/virnetdaemon.c                             |   2 +
 src/rpc/virnetdaemon.h                             |   1 +
 src/rpc/virnetserver.c                             |   6 +-
 src/rpc/virnetserver.h                             |   1 +
 .../input-data-admin-server-names.json             | 128 +++++++++++++++++++++
 .../virnetdaemondata/output-data-admin-nomdns.json |   2 +
 .../output-data-admin-server-names.json            | 128 +++++++++++++++++++++
 .../virnetdaemondata/output-data-anon-clients.json |   1 +
 .../output-data-initial-nomdns.json                |   1 +
 tests/virnetdaemondata/output-data-initial.json    |   1 +
 tests/virnetdaemontest.c                           |  40 +++----
 13 files changed, 288 insertions(+), 25 deletions(-)
 create mode 100644 tests/virnetdaemondata/input-data-admin-server-names.json
 create mode 100644 tests/virnetdaemondata/output-data-admin-server-names.json

diff --git a/src/locking/lock_daemon.c b/src/locking/lock_daemon.c
index 568b657..5ebb972 100644
--- a/src/locking/lock_daemon.c
+++ b/src/locking/lock_daemon.c
@@ -267,6 +267,7 @@ virLockDaemonNewPostExecRestart(virJSONValuePtr object, bool privileged)
         goto error;
 
     if (!(srv = virNetDaemonAddServerPostExec(lockd->dmn,
+                                              "virtlockd",
                                               virLockDaemonClientNew,
                                               virLockDaemonClientNewPostExecRestart,
                                               virLockDaemonClientPreExecRestart,
diff --git a/src/logging/log_daemon.c b/src/logging/log_daemon.c
index ea7bfcf..9b7be3c 100644
--- a/src/logging/log_daemon.c
+++ b/src/logging/log_daemon.c
@@ -209,6 +209,7 @@ virLogDaemonNewPostExecRestart(virJSONValuePtr object, bool privileged)
         goto error;
 
     if (!(logd->srv = virNetDaemonAddServerPostExec(logd->dmn,
+                                                    "virtlogd",
                                                     virLogDaemonClientNew,
                                                     virLogDaemonClientNewPostExecRestart,
                                                     virLogDaemonClientPreExecRestart,
diff --git a/src/rpc/virnetdaemon.c b/src/rpc/virnetdaemon.c
index 910f266..5324873 100644
--- a/src/rpc/virnetdaemon.c
+++ b/src/rpc/virnetdaemon.c
@@ -206,6 +206,7 @@ virNetDaemonGetServer(virNetDaemonPtr dmn,
 
 virNetServerPtr
 virNetDaemonAddServerPostExec(virNetDaemonPtr dmn,
+                              const char *serverName,
                               virNetServerClientPrivNew clientPrivNew,
                               virNetServerClientPrivNewPostExecRestart clientPrivNewPostExecRestart,
                               virNetServerClientPrivPreExecRestart clientPrivPreExecRestart,
@@ -236,6 +237,7 @@ virNetDaemonAddServerPostExec(virNetDaemonPtr dmn,
     }
 
     srv = virNetServerNewPostExecRestart(object,
+                                         serverName,
                                          clientPrivNew,
                                          clientPrivNewPostExecRestart,
                                          clientPrivPreExecRestart,
diff --git a/src/rpc/virnetdaemon.h b/src/rpc/virnetdaemon.h
index bb32053..bb7de29 100644
--- a/src/rpc/virnetdaemon.h
+++ b/src/rpc/virnetdaemon.h
@@ -40,6 +40,7 @@ virNetDaemonPtr virNetDaemonNew(void);
 int virNetDaemonAddServer(virNetDaemonPtr dmn, virNetServerPtr);
 
 virNetServerPtr virNetDaemonAddServerPostExec(virNetDaemonPtr dmn,
+                                              const char *serverName,
                                               virNetServerClientPrivNew clientPrivNew,
                                               virNetServerClientPrivNewPostExecRestart clientPrivNewPostExecRestart,
                                               virNetServerClientPrivPreExecRestart clientPrivPreExecRestart,
diff --git a/src/rpc/virnetserver.c b/src/rpc/virnetserver.c
index d4dc41f..2e06dcc 100644
--- a/src/rpc/virnetserver.c
+++ b/src/rpc/virnetserver.c
@@ -363,6 +363,7 @@ virNetServerPtr virNetServerNew(size_t min_workers,
 
 
 virNetServerPtr virNetServerNewPostExecRestart(virJSONValuePtr object,
+                                               const char *serverName,
                                                virNetServerClientPrivNew clientPrivNew,
                                                virNetServerClientPrivNewPostExecRestart clientPrivNewPostExecRestart,
                                                virNetServerClientPrivPreExecRestart clientPrivPreExecRestart,
@@ -382,7 +383,10 @@ virNetServerPtr virNetServerNewPostExecRestart(virJSONValuePtr object,
     unsigned int keepaliveInterval;
     unsigned int keepaliveCount;
     const char *mdnsGroupName = NULL;
-    const char *serverName = NULL;
+    const char *srvName = NULL;
+
+    if (!(srvName = virJSONValueObjectGetString(object, "name")))
+        srvName = serverName;
 
     if (virJSONValueObjectGetNumberUint(object, "min_workers", &min_workers) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
diff --git a/src/rpc/virnetserver.h b/src/rpc/virnetserver.h
index fb04aa3..60707d1 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 *serverName,
                                                virNetServerClientPrivNew clientPrivNew,
                                                virNetServerClientPrivNewPostExecRestart clientPrivNewPostExecRestart,
                                                virNetServerClientPrivPreExecRestart clientPrivPreExecRestart,
diff --git a/tests/virnetdaemondata/input-data-admin-server-names.json b/tests/virnetdaemondata/input-data-admin-server-names.json
new file mode 100644
index 0000000..608023f
--- /dev/null
+++ b/tests/virnetdaemondata/input-data-admin-server-names.json
@@ -0,0 +1,128 @@
+{
+    "servers": [
+    {
+        "name": "testServer0",
+        "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": "testServer1",
+        "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.json b/tests/virnetdaemondata/output-data-admin-nomdns.json
index a814aeb..4b09311 100644
--- a/tests/virnetdaemondata/output-data-admin-nomdns.json
+++ b/tests/virnetdaemondata/output-data-admin-nomdns.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-admin-server-names.json b/tests/virnetdaemondata/output-data-admin-server-names.json
new file mode 100644
index 0000000..4b09311
--- /dev/null
+++ b/tests/virnetdaemondata/output-data-admin-server-names.json
@@ -0,0 +1,128 @@
+{
+    "servers": [
+        {
+            "name": "testServer0",
+            "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": "testServer1",
+            "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-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 754b6fb..b487235 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,
@@ -135,7 +135,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;
@@ -157,7 +157,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()))
@@ -186,8 +186,8 @@ static char *testGenerateJSON(void)
 
 struct testExecRestartData {
     const char *jsonfile;
+    const char **serverNames;
     int nservers;
-    bool pass;
 };
 
 static int testExecRestart(const void *opaque)
@@ -241,7 +241,7 @@ static int testExecRestart(const void *opaque)
         goto cleanup;
 
     for (i = 0; i < data->nservers; i++) {
-        if (!(srv = virNetDaemonAddServerPostExec(dmn,
+        if (!(srv = virNetDaemonAddServerPostExec(dmn, data->serverNames[i],
                                                   NULL, NULL, NULL,
                                                   NULL, NULL)))
             goto cleanup;
@@ -257,19 +257,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);
@@ -289,6 +281,7 @@ static int
 mymain(void)
 {
     int ret = 0;
+    const char *server_names[] = { "testServer0", "testServer1" };
 
     if (virInitialize() < 0 ||
         virEventRegisterDefaultImpl() < 0) {
@@ -302,7 +295,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;
 
@@ -311,26 +304,25 @@ mymain(void)
         return ret;
     }
 
-# define EXEC_RESTART_TEST_FULL(file, servers, pass)    \
+# define EXEC_RESTART_TEST_FULL(file, nservers)         \
     do {                                                \
         struct testExecRestartData data = {             \
-            file, servers, pass                         \
+            file, server_names, nservers                \
         };                                              \
         if (virtTestRun("ExecRestart " file,            \
                         testExecRestart, &data) < 0)    \
             ret = -1;                                   \
     } while (0)
 
-# define EXEC_RESTART_TEST(file) EXEC_RESTART_TEST_FULL(file, 1, true)
+# define EXEC_RESTART_TEST(file) EXEC_RESTART_TEST_FULL(file, 1)
 
 # 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", 2, true);
+    EXEC_RESTART_TEST_FULL("admin-nomdns", 2);
+    EXEC_RESTART_TEST_FULL("admin-server-names", 2);
 
     return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
 }
-- 
2.4.3




More information about the libvir-list mailing list