Edit on GitHub

bin.Databases.KvrocksDB

  1from Databases.database import Database
  2import redis
  3
  4
  5class KvrocksDB(Database):
  6    """
  7    This database store data as live
  8    --> When a withdraw is received, concerned prefixes are removed
  9    """
 10
 11    name = "kvrocks"
 12
 13    def __init__(self, config):
 14        super().__init__()
 15        self.client = redis.Redis(
 16            host=config["host"], port=config["port"], db=config["db"]
 17        )
 18
 19    def start(self):
 20        print(f"Database size : {self.client.dbsize()}")
 21
 22    def stop(self):
 23        pass
 24
 25    ###############
 26    #   INSERTS   #
 27    ###############
 28
 29    def save(self, record):
 30        """Store data in a sorted set named "bgp" with a scorebased on Time
 31
 32        Format :
 33            bgp-prefix:path:source time time:type:peer_asn:collector:country_code
 34
 35        Args:
 36            record (`BGPElem`): BGP Element to save
 37        """
 38        e = record
 39
 40        if e["type"] == "A":
 41            self.client.sadd(
 42                f"prefixes-{e['source']}", e["prefix"]
 43            )  # prefixes-{ASN} : (cidr, cidr)
 44            self.client.sadd(
 45                f"prefixes-{e['country_code']}", e["prefix"]
 46            )  # prefixes-{LU} : (cidr, cidr)
 47            self.client.sadd(
 48                f"as-{e['prefix']}", e["source"]
 49            )  # as-{cidr} : (as, as, as)
 50            self.client.sadd(
 51                f"countries-{e['prefix'] or ''}", e["country_code"]
 52            )  # countries-{cidr} : (LU, FR)
 53            self.client.sadd(
 54                f"paths-{e['prefix']}", e.get("as-path")
 55            )  # paths-{cidr} : (path, path, path)
 56
 57            self.client.zadd(
 58                "bgp-{}:{}:{}".format(e["prefix"], e.get("as-path"), e["source"]),
 59                {
 60                    f"{e['time']}:{e['type']}:{e['peer_asn']}:"
 61                    f"{e['collector']}:{e['country_code']}": int(float(e["time"]))
 62                },
 63            )
 64        #            self.client.execute()
 65
 66        elif e["type"] == "W":
 67            return
 68            for as_source in self.client.smembers(f"as-{e['prefix']}"):
 69                self.client.srem(
 70                    f"prefixes-{as_source}", e["prefix"]
 71                )  # pr AS {cidr, cidr}
 72
 73            for pr in self.client.smembers(f"country-{e['prefix']}"):
 74                self.client.srem(
 75                    f"prefixes-{e['country_code']}", pr
 76                )  # pr LU {cidr, cidr}
 77
 78            self.client.delete(f"countries-{e['prefix']}")  # countries-cidr {LU, FR}
 79            self.client.delete(f"as-{e['prefix']}")  # as-cidr {as, as, as }
 80            self.client.delete(f"paths-{e['prefix']}")  # paths-cidr {path, path, path}
 81
 82            self.client.zadd(
 83                "bgp-{}".format(e["prefix"]),
 84                {
 85                    f"{e['time']}:{e['type']}:{e['peer_asn']}:{e['collector']}": int(
 86                        float(e["time"])
 87                    )
 88                },
 89            )
 90            self.client.zadd(
 91                "bgp-{}:{}".format(e["prefix"], e.get("as-path")),
 92                {
 93                    f"{e['time']}:{e['type']}:{e['peer_asn']}:"
 94                    f"{e['collector']}": int(float(e["time"]))
 95                },
 96            )
 97
 98    ##############
 99    #   GETTER   #
100    ##############
101
102    def get(
103        self,
104        time_start,
105        time_end,
106        record_type=None,
107        peer_asn=None,
108        collectors=None,
109        countries=None,
110        as_numbers=None,
111        prefixes=None,
112        as_paths=None,
113    ):
114        """Can't be tested now"""
115        pass
class KvrocksDB(Databases.database.Database):
  6class KvrocksDB(Database):
  7    """
  8    This database store data as live
  9    --> When a withdraw is received, concerned prefixes are removed
 10    """
 11
 12    name = "kvrocks"
 13
 14    def __init__(self, config):
 15        super().__init__()
 16        self.client = redis.Redis(
 17            host=config["host"], port=config["port"], db=config["db"]
 18        )
 19
 20    def start(self):
 21        print(f"Database size : {self.client.dbsize()}")
 22
 23    def stop(self):
 24        pass
 25
 26    ###############
 27    #   INSERTS   #
 28    ###############
 29
 30    def save(self, record):
 31        """Store data in a sorted set named "bgp" with a scorebased on Time
 32
 33        Format :
 34            bgp-prefix:path:source time time:type:peer_asn:collector:country_code
 35
 36        Args:
 37            record (`BGPElem`): BGP Element to save
 38        """
 39        e = record
 40
 41        if e["type"] == "A":
 42            self.client.sadd(
 43                f"prefixes-{e['source']}", e["prefix"]
 44            )  # prefixes-{ASN} : (cidr, cidr)
 45            self.client.sadd(
 46                f"prefixes-{e['country_code']}", e["prefix"]
 47            )  # prefixes-{LU} : (cidr, cidr)
 48            self.client.sadd(
 49                f"as-{e['prefix']}", e["source"]
 50            )  # as-{cidr} : (as, as, as)
 51            self.client.sadd(
 52                f"countries-{e['prefix'] or ''}", e["country_code"]
 53            )  # countries-{cidr} : (LU, FR)
 54            self.client.sadd(
 55                f"paths-{e['prefix']}", e.get("as-path")
 56            )  # paths-{cidr} : (path, path, path)
 57
 58            self.client.zadd(
 59                "bgp-{}:{}:{}".format(e["prefix"], e.get("as-path"), e["source"]),
 60                {
 61                    f"{e['time']}:{e['type']}:{e['peer_asn']}:"
 62                    f"{e['collector']}:{e['country_code']}": int(float(e["time"]))
 63                },
 64            )
 65        #            self.client.execute()
 66
 67        elif e["type"] == "W":
 68            return
 69            for as_source in self.client.smembers(f"as-{e['prefix']}"):
 70                self.client.srem(
 71                    f"prefixes-{as_source}", e["prefix"]
 72                )  # pr AS {cidr, cidr}
 73
 74            for pr in self.client.smembers(f"country-{e['prefix']}"):
 75                self.client.srem(
 76                    f"prefixes-{e['country_code']}", pr
 77                )  # pr LU {cidr, cidr}
 78
 79            self.client.delete(f"countries-{e['prefix']}")  # countries-cidr {LU, FR}
 80            self.client.delete(f"as-{e['prefix']}")  # as-cidr {as, as, as }
 81            self.client.delete(f"paths-{e['prefix']}")  # paths-cidr {path, path, path}
 82
 83            self.client.zadd(
 84                "bgp-{}".format(e["prefix"]),
 85                {
 86                    f"{e['time']}:{e['type']}:{e['peer_asn']}:{e['collector']}": int(
 87                        float(e["time"])
 88                    )
 89                },
 90            )
 91            self.client.zadd(
 92                "bgp-{}:{}".format(e["prefix"], e.get("as-path")),
 93                {
 94                    f"{e['time']}:{e['type']}:{e['peer_asn']}:"
 95                    f"{e['collector']}": int(float(e["time"]))
 96                },
 97            )
 98
 99    ##############
100    #   GETTER   #
101    ##############
102
103    def get(
104        self,
105        time_start,
106        time_end,
107        record_type=None,
108        peer_asn=None,
109        collectors=None,
110        countries=None,
111        as_numbers=None,
112        prefixes=None,
113        as_paths=None,
114    ):
115        """Can't be tested now"""
116        pass

This database store data as live --> When a withdraw is received, concerned prefixes are removed

KvrocksDB(config)
14    def __init__(self, config):
15        super().__init__()
16        self.client = redis.Redis(
17            host=config["host"], port=config["port"], db=config["db"]
18        )
name = 'kvrocks'

This variable is used for configuration file

You must specify it in config to load an instance

def start(self):
20    def start(self):
21        print(f"Database size : {self.client.dbsize()}")
def stop(self):
23    def stop(self):
24        pass
def save(self, record):
30    def save(self, record):
31        """Store data in a sorted set named "bgp" with a scorebased on Time
32
33        Format :
34            bgp-prefix:path:source time time:type:peer_asn:collector:country_code
35
36        Args:
37            record (`BGPElem`): BGP Element to save
38        """
39        e = record
40
41        if e["type"] == "A":
42            self.client.sadd(
43                f"prefixes-{e['source']}", e["prefix"]
44            )  # prefixes-{ASN} : (cidr, cidr)
45            self.client.sadd(
46                f"prefixes-{e['country_code']}", e["prefix"]
47            )  # prefixes-{LU} : (cidr, cidr)
48            self.client.sadd(
49                f"as-{e['prefix']}", e["source"]
50            )  # as-{cidr} : (as, as, as)
51            self.client.sadd(
52                f"countries-{e['prefix'] or ''}", e["country_code"]
53            )  # countries-{cidr} : (LU, FR)
54            self.client.sadd(
55                f"paths-{e['prefix']}", e.get("as-path")
56            )  # paths-{cidr} : (path, path, path)
57
58            self.client.zadd(
59                "bgp-{}:{}:{}".format(e["prefix"], e.get("as-path"), e["source"]),
60                {
61                    f"{e['time']}:{e['type']}:{e['peer_asn']}:"
62                    f"{e['collector']}:{e['country_code']}": int(float(e["time"]))
63                },
64            )
65        #            self.client.execute()
66
67        elif e["type"] == "W":
68            return
69            for as_source in self.client.smembers(f"as-{e['prefix']}"):
70                self.client.srem(
71                    f"prefixes-{as_source}", e["prefix"]
72                )  # pr AS {cidr, cidr}
73
74            for pr in self.client.smembers(f"country-{e['prefix']}"):
75                self.client.srem(
76                    f"prefixes-{e['country_code']}", pr
77                )  # pr LU {cidr, cidr}
78
79            self.client.delete(f"countries-{e['prefix']}")  # countries-cidr {LU, FR}
80            self.client.delete(f"as-{e['prefix']}")  # as-cidr {as, as, as }
81            self.client.delete(f"paths-{e['prefix']}")  # paths-cidr {path, path, path}
82
83            self.client.zadd(
84                "bgp-{}".format(e["prefix"]),
85                {
86                    f"{e['time']}:{e['type']}:{e['peer_asn']}:{e['collector']}": int(
87                        float(e["time"])
88                    )
89                },
90            )
91            self.client.zadd(
92                "bgp-{}:{}".format(e["prefix"], e.get("as-path")),
93                {
94                    f"{e['time']}:{e['type']}:{e['peer_asn']}:"
95                    f"{e['collector']}": int(float(e["time"]))
96                },
97            )

Store data in a sorted set named "bgp" with a scorebased on Time

Format : bgp-prefix:path:source time time:type:peer_asn:collector:country_code

Args: record (BGPElem): BGP Element to save

def get( self, time_start, time_end, record_type=None, peer_asn=None, collectors=None, countries=None, as_numbers=None, prefixes=None, as_paths=None):
103    def get(
104        self,
105        time_start,
106        time_end,
107        record_type=None,
108        peer_asn=None,
109        collectors=None,
110        countries=None,
111        as_numbers=None,
112        prefixes=None,
113        as_paths=None,
114    ):
115        """Can't be tested now"""
116        pass

Can't be tested now