mirror of
https://github.com/peeringdb/peeringdb.git
synced 2024-05-11 05:55:09 +00:00
* dependency updates #1311 * poetry relock * linting * fix global stats cache test and remove timed test * pin django-peeringdb 3.1.0 * remove deprecated cors test --------- Co-authored-by: 20C <code@20c.com>
112 lines
3.0 KiB
Python
112 lines
3.0 KiB
Python
"""
|
|
Load and maintain global stats (displayed in peeringdb footer).
|
|
"""
|
|
from django.conf import settings
|
|
from django.utils import timezone
|
|
|
|
from peeringdb_server.models import (
|
|
Campus,
|
|
Carrier,
|
|
Facility,
|
|
InternetExchange,
|
|
Network,
|
|
NetworkFacility,
|
|
NetworkIXLan,
|
|
Organization,
|
|
User,
|
|
)
|
|
|
|
__STATS = {"data": {}, "mod": None}
|
|
|
|
|
|
def reset_stats():
|
|
"""
|
|
Resets global stats to empty. Useful to reset for testing purposes.
|
|
"""
|
|
__STATS["data"] = {}
|
|
__STATS["mod"] = None
|
|
|
|
|
|
def gen_stats():
|
|
"""
|
|
Regenerates global statics to stats.__STATS['data']
|
|
"""
|
|
|
|
__STATS["data"] = {
|
|
Network.handleref.tag: Network.handleref.filter(status="ok").count(),
|
|
InternetExchange.handleref.tag: InternetExchange.handleref.filter(
|
|
status="ok"
|
|
).count(),
|
|
Facility.handleref.tag: Facility.handleref.filter(status="ok").count(),
|
|
Carrier.handleref.tag: Carrier.handleref.filter(status="ok").count(),
|
|
Campus.handleref.tag: Campus.handleref.filter(status="ok").count(),
|
|
NetworkIXLan.handleref.tag: NetworkIXLan.handleref.filter(status="ok").count(),
|
|
NetworkFacility.handleref.tag: NetworkFacility.handleref.filter(
|
|
status="ok"
|
|
).count(),
|
|
"automated_nets": Network.handleref.filter(
|
|
status="ok", allow_ixp_update=True
|
|
).count(),
|
|
"organizations": Organization.objects.filter(status="ok").count(),
|
|
"registered_users": User.objects.count(),
|
|
}
|
|
__STATS["mod"] = timezone.now()
|
|
|
|
|
|
def stats():
|
|
"""
|
|
Returns dict of global statistics
|
|
|
|
Will return cached statistics according to `GLOBAL_STATS_CACHE_DURATION` setting
|
|
"""
|
|
|
|
if __STATS["mod"]:
|
|
diff = timezone.now() - __STATS["mod"]
|
|
if diff.total_seconds() < settings.GLOBAL_STATS_CACHE_DURATION:
|
|
return __STATS["data"]
|
|
|
|
gen_stats()
|
|
return __STATS["data"]
|
|
|
|
|
|
def get_fac_stats(netfac, ixfac):
|
|
return {
|
|
"networks": netfac.filter(status="ok").count(),
|
|
"ix": ixfac.filter(status="ok").count(),
|
|
}
|
|
|
|
|
|
def get_ix_stats(netixlan, ixlan):
|
|
peer_count = netixlan.values("network").distinct().filter(status="ok").count()
|
|
connections_count = netixlan.filter(ixlan=ixlan, status="ok").count()
|
|
open_peer_count = (
|
|
netixlan.values("network")
|
|
.distinct()
|
|
.filter(network__policy_general="Open", status="ok")
|
|
.count()
|
|
)
|
|
ipv6_percentage = 0
|
|
total_speed = 0
|
|
|
|
try:
|
|
ipv6_percentage = int(
|
|
(
|
|
netixlan.filter(status="ok", ixlan=ixlan, ipaddr6__isnull=False).count()
|
|
/ netixlan.filter(ixlan=ixlan, status="ok").count()
|
|
)
|
|
* 100
|
|
)
|
|
except ZeroDivisionError:
|
|
pass
|
|
|
|
for n in netixlan.filter(status="ok", ixlan=ixlan):
|
|
total_speed += n.speed
|
|
|
|
return {
|
|
"peer_count": peer_count,
|
|
"connection_count": connections_count,
|
|
"open_peer_count": open_peer_count,
|
|
"ipv6_percentage": ipv6_percentage,
|
|
"total_speed": total_speed,
|
|
}
|