forked from bartvdbraak/blender
afee963155
Docs are here: http://wiki.blender.org/index.php/User:Theeth/netrender Should be easy to test if people want too, just follow the instructions on wiki Code is still very much in flux, so I'd like if people would refrain from making changes (send patches directly to me if you must). The UI side is very crap, it's basically there just to get things testable. See wiki for known bugs.
151 lines
3.1 KiB
Python
151 lines
3.1 KiB
Python
import sys, os
|
|
import http, http.client, http.server, urllib
|
|
import subprocess, shutil, time, hashlib
|
|
|
|
from netrender.utils import *
|
|
|
|
class RenderSlave:
|
|
_slave_map = {}
|
|
|
|
def __init__(self):
|
|
self.id = ""
|
|
self.name = ""
|
|
self.adress = (0,0)
|
|
self.stats = ""
|
|
self.total_done = 0
|
|
self.total_error = 0
|
|
self.last_seen = 0.0
|
|
|
|
def serialize(self):
|
|
return {
|
|
"id": self.id,
|
|
"name": self.name,
|
|
"adress": self.adress,
|
|
"stats": self.stats,
|
|
"total_done": self.total_done,
|
|
"total_error": self.total_error,
|
|
"last_seen": self.last_seen
|
|
}
|
|
|
|
@staticmethod
|
|
def materialize(data):
|
|
if not data:
|
|
return None
|
|
|
|
slave_id = data["id"]
|
|
|
|
if slave_id in RenderSlave._slave_map:
|
|
return RenderSlave._slave_map[slave_id]
|
|
else:
|
|
slave = RenderSlave()
|
|
slave.id = slave_id
|
|
slave.name = data["name"]
|
|
slave.adress = data["adress"]
|
|
slave.stats = data["stats"]
|
|
slave.total_done = data["total_done"]
|
|
slave.total_error = data["total_error"]
|
|
slave.last_seen = data["last_seen"]
|
|
|
|
RenderSlave._slave_map[slave_id] = slave
|
|
|
|
return slave
|
|
|
|
class RenderJob:
|
|
def __init__(self):
|
|
self.id = ""
|
|
self.name = ""
|
|
self.path = ""
|
|
self.frames = []
|
|
self.chunks = 0
|
|
self.priority = 0
|
|
self.credits = 0
|
|
self.blacklist = []
|
|
self.last_dispatched = 0.0
|
|
|
|
def __len__(self):
|
|
return len(self.frames)
|
|
|
|
def status(self):
|
|
results = {
|
|
QUEUED: 0,
|
|
DISPATCHED: 0,
|
|
DONE: 0,
|
|
ERROR: 0
|
|
}
|
|
|
|
for frame in self.frames:
|
|
results[frame.status] += 1
|
|
|
|
return results
|
|
|
|
def __contains__(self, frame_number):
|
|
for f in self.frames:
|
|
if f.number == frame_number:
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
def __getitem__(self, frame_number):
|
|
for f in self.frames:
|
|
if f.number == frame_number:
|
|
return f
|
|
else:
|
|
return None
|
|
|
|
def serialize(self, frames = None):
|
|
return {
|
|
"id": self.id,
|
|
"name": self.name,
|
|
"path": self.path,
|
|
"frames": [f.serialize() for f in self.frames if not frames or f in frames],
|
|
"priority": self.priority,
|
|
"credits": self.credits,
|
|
"blacklist": self.blacklist,
|
|
"last_dispatched": self.last_dispatched
|
|
}
|
|
|
|
@staticmethod
|
|
def materialize(data):
|
|
if not data:
|
|
return None
|
|
|
|
job = RenderJob()
|
|
job.id = data["id"]
|
|
job.name = data["name"]
|
|
job.path = data["path"]
|
|
job.frames = [RenderFrame.materialize(f) for f in data["frames"]]
|
|
job.priority = data["priority"]
|
|
job.credits = data["credits"]
|
|
job.blacklist = data["blacklist"]
|
|
job.last_dispatched = data["last_dispatched"]
|
|
|
|
return job
|
|
|
|
class RenderFrame:
|
|
def __init__(self):
|
|
self.number = 0
|
|
self.time = 0
|
|
self.status = QUEUED
|
|
self.slave = None
|
|
|
|
def serialize(self):
|
|
return {
|
|
"number": self.number,
|
|
"time": self.time,
|
|
"status": self.status,
|
|
"slave": None if not self.slave else self.slave.serialize()
|
|
}
|
|
|
|
@staticmethod
|
|
def materialize(data):
|
|
if not data:
|
|
return None
|
|
|
|
frame = RenderFrame()
|
|
frame.number = data["number"]
|
|
frame.time = data["time"]
|
|
frame.status = data["status"]
|
|
frame.slave = RenderSlave.materialize(data["slave"])
|
|
|
|
return frame
|