remove 'provisioning'/'reliability' from WUI, add to misc/operations_helpers
Also remove docs related to reliability/provisioning pages
This commit is contained in:
parent
e0f409c681
commit
11f9394704
|
@ -553,9 +553,3 @@ will be able to reduce the expansion factor down to a bare minimum while
|
||||||
still retaining high reliability, but large unstable grids (where nodes are
|
still retaining high reliability, but large unstable grids (where nodes are
|
||||||
coming and going very quickly) may require more repair/verification bandwidth
|
coming and going very quickly) may require more repair/verification bandwidth
|
||||||
than actual upload/download traffic.
|
than actual upload/download traffic.
|
||||||
|
|
||||||
Tahoe-LAFS nodes that run a webserver have a page dedicated to provisioning
|
|
||||||
decisions: this tool may help you evaluate different expansion factors and
|
|
||||||
view the disk consumption of each. It is also acquiring some sections with
|
|
||||||
availability/reliability numbers, as well as preliminary cost analysis data.
|
|
||||||
This tool will continue to evolve as our analysis improves.
|
|
||||||
|
|
|
@ -1805,17 +1805,6 @@ This is the "Welcome Page", and contains a few distinct sections::
|
||||||
implementation hashes synchronously, so clients will probably never see
|
implementation hashes synchronously, so clients will probably never see
|
||||||
progress-hash!=1.0).
|
progress-hash!=1.0).
|
||||||
|
|
||||||
``GET /provisioning/``
|
|
||||||
|
|
||||||
This page provides a basic tool to predict the likely storage and bandwidth
|
|
||||||
requirements of a large Tahoe grid. It provides forms to input things like
|
|
||||||
total number of users, number of files per user, average file size, number
|
|
||||||
of servers, expansion ratio, hard drive failure rate, etc. It then provides
|
|
||||||
numbers like how many disks per server will be needed, how many read
|
|
||||||
operations per second should be expected, and the likely MTBF for files in
|
|
||||||
the grid. This information is very preliminary, and the model upon which it
|
|
||||||
is based still needs a lot of work.
|
|
||||||
|
|
||||||
``GET /helper_status/``
|
``GET /helper_status/``
|
||||||
|
|
||||||
If the node is running a helper (i.e. if [helper]enabled is set to True in
|
If the node is running a helper (i.e. if [helper]enabled is set to True in
|
||||||
|
|
|
@ -512,90 +512,6 @@ class Web(WebMixin, WebErrorMixin, testutil.StallMixin, testutil.ReallyEqualMixi
|
||||||
d.addCallback(_check)
|
d.addCallback(_check)
|
||||||
return d
|
return d
|
||||||
|
|
||||||
def test_provisioning(self):
|
|
||||||
d = self.GET("/provisioning/")
|
|
||||||
def _check(res):
|
|
||||||
self.failUnlessIn('Provisioning Tool', res)
|
|
||||||
self.failUnlessIn(FAVICON_MARKUP, res)
|
|
||||||
|
|
||||||
fields = {'filled': True,
|
|
||||||
"num_users": int(50e3),
|
|
||||||
"files_per_user": 1000,
|
|
||||||
"space_per_user": int(1e9),
|
|
||||||
"sharing_ratio": 1.0,
|
|
||||||
"encoding_parameters": "3-of-10-5",
|
|
||||||
"num_servers": 30,
|
|
||||||
"ownership_mode": "A",
|
|
||||||
"download_rate": 100,
|
|
||||||
"upload_rate": 10,
|
|
||||||
"delete_rate": 10,
|
|
||||||
"lease_timer": 7,
|
|
||||||
}
|
|
||||||
return self.POST("/provisioning/", **fields)
|
|
||||||
|
|
||||||
d.addCallback(_check)
|
|
||||||
def _check2(res):
|
|
||||||
self.failUnlessIn('Provisioning Tool', res)
|
|
||||||
self.failUnlessIn(FAVICON_MARKUP, res)
|
|
||||||
self.failUnlessIn("Share space consumed: 167.01TB", res)
|
|
||||||
|
|
||||||
fields = {'filled': True,
|
|
||||||
"num_users": int(50e6),
|
|
||||||
"files_per_user": 1000,
|
|
||||||
"space_per_user": int(5e9),
|
|
||||||
"sharing_ratio": 1.0,
|
|
||||||
"encoding_parameters": "25-of-100-50",
|
|
||||||
"num_servers": 30000,
|
|
||||||
"ownership_mode": "E",
|
|
||||||
"drive_failure_model": "U",
|
|
||||||
"drive_size": 1000,
|
|
||||||
"download_rate": 1000,
|
|
||||||
"upload_rate": 100,
|
|
||||||
"delete_rate": 100,
|
|
||||||
"lease_timer": 7,
|
|
||||||
}
|
|
||||||
return self.POST("/provisioning/", **fields)
|
|
||||||
d.addCallback(_check2)
|
|
||||||
def _check3(res):
|
|
||||||
self.failUnlessIn("Share space consumed: huge!", res)
|
|
||||||
fields = {'filled': True}
|
|
||||||
return self.POST("/provisioning/", **fields)
|
|
||||||
d.addCallback(_check3)
|
|
||||||
def _check4(res):
|
|
||||||
self.failUnlessIn("Share space consumed:", res)
|
|
||||||
d.addCallback(_check4)
|
|
||||||
return d
|
|
||||||
|
|
||||||
def test_reliability_tool(self):
|
|
||||||
try:
|
|
||||||
from allmydata import reliability
|
|
||||||
_hush_pyflakes = reliability
|
|
||||||
del _hush_pyflakes
|
|
||||||
except:
|
|
||||||
raise unittest.SkipTest("reliability tool requires NumPy")
|
|
||||||
|
|
||||||
d = self.GET("/reliability/")
|
|
||||||
def _check(res):
|
|
||||||
self.failUnlessIn('Reliability Tool', res)
|
|
||||||
fields = {'drive_lifetime': "8Y",
|
|
||||||
"k": "3",
|
|
||||||
"R": "7",
|
|
||||||
"N": "10",
|
|
||||||
"delta": "100000",
|
|
||||||
"check_period": "1M",
|
|
||||||
"report_period": "3M",
|
|
||||||
"report_span": "5Y",
|
|
||||||
}
|
|
||||||
return self.POST("/reliability/", **fields)
|
|
||||||
|
|
||||||
d.addCallback(_check)
|
|
||||||
def _check2(res):
|
|
||||||
self.failUnlessIn('Reliability Tool', res)
|
|
||||||
r = r'Probability of loss \(no maintenance\):\s+<span>0.033591'
|
|
||||||
self.failUnless(re.search(r, res), res)
|
|
||||||
d.addCallback(_check2)
|
|
||||||
return d
|
|
||||||
|
|
||||||
def test_status(self):
|
def test_status(self):
|
||||||
h = self.s.get_history()
|
h = self.s.get_history()
|
||||||
dl_num = h.list_all_download_statuses()[0].get_counter()
|
dl_num = h.list_all_download_statuses()[0].get_counter()
|
||||||
|
|
|
@ -2,18 +2,17 @@ import time, os
|
||||||
|
|
||||||
from twisted.internet import address
|
from twisted.internet import address
|
||||||
from twisted.web import http
|
from twisted.web import http
|
||||||
from nevow import rend, url, loaders, tags as T
|
from nevow import rend, url, tags as T
|
||||||
from nevow.inevow import IRequest
|
from nevow.inevow import IRequest
|
||||||
from nevow.static import File as nevow_File # TODO: merge with static.File?
|
from nevow.static import File as nevow_File # TODO: merge with static.File?
|
||||||
from nevow.util import resource_filename
|
from nevow.util import resource_filename
|
||||||
|
|
||||||
import allmydata # to display import path
|
import allmydata # to display import path
|
||||||
from allmydata import get_package_versions_string
|
from allmydata import get_package_versions_string
|
||||||
from allmydata import provisioning
|
|
||||||
from allmydata.util import idlib, log
|
from allmydata.util import idlib, log
|
||||||
from allmydata.interfaces import IFileNode
|
from allmydata.interfaces import IFileNode
|
||||||
from allmydata.web import filenode, directory, unlinked, status, operations
|
from allmydata.web import filenode, directory, unlinked, status, operations
|
||||||
from allmydata.web import reliability, storage
|
from allmydata.web import storage
|
||||||
from allmydata.web.common import abbreviate_size, getxmlfile, WebError, \
|
from allmydata.web.common import abbreviate_size, getxmlfile, WebError, \
|
||||||
get_arg, RenderMixin, get_format, get_mutable_type
|
get_arg, RenderMixin, get_format, get_mutable_type
|
||||||
|
|
||||||
|
@ -126,20 +125,6 @@ class IncidentReporter(RenderMixin, rend.Page):
|
||||||
req.setHeader("content-type", "text/plain")
|
req.setHeader("content-type", "text/plain")
|
||||||
return "Thank you for your report!"
|
return "Thank you for your report!"
|
||||||
|
|
||||||
class NoReliability(rend.Page):
|
|
||||||
docFactory = loaders.xmlstr('''\
|
|
||||||
<html xmlns:n="http://nevow.com/ns/nevow/0.1">
|
|
||||||
<head>
|
|
||||||
<title>AllMyData - Tahoe</title>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h2>"Reliability" page not available</h2>
|
|
||||||
<p>Please install the python "NumPy" module to enable this page.</p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
''')
|
|
||||||
|
|
||||||
SPACE = u"\u00A0"*2
|
SPACE = u"\u00A0"*2
|
||||||
|
|
||||||
class Root(rend.Page):
|
class Root(rend.Page):
|
||||||
|
@ -175,12 +160,6 @@ class Root(rend.Page):
|
||||||
# needs to created on each request
|
# needs to created on each request
|
||||||
return status.HelperStatus(self.client.helper)
|
return status.HelperStatus(self.client.helper)
|
||||||
|
|
||||||
child_provisioning = provisioning.ProvisioningTool()
|
|
||||||
if reliability.is_available():
|
|
||||||
child_reliability = reliability.ReliabilityTool()
|
|
||||||
else:
|
|
||||||
child_reliability = NoReliability()
|
|
||||||
|
|
||||||
child_report_incident = IncidentReporter()
|
child_report_incident = IncidentReporter()
|
||||||
#child_server # let's reserve this for storage-server-over-HTTP
|
#child_server # let's reserve this for storage-server-over-HTTP
|
||||||
|
|
||||||
|
|
|
@ -91,9 +91,6 @@
|
||||||
<div>Please visit the <a target="_blank" href="http://tahoe-lafs.org">Tahoe-LAFS home page</a> for
|
<div>Please visit the <a target="_blank" href="http://tahoe-lafs.org">Tahoe-LAFS home page</a> for
|
||||||
code updates and bug reporting.</div>
|
code updates and bug reporting.</div>
|
||||||
|
|
||||||
<div>The <a href="provisioning">provisioning tool</a> and <a
|
|
||||||
href="reliability">reliability calculator</a> may also be useful.</div>
|
|
||||||
|
|
||||||
<div n:render="incident_button" />
|
<div n:render="incident_button" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue