Skip to content

Commit

Permalink
Merge ba376de into aef52ff
Browse files Browse the repository at this point in the history
  • Loading branch information
super3 committed Sep 21, 2015
2 parents aef52ff + ba376de commit 3aac320
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 14 deletions.
51 changes: 42 additions & 9 deletions dataserv/Farmer.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,15 @@ def sha256(content):

class Farmer(db.Model):
id = db.Column(db.Integer, primary_key=True)

btc_addr = db.Column(db.String(35), unique=True)
payout_addr = db.Column(db.String(35))
last_seen = db.Column(DateTime, index=True, default=datetime.utcnow)
height = db.Column(db.Integer, default=0)

last_seen = db.Column(DateTime, index=True, default=datetime.utcnow)
reg_time = db.Column(DateTime, default=datetime.utcnow)
uptime = db.Column(db.Integer, default=0)

def __init__(self, btc_addr, last_seen=None):
"""
A farmer is a un-trusted client that provides some disk space
Expand Down Expand Up @@ -105,17 +109,24 @@ def ping(self, before_commit_callback=None):
we just want to know if they are still there.
"""
pingtime = datetime.utcnow()
farmer = self.lookup()
delta = pingtime - farmer.last_seen
time_limit = delta.seconds >= app.config["MAX_PING"]
ping_time = datetime.utcnow()

if time_limit:
farmer.last_seen = pingtime
# make sure the farmer is valid
farmer = self.lookup()
# find time delta since we last pinged
delta = ping_time - farmer.last_seen

# if we are above the time limit, update last seen
if delta.seconds >= app.config["MAX_PING"]:
farmer.last_seen = ping_time
# if the farmer has been online in the last ONLINE_TIME seconds
# then we can update their uptime statistic
if delta.seconds <= (app.config["ONLINE_TIME"] * 60):
farmer.uptime += delta.seconds
# call to the authentication module
if before_commit_callback:
before_commit_callback()
db.session.commit()
# else just ignore

# TODO: Actually do an audit.
def audit(self):
Expand All @@ -134,12 +145,34 @@ def set_height(self, height):
db.session.commit()
return self.height

def calculate_uptime(self):
"""Calculate uptime from registration date."""
farmer = self.lookup()
# time delta from registration
delta_reg = datetime.utcnow() - farmer.reg_time

# convert to seconds
delta_reg = delta_reg.seconds

# in case registration happened a short bit ago
if delta_reg == 0:
delta_reg = 1
farmer_uptime = farmer.uptime + (app.config["ONLINE_TIME"] * 60)
uptime = round(farmer_uptime / delta_reg, 3)
# clip if we completed the audit recently (which sends us over 100%)
uptime *= 100 # covert from decimal to percentage
if uptime > 100:
uptime = 100

return round(uptime, 3)

def to_json(self):
"""Object to JSON payload."""
payload = {
"btc_addr": self.btc_addr,
"payout_addr": self.payout_addr,
"last_seen": (datetime.utcnow() - self.last_seen).seconds,
"height": self.height
"height": self.height,
"uptime": self.calculate_uptime()
}
return json.dumps(payload)
2 changes: 1 addition & 1 deletion dataserv/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,4 +208,4 @@ def set_height(btc_addr, height):


if __name__ == '__main__':
manager.run()
app.run(debug=True)
9 changes: 6 additions & 3 deletions tests/test_App.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ def test_register_no_payout(self):
"height": 0,
"btc_addr": addresses["gamma"],
'payout_addr': addresses["gamma"],
"last_seen": 0
"last_seen": 0,
"uptime": 100
}
self.assertEqual(rv.status_code, 200)
self.assertEqual(return_data, expected_data)
Expand All @@ -66,7 +67,8 @@ def test_register_w_payout(self):
"height": 0,
"btc_addr": addresses["delta"],
'payout_addr': addresses["epsilon"],
"last_seen": 0
"last_seen": 0,
"uptime": 100
}
self.assertEqual(rv.status_code, 200)
self.assertEqual(return_data, expected_data)
Expand All @@ -86,7 +88,8 @@ def test_register_w_payout(self):
"height": 0,
"btc_addr": addresses["zeta"],
'payout_addr': addresses["epsilon"],
"last_seen": 0
"last_seen": 0,
"uptime": 100
}
self.assertEqual(rv.status_code, 200)
self.assertEqual(return_data, expected_data)
Expand Down
3 changes: 2 additions & 1 deletion tests/test_Farmer.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,8 @@ def test_to_json(self):
"height": 50,
"btc_addr": addresses["epsilon"],
'payout_addr': addresses["epsilon"],
"last_seen": 0
"last_seen": 0,
"uptime": 100
}
call_payload = json.loads(farmer.to_json())
self.assertEqual(test_json, call_payload)
Expand Down

0 comments on commit 3aac320

Please sign in to comment.