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
name =
'kvrocks'
This variable is used for configuration file
You must specify it in config to load an instance
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