]> git.puffer.fish Git - matthieu/frr.git/commitdiff
mgmtd: Enroll Staticd as a backend client for MGMTD
authorChristian Hopps <chopps@labn.net>
Tue, 28 Feb 2023 09:08:41 +0000 (04:08 -0500)
committerChristian Hopps <chopps@labn.net>
Wed, 22 Mar 2023 02:09:07 +0000 (22:09 -0400)
This commmit introduces Staticd as a backend client for the MGMTd
framework. All the static commands will be diverted to the MGMT
daemon and will use the transactional model to make changes to the
internal state. Similar mechanism can be used by other daemons to use
the MGMT framework in the future.

This commit includes the following functionalities in the changeset:
1. Diverts all the staticd (config only) commands to MGMTd.
2. Enrolls staticd as a backend client to use the MGMT framework.
3. Modify the staticd NB config handlers so that they can be compiled
   into a library and loaded in the MGMTd process context.

Co-authored-by: Pushpasis Sarkar <pushpasis@gmail.com>
Co-authored-by: Abhinay Ramesh <rabhinay@vmware.com>
Co-authored-by: Ujwal P <ujwalp@vmware.com>
Signed-off-by: Yash Ranjan <ranjany@vmware.com>
lib/mgmt_be_client.c
lib/mgmt_be_client.h
mgmtd/mgmt_be_adapter.c
mgmtd/mgmt_main.c
mgmtd/mgmt_vty.c
mgmtd/subdir.am
staticd/static_main.c
staticd/static_routes.c
staticd/static_routes.h
staticd/static_vty.c

index d86f3d336ab2be59d998b8bcdfdc30b1c71ee4d8..1e98c6123dd1d182bd35fb6cee736385078dd16a 100644 (file)
@@ -146,10 +146,8 @@ static bool mgmt_debug_be_client;
 static struct mgmt_be_client_ctx mgmt_be_client_ctx = {0};
 
 const char *mgmt_be_client_names[MGMTD_BE_CLIENT_ID_MAX + 1] = {
-#if 0
 #ifdef HAVE_STATICD
        [MGMTD_BE_CLIENT_ID_STATICD] = "staticd",
-#endif
 #endif
        [MGMTD_BE_CLIENT_ID_MAX] = "Unknown/Invalid",
 };
index 75b4ddf017d158175ef90b7133d28238109667d1..bf875f5a451a0dfb36139ff1c9248cf5cb094bf7 100644 (file)
@@ -25,10 +25,8 @@ extern "C" {
 enum mgmt_be_client_id {
        MGMTD_BE_CLIENT_ID_MIN = 0,
        MGMTD_BE_CLIENT_ID_INIT = -1,
-#if 0 /* example */
 #ifdef HAVE_STATICD
        MGMTD_BE_CLIENT_ID_STATICD,
-#endif
 #endif
        MGMTD_BE_CLIENT_ID_MAX
 };
index b47ed3afe18895414627c6086b500bff176f93eb..8ad40642987ac611c5abe0b121f36aa8aa07c414 100644 (file)
@@ -78,19 +78,15 @@ static const struct mgmt_be_xpath_map_reg xpath_static_map_reg[] = {
        {.xpath_regexp = "/frr-vrf:lib/*",
         .be_clients =
                 (enum mgmt_be_client_id[]){
-#if 0
 #if HAVE_STATICD
                 MGMTD_BE_CLIENT_ID_STATICD,
-#endif
 #endif
                         MGMTD_BE_CLIENT_ID_MAX}},
        {.xpath_regexp = "/frr-interface:lib/*",
         .be_clients =
                 (enum mgmt_be_client_id[]){
-#if 0
 #if HAVE_STATICD
                 MGMTD_BE_CLIENT_ID_STATICD,
-#endif
 #endif
                         MGMTD_BE_CLIENT_ID_MAX}},
        {.xpath_regexp =
@@ -98,10 +94,8 @@ static const struct mgmt_be_xpath_map_reg xpath_static_map_reg[] = {
 
         .be_clients =
                 (enum mgmt_be_client_id[]){
-#if 0
 #if HAVE_STATICD
                 MGMTD_BE_CLIENT_ID_STATICD,
-#endif
 #endif
                         MGMTD_BE_CLIENT_ID_MAX}},
 };
index 017263ca88d9bb81fc3765cc39e3508e3e2168de..7d176059f57646550fd5c80a1287177861a14521 100644 (file)
@@ -201,12 +201,10 @@ static const struct frr_yang_module_info *const mgmt_yang_modules[] = {
  * NOTE: Always set .ignore_cbs true for to avoid validating
  * backend northbound callbacks during loading.
  */
-#if 0
 #ifdef HAVE_STATICD
        &(struct frr_yang_module_info){.name = "frr-staticd",
                                       .ignore_cbs = true},
 #endif
-#endif
 };
 
 FRR_DAEMON_INFO(mgmtd, MGMTD, .vty_port = MGMTD_VTY_PORT,
index 0ac4ebc9e65f49bd657021dff39f3906133f98b6..79fa54a791d2e6f07d4c68b5eb258843f5161914 100644 (file)
@@ -447,11 +447,9 @@ void mgmt_vty_init(void)
         * backend components that are moved to new MGMTD infra
         * here one by one.
         */
-#if 0
 #if HAVE_STATICD
        extern void static_vty_init(void);
        static_vty_init();
-#endif
 #endif
 
        install_node(&debug_node);
index d56fd93450684f8d266aebc3812599fd45f3bc49..a93f8f94414777b992524be8f15c0714df5c0148 100644 (file)
@@ -60,3 +60,9 @@ mgmtd_mgmtd_SOURCES = \
 mgmtd_mgmtd_CFLAGS = $(AM_CFLAGS) -I ./
 mgmtd_mgmtd_LDADD = mgmtd/libmgmtd.a lib/libfrr.la $(LIBCAP) $(LIBM) $(LIBYANG_LIBS) $(UST_LIBS)
 mgmtd_mgmtd_LDADD += mgmtd/libmgmt_be_nb.la
+
+if STATICD
+$(mgmtd_mgmtd_OBJECTS): yang/frr-staticd.yang.c
+CLEANFILES += yang/frr-staticd.yang.c
+nodist_mgmtd_libmgmt_be_nb_la_SOURCES += staticd/static_vty.c
+endif
index 0d0de7e8d317b34423f68266d815966d2624c9b4..d429162196c5c79579fec113473cb611764b6b7a 100644 (file)
@@ -27,6 +27,8 @@
 #include "static_debug.h"
 #include "static_nb.h"
 
+#include "mgmt_be_client.h"
+
 char backup_config_file[256];
 
 bool mpls_enabled;
@@ -51,6 +53,8 @@ struct option longopts[] = { { 0 } };
 /* Master of threads. */
 struct thread_master *master;
 
+uintptr_t mgmt_lib_hndl;
+
 static struct frr_daemon_info staticd_di;
 /* SIGHUP handler. */
 static void sighup(void)
@@ -67,6 +71,8 @@ static void sigint(void)
        /* Disable BFD events to avoid wasting processing. */
        bfd_protocol_integration_set_shutdown(true);
 
+       mgmt_be_client_lib_destroy(mgmt_lib_hndl);
+
        static_vrf_terminate();
 
        static_zebra_stop();
@@ -100,6 +106,51 @@ struct frr_signal_t static_signals[] = {
        },
 };
 
+static void static_mgmt_be_client_connect(uintptr_t lib_hndl,
+                                         uintptr_t usr_data, bool connected)
+{
+       (void)usr_data;
+
+       assert(lib_hndl == mgmt_lib_hndl);
+
+       zlog_debug("Got %s %s MGMTD Backend Client Server",
+                  connected ? "connected" : "disconnected",
+                  connected ? "to" : "from");
+
+       if (connected)
+               (void)mgmt_be_subscribe_yang_data(mgmt_lib_hndl, NULL, 0);
+}
+
+#if 0
+static void
+static_mgmt_txn_notify(uintptr_t lib_hndl, uintptr_t usr_data,
+                       struct mgmt_be_client_txn_ctx *txn_ctx,
+                       bool destroyed)
+{
+       zlog_debug("Got Txn %s Notify from MGMTD server",
+                  destroyed ? "DESTROY" : "CREATE");
+
+       if (!destroyed) {
+               /*
+                * TODO: Allocate and install a private scratchpad for this
+                * transaction if required
+                */
+       } else {
+               /*
+                * TODO: Uninstall and deallocate the private scratchpad for
+                * this transaction if installed earlier.
+                */
+       }
+}
+#endif
+
+static struct mgmt_be_client_params mgmt_params = {
+       .name = "staticd",
+       .conn_retry_intvl_sec = 3,
+       .client_connect_notify = static_mgmt_be_client_connect,
+       .txn_notify = NULL, /* static_mgmt_txn_notify */
+};
+
 static const struct frr_yang_module_info *const staticd_yang_modules[] = {
        &frr_filter_info,
        &frr_interface_info,
@@ -150,6 +201,10 @@ int main(int argc, char **argv, char **envp)
        static_zebra_init();
        static_vty_init();
 
+       /* Initialize MGMT backend functionalities */
+       mgmt_lib_hndl = mgmt_be_client_lib_init(&mgmt_params, master);
+       assert(mgmt_lib_hndl);
+
        hook_register(routing_conf_event,
                      routing_control_plane_protocols_name_validate);
 
index 3399686a90d05d3d01b021158bb2c4cd148180a5..1fbbf7e99d34fa6b40dfbe48970fbbd559389abc 100644 (file)
@@ -757,30 +757,6 @@ void static_ifindex_update(struct interface *ifp, bool up)
        static_ifindex_update_af(ifp, up, AFI_IP6, SAFI_MULTICAST);
 }
 
-void static_get_nh_type(enum static_nh_type stype, char *type, size_t size)
-{
-       switch (stype) {
-       case STATIC_IFNAME:
-               strlcpy(type, "ifindex", size);
-               break;
-       case STATIC_IPV4_GATEWAY:
-               strlcpy(type, "ip4", size);
-               break;
-       case STATIC_IPV4_GATEWAY_IFNAME:
-               strlcpy(type, "ip4-ifindex", size);
-               break;
-       case STATIC_BLACKHOLE:
-               strlcpy(type, "blackhole", size);
-               break;
-       case STATIC_IPV6_GATEWAY:
-               strlcpy(type, "ip6", size);
-               break;
-       case STATIC_IPV6_GATEWAY_IFNAME:
-               strlcpy(type, "ip6-ifindex", size);
-               break;
-       };
-}
-
 struct stable_info *static_get_stable_info(struct route_node *rn)
 {
        struct route_table *table;
index eb7953db2cfb79dab27c097b0cc2b541a7eaa4f9..4fd7a1342ff8cdcc1f5a2ea630a31971271db7b9 100644 (file)
@@ -159,6 +159,31 @@ static_route_info_from_rnode(struct route_node *rn)
        return (struct static_route_info *)(rn->info);
 }
 
+static inline void static_get_nh_type(enum static_nh_type stype, char *type,
+                                     size_t size)
+{
+       switch (stype) {
+       case STATIC_IFNAME:
+               strlcpy(type, "ifindex", size);
+               break;
+       case STATIC_IPV4_GATEWAY:
+               strlcpy(type, "ip4", size);
+               break;
+       case STATIC_IPV4_GATEWAY_IFNAME:
+               strlcpy(type, "ip4-ifindex", size);
+               break;
+       case STATIC_BLACKHOLE:
+               strlcpy(type, "blackhole", size);
+               break;
+       case STATIC_IPV6_GATEWAY:
+               strlcpy(type, "ip6", size);
+               break;
+       case STATIC_IPV6_GATEWAY_IFNAME:
+               strlcpy(type, "ip6-ifindex", size);
+               break;
+       };
+}
+
 extern bool mpls_enabled;
 extern uint32_t zebra_ecmp_count;
 
@@ -192,8 +217,6 @@ extern struct static_path *static_add_path(struct route_node *rn,
                                           uint32_t table_id, uint8_t distance);
 extern void static_del_path(struct static_path *pn);
 
-extern void static_get_nh_type(enum static_nh_type stype, char *type,
-                              size_t size);
 extern bool static_add_nexthop_validate(const char *nh_vrf_name,
                                        enum static_nh_type type,
                                        struct ipaddr *ipaddr);
index d87ca16c6198de10e8b1bb669b71a048dfaa90fd..bfffbe6a6065ca76f068a7bfda57bf2ad7b474f4 100644 (file)
@@ -1452,15 +1452,18 @@ DEFPY_YANG(debug_staticd, debug_staticd_cmd,
           "Debug route\n"
           "Debug bfd\n")
 {
+#ifndef INCLUDE_MGMTD_CMDDEFS_ONLY
        /* If no specific category, change all */
        if (strmatch(argv[argc - 1]->text, "static"))
                static_debug_set(vty->node, !no, true, true, true);
        else
                static_debug_set(vty->node, !no, !!events, !!route, !!bfd);
+#endif /* ifndef INCLUDE_MGMTD_CMDDEFS_ONLY */
 
        return CMD_SUCCESS;
 }
 
+#ifndef INCLUDE_MGMTD_CMDDEFS_ONLY
 DEFPY(staticd_show_bfd_routes, staticd_show_bfd_routes_cmd,
       "show bfd static route [json]$isjson",
       SHOW_STR
@@ -1496,9 +1499,15 @@ static struct cmd_node debug_node = {
        .config_write = static_config_write_debug,
 };
 
+#endif /* ifndef INCLUDE_MGMTD_CMDDEFS_ONLY */
+
 void static_vty_init(void)
 {
+#ifndef INCLUDE_MGMTD_CMDDEFS_ONLY
        install_node(&debug_node);
+       install_element(ENABLE_NODE, &show_debugging_static_cmd);
+       install_element(ENABLE_NODE, &staticd_show_bfd_routes_cmd);
+#endif /* ifndef INCLUDE_MGMTD_CMDDEFS_ONLY */
 
        install_element(CONFIG_NODE, &ip_mroute_dist_cmd);
 
@@ -1516,9 +1525,6 @@ void static_vty_init(void)
        install_element(CONFIG_NODE, &ipv6_route_cmd);
        install_element(VRF_NODE, &ipv6_route_vrf_cmd);
 
-       install_element(ENABLE_NODE, &show_debugging_static_cmd);
        install_element(ENABLE_NODE, &debug_staticd_cmd);
        install_element(CONFIG_NODE, &debug_staticd_cmd);
-
-       install_element(ENABLE_NODE, &staticd_show_bfd_routes_cmd);
 }