From 8815b30b9bb958de1804a9368635e0aacb69bc5f Mon Sep 17 00:00:00 2001
From: Brian Warner <warner@allmydata.com>
Date: Thu, 6 Mar 2008 21:16:38 -0700
Subject: [PATCH] webish: show storage sizelimit, abbreviate current usage

---
 src/allmydata/web/common.py | 37 +++++++++++++++++++++++++++++++++++++
 src/allmydata/web/status.py | 25 ++++---------------------
 src/allmydata/webish.py     | 10 +++++++---
 3 files changed, 48 insertions(+), 24 deletions(-)

diff --git a/src/allmydata/web/common.py b/src/allmydata/web/common.py
index 8f97dde5..000fda35 100644
--- a/src/allmydata/web/common.py
+++ b/src/allmydata/web/common.py
@@ -31,3 +31,40 @@ def get_arg(req, argname, default=None, multiple=False):
     if results:
         return results[0]
     return default
+
+def abbreviate_time(data):
+    # 1.23s, 790ms, 132us
+    if data is None:
+        return ""
+    s = float(data)
+    if s >= 1.0:
+        return "%.2fs" % s
+    if s >= 0.01:
+        return "%dms" % (1000*s)
+    if s >= 0.001:
+        return "%.1fms" % (1000*s)
+    return "%dus" % (1000000*s)
+
+def abbreviate_rate(data):
+    # 21.8kBps, 554.4kBps 4.37MBps
+    if data is None:
+        return ""
+    r = float(data)
+    if r > 1000000:
+        return "%1.2fMBps" % (r/1000000)
+    if r > 1000:
+        return "%.1fkBps" % (r/1000)
+    return "%dBps" % r
+
+def abbreviate_size(data):
+    # 21.8kB, 554.4kB 4.37MB
+    if data is None:
+        return ""
+    r = float(data)
+    if r > 1000000000:
+        return "%1.2fGB" % (r/1000000000)
+    if r > 1000000:
+        return "%1.2fMB" % (r/1000000)
+    if r > 1000:
+        return "%.1fkB" % (r/1000)
+    return "%dB" % r
diff --git a/src/allmydata/web/status.py b/src/allmydata/web/status.py
index 884fc3d2..339c1537 100644
--- a/src/allmydata/web/status.py
+++ b/src/allmydata/web/status.py
@@ -3,7 +3,8 @@ import time
 from twisted.internet import defer
 from nevow import rend, tags as T
 from allmydata.util import base32, idlib
-from allmydata.web.common import IClient, getxmlfile
+from allmydata.web.common import IClient, getxmlfile, abbreviate_time, \
+     abbreviate_rate
 from allmydata.interfaces import IUploadStatus, IDownloadStatus, \
      IPublishStatus, IRetrieveStatus
 
@@ -19,28 +20,10 @@ def plural(sequence_or_length):
 class RateAndTimeMixin:
 
     def render_time(self, ctx, data):
-        # 1.23s, 790ms, 132us
-        if data is None:
-            return ""
-        s = float(data)
-        if s >= 1.0:
-            return "%.2fs" % s
-        if s >= 0.01:
-            return "%dms" % (1000*s)
-        if s >= 0.001:
-            return "%.1fms" % (1000*s)
-        return "%dus" % (1000000*s)
+        return abbreviate_time(data)
 
     def render_rate(self, ctx, data):
-        # 21.8kBps, 554.4kBps 4.37MBps
-        if data is None:
-            return ""
-        r = float(data)
-        if r > 1000000:
-            return "%1.2fMBps" % (r/1000000)
-        if r > 1000:
-            return "%.1fkBps" % (r/1000)
-        return "%dBps" % r
+        return abbreviate_rate(data)
 
 class UploadResultsRendererMixin(RateAndTimeMixin):
     # this requires a method named 'upload_results'
diff --git a/src/allmydata/webish.py b/src/allmydata/webish.py
index e8a9a6f0..f591cf65 100644
--- a/src/allmydata/webish.py
+++ b/src/allmydata/webish.py
@@ -23,7 +23,8 @@ from foolscap.eventual import fireEventually
 from nevow.util import resource_filename
 
 from allmydata.web import status, unlinked
-from allmydata.web.common import IClient, getxmlfile, get_arg, boolean_of_arg
+from allmydata.web.common import IClient, getxmlfile, get_arg, \
+     boolean_of_arg, abbreviate_size
 
 class ILocalAccess(Interface):
     def local_access_is_allowed():
@@ -1403,8 +1404,11 @@ class Root(rend.Page):
             ss = client.getServiceNamed("storage")
         except KeyError:
             return "Not running"
-        allocated = ss.allocated_size()
-        return "about %d bytes allocated" % allocated
+        allocated = "about %s allocated" % abbreviate_size(ss.allocated_size())
+        sizelimit = "no size limit"
+        if ss.sizelimit is not None:
+            sizelimit = "size limit is %s" % abbreviate_size(ss.sizelimit)
+        return "%s, %s" % (allocated, sizelimit)
 
     def data_introducer_furl(self, ctx, data):
         return IClient(ctx).introducer_furl
-- 
2.45.2