aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJunfeng Wang <Drenfong.Wang@intel.com>2019-04-16 04:42:12 +0000
committerJunfeng Wang <drenfong.wang@intel.com>2019-04-24 01:27:37 +0000
commit2964c86ecc976ad2239a6e9e377ccdfcadfd2e0e (patch)
tree4bc2070078d59c377ac2004376f051039294036a
parentc6f8ab391afc726117f677d8c9408c5fc052284f (diff)
check vpp health and if found vpp is down/restart, will reconnect vppv19.04-rc2v19.04
Change-Id: I7c38d351b8016f51671a94f18ade44ef966acc04 Signed-off-by: Junfeng Wang <Drenfong.Wang@intel.com> (cherry picked from commit 29d2d586b9dfdd7776e42fefbe2b049de49dc009)
-rw-r--r--src/plugins/sc_plugins.c63
-rw-r--r--src/plugins/sc_plugins.h1
2 files changed, 63 insertions, 1 deletions
diff --git a/src/plugins/sc_plugins.c b/src/plugins/sc_plugins.c
index 4dc6751..0a36afb 100644
--- a/src/plugins/sc_plugins.c
+++ b/src/plugins/sc_plugins.c
@@ -15,6 +15,51 @@
#include "sc_plugins.h"
#include "sc_model.h"
+#include <dirent.h>
+
+static int vpp_pid_start;
+
+/* get vpp pid in system */
+int get_vpp_pid()
+{
+ DIR *dir;
+ struct dirent *ptr;
+ FILE *fp;
+ char filepath[50];
+ char filetext[20];
+
+ dir = opendir("/proc");
+ int vpp_pid = 0;
+ /* read vpp pid file in proc, return pid of vpp */
+ if (NULL != dir)
+ {
+ while (NULL != (ptr =readdir(dir)))
+ {
+ if ((0 == strcmp(ptr->d_name, ".")) || (0 == strcmp(ptr->d_name, "..")))
+ continue;
+
+ if (DT_DIR != ptr->d_type)
+ continue;
+
+ sprintf(filepath, "/proc/%s/cmdline",ptr->d_name);
+ fp = fopen(filepath, "r");
+
+ if (NULL != fp)
+ {
+ fread(filetext, 1, 13, fp);
+ filetext[12] = '\0';
+
+ if (filetext == strstr(filetext, "/usr/bin/vpp"))
+ vpp_pid = atoi(ptr->d_name);
+
+ fclose(fp);
+ }
+ }
+ closedir(dir);
+ }
+ return vpp_pid;
+}
+
int sr_plugin_init_cb(sr_session_ctx_t *session, void **private_ctx)
{
@@ -38,7 +83,8 @@ int sr_plugin_init_cb(sr_session_ctx_t *session, void **private_ctx)
/* set subscription as our private context */
*private_ctx = plugin_main.subscription;
-
+ /* get the vpp pid sweetcomb connected, we assumed that only one vpp is run in system */
+ vpp_pid_start = get_vpp_pid();
return SR_ERR_OK;
}
@@ -53,3 +99,18 @@ void sr_plugin_cleanup_cb(sr_session_ctx_t *session, void *private_ctx)
SRP_LOG_DBG_MSG("plugin disconnect vpp ok.");
}
+int sr_plugin_health_check_cb(sr_session_ctx_t *session, void *private_ctx)
+{
+ /* health check, will use shell to detect vpp when plugin is loaded */
+ /* health_check will run every 10 seconds in loop*/
+ int vpp_pid_now = get_vpp_pid();
+
+ if(vpp_pid_now == vpp_pid_start)
+ {
+ return SR_ERR_OK;
+ }
+ else
+ {
+ return -1;
+ }
+}
diff --git a/src/plugins/sc_plugins.h b/src/plugins/sc_plugins.h
index f405300..feec482 100644
--- a/src/plugins/sc_plugins.h
+++ b/src/plugins/sc_plugins.h
@@ -49,5 +49,6 @@
//functions that sysrepo-plugin need
int sr_plugin_init_cb(sr_session_ctx_t *session, void **private_ctx);
void sr_plugin_cleanup_cb(sr_session_ctx_t *session, void *private_ctx);
+int sr_plugin_health_check_cb(sr_session_ctx_t *session, void *private_ctx);
#endif //__SC_PLUGINS_H__