Пример #1
0
 def _run(self, client: OpenrCtrl.Client) -> None:
     prefix_keys = client.getKvStoreKeyValsFiltered(
         self.buildKvStoreKeyDumpParams(Consts.PREFIX_DB_MARKER))
     adj_keys = client.getKvStoreKeyValsFiltered(
         self.buildKvStoreKeyDumpParams(Consts.ADJ_DB_MARKER))
     host_id = client.getMyNodeName()
     self.print_kvstore_nodes(self.get_connected_nodes(adj_keys, host_id),
                              prefix_keys, host_id)
Пример #2
0
 def _run(self, client: OpenrCtrl.Client, nodes: Any, json: bool) -> None:
     keyDumpParams = self.buildKvStoreKeyDumpParams(Consts.PREFIX_DB_MARKER)
     resp = client.getKvStoreKeyValsFiltered(keyDumpParams)
     if json:
         utils.print_prefixes_json(resp, nodes, self.iter_publication)
     else:
         utils.print_prefixes_table(resp, nodes, self.iter_publication)
Пример #3
0
    def _run(self, client: OpenrCtrl.Client, nodes: set) -> None:
        area = self.get_area_id()

        all_nodes_to_ips = self.get_node_to_ips(client, area)
        if nodes:
            nodes = set(nodes.strip().split(","))
            if "all" in nodes:
                nodes = list(all_nodes_to_ips.keys())
            host_id = client.getMyNodeName()
            if host_id in nodes:
                nodes.remove(host_id)

            keyDumpParams = self.buildKvStoreKeyDumpParams(
                Consts.ALL_DB_MARKER)
            pub = None
            if not self.area_feature:
                pub = client.getKvStoreKeyValsFiltered(keyDumpParams)
            else:
                pub = client.getKvStoreKeyValsFilteredArea(keyDumpParams, area)
            kv_dict = self.dump_nodes_kvs(nodes, all_nodes_to_ips, area)
            for node in kv_dict:
                self.compare(pub.keyVals, kv_dict[node], host_id, node)
        else:
            nodes = list(all_nodes_to_ips.keys())
            kv_dict = self.dump_nodes_kvs(nodes, all_nodes_to_ips, area)
            for our_node, other_node in combinations(kv_dict.keys(), 2):
                self.compare(kv_dict[our_node], kv_dict[other_node], our_node,
                             other_node)
Пример #4
0
 def _run(self, client: OpenrCtrl.Client, nodes: set, node: Any,
          interface: Any) -> None:
     keyDumpParams = self.buildKvStoreKeyDumpParams(Consts.ADJ_DB_MARKER)
     publication = client.getKvStoreKeyValsFiltered(keyDumpParams)
     adjs_map = utils.adj_dbs_to_dict(publication, nodes, True,
                                      self.iter_publication)
     utils.print_adjs_table(adjs_map, self.enable_color, node, interface)
Пример #5
0
    def _run(
        self,
        client: OpenrCtrl.Client,
        src: str,
        dst: str,
        max_hop: int,
        area: str,
        *args,
        **kwargs,
    ) -> None:
        if not src or not dst:
            host_id = client.getMyNodeName()
            src = src or host_id
            dst = dst or host_id

        # pyre-fixme[16]: `PathCmd` has no attribute `prefix_dbs`.
        self.prefix_dbs: Dict[str, openr_types.PrefixDatabase] = {}
        area = utils.get_area_id(client, area)
        # Get prefix_dbs from KvStore

        params = openr_types.KeyDumpParams(Consts.PREFIX_DB_MARKER)
        params.keys = [Consts.PREFIX_DB_MARKER]
        if area is None:
            pub = client.getKvStoreKeyValsFiltered(params)
        else:
            pub = client.getKvStoreKeyValsFilteredArea(params, area)
        for value in pub.keyVals.values():
            utils.parse_prefix_database("", "", self.prefix_dbs, value)

        paths = self.get_paths(client, src, dst, max_hop)
        self.print_paths(paths)
Пример #6
0
 def _run(self, client: OpenrCtrl.Client, nodes: set, bidir: bool,
          json: bool) -> None:
     keyDumpParams = self.buildKvStoreKeyDumpParams(Consts.ADJ_DB_MARKER)
     publication = client.getKvStoreKeyValsFiltered(keyDumpParams)
     adjs_map = utils.adj_dbs_to_dict(publication, nodes, bidir,
                                      self.iter_publication)
     if json:
         utils.print_json(adjs_map)
     else:
         utils.print_adjs_table(adjs_map, self.enable_color)
Пример #7
0
    def get_dbs(self, client: OpenrCtrl.Client) -> Tuple[Dict, Dict, Dict]:
        # get LSDB from Decision
        decision_adj_dbs = client.getDecisionAdjacencyDbs()
        decision_prefix_dbs = client.getDecisionPrefixDbs()

        # get LSDB from KvStore
        kvstore_keyvals = client.getKvStoreKeyValsFiltered(
            kv_store_types.KeyDumpParams(Consts.ALL_DB_MARKER)).keyVals

        return (decision_adj_dbs, decision_prefix_dbs, kvstore_keyvals)
Пример #8
0
 def _run(
     self,
     client: OpenrCtrl.Client,
     json: bool,
     prefix: Any,
     originator: Any = None,
     ttl: bool = False,
 ) -> None:
     keyDumpParams = self.buildKvStoreKeyDumpParams(prefix)
     resp = client.getKvStoreKeyValsFiltered(keyDumpParams)
     self.print_kvstore_keys(resp, ttl, json)
Пример #9
0
 def _run(
     self,
     client: OpenrCtrl.Client,
     nodes: set,
     json: bool,
     prefix: str,
     client_type: str,
 ) -> None:
     keyDumpParams = self.buildKvStoreKeyDumpParams(Consts.PREFIX_DB_MARKER)
     resp = client.getKvStoreKeyValsFiltered(keyDumpParams)
     self.print_prefix({None: resp}, nodes, json, prefix, client_type)
Пример #10
0
    def get_node_to_ips(self, client: OpenrCtrl.Client) -> Dict:
        """ get the dict of all nodes to their IP in the network """

        node_dict = {}
        keyDumpParams = self.buildKvStoreKeyDumpParams(Consts.PREFIX_DB_MARKER)
        resp = client.getKvStoreKeyValsFiltered(keyDumpParams)
        prefix_maps = utils.collate_prefix_keys(resp.keyVals)
        for node, prefix_db in prefix_maps.items():
            node_dict[node] = self.get_node_ip(prefix_db)

        return node_dict
Пример #11
0
    def get_node_to_ips(self, client: OpenrCtrl.Client) -> Dict:
        """ get the dict of all nodes to their IP in the network """
        def _parse_nodes(node_dict, value):
            prefix_db = serializer.deserialize_thrift_object(
                value.value, lsdb_types.PrefixDatabase)
            node_dict[prefix_db.thisNodeName] = self.get_node_ip(prefix_db)

        node_dict = {}
        keyDumpParams = self.buildKvStoreKeyDumpParams(Consts.PREFIX_DB_MARKER)
        resp = client.getKvStoreKeyValsFiltered(keyDumpParams)
        self.iter_publication(node_dict, resp, ["all"], _parse_nodes)

        return node_dict
Пример #12
0
    def get_dbs(self, client: OpenrCtrl.Client, area: str) -> Tuple[Dict, Dict, Dict]:
        # get LSDB from Decision
        decision_adj_dbs = client.getDecisionAdjacencyDbs()
        decision_prefix_dbs = client.getDecisionPrefixDbs()

        area = utils.get_area_id(client, area)
        # get LSDB from KvStore
        params = openr_types.KeyDumpParams(Consts.ALL_DB_MARKER)
        params.keys = [Consts.ALL_DB_MARKER]
        if area is None:
            kvstore_keyvals = client.getKvStoreKeyValsFiltered(params).keyVals
        else:
            kvstore_keyvals = client.getKvStoreKeyValsFilteredArea(params, area).keyVals

        return (decision_adj_dbs, decision_prefix_dbs, kvstore_keyvals)
Пример #13
0
    def _run(self, client: OpenrCtrl.Client, src: str, dst: str, max_hop: int) -> None:
        if not src or not dst:
            host_id = client.getMyNodeName()
            src = src or host_id
            dst = dst or host_id

        # Get prefix_dbs from KvStore
        self.prefix_dbs: Dict[str, lsdb_types.PrefixDatabase] = {}
        pub = client.getKvStoreKeyValsFiltered(
            kv_store_types.KeyDumpParams(Consts.PREFIX_DB_MARKER)
        )
        for value in pub.keyVals.values():
            utils.parse_prefix_database("", "", self.prefix_dbs, value)

        paths = self.get_paths(client, src, dst, max_hop)
        self.print_paths(paths)
Пример #14
0
    def _run(self, client: OpenrCtrl.Client, src: str, dst: str,
             max_hop: int) -> None:
        if not src or not dst:
            host_id = utils.get_connected_node_name(self.cli_opts)
            src = src or host_id
            dst = dst or host_id

        # Get prefix_dbs from KvStore
        self.prefix_dbs = {}
        pub = client.getKvStoreKeyValsFiltered(
            kv_store_types.KeyDumpParams(Consts.PREFIX_DB_MARKER))
        for v in pub.keyVals.values():
            prefix_db = deserialize_thrift_object(v.value,
                                                  lsdb_types.PrefixDatabase)
            self.prefix_dbs[prefix_db.thisNodeName] = prefix_db

        paths = self.get_paths(client, src, dst, max_hop)
        self.print_paths(paths)
Пример #15
0
    def get_node_to_ips(self, client: OpenrCtrl.Client, area: str = None) -> Dict:
        """ get the dict of all nodes to their IP in the network """

        node_dict = {}
        keyDumpParams = self.buildKvStoreKeyDumpParams(Consts.PREFIX_DB_MARKER)
        resp = kv_store_types.Publication()
        if not self.area_feature:
            resp = client.getKvStoreKeyValsFiltered(keyDumpParams)
        else:
            if area is None:
                print(f"Error: Must specify one of the areas: {self.areas}")
                sys.exit(1)
            resp = client.getKvStoreKeyValsFilteredArea(keyDumpParams, area)

        prefix_maps = utils.collate_prefix_keys(resp.keyVals)
        for node, prefix_db in prefix_maps.items():
            node_dict[node] = self.get_node_ip(prefix_db)

        return node_dict
Пример #16
0
    def _run(self, client: OpenrCtrl.Client, nodes: set) -> None:
        all_nodes_to_ips = self.get_node_to_ips(client)
        if nodes:
            nodes = set(nodes.strip().split(","))
            if "all" in nodes:
                nodes = list(all_nodes_to_ips.keys())
            host_id = utils.get_connected_node_name(self.cli_opts)
            if host_id in nodes:
                nodes.remove(host_id)

            keyDumpParams = self.buildKvStoreKeyDumpParams(
                Consts.ALL_DB_MARKER)
            pub = client.getKvStoreKeyValsFiltered(keyDumpParams)
            kv_dict = self.dump_nodes_kvs(nodes, all_nodes_to_ips)
            for node in kv_dict:
                self.compare(pub.keyVals, kv_dict[node], host_id, node)

        else:
            nodes = list(all_nodes_to_ips.keys())
            kv_dict = self.dump_nodes_kvs(nodes, all_nodes_to_ips)
            for our_node, other_node in combinations(kv_dict.keys(), 2):
                self.compare(kv_dict[our_node], kv_dict[other_node], our_node,
                             other_node)
Пример #17
0
    def get_snapshot(self, client: OpenrCtrl.Client, delta: Any) -> Dict:
        # get the active network snapshot first, so we can compute deltas
        global_dbs = bunch.Bunch(
            {
                "prefixes": {},
                "adjs": {},
                "publications": {},  # map(key -> (version, originatorId))
            }
        )

        if delta:
            print("Retrieving KvStore snapshot ... ")
            keyDumpParams = self.buildKvStoreKeyDumpParams(Consts.ALL_DB_MARKER)
            resp = client.getKvStoreKeyValsFiltered(keyDumpParams)

            global_dbs.prefixes = utils.build_global_prefix_db(resp)
            global_dbs.adjs = utils.build_global_adj_db(resp)
            for key, value in resp.keyVals.items():
                global_dbs.publications[key] = (value.version, value.originatorId)
            print("Done. Loaded {} initial key-values".format(len(resp.keyVals)))
        else:
            print("Skipping retrieval of KvStore snapshot")
        return global_dbs
Пример #18
0
    def _run(
        self,
        client: OpenrCtrl.Client,
        node: str,
        bidir: bool,
        output_file: str,
        edge_label: Any,
        json: bool,
    ) -> None:

        try:
            import matplotlib.pyplot as plt
            import networkx as nx
        except ImportError:
            print("Drawing topology requires `matplotlib` and `networkx` "
                  "libraries. You can install them with following command and "
                  "retry. \n"
                  "  pip install matplotlib\n"
                  "  pip install networkx")
            sys.exit(1)

        rem_str = {".facebook.com": "", ".tfbnw.net": ""}
        rem_str = dict((re.escape(k), v) for k, v in rem_str.items())
        rem_pattern = re.compile("|".join(rem_str.keys()))

        keyDumpParams = self.buildKvStoreKeyDumpParams(Consts.ADJ_DB_MARKER)
        publication = client.getKvStoreKeyValsFiltered(keyDumpParams)
        nodes = list(
            self.get_node_to_ips(client).keys()) if not node else [node]
        adjs_map = utils.adj_dbs_to_dict(publication, nodes, bidir,
                                         self.iter_publication)

        if json:
            return self.topology_json_dump(adjs_map.items())

        G = nx.Graph()
        adj_metric_map = {}
        node_overloaded = {}

        for this_node_name, db in adjs_map.items():
            node_overloaded[rem_pattern.sub(
                lambda m: rem_str[re.escape(m.group(0))],
                this_node_name)] = db["overloaded"]
            for adj in db["adjacencies"]:
                adj_metric_map[(this_node_name, adj["ifName"])] = adj["metric"]

        for this_node_name, db in adjs_map.items():
            for adj in db["adjacencies"]:
                adj["color"] = "r" if adj["isOverloaded"] else "b"
                adj["adjOtherIfMetric"] = adj_metric_map[(adj["otherNodeName"],
                                                          adj["otherIfName"])]
                G.add_edge(
                    rem_pattern.sub(lambda m: rem_str[re.escape(m.group(0))],
                                    this_node_name),
                    rem_pattern.sub(lambda m: rem_str[re.escape(m.group(0))],
                                    adj["otherNodeName"]),
                    **adj,
                )

        # hack to get nice fabric
        # XXX: FB Specific
        pos = {}
        eswx = 0
        sswx = 0
        fswx = 0
        rswx = 0
        blue_nodes = []
        red_nodes = []
        for node in G.nodes():
            if node_overloaded[node]:
                red_nodes.append(node)
            else:
                blue_nodes.append(node)

            if "esw" in node:
                pos[node] = [eswx, 3]
                eswx += 10
            elif "ssw" in node:
                pos[node] = [sswx, 2]
                sswx += 10
            elif "fsw" in node:
                pos[node] = [fswx, 1]
                fswx += 10
            elif "rsw" in node:
                pos[node] = [rswx, 0]
                rswx += 10

        maxswx = max(eswx, sswx, fswx, rswx)
        if maxswx > 0:
            # aesthetically pleasing multiplier (empirically determined)
            plt.figure(figsize=(maxswx * 0.5, 8))
        else:
            plt.figure(figsize=(min(len(G.nodes()) * 2, 150),
                                min(len(G.nodes()) * 2, 150)))
            pos = nx.spring_layout(G)
        plt.axis("off")

        edge_colors = []
        for _, _, d in G.edges(data=True):
            edge_colors.append(d["color"])

        nx.draw_networkx_nodes(G,
                               pos,
                               ax=None,
                               alpha=0.5,
                               node_color="b",
                               nodelist=blue_nodes)
        nx.draw_networkx_nodes(G,
                               pos,
                               ax=None,
                               alpha=0.5,
                               node_color="r",
                               nodelist=red_nodes)
        nx.draw_networkx_labels(G, pos, ax=None, alpha=0.5, font_size=8)
        nx.draw_networkx_edges(G,
                               pos,
                               ax=None,
                               alpha=0.5,
                               font_size=8,
                               edge_color=edge_colors)
        edge_labels = {}
        if node:
            if edge_label:
                edge_labels = {
                    (u, v): "<" + str(d["otherIfName"]) + ",  " +
                    str(d["metric"]) + " >     <" + str(d["ifName"]) + ", " +
                    str(d["adjOtherIfMetric"]) + ">"
                    for u, v, d in G.edges(data=True)
                }
            nx.draw_networkx_edge_labels(G,
                                         pos,
                                         edge_labels=edge_labels,
                                         font_size=6)

        print("Saving topology to file => {}".format(output_file))
        plt.savefig(output_file)
Пример #19
0
 def _run(self, client: OpenrCtrl.Client, nodes: set, bidir: bool,
          json: bool) -> None:
     keyDumpParams = self.buildKvStoreKeyDumpParams(Consts.ADJ_DB_MARKER)
     publication = client.getKvStoreKeyValsFiltered(keyDumpParams)
     self.print_adj({None: publication}, nodes, bidir, json)
Пример #20
0
 def _run(self, client: OpenrCtrl.Client) -> None:
     keyDumpParams = self.buildKvStoreKeyDumpParams(Consts.PREFIX_DB_MARKER)
     resp = client.getKvStoreKeyValsFiltered(keyDumpParams)
     host_id = utils.get_connected_node_name(self.cli_opts)
     self.print_kvstore_nodes(resp, host_id)
Пример #21
0
 def _run(self, client: OpenrCtrl.Client, nodes: set, node: Any,
          interface: Any) -> None:
     keyDumpParams = self.buildKvStoreKeyDumpParams(Consts.ADJ_DB_MARKER)
     publication = client.getKvStoreKeyValsFiltered(keyDumpParams)
     self.printAdjNode(publication, nodes)