]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra: json support for show ip nht route-map
authorSindhu Parvathi Gopinathan <sgopinathan@nvidia.com>
Tue, 8 Nov 2022 05:40:13 +0000 (21:40 -0800)
committerChirag Shah <chirag@nvidia.com>
Fri, 16 Dec 2022 16:42:53 +0000 (08:42 -0800)
Changes:
JSON support added for below commands,
     - show ip nht route-map vrf all json
     - show ip nht route-map vrf <name> json
     - show ipv6 nht route-map vrf all json
     - show ipv6 nht route-map vrf <name> json
     - show ipv6 nht route-map json
     - show ip nht route-map json

Testing Done: Unit testing completed.

tor-1# show ip nht route-map vrf default json
{
  "afi":"ipv4",
  "vrfs":{
"default":{
  "protocols":{
"system":"none",
"kernel":"none",
"connected":"connected-policy",
"static":"none",
"rip":"none",
"ripng":"none",
"ospf":"none",
"ospf6":"none",
"isis":"none",
"bgp":"bgp-policy",
"pim":"none",
"eigrp":"none",
"nhrp":"none",
"hsls":"none",
"olsr":"none",
"table":"none",
"ldp":"none",
"vnc":"none",
"vnc-direct":"none",
"vnc-rn":"none",
"bgp-direct":"none",
"bgp-direct-to-nve-groups":"none",
"babel":"none",
"sharp":"none",
"pbr":"none",
"bfd":"none",
"openfabric":"none",
"vrrp":"none",
"zebra":"none",
"frr":"none",
"wildcard":"none",
"any":"none"
  }
}
  }
}

tor-1# show ip nht route-map vrf all json
{
  "afi":"ipv4",
  "vrfs":{
"default":{
  "protocols":{
"system":"none",
"kernel":"none",
"connected":"connected-policy",
"static":"none",
"rip":"none",
"ripng":"none",
"ospf":"none",
"ospf6":"none",
"isis":"none",
"bgp":"bgp-policy",
"pim":"none",
"eigrp":"none",
"nhrp":"none",
"hsls":"none",
"olsr":"none",
"table":"none",
"ldp":"none",
"vnc":"none",
"vnc-direct":"none",
"vnc-rn":"none",
"bgp-direct":"none",
"bgp-direct-to-nve-groups":"none",
"babel":"none",
"sharp":"none",
"pbr":"none",
"bfd":"none",
"openfabric":"none",
"vrrp":"none",
"zebra":"none",
"frr":"none",
"wildcard":"none",
"any":"none"
  }
},
"mgmt":{
  "protocols":{
"system":"none",
"kernel":"none",
"connected":"none",
"static":"none",
"rip":"none",
"ripng":"none",
"ospf":"none",
"ospf6":"none",
"isis":"none",
"bgp":"none",
"pim":"none",
"eigrp":"none",
"nhrp":"none",
"hsls":"none",
"olsr":"none",
"table":"none",
"ldp":"none",
"vnc":"none",
"vnc-direct":"none",
"vnc-rn":"none",
"bgp-direct":"none",
"bgp-direct-to-nve-groups":"none",
"babel":"none",
"sharp":"none",
"pbr":"none",
"bfd":"none",
"openfabric":"none",
"vrrp":"none",
"zebra":"none",
"frr":"none",
"wildcard":"none",
"any":"none"
  }
},
"sym_1":{
  "protocols":{
"system":"none",
"kernel":"none",
"connected":"none",
"static":"none",
"rip":"none",
"ripng":"none",
"ospf":"none",
"ospf6":"none",
"isis":"none",
"bgp":"bgp-policy",
"pim":"none",
"eigrp":"none",
"nhrp":"none",
"hsls":"none",
"olsr":"none",
"table":"none",
"ldp":"none",
"vnc":"none",
"vnc-direct":"none",
"vnc-rn":"none",
"bgp-direct":"none",
"bgp-direct-to-nve-groups":"none",
"babel":"none",
"sharp":"none",
"pbr":"none",
"bfd":"none",
"openfabric":"none",
"vrrp":"none",
"zebra":"none",
"frr":"none",
"wildcard":"none",
"any":"none"
  }
}
  }
}

tor-1# show ipv6 nht route-map vrf default json
{
  "afi":"ipv6",
  "vrfs":{
"default":{
  "protocols":{
"system":"none",
"kernel":"kernel-policy",
"connected":"connected-policy",
"static":"none",
"rip":"none",
"ripng":"none",
"ospf":"none",
"ospf6":"none",
"isis":"none",
"bgp":"none",
"pim":"none",
"eigrp":"none",
"nhrp":"none",
"hsls":"none",
"olsr":"none",
"table":"none",
"ldp":"none",
"vnc":"none",
"vnc-direct":"none",
"vnc-rn":"none",
"bgp-direct":"none",
"bgp-direct-to-nve-groups":"none",
"babel":"none",
"sharp":"none",
"pbr":"none",
"bfd":"none",
"openfabric":"none",
"vrrp":"none",
"zebra":"none",
"frr":"none",
"wildcard":"none",
"any":"none"
  }
}
  }
}

Ticket:#3229016
Issue:3229016

Signed-off-by: Sindhu Parvathi Gopinathan <sgopinathan@nvidia.com>
zebra/zebra_routemap.c

index 066ef8a8d05bf0bb80da9a2ac317d76dad910d3f..4f43cea4930df0794d96f96c342d90b673e50c24 100644 (file)
@@ -143,26 +143,48 @@ static void show_vrf_proto_rm(struct vty *vty, struct zebra_vrf *zvrf,
 }
 
 static void show_vrf_nht_rm(struct vty *vty, struct zebra_vrf *zvrf,
-                           int af_type)
+                           int af_type, json_object *json)
 {
        int i;
 
-       vty_out(vty, "Protocol                  : route-map\n");
-       vty_out(vty, "-------------------------------------\n");
+       if (!json) {
+               vty_out(vty, "Protocol                  : route-map\n");
+               vty_out(vty, "-------------------------------------\n");
+       }
 
        for (i = 0; i < ZEBRA_ROUTE_MAX; i++) {
+               if (json) {
+                       if (NHT_RM_NAME(zvrf, af_type, i))
+                               json_object_string_add(
+                                       json, zebra_route_string(i),
+                                       NHT_RM_NAME(zvrf, af_type, i));
+                       else
+                               json_object_string_add(
+                                       json, zebra_route_string(i), "none");
+               } else {
+                       if (NHT_RM_NAME(zvrf, af_type, i))
+                               vty_out(vty, "%-24s  : %-10s\n",
+                                       zebra_route_string(i),
+                                       NHT_RM_NAME(zvrf, af_type, i));
+                       else
+                               vty_out(vty, "%-24s  : none\n",
+                                       zebra_route_string(i));
+               }
+       }
+
+       if (json) {
                if (NHT_RM_NAME(zvrf, af_type, i))
-                       vty_out(vty, "%-24s  : %-10s\n", zebra_route_string(i),
+                       json_object_string_add(json, "any",
+                                              NHT_RM_NAME(zvrf, af_type, i));
+               else
+                       json_object_string_add(json, "any", "none");
+       } else {
+               if (NHT_RM_NAME(zvrf, af_type, i))
+                       vty_out(vty, "%-24s  : %-10s\n", "any",
                                NHT_RM_NAME(zvrf, af_type, i));
                else
-                       vty_out(vty, "%-24s  : none\n", zebra_route_string(i));
+                       vty_out(vty, "%-24s  : none\n", "any");
        }
-
-       if (NHT_RM_NAME(zvrf, af_type, i))
-               vty_out(vty, "%-24s  : %-10s\n", "any",
-                       NHT_RM_NAME(zvrf, af_type, i));
-       else
-               vty_out(vty, "%-24s  : none\n", "any");
 }
 
 static int show_proto_rm(struct vty *vty, int af_type, const char *vrf_all,
@@ -198,35 +220,78 @@ static int show_proto_rm(struct vty *vty, int af_type, const char *vrf_all,
 }
 
 static int show_nht_rm(struct vty *vty, int af_type, const char *vrf_all,
-                      const char *vrf_name)
+                      const char *vrf_name, bool use_json)
 {
        struct zebra_vrf *zvrf;
+       json_object *json = NULL;
+       json_object *json_vrfs = NULL;
+
+       if (use_json) {
+               json = json_object_new_object();
+               json_vrfs = json_object_new_object();
+               json_object_string_add(json, "afi",
+                                      (af_type == AFI_IP) ? "ipv4" : "ipv6");
+       }
 
        if (vrf_all) {
                struct vrf *vrf;
 
+               if (use_json)
+                       json_object_object_add(json, "vrfs", json_vrfs);
+
                RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
                        zvrf = (struct zebra_vrf *)vrf->info;
                        if (zvrf == NULL)
                                continue;
 
-                       vty_out(vty, "VRF: %s\n", zvrf->vrf->name);
-                       show_vrf_nht_rm(vty, zvrf, af_type);
+                       if (use_json) {
+                               json_object *json_proto = NULL;
+                               json_object *json_vrf = NULL;
+                               json_vrf = json_object_new_object();
+                               json_object_object_add(
+                                       json_vrfs, zvrf->vrf->name, json_vrf);
+                               json_proto = json_object_new_object();
+                               json_object_object_add(json_vrf, "protocols",
+                                                      json_proto);
+                               show_vrf_nht_rm(vty, zvrf, af_type, json_proto);
+                       } else {
+                               vty_out(vty, "VRF: %s\n", zvrf->vrf->name);
+                               show_vrf_nht_rm(vty, zvrf, af_type, NULL);
+                       }
                }
        } else {
+               json_object *json_proto = NULL;
+               json_object *json_vrf = NULL;
                vrf_id_t vrf_id = VRF_DEFAULT;
 
                if (vrf_name)
                        VRF_GET_ID(vrf_id, vrf_name, false);
 
                zvrf = zebra_vrf_lookup_by_id(vrf_id);
-               if (!zvrf)
+               if (!zvrf) {
+                       json_object_free(json);
+                       json_object_free(json_vrfs);
                        return CMD_SUCCESS;
+               }
 
-               vty_out(vty, "VRF: %s\n", zvrf->vrf->name);
-               show_vrf_nht_rm(vty, zvrf, af_type);
+               if (use_json) {
+                       json_object_object_add(json, "vrfs", json_vrfs);
+                       json_vrf = json_object_new_object();
+                       json_object_object_add(json_vrfs, zvrf->vrf->name,
+                                              json_vrf);
+                       json_proto = json_object_new_object();
+                       json_object_object_add(json_vrf, "protocols",
+                                              json_proto);
+                       show_vrf_nht_rm(vty, zvrf, af_type, json_proto);
+               } else {
+                       vty_out(vty, "VRF: %s\n", zvrf->vrf->name);
+                       show_vrf_nht_rm(vty, zvrf, af_type, NULL);
+               }
        }
 
+       if (use_json)
+               vty_json(vty, json);
+
        return CMD_SUCCESS;
 }
 
@@ -854,14 +919,19 @@ DEFPY_YANG (no_ip_protocol_nht_rmap,
 
 DEFPY_YANG (show_ip_protocol_nht,
        show_ip_protocol_nht_cmd,
-       "show ip nht route-map [vrf <NAME$vrf_name|all$vrf_all>]",
+       "show ip nht route-map [vrf <NAME$vrf_name|all$vrf_all>] [json]",
        SHOW_STR
        IP_STR
-       "IP nexthop tracking table\n"
-       "IP Next Hop tracking filtering status\n"
-       VRF_FULL_CMD_HELP_STR)
+       "IPv4 nexthop tracking table\n"
+       "IPv4 Next Hop tracking filtering status\n"
+       VRF_CMD_HELP_STR
+       "All VRFs\n"
+       JSON_STR)
 {
-       int ret = show_nht_rm(vty, AFI_IP, vrf_all, vrf_name);
+       int ret;
+       bool uj = use_json(argc, argv);
+
+       ret = show_nht_rm(vty, AFI_IP, vrf_all, vrf_name, uj);
 
        return ret;
 }
@@ -936,14 +1006,19 @@ DEFPY_YANG (no_ipv6_protocol_nht_rmap,
 
 DEFPY_YANG (show_ipv6_protocol_nht,
        show_ipv6_protocol_nht_cmd,
-       "show ipv6 nht route-map [vrf <NAME$vrf_name|all$vrf_all>]",
+       "show ipv6 nht route-map [vrf <NAME$vrf_name|all$vrf_all>] [json]",
        SHOW_STR
        IP6_STR
-       "Next Hop filtering status\n"
-       "Route-map\n"
-       VRF_FULL_CMD_HELP_STR)
+       "IPv6 nexthop tracking table\n"
+       "IPv6 Next Hop tracking filtering status\n"
+       VRF_CMD_HELP_STR
+       "All VRFs\n"
+       JSON_STR)
 {
-       int ret = show_nht_rm(vty, AFI_IP6, vrf_all, vrf_name);
+       int ret;
+       bool uj = use_json(argc, argv);
+
+       ret = show_nht_rm(vty, AFI_IP6, vrf_all, vrf_name, uj);
 
        return ret;
 }