2 from twisted.trial import unittest
3 from allmydata import provisioning
4 ReliabilityModel = None
6 from allmydata.reliability import ReliabilityModel
8 pass # might not be importable, since it needs NumPy
10 from nevow import inevow
11 from zope.interface import implements
14 implements(inevow.IRequest)
17 class Provisioning(unittest.TestCase):
18 def getarg(self, name, astype=int):
19 if name in self.fields:
20 return astype(self.fields[name])
24 pt = provisioning.ProvisioningTool()
27 #r.fields = self.fields
28 #ctx = RequestContext()
29 #unfilled = pt.renderSynchronously(ctx)
30 lots_of_stan = pt.do_forms(self.getarg)
31 self.failUnlessEqual(type(lots_of_stan), list)
33 self.fields = {'filled': True,
35 "files_per_user": 1000,
36 "space_per_user": 1e9,
38 "encoding_parameters": "3-of-10-5",
40 "ownership_mode": "A",
46 #filled = pt.renderSynchronously(ctx)
47 more_stan = pt.do_forms(self.getarg)
48 self.failUnlessEqual(type(more_stan), list)
50 # trigger the wraparound configuration
51 self.fields["num_servers"] = 5
52 #filled = pt.renderSynchronously(ctx)
53 more_stan = pt.do_forms(self.getarg)
55 # and other ownership modes
56 self.fields["ownership_mode"] = "B"
57 more_stan = pt.do_forms(self.getarg)
58 self.fields["ownership_mode"] = "E"
59 more_stan = pt.do_forms(self.getarg)
61 def test_provisioning_math(self):
62 self.failUnlessEqual(provisioning.binomial(10, 0), 1)
63 self.failUnlessEqual(provisioning.binomial(10, 1), 10)
64 self.failUnlessEqual(provisioning.binomial(10, 2), 45)
65 self.failUnlessEqual(provisioning.binomial(10, 9), 10)
66 self.failUnlessEqual(provisioning.binomial(10, 10), 1)
72 class Reliability(unittest.TestCase):
74 if ReliabilityModel is None:
75 raise unittest.SkipTest("reliability model requires NumPy")
77 # test that numpy math works the way I think it does
79 decay = numpy.matrix([[1,0,0],
83 start = numpy.array([0,0,1])
84 g2 = (start * decay).A[0]
85 self.failUnlessEqual(repr(g2), repr(numpy.array([.01,.09,.9])))
86 g3 = (g2 * decay).A[0]
87 self.failUnlessEqual(repr(g3), repr(numpy.array([.028,.162,.81])))
90 recoverable = numpy.array([0,1,1])
91 P_recoverable_g2 = numpy.dot(g2, recoverable)
92 self.failUnlessAlmostEqual(P_recoverable_g2, .9 + .09)
93 P_recoverable_g3 = numpy.dot(g3, recoverable)
94 self.failUnlessAlmostEqual(P_recoverable_g3, .81 + .162)
96 r = ReliabilityModel.run(delta=100000,
97 report_period=3*MONTH,
99 self.failUnlessEqual(len(r.samples), 20)
101 last_row = r.samples[-1]
103 (when, unmaintained_shareprobs, maintained_shareprobs,
104 P_repaired_last_check_period,
105 cumulative_number_of_repairs,
106 cumulative_number_of_new_shares,
107 P_dead_unmaintained, P_dead_maintained) = last_row
108 self.failUnless(isinstance(P_repaired_last_check_period, float))
109 self.failUnless(isinstance(P_dead_unmaintained, float))
110 self.failUnless(isinstance(P_dead_maintained, float))
111 self.failUnlessAlmostEqual(P_dead_unmaintained, 0.033591004555395272)
112 self.failUnlessAlmostEqual(P_dead_maintained, 3.2983995819177542e-08)