]> git.puffer.fish Git - mirror/frr.git/commitdiff
zebra: Fix JSON output for `show route summary json` 15645/head
authorDonatas Abraitis <donatas@opensourcerouting.org>
Sat, 30 Mar 2024 21:04:10 +0000 (23:04 +0200)
committerDonatas Abraitis <donatas@opensourcerouting.org>
Sat, 30 Mar 2024 21:04:10 +0000 (23:04 +0200)
Before:
```
{
  "routes":[
    {
      "fib":1,
      "rib":1,
      "fibOffLoaded":0,
      "fibTrapped":0,
      "type":"connected"
    },
    {
      "fib":1,
      "rib":1,
      "fibOffLoaded":0,
      "fibTrapped":0,
      "type":"local"
    },
    {
      "fib":2,
      "rib":2,
      "fibOffLoaded":0,
      "fibTrapped":0,
      "type":"static"
    }
  ],
  "routesTotal":4,
  "routesTotalFib":4
}
{
  "routes":[
    {
      "fib":2,
      "rib":2,
      "fibOffLoaded":0,
      "fibTrapped":0,
      "type":"connected"
    },
    {
      "fib":2,
      "rib":2,
      "fibOffLoaded":0,
      "fibTrapped":0,
      "type":"local"
    },
    {
      "fib":2,
      "rib":2,
      "fibOffLoaded":0,
      "fibTrapped":0,
      "type":"static"
    }
  ],
  "routesTotal":6,
  "routesTotalFib":6
}
```

After:
```
{
  "ISR":{
    "routes":[
      {
        "fib":1,
        "rib":1,
        "fibOffLoaded":0,
        "fibTrapped":0,
        "type":"connected"
      },
      {
        "fib":1,
        "rib":1,
        "fibOffLoaded":0,
        "fibTrapped":0,
        "type":"local"
      },
      {
        "fib":2,
        "rib":2,
        "fibOffLoaded":0,
        "fibTrapped":0,
        "type":"static"
      }
    ],
    "routesTotal":4,
    "routesTotalFib":4
  },
  "default":{
    "routes":[
      {
        "fib":2,
        "rib":2,
        "fibOffLoaded":0,
        "fibTrapped":0,
        "type":"connected"
      },
      {
        "fib":2,
        "rib":2,
        "fibOffLoaded":0,
        "fibTrapped":0,
        "type":"local"
      },
      {
        "fib":2,
        "rib":2,
        "fibOffLoaded":0,
        "fibTrapped":0,
        "type":"static"
      }
    ],
    "routesTotal":6,
    "routesTotalFib":6
  }
}
```

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
zebra/zebra_vty.c

index 2fba5ebd9da8354bafc19efb31de8b8b4bbf02aa..0b5362094eab57b5d48a91d5724b0d6326caa71c 100644 (file)
@@ -68,10 +68,11 @@ static int do_show_ip_route(struct vty *vty, const char *vrf_name, afi_t afi,
                            bool show_ng, struct route_show_ctx *ctx);
 static void vty_show_ip_route_detail(struct vty *vty, struct route_node *rn,
                                     int mcast, bool use_fib, bool show_ng);
-static void vty_show_ip_route_summary(struct vty *vty,
-                                     struct route_table *table, bool use_json);
+static void vty_show_ip_route_summary(struct vty *vty, struct route_table *table,
+                                     json_object *vrf_json, bool use_json);
 static void vty_show_ip_route_summary_prefix(struct vty *vty,
                                             struct route_table *table,
+                                            json_object *vrf_json,
                                             bool use_json);
 /* Helper api to format a nexthop in the 'detailed' output path. */
 static void show_nexthop_detail_helper(struct vty *vty,
@@ -1997,11 +1998,15 @@ DEFPY (show_route_summary,
        afi_t afi = ipv4 ? AFI_IP : AFI_IP6;
        struct route_table *table;
        bool uj = use_json(argc, argv);
+       json_object *vrf_json = NULL;
 
        if (vrf_all) {
                struct vrf *vrf;
                struct zebra_vrf *zvrf;
 
+               if (uj && !vrf_json)
+                       vrf_json = json_object_new_object();
+
                RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
                        if ((zvrf = vrf->info) == NULL)
                                continue;
@@ -2019,10 +2024,14 @@ DEFPY (show_route_summary,
 
                        if (prefix)
                                vty_show_ip_route_summary_prefix(vty, table,
-                                                                uj);
+                                                                vrf_json, uj);
                        else
-                               vty_show_ip_route_summary(vty, table, uj);
+                               vty_show_ip_route_summary(vty, table, vrf_json,
+                                                         uj);
                }
+
+               if (uj)
+                       vty_json(vty, vrf_json);
        } else {
                vrf_id_t vrf_id = VRF_DEFAULT;
 
@@ -2038,9 +2047,9 @@ DEFPY (show_route_summary,
                        return CMD_SUCCESS;
 
                if (prefix)
-                       vty_show_ip_route_summary_prefix(vty, table, uj);
+                       vty_show_ip_route_summary_prefix(vty, table, NULL, uj);
                else
-                       vty_show_ip_route_summary(vty, table, uj);
+                       vty_show_ip_route_summary(vty, table, NULL, uj);
        }
 
        return CMD_SUCCESS;
@@ -2246,8 +2255,8 @@ static void show_ip_route_dump_vty(struct vty *vty, struct route_table *table)
        }
 }
 
-static void vty_show_ip_route_summary(struct vty *vty,
-                                     struct route_table *table, bool use_json)
+static void vty_show_ip_route_summary(struct vty *vty, struct route_table *table,
+                                     json_object *vrf_json, bool use_json)
 {
        struct route_node *rn;
        struct route_entry *re;
@@ -2261,6 +2270,8 @@ static void vty_show_ip_route_summary(struct vty *vty,
        uint32_t is_ibgp;
        json_object *json_route_summary = NULL;
        json_object *json_route_routes = NULL;
+       const char *vrf_name = zvrf_name(
+               ((struct rib_table_info *)route_table_get_info(table))->zvrf);
 
        memset(&rib_cnt, 0, sizeof(rib_cnt));
        memset(&fib_cnt, 0, sizeof(fib_cnt));
@@ -2311,10 +2322,7 @@ static void vty_show_ip_route_summary(struct vty *vty,
 
        if (!use_json)
                vty_out(vty, "%-20s %-20s %s  (vrf %s)\n", "Route Source",
-                       "Routes", "FIB",
-                       zvrf_name(((struct rib_table_info *)
-                                          route_table_get_info(table))
-                                         ->zvrf));
+                       "Routes", "FIB", vrf_name);
 
        for (i = 0; i < ZEBRA_ROUTE_MAX; i++) {
                if ((rib_cnt[i] > 0) || (i == ZEBRA_ROUTE_BGP
@@ -2406,7 +2414,11 @@ static void vty_show_ip_route_summary(struct vty *vty,
                json_object_int_add(json_route_summary, "routesTotalFib",
                                    fib_cnt[ZEBRA_ROUTE_TOTAL]);
 
-               vty_json(vty, json_route_summary);
+               if (!vrf_json)
+                       vty_json(vty, json_route_summary);
+               else
+                       json_object_object_add(vrf_json, vrf_name,
+                                              json_route_summary);
        } else {
                vty_out(vty, "------\n");
                vty_out(vty, "%-20s %-20d %-20d \n", "Totals",
@@ -2424,6 +2436,7 @@ static void vty_show_ip_route_summary(struct vty *vty,
  */
 static void vty_show_ip_route_summary_prefix(struct vty *vty,
                                             struct route_table *table,
+                                            json_object *vrf_json,
                                             bool use_json)
 {
        struct route_node *rn;
@@ -2437,6 +2450,8 @@ static void vty_show_ip_route_summary_prefix(struct vty *vty,
        int cnt;
        json_object *json_route_summary = NULL;
        json_object *json_route_routes = NULL;
+       const char *vrf_name = zvrf_name(
+               ((struct rib_table_info *)route_table_get_info(table))->zvrf);
 
        memset(&rib_cnt, 0, sizeof(rib_cnt));
        memset(&fib_cnt, 0, sizeof(fib_cnt));
@@ -2476,10 +2491,7 @@ static void vty_show_ip_route_summary_prefix(struct vty *vty,
 
        if (!use_json)
                vty_out(vty, "%-20s %-20s %s  (vrf %s)\n", "Route Source",
-                       "Prefix Routes", "FIB",
-                       zvrf_name(((struct rib_table_info *)
-                                          route_table_get_info(table))
-                                         ->zvrf));
+                       "Prefix Routes", "FIB", vrf_name);
 
        for (i = 0; i < ZEBRA_ROUTE_MAX; i++) {
                if (rib_cnt[i] > 0) {
@@ -2554,7 +2566,11 @@ static void vty_show_ip_route_summary_prefix(struct vty *vty,
                json_object_int_add(json_route_summary, "prefixRoutesTotalFib",
                                    fib_cnt[ZEBRA_ROUTE_TOTAL]);
 
-               vty_json(vty, json_route_summary);
+               if (!vrf_json)
+                       vty_json(vty, json_route_summary);
+               else
+                       json_object_object_add(vrf_json, vrf_name,
+                                              json_route_summary);
        } else {
                vty_out(vty, "------\n");
                vty_out(vty, "%-20s %-20d %-20d \n", "Totals",