Source code for onbrisca.models.bridge_measurement

# SPDX-FileCopyrightText: 2022 The Tor Project, Inc.
#
# SPDX-License-Identifier: BSD-3-Clause
import logging

from django.db import models
from django.db.models.query import sync_to_async

from onbasca.base.models import BaseManager, BaseModel
from onbasca.onbasca import constants
from onbasca.onbasca.models.webserver import WebServer

from .bridge import Bridge

logger = logging.getLogger(__name__)


[docs] class BridgeMeasurementManager(BaseManager): pass
[docs] class BridgeMeasurement(BaseModel): class Meta: get_latest_by = "_obj_created_at" objects = BridgeMeasurementManager() bridge = models.ForeignKey( Bridge, on_delete=models.CASCADE, blank=True, null=True, related_name="measurements", ) webserver = models.ForeignKey( WebServer, on_delete=models.CASCADE, blank=True, null=True ) bandwidth = models.PositiveIntegerField(blank=True, null=True) error = models.TextField(blank=True, null=True) def __str__(self): return "{}, {}".format(self.bridge, self.error or str(self.bandwidth))
[docs] async def asave(self, *args, **kwargs): await sync_to_async(super().save)(*args, **kwargs)
[docs] async def finish_with_error(self, error): self.error = error logger.info("Finished measurement %s", self) await self.asave()
[docs] async def ameasure_bandwidth( self, http_client, bytes_range, size=constants.INITIAL_DL_BYTES ): logger.debug( "Measuring bw with web server %s, bytes range %s " "and size %s.", self.webserver.url, bytes_range, size, ) response = await http_client.aget(self.webserver.url) if ( isinstance(response, Exception) or isinstance(response, str) or response.status != 200 ): await self.finish_with_error(response) return response self.bandwidth = size / response.elapsed_time await self.asave() logger.info("Finished measurement %s.", self) logger.debug( "Measured bandwidth: %s Bytes/seconds", self.bandwidth, ) return self.bandwidth