Skip to content

Commit df5f91a

Browse files
committed
[fix] Handled ZeroDivisionError in DeviceDataWriter._write_disk
1 parent d15d1f5 commit df5f91a

File tree

2 files changed

+23
-4
lines changed

2 files changed

+23
-4
lines changed

openwisp_monitoring/device/tests/test_models.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,23 @@ def test_bad_disk_fail(self):
514514
else:
515515
self.fail("ValidationError not raised")
516516

517+
def test_disk_size_bytes_zero(self):
518+
"""Ensures buggy data doesn't crash the writer"""
519+
dd = self._create_device_data()
520+
data = deepcopy(self._sample_data)
521+
data["resources"]["disk"] = [
522+
{
523+
"used_bytes": 0,
524+
"available_bytes": 0,
525+
"filesystem": "/dev/root",
526+
"mount_point": "/",
527+
"used_percent": 100,
528+
"size_bytes": 0,
529+
}
530+
]
531+
dd.writer.write(data)
532+
self.assertEqual(dd.data["resources"]["disk"][0]["used_percent"], 100)
533+
517534
def test_resources_no_key(self):
518535
dd = self._create_device_data()
519536
with self.subTest("Test No Resources"):

openwisp_monitoring/device/writer.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import logging
22
from copy import deepcopy
33
from datetime import datetime, timedelta
4-
from django.utils import timezone
54

65
from django.contrib.contenttypes.models import ContentType
76
from django.core.exceptions import ObjectDoesNotExist
7+
from django.utils import timezone
88
from pytz import UTC
99
from swapper import load_model
1010

@@ -306,9 +306,11 @@ def _write_disk(
306306
if created:
307307
self._create_resources_chart(metric, resource="disk")
308308
self._create_resources_alert_settings(metric, resource="disk")
309-
self._append_metric_data(
310-
metric, 100 * used_bytes / size_bytes, current, time=time
311-
)
309+
try:
310+
value = 100 * used_bytes / size_bytes
311+
except ZeroDivisionError:
312+
value = 100
313+
self._append_metric_data(metric, value, current, time=time)
312314

313315
def _write_memory(
314316
self, memory, primary_key, content_type, current=False, time=None

0 commit comments

Comments
 (0)